|
@@ -5494,7 +5494,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, sta
|
|
|
|
|
|
void status_calc_state_sub( block_list& bl, status_change& sc, bool start, std::shared_ptr<s_status_change_db> scdb_main, bool& restriction, e_scs_flag flag, e_scs_flag flag_conditional, std::function<bool ( block_list&, status_change&, bool&, const sc_type, const status_change_entry& )> func_switch ){
|
|
void status_calc_state_sub( block_list& bl, status_change& sc, bool start, std::shared_ptr<s_status_change_db> scdb_main, bool& restriction, e_scs_flag flag, e_scs_flag flag_conditional, std::function<bool ( block_list&, status_change&, bool&, const sc_type, const status_change_entry& )> func_switch ){
|
|
// If starting and unconditional no further checks are needed
|
|
// If starting and unconditional no further checks are needed
|
|
- if( start && !scdb_main->state[flag_conditional] ){
|
|
|
|
|
|
+ if( start && scdb_main->state[flag] ){
|
|
restriction = true;
|
|
restriction = true;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -5510,17 +5510,18 @@ void status_calc_state_sub( block_list& bl, status_change& sc, bool start, std::
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- // If there is no restriction, skip the status change
|
|
|
|
- if( !scdb_other->state[flag] ){
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
// If it is unconditional we can already restore the restriction and return early
|
|
// If it is unconditional we can already restore the restriction and return early
|
|
- if( !scdb_other->state[flag_conditional] ){
|
|
|
|
|
|
+ if( scdb_other->state[flag] ){
|
|
restriction = true;
|
|
restriction = true;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // If there is no conditional restriction, skip the status change
|
|
|
|
+ if( !scdb_other->state[flag_conditional] ){
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Check the conditional restrictions
|
|
if( !func_switch( bl, sc, restriction, it.first, it.second ) ){
|
|
if( !func_switch( bl, sc, restriction, it.first, it.second ) ){
|
|
const char* constant_sc = script_get_constant_str( "SC_", it.first );
|
|
const char* constant_sc = script_get_constant_str( "SC_", it.first );
|
|
|
|
|
|
@@ -16193,6 +16194,40 @@ void StatusDatabase::loadingFinished(){
|
|
status->calc_flag |= this->SCB_ALL;
|
|
status->calc_flag |= this->SCB_ALL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ struct{
|
|
|
|
+ e_scs_flag unconditional;
|
|
|
|
+ const char* unconditional_str;
|
|
|
|
+ e_scs_flag conditional;
|
|
|
|
+ const char* conditional_str;
|
|
|
|
+ } scs_checks[] = {
|
|
|
|
+ { SCS_NOMOVE, QUOTE( SCS_NOMOVE ), SCS_NOMOVECOND, QUOTE( SCS_NOMOVECOND ) },
|
|
|
|
+ { SCS_NOPICKITEM, QUOTE( SCS_NOPICKITEM ), SCS_NOPICKITEMCOND, QUOTE( SCS_NOPICKITEMCOND ) },
|
|
|
|
+ { SCS_NODROPITEM, QUOTE( SCS_NODROPITEM ), SCS_NODROPITEMCOND, QUOTE( SCS_NODROPITEMCOND ) },
|
|
|
|
+ { SCS_NOCAST, QUOTE( SCS_NOCAST ), SCS_NOCASTCOND, QUOTE( SCS_NOCASTCOND ) },
|
|
|
|
+ { SCS_NOCHAT, QUOTE( SCS_NOCHAT ), SCS_NOCHATCOND, QUOTE( SCS_NOCHATCOND ) },
|
|
|
|
+ { SCS_NOEQUIPITEM, QUOTE( SCS_NOEQUIPITEM ), SCS_NOEQUIPITEMCOND, QUOTE( SCS_NOEQUIPITEMCOND ) },
|
|
|
|
+ { SCS_NOUNEQUIPITEM, QUOTE( SCS_NOUNEQUIPITEM ), SCS_NOUNEQUIPITEMCOND, QUOTE( SCS_NOUNEQUIPITEMCOND ) },
|
|
|
|
+ { SCS_NOCONSUMEITEM, QUOTE( SCS_NOCONSUMEITEM ), SCS_NOCONSUMEITEMCOND, QUOTE( SCS_NOCONSUMEITEMCOND ) },
|
|
|
|
+ { SCS_NOATTACK, QUOTE( SCS_NOATTACK ), SCS_NOATTACKCOND, QUOTE( SCS_NOATTACKCOND ) },
|
|
|
|
+ { SCS_NOWARP, QUOTE( SCS_NOWARP ), SCS_NOWARPCOND, QUOTE( SCS_NOWARPCOND ) },
|
|
|
|
+ { SCS_NODEATHPENALTY, QUOTE( SCS_NODEATHPENALTY ), SCS_NODEATHPENALTYCOND, QUOTE( SCS_NODEATHPENALTYCOND ) },
|
|
|
|
+ { SCS_NOINTERACT, QUOTE( SCS_NOINTERACT ), SCS_NOINTERACTCOND, QUOTE( SCS_NOINTERACTCOND ) }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ for( const auto& scs_check : scs_checks ){
|
|
|
|
+ if( status->state[scs_check.conditional] && status->state[scs_check.unconditional] ){
|
|
|
|
+ const char* constant = script_get_constant_str( "SC_", entry.first );
|
|
|
|
+
|
|
|
|
+ if( constant != nullptr ){
|
|
|
|
+ ShowWarning( "StatusDatabase::loadingFinished: %s and %s defined for status change \"%s\". Removing unconditional...\n", scs_check.conditional_str, scs_check.unconditional_str, constant );
|
|
|
|
+ }else{
|
|
|
|
+ ShowWarning( "StatusDatabase::loadingFinished: %s and %s defined for status change \"%d\". Removing unconditional...\n", scs_check.conditional_str, scs_check.unconditional_str, entry.first );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ status->state.reset( scs_check.conditional );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (status->type == SC_HALLUCINATION && !battle_config.display_hallucination) // Disable Hallucination.
|
|
if (status->type == SC_HALLUCINATION && !battle_config.display_hallucination) // Disable Hallucination.
|
|
status->icon = EFST_BLANK;
|
|
status->icon = EFST_BLANK;
|
|
|
|
|