bool Scene_Battle_Rpg2k3::ProcessBattleAction(Game_BattleAlgorithm::AlgorithmBase* action) { if (Game_Battle::IsBattleAnimationWaiting()) { return false; } Sprite_Battler* source_sprite; source_sprite = Game_Battle::GetSpriteset().FindBattler(action->GetSource()); if (source_sprite && !source_sprite->IsIdling()) { return false; } std::vector<Game_Battler*>::const_iterator it; switch (battle_action_state) { case BattleActionState_Start: ShowNotification(action->GetStartMessage()); if (!action->IsTargetValid()) { action->SetTarget(action->GetTarget()->GetParty().GetNextActiveBattler(action->GetTarget())); if (!action->IsTargetValid()) { // Nothing left to target, abort return true; } } //printf("Action: %s\n", action->GetSource()->GetName().c_str()); action->Execute(); if (action->GetTarget() && action->GetAnimation()) { Game_Battle::ShowBattleAnimation( action->GetAnimation()->ID, action->GetTarget()); } if (source_sprite) { source_sprite->Flash(Color(255, 255, 255, 100), 15); source_sprite->SetAnimationState( action->GetSourceAnimationState(), Sprite_Battler::LoopState_DefaultAnimationAfterFinish); } if (action->IsFirstAttack() && action->GetStartSe()) { Game_System::SePlay(*action->GetStartSe()); } battle_action_state = BattleActionState_Result; break; case BattleActionState_Result: do { if (!action->IsFirstAttack()) { action->Execute(); } else { std::vector<int16_t> states = action->GetSource()->NextBattleTurn(); } Sprite_Battler* target_sprite = Game_Battle::GetSpriteset().FindBattler(action->GetTarget()); if (action->IsSuccess() && target_sprite) { target_sprite->SetAnimationState(Sprite_Battler::AnimationState_Damage, Sprite_Battler::LoopState_DefaultAnimationAfterFinish); } action->Apply(); if (action->GetTarget()) { DrawFloatText( action->GetTarget()->GetBattleX(), action->GetTarget()->GetBattleY(), 0, action->IsSuccess() && action->GetAffectedHp() != -1 ? boost::lexical_cast<std::string>(action->GetAffectedHp()) : Data::terms.miss, 30); targets.push_back(action->GetTarget()); } status_window->Refresh(); } while (action->TargetNext()); if (action->GetResultSe()) { Game_System::SePlay(*action->GetResultSe()); } battle_action_wait = 30; battle_action_state = BattleActionState_Finished; break; case BattleActionState_Finished: if (battle_action_wait--) { return false; } battle_action_wait = 30; for (it = targets.begin(); it != targets.end(); it++) { if ((*it)->IsDead()) { if (action->GetDeathSe()) { Game_System::SePlay(*action->GetDeathSe()); } Sprite_Battler* target_sprite = Game_Battle::GetSpriteset().FindBattler(*it); if (target_sprite) { target_sprite->SetAnimationState(Sprite_Battler::AnimationState_Dead); } } } // Reset variables battle_action_state = BattleActionState_Start; targets.clear(); return true; } return false; }
bool Scene_Battle_Rpg2k3::ProcessBattleAction(Game_BattleAlgorithm::AlgorithmBase* action) { if (Main_Data::game_screen->IsBattleAnimationWaiting()) { return false; } Sprite_Battler* source_sprite; source_sprite = Game_Battle::GetSpriteset().FindBattler(action->GetSource()); if (source_sprite && !source_sprite->IsIdling()) { return false; } switch (battle_action_state) { case BattleActionState_Start: ShowNotification(action->GetStartMessage()); if (!action->IsTargetValid()) { action->SetTarget(action->GetTarget()->GetParty().GetNextActiveBattler(action->GetTarget())); } //printf("Action: %s\n", action->GetSource()->GetName().c_str()); action->Execute(); if (action->GetTarget() && action->GetAnimation()) { Main_Data::game_screen->ShowBattleAnimationBattle( action->GetAnimation()->ID, action->GetTarget()); } if (source_sprite) { source_sprite->Flash(Color(255, 255, 255, 100), 15); source_sprite->SetAnimationState( action->GetSourceAnimationState(), Sprite_Battler::LoopState_IdleAnimationAfterFinish); } if (action->IsFirstAttack() && action->GetStartSe()) { Game_System::SePlay(*action->GetStartSe()); } battle_action_state = BattleActionState_Result; break; case BattleActionState_Result: do { if (!action->IsFirstAttack()) { action->Execute(); } Sprite_Battler* target_sprite = Game_Battle::GetSpriteset().FindBattler(action->GetTarget()); if (action->IsSuccess() && target_sprite) { target_sprite->SetAnimationState(Sprite_Battler::AnimationState_Damage, Sprite_Battler::LoopState_IdleAnimationAfterFinish); } action->Apply(); if (action->GetTarget()) { DrawFloatText( action->GetTarget()->GetBattleX(), action->GetTarget()->GetBattleY(), 0, action->IsSuccess() && action->GetAffectedHp() != -1 ? boost::lexical_cast<std::string>(action->GetAffectedHp()) : Data::terms.miss, 30); } status_window->Refresh(); } while (action->TargetNext()); if (action->GetResultSe()) { Game_System::SePlay(*action->GetResultSe()); } battle_action_wait = 30; battle_action_state = BattleActionState_Finished; break; case BattleActionState_Finished: if (battle_action_wait--) { return false; } battle_action_wait = 30; if (action->GetTarget()) { Sprite_Battler* target_sprite = Game_Battle::GetSpriteset().FindBattler(action->GetTarget()); if (action->GetTarget()->IsDead()) { if (action->GetDeathSe()) { Game_System::SePlay(*action->GetDeathSe()); } if (target_sprite) { target_sprite->SetAnimationState(Sprite_Battler::AnimationState_Dead); } } else { if (target_sprite) { target_sprite->SetAnimationState(Sprite_Battler::AnimationState_Idle); } } } // Reset variables battle_action_state = BattleActionState_Start; return true; } return false; }