예제 #1
0
        public override StateOperationResult OnSelectPosition(FDPosition position)
        {
            FDCreature creature = gameAction.GetCreatureAt(position);

            if (creature == null)
            {
                // Empty space, show system menu
                MenuSystemState state = new MenuSystemState(gameAction, position);
                return(new StateOperationResult(StateOperationResult.ResultType.Push, state));
            }
            else if (creature.IsActionable())
            {
                // Actionable friend
                ShowMoveRangeState nextState = new ShowMoveRangeState(gameAction, creature);
                return(new StateOperationResult(StateOperationResult.ResultType.Push, nextState));
            }
            else
            {
                // Show creature information
                CreatureShowInfoPack pack = new CreatureShowInfoPack(creature.Clone(), CreatureInfoType.View);
                var gameCallback          = gameAction.GetCallback();
                gameCallback.OnHandlePack(pack);

                return(new StateOperationResult(StateOperationResult.ResultType.None));
            }
        }
예제 #2
0
        private StateOperationResult OnMagicSelected(int index)
        {
            Debug.Log("MenuActionState: OnMagicSelected.");
            if (index < 0 || index >= this.Creature.Data.Magics.Count)
            {
                // Cancelled
                return(StateOperationResult.Pop());
            }

            int             magicId         = this.Creature.Data.Magics[index];
            MagicDefinition magicDefinition = DefinitionStore.Instance.GetMagicDefinition(magicId);

            if (magicDefinition != null && this.Creature.Data.CanSpellMagic() && magicDefinition.MpCost <= this.Creature.Data.Mp)
            {
                // Enough MP to spell
                SelecteMagicTargetState magicTargetState = new SelecteMagicTargetState(gameAction, this.Creature, magicDefinition);
                return(StateOperationResult.Push(magicTargetState));
            }
            else
            {
                // Go back to open magic info
                CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectMagic);
                SendPack(pack);

                return(StateOperationResult.None());
            }
        }
예제 #3
0
        public override StateOperationResult OnSelectPosition(FDPosition position)
        {
            if (range == null || !range.Contains(position))
            {
                return(StateOperationResult.Pop());
            }

            // No creature or not a friend/NPC
            FDCreature targetCreature = this.gameAction.GetCreatureAt(position);

            if (targetCreature == null || targetCreature.Faction == Definitions.CreatureFaction.Enemy)
            {
                return(StateOperationResult.None());
            }

            if (!targetCreature.Data.IsItemsFull())
            {
                gameAction.DoCreatureExchangeItem(this.CreatureId, this.SelectedItemIndex, targetCreature.CreatureId);
                return(StateOperationResult.Clear());
            }
            else
            {
                subState            = SubState.SelectExchangeItem;
                this.TargetCreature = targetCreature;
                CreatureShowInfoPack pack = new CreatureShowInfoPack(targetCreature, CreatureInfoType.SelectAllItem);
                SendPack(pack);

                return(StateOperationResult.None());
            }
        }
예제 #4
0
        private static ActivityBase BuildShowCreatureInfoActivity(CreatureShowInfoPack pack)
        {
            if (pack == null)
            {
                throw new ArgumentNullException("pack");
            }

            FDCreature creature = pack.Creature;

            CreatureDialog.ShowType showType = CreatureDialog.ShowType.SelectAllItem;
            switch (pack.InfoType)
            {
            case CreatureInfoType.SelectAllItem:
                showType = CreatureDialog.ShowType.SelectAllItem;
                break;

            case CreatureInfoType.SelectEquipItem:
                showType = CreatureDialog.ShowType.SelectEquipItem;
                break;

            case CreatureInfoType.SelectUseItem:
                showType = CreatureDialog.ShowType.SelectUseItem;
                break;

            case CreatureInfoType.SelectMagic:
                showType = CreatureDialog.ShowType.SelectMagic;
                break;

            case CreatureInfoType.View:
                showType = CreatureDialog.ShowType.ViewItem;
                break;

            default:
                showType = CreatureDialog.ShowType.SelectAllItem;
                break;
            }

            CallbackActivity activity = new CallbackActivity(
                (gameInterface) => { gameInterface.ShowCreatureDialog(pack.Creature, showType); });

            if (pack.InfoType == CreatureInfoType.View && creature.Data.HasMagic())
            {
                SequenceActivity sequenceActivity = new SequenceActivity();
                sequenceActivity.Add(activity);

                CallbackActivity activity2 = new CallbackActivity(
                    (gameInterface) => { gameInterface.ShowCreatureDialog(pack.Creature, CreatureDialog.ShowType.ViewMagic); });

                sequenceActivity.Add(activity2);
                return(sequenceActivity);
            }

            return(activity);
        }
