Exemple #1
0
        //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);
            }
            }
        }