//the intention, and its result to that frame //"choose the action to partake in" public IEnumerator <YieldInstruction> ProcessInput(GameAction action, Character character, ActionResult result) { //translates commands into actions if (character.AttackOnly && character.CantWalk && action.Type == GameAction.ActionType.Wait) { action = new GameAction(GameAction.ActionType.Attack, action.Dir); } ProcessDir(action.Dir, character); switch (action.Type) { case GameAction.ActionType.Dir: { //result.Success = ActionResult.ResultType.Success; break; } case GameAction.ActionType.Wait: { result.Success = ActionResult.ResultType.TurnTaken; //if it's a team character and it's team mode, wait a little while if (DataManager.Instance.Save.TeamMode && character.MemberTeam == ActiveTeam) { DungeonScene.Instance.LogMsg(Text.FormatKey("MSG_SKIP_TURN", character.GetDisplayName(false)), false, true); yield return(new WaitForFrames(GameManager.Instance.ModifyBattleSpeed(20))); } else if (character == FocusedCharacter) //add just one little wait to slow down the turn-passing when no enemies are in view { yield return(new WaitForFrames(1)); //this will cause 1-frame breaks when waiting with walking characters in view, but it's barely noticable } yield return(CoroutineManager.Instance.StartCoroutine(FinishTurn(character, true, false, false))); break; } case GameAction.ActionType.Move: { yield return(CoroutineManager.Instance.StartCoroutine(ProcessWalk(character, (action[0] == 1), result))); break; } case GameAction.ActionType.Pickup: { yield return(CoroutineManager.Instance.StartCoroutine(ProcessPickup(character, result))); break; } case GameAction.ActionType.Drop: { //takes an index argument //[0] = item slot to use (-1 for the held item) yield return(CoroutineManager.Instance.StartCoroutine(ProcessPlaceItem(character, action[0], result))); break; } case GameAction.ActionType.Give: { //[0] = item slot to use (-1 for the ground item) //[1] = who to give it to (-1 for the user) yield return(CoroutineManager.Instance.StartCoroutine(ProcessGiveItem(character, action[0], action[1], result))); break; } case GameAction.ActionType.Take: { //[0] = team slot to take from yield return(CoroutineManager.Instance.StartCoroutine(ProcessTakeItem(character, action[0], result))); break; } case GameAction.ActionType.Tile: { yield return(CoroutineManager.Instance.StartCoroutine(ProcessTileInteract(character, result))); break; } case GameAction.ActionType.Attack: { yield return(CoroutineManager.Instance.StartCoroutine(ProcessObjectInteract(character, result))); break; } case GameAction.ActionType.UseSkill: { yield return(CoroutineManager.Instance.StartCoroutine(ProcessUseSkill(character, action[0], result))); break; } case GameAction.ActionType.UseItem: { //[0] = item slot to use (-1 for held item, -2 for the ground item) //[1] = who to use it on (-1 for the user) //others: which slot to delete, //which intrinsic to have, which team member/item to send in, etc. yield return(CoroutineManager.Instance.StartCoroutine(ProcessUseItem(character, action[0], action[1], result))); break; } case GameAction.ActionType.Throw: { //[0] = item slot to use (-1 for held item, -2 for the ground item) yield return(CoroutineManager.Instance.StartCoroutine(ProcessThrowItem(character, action[0], result))); break; } case GameAction.ActionType.TeamMode: { yield return(CoroutineManager.Instance.StartCoroutine(ToggleTeamMode(result))); break; } case GameAction.ActionType.ShiftTeam: { result.Success = ActionResult.ResultType.Success; SwitchTeam(action[0]); break; } case GameAction.ActionType.SetLeader: { yield return(CoroutineManager.Instance.StartCoroutine(MakeLeader(action[0], result))); break; } case GameAction.ActionType.SendHome: { result.Success = ActionResult.ResultType.Success; yield return(CoroutineManager.Instance.StartCoroutine(SendHome(action[0]))); break; } case GameAction.ActionType.GiveUp: { result.Success = ActionResult.ResultType.Success; yield return(CoroutineManager.Instance.StartCoroutine(GameManager.Instance.EndSegment((GameProgress.ResultType)action[0]))); break; } case GameAction.ActionType.Tactics: { result.Success = ActionResult.ResultType.Success; //saves all the settings to the characters for (int ii = 0; ii < ActiveTeam.Players.Count; ii++) { int choice = action[ii]; Character target = ActiveTeam.Players[ii]; AITactic tactic = DataManager.Instance.GetAITactic(choice); if (tactic.ID != target.Tactic.ID) { target.Tactic = new AITactic(tactic); } target.Tactic.Initialize(target); } break; } case GameAction.ActionType.SetSkill: { result.Success = ActionResult.ResultType.Success; Skill skill = ActiveTeam.Players[action[0]].Skills[action[1]].Element; skill.Enabled = !skill.Enabled; break; } case GameAction.ActionType.ShiftSkill: { result.Success = ActionResult.ResultType.Success; ActiveTeam.Players[action[0]].SwitchSkills(action[1]); break; } case GameAction.ActionType.SortItems: { result.Success = ActionResult.ResultType.Success; ActiveTeam.SortItems(); break; } default: { throw new Exception("Undefined Command: " + action.Type); } } }