예제 #5
0
        public MenuActionState(IGameAction gameAction, int creatureId, FDPosition position)
            : base(gameAction, position)
        {
            this.CreatureId = creatureId;
            this.Creature   = gameAction.GetCreature(creatureId);

            // Magic
            this.SetMenu(0, MenuItemId.ActionMagic, IsMenuMagicEnabled(), () =>
            {
                CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectMagic);
                gameAction.GetCallback().OnHandlePack(pack);

                subState = SubActionState.SelectMagic;
                return(StateOperationResult.None());
            });

            // Attack
            this.SetMenu(1, MenuItemId.ActionAttack, IsMenuAttackEnabled(), () =>
            {
                SelectAttackTargetState attackState = new SelectAttackTargetState(gameAction, this.Creature);
                return(StateOperationResult.Push(attackState));
            });

            // Item
            this.SetMenu(2, MenuItemId.ActionItems, IsMenuItemEnabled(), () =>
            {
                MenuItemState itemState = new MenuItemState(gameAction, this.CreatureId, this.Central);
                return(StateOperationResult.Push(itemState));
            });

            // Rest
            this.SetMenu(3, MenuItemId.ActionRest, true, () =>
            {
                // Check Treasure
                treasureItem = gameAction.GetTreatureAt(this.Creature.Position);
                if (treasureItem != null)
                {
                    subState = SubActionState.ConfirmPickTreasure;
                    return(StateOperationResult.None());
                }

                gameAction.DoCreatureRest(this.CreatureId);
                return(StateOperationResult.Clear());
            });
        }
예제 #6
0
        public MenuItemState(IGameAction gameAction, int creatureId, FDPosition position) : base(gameAction, position)
        {
            this.CreatureId = creatureId;
            this.Creature   = gameAction.GetCreature(creatureId);

            // Exchange
            this.SetMenu(0, MenuItemId.ItemExchange, IsMenuExchangeEnabled(), () =>
            {
                CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectAllItem);
                SendPack(pack);

                subState = SubActionState.SelectExchangeItem;
                return(StateOperationResult.None());
            });

            // Use
            this.SetMenu(1, MenuItemId.ItemUse, IsMenuUseEnabled(), () =>
            {
                CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectUseItem);
                SendPack(pack);

                subState = SubActionState.SelectUseItem;
                return(StateOperationResult.None());
            });

            // Equip
            this.SetMenu(2, MenuItemId.ItemEquip, IsMenuEquipEnabled(), () =>
            {
                CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectEquipItem);
                SendPack(pack);

                subState = SubActionState.SelectEquipItem;
                return(StateOperationResult.None());
            });

            // Discard
            this.SetMenu(3, MenuItemId.ItemDiscard, IsMenuDiscardEnabled(), () =>
            {
                CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectAllItem);
                SendPack(pack);

                subState = SubActionState.SelectDiscardItem;
                return(StateOperationResult.None());
            });
        }
예제 #7
0
        private StateOperationResult OnSelectedEquipItem(int index)
        {
            if (index < 0)
            {
                // Cancel the selection
                return(StateOperationResult.None());
            }

            this.Creature.Data.EquipItemAt(index);

            // Reopen the item dialog
            CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectEquipItem);

            SendPack(pack);

            subState = SubActionState.SelectEquipItem;
            return(StateOperationResult.None());
        }
예제 #8
0
        private StateOperationResult OnExchangeTreasureConfirmed(int index)
        {
            if (index == 0)
            {
                // Put it back
                TalkPack talkPack = new TalkPack(this.Creature.Clone(), MessageId.Create(MessageId.MessageTypes.Message, 7));
                SendPack(talkPack);

                gameAction.DoCreatureRest(this.CreatureId);
                return(StateOperationResult.Clear());
            }

            subState = SubActionState.ConfirmExchangeSelecting;
            CreatureShowInfoPack pack = new CreatureShowInfoPack(this.Creature, CreatureInfoType.SelectAllItem);

            SendPack(pack);

            return(StateOperationResult.None());
        }