static public void Add(BattleMapEffectScriptConector a) { lock (battle_map_effect_script_conector_manager.lock_action_foreach) { a.Run(); battle_map_effect_script_conector_manager.scripts.Add(a); } }
// todo: 行動させるのと、UI制御が混ざってるので、分離したほうが良さそう // 行動の実行できるかどうかについても判定しているからややこしい(AIのところで食い違う…多重チェックになってる) public void DoAction(string command, string sub_command, Unit action_unit, int target_map_x, int target_map_y, bool is_user_owner) { var game_main = GameMain.GetInstance(); var user_interface = game_main.user_interface; var game_base = game_main.game_base; var g3d_map = game_main.g3d_map; var unit_manager = game_main.unit_manager; var target_unit = unit_manager.GetUnit(target_map_x, target_map_y); var is_inside = false; var action_data = ActionDataManager.GetActionData(command); if (!is_user_owner) { // 自動・NPCでの操作の場合 g3d_map.ClearRangeAreaEffect(); g3d_map.SetActionTargetAreaEffect(action_unit.map_x, action_unit.map_y, action_data.range_min, action_data.range_max, 1); is_inside = g3d_map.action_target_area.IsInside(target_map_x, target_map_y); } else { is_inside = g3d_map.action_target_area.IsInside(target_map_x, target_map_y); } var is_action_do_ok = false; switch (action_data.range_ok_type) { case "範囲内": // 範囲内しか行動の実行を認めない if (is_inside) { is_action_do_ok = true; } break; case "延長可": // 射程最小値より大きければ、射程最大値外でも行動の実行を認める //if (is_inside) action_do_ok = true; { var range = Math.Abs(target_map_x - action_unit.map_x) + Math.Abs(target_map_y - action_unit.map_y); if (range >= action_data.range_min) { is_action_do_ok = true; } } break; } if (!is_action_do_ok) { // 行動不可なので、中断 if (is_user_owner) { user_interface.SetMode(UserInterface.Mode.PlayerTurnFree, game_base.input.mouse_sutatus.position); g3d_map.ClearRangeAreaEffect(); } return; } // todo: 行動のモーション、サウンドに関わるため、一旦はこのまま(先に他を整理) switch (command) { default: // 対象が単体のものはこれでいけるはず { var damage = 0; var is_success = target_unit != null; if (is_success) { damage = GetDamage(action_unit, target_unit, action_data); } if (target_unit == null) { // ダミーの対象ユニットを作成しておく target_unit = new Unit(target_map_x, target_map_y); } else { // 攻撃の場合、ダメージでHPが0になる場合、この時点で、戦闘不能予約をしておく if (action_data.type == "攻撃") { var hp = target_unit.bt.status["HP"].now - damage; if (hp <= 0) { target_unit.bt.is_reserve_dead = true; } } } var action = new ScriptConector.BattleMapEffectScriptConector(action_data.script_path, is_success, damage, action_unit, target_unit); ScriptConector.BattleMapEffectScriptConectorManager.Add(action); } break; } if (is_user_owner) { user_interface.SetMode(UserInterface.Mode.PlayerTurnFree, game_base.input.mouse_sutatus.position); g3d_map.ClearRangeAreaEffect(); } // 手番ユニットの行動済みを設定 if (!game_main.debug_status.is_battle_ui_debug_mode) { turn_owner_unit.end_action = true; } }