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); }
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(); }
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); }
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); }
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); } }
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); }