Пример #1
0
        public override EActResults Do(Creature _creature)
        {
            var building = _creature[0, 0].InBuilding;

            if (building != null)
            {
                var coords = _creature[0, 0].WorldCoords;
                var p      = building.OutDoorWorldCoords.RandomItem(World.Rnd);
                if (_creature[p - coords].GetIsPassableBy(_creature) > 0)
                {
                    _creature.AddActToPool(new MoveToAct(), p);
                    return(EActResults.ACT_REPLACED);
                }
                return(EActResults.QUICK_FAIL);
            }
            return(EActResults.DONE);
        }
Пример #2
0
        public EActResults Open(Creature _creature, LiveMapCell _liveMapCell)
        {
            if (ELockType != ELockType.OPEN)
            {
                MessageManager.SendXMessage(this, new XMessage(EALTurnMessage.CREATURE_OPENS_IT, _creature, this));
                ELockType = ELockType.OPEN;

                var collection = GetItems(_creature);
                if (collection.Any)
                {
                    //обязать по любасу показать диалог выбора предметов
                    _creature.AddActToPool(new TakeAct(), true, collection.Items, _liveMapCell.LiveCoords);
                }
                else
                {
                    MessageManager.SendXMessage(this, new XMessage(EALTurnMessage.CONTAINER_IS_EMPTY, _creature, this));
                }

                return(EActResults.DONE);
            }
            throw new NotImplementedException();
        }
Пример #3
0
        public override EActResults Do(Creature _creature)
        {
            var intelligent = (Intelligent)_creature;
            var descriptors = GetParameter <EssenceDescriptor>().ToArray();

            if (descriptors.Length == 0)
            {
                MessageManager.SendMessage(this, new AskMessageNg(this, EAskMessageType.SELECT_THINGS_FROM_BACK_PACK, ESelectItemDialogBehavior.ALLOW_CHANGE_FILTER | ESelectItemDialogBehavior.SELECT_ONE));
                return(EActResults.NEED_ADDITIONAL_PARAMETERS);
            }

            if (descriptors.Length > 1)
            {
                foreach (var thingDescriptor in descriptors)
                {
                    _creature.AddActToPool(new DropAct(), thingDescriptor);
                }
                return(EActResults.QUICK_FAIL);
            }

            var descriptor = descriptors[0];

            if (descriptor == EssenceDescriptor.Empty)
            {
                return(EActResults.QUICK_FAIL);
            }

            var total = intelligent.GetBackPackItems().Where(_thingDescriptor => _thingDescriptor.Essence.GetName(_creature) == descriptor.Essence.GetName(_creature)).Count();

            if (total == 0)
            {
                throw new ApplicationException("в рюкзаке нет такого предмета");
            }
            if (total > 1)
            {
                int cnt;
                if (TryGetParameter(out cnt))
                {
                    Count = cnt;
                }
                else
                {
                    MessageManager.SendMessage(this, new AskMessageNg(this, EAskMessageType.HOW_MUCH, descriptor, total));
                    return(EActResults.NEED_ADDITIONAL_PARAMETERS);
                }
            }
            else
            {
                Count = 1;
            }
            var item = (Item)descriptor.Essence;

            for (var i = 0; i < Count; ++i)
            {
                intelligent.RemoveFromBackpack(item);
                _creature[0, 0].AddItem(item);
            }

            MessageManager.SendXMessage(this, new XMessage(EALTurnMessage.CREATURE_DROPS_IT, _creature, item, Count));
            return(EActResults.DONE);
        }
