Example #1
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;
		}
Example #2
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;
		}
		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;
		}
Example #4
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();
		}
Example #5
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;
		}
Example #6
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;
			}
		}