예제 #1
0
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;
}