Пример #4
0
        public override EActResults Do(Creature _creature)
        {
            IEnumerable <Point> way;

            var max = int.MaxValue;

            TryGetParameter(out max);

            if (TryGetParameter(out way))
            {
                var result  = EActResults.DONE;
                var pnt     = way.First();
                var longWay = way.Count() > 1;
                foreach (var point in way)
                {
                    var dpoint = point - pnt;
                    if (dpoint != Point.Zero)
                    {
                        _creature.AddActToPool(new MoveAct(), dpoint, longWay);
                        result = EActResults.ACT_REPLACED;
                        max--;
                        if (max <= 0)
                        {
                            break;
                        }
                    }
                    pnt = point;
                }
                return(result);
            }

            Point target;

            if (!TryGetParameter(out target))
            {
                MessageManager.SendMessage(this, new AskMessageNg(this, EAskMessageType.ASK_DESTINATION));
                return(EActResults.NEED_ADDITIONAL_PARAMETERS);
            }

            var current = _creature[0, 0].WorldCoords;

            if (target == current)
            {
                return(EActResults.QUICK_FAIL);
            }
            var nextPoint = current.GetLineToPoints(target).ToArray()[1];
            var delta     = nextPoint - current;
            var nextCell  = _creature[delta];

            if (nextCell.GetIsPassableBy(_creature) > 0)
            {
                _creature.AddActToPool(new MoveAct(), delta);
                return(EActResults.ACT_REPLACED);
            }
            if (nextCell.Thing != null && nextCell.Thing.Is <ClosedDoor>())
            {
                _creature.AddActToPool(new OpenAct(), delta);
                return(EActResults.ACT_REPLACED);
            }
            return(EActResults.FAIL);
        }
Пример #5
0
        public override EActResults Do(Creature _creature)
        {
            Point delta;

            if (!TryGetParameter(out delta))
            {
                delta = KeyTranslator.GetDirection(GetFirstParameter <ConsoleKey>());
            }

            if (delta.QLenght > 1)
            {
                throw new ApplicationException("Элементарное перемещение длиннее чем 1");
            }

            if (delta == Point.Zero)
            {
                _creature.AddActToPool(new WaitAct());
                return(EActResults.ACT_REPLACED);
            }

            var cell = _creature[delta];

            if (cell.GetIsPassableBy(_creature) > 0)
            {
                World.TheWorld.CreatureManager.MoveCreatureOnDelta(_creature, delta);

                var mess = "";
                if (_creature.IsAvatar)
                {
                    var thing = cell.Thing;
                    if (thing != null)
                    {
                        mess += EALSentence.NONE.GetString(thing.GetName(_creature));
                    }
                    var items = cell.Items.ToArray();
                    if (items.Length > 0)
                    {
                        if (items.Length == 1)
                        {
                            mess += (mess == "" ? "" : ", ") + EALSentence.NONE.GetString(items[0].GetName(_creature));
                        }
                        else
                        {
                            mess += (mess == "" ? "" : ", ") + "вещи";
                        }
                    }
                    if (mess != "")
                    {
                        MessageManager.SendMessage(this, mess);
                    }
                }
                return(EActResults.DONE);
            }
            {
                var thing = cell.Thing;
                if (thing != null && thing.Is <ClosedDoor>() && thing.IsLockedFor(cell, _creature))
                {
                    _creature.InsertActToPool(new OpenAct(), delta);
                    return(EActResults.ACT_REPLACED);
                }

                if (_creature.IsAvatar)
                {
                    var      creature = cell.Creature;
                    XMessage mess;
                    if (creature != null && World.TheWorld.Avatar.Tactic != ETactics.PEACEFULL)
                    {
                        bool isMoveToAct;
                        if (!TryGetParameter(out isMoveToAct) || !isMoveToAct)
                        {
                            _creature.AddActToPool(new AtackAct(), delta);
                            return(EActResults.ACT_REPLACED);

                            ////Если это не перемещение на дальнее расстояние
                            //return World.TheWorld.BattleProcessor.Atack(_creature, creature);
                        }
                    }
                    else
                    {
                        if (creature != null)
                        {
                            mess = new XMessage(EALTurnMessage.CELL_IS_OCCUPIED_BY, _creature, creature);
                        }
                        else if (thing != null)
                        {
                            mess = new XMessage(EALTurnMessage.CELL_IS_OCCUPIED_BY, _creature, thing);
                        }
                        else
                        {
                            mess = new XMessage(EALTurnMessage.CELL_IS_OCCUPIED_BY, _creature, cell.Terrain.AsNoun());
                        }
                        MessageManager.SendXMessage(this, mess);
                    }
                }
                return(EActResults.QUICK_FAIL);
            }
        }
Пример #6
0
        public override EActResults Do(Creature _creature)
        {
            var intelligent = (Intelligent)_creature;
            var notTaken    = _creature.GetNotTakenAvailableItems(GetParameter <Point>().ToArray());

            if (!notTaken.Any())
            {
                // Если ничего не доступно
                if (_creature.IsAvatar)
                {
                    MessageManager.SendMessage(this, new SimpleTextMessage(EMessageType.INFO, "тут ничего нет."));
                }
                return(EActResults.QUICK_FAIL);
            }

            var toTake = GetParameter <EssenceDescriptor>().ToList();

            if (toTake.Any(_thingDescriptor => _thingDescriptor == EssenceDescriptor.Empty))
            {
                return(EActResults.QUICK_FAIL);
            }

            if (toTake.Count == 0)
            {
                // Если в параметрах нет уточнений
                var ask = new AskMessageNg(this, EAskMessageType.SELECT_THINGS, ESelectItemDialogBehavior.SELECT_MULTIPLE | ESelectItemDialogBehavior.ALLOW_CHANGE_FILTER);
                foreach (var essenceDescriptor in notTaken)
                {
                    ask.AddParameter(essenceDescriptor);
                }
                if (notTaken.Count() == 1)
                {
                    var needToShow = GetParameter <bool>().ToArray();
                    if (needToShow.Length > 0 && needToShow[0])
                    {
                        MessageManager.SendMessage(this, ask);
                        return(EActResults.NEED_ADDITIONAL_PARAMETERS);
                    }

                    toTake.AddRange(notTaken);
                }
                else
                {
                    //получаем все возможные координаты ячеек, где лежат не взятые предметы, ограничив параметром направления, если таковой представлен
                    var coords = notTaken.Select(_descriptor => _descriptor.LiveCoords).Distinct();
                    if (coords.Count() > 1)
                    {
                        MessageManager.SendMessage(this, new AskMessageNg(this, EAskMessageType.ASK_DIRECTION));
                    }
                    else
                    {
                        MessageManager.SendMessage(this, ask);
                    }
                    return(EActResults.NEED_ADDITIONAL_PARAMETERS);
                }
            }

            if (toTake.Count > 1)
            {
                foreach (var descr in toTake)
                {
                    _creature.AddActToPool(new TakeAct(), GetParameter <Point>(), descr);
                }
                return(EActResults.ACT_REPLACED);
            }

            var descriptor = toTake[0];
            var thing      = descriptor.Essence;

            Item[] get;
            if (descriptor.Container == null)
            {
                get = World.TheWorld.LiveMap.GetCell(descriptor.LiveCoords).Items.Where(_item => _item.Equals(thing)).ToArray();
            }
            else
            {
                get = descriptor.Container.GetItems(_creature).Items.Where(_item => _item.Equals(thing)).ToArray();
            }

            if (get.Count() > 1)
            {
                var cnt = GetParameter <int>().ToArray();
                if (cnt.Length > 0)
                {
                    Count = cnt[0];
                }
                else
                {
                    MessageManager.SendMessage(this, new AskMessageNg(this, EAskMessageType.HOW_MUCH, descriptor, get.Count()));
                    return(EActResults.NEED_ADDITIONAL_PARAMETERS);
                }
            }

            for (var i = 0; i < Count; ++i)
            {
                if (descriptor.Container == null)
                {
                    World.TheWorld.LiveMap.GetCell(descriptor.LiveCoords).RemoveItem((Item)thing);
                }
                else
                {
                    descriptor.Container.GetItems(_creature).Remove((Item)thing);
                }
            }

            for (var i = 0; i < Count; ++i)
            {
                intelligent.ObjectTaken((Item)thing);
            }

            MessageManager.SendXMessage(this, new XMessage(EALTurnMessage.CREATURE_TAKES_IT, _creature, thing, Count));

            return(EActResults.DONE);
        }