public void RemoveEntityAt(FEntity entity) { FEvent loc = entity.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); string key = ((int)loc.Get("x")) + "," + ((int)loc.Get("y")); if (!entityLocationMap.ContainsKey(key)) { // Debug.Log("Could not find item"); return; } entityLocationMap[key].Remove(entity); }
public bool TryMoveEntity(FEntity ch, int tox, int toy) { FEvent moveIntoEvent = new FEvent(FEventCodes.ENTITY_TRY_MOVE_INTO); moveIntoEvent.Add("x", tox); moveIntoEvent.Add("y", toy); moveIntoEvent.Add("entity", ch); moveIntoEvent.Add("moveCancelled", false); FEvent loc1 = ch.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); int dist = Mathf.Max(Mathf.Abs((int)loc1.Get("x") - tox), Mathf.Abs((int)loc1.Get("y") - toy)); if (dist > 1) { Debug.Log(loc1.Get("x") + "," + loc1.Get("y")); List <MapTile> tiles = GameMap.instance.PathToFrom((int)loc1.Get("x"), (int)loc1.Get("y"), tox, toy); Debug.Log(tiles[0].x + "," + tiles[0].y); return(TryMoveEntity(ch, tiles[0].x, tiles[0].y)); } List <FEntity> entitiesAtNewLocation = map.GetEntitiesAt(tox, toy); foreach (FEntity entity in entitiesAtNewLocation) { moveIntoEvent = entity.PropagateEvent(moveIntoEvent); } if ((bool)moveIntoEvent.Get("moveCancelled")) { //Nope if (moveIntoEvent.Get("moveBlockedByEntity") != null) { //End turn FEntity entity = (FEntity)moveIntoEvent.Get("blockingEntity"); FEvent meleeAttack = ch.PropagateEvent(new FEvent(FEventCodes.ENTITY_MELEE_ATTACK, "target", entity, "damage", 0)); } EndTurn(); return(false); } FEvent moveEvent = new FEvent(FEventCodes.ENTITY_MOVE); moveEvent.Add("x", tox); moveEvent.Add("y", toy); moveEvent = ch.PropagateEvent(moveEvent); EndTurn(); return(true); }
public void RefreshWindow(List <FEntity> entities) { int num = 1; entityList = entities; if (texts != null) { for (int i = 0; i < texts.Count; i++) { Destroy(texts[i].gameObject); } } texts = new List <TMPro.TextMeshProUGUI>(); foreach (FEntity entity in entities) { TMPro.TextMeshProUGUI textEntry = Instantiate(itemPrefab); texts.Add(textEntry); FEvent name = entity.PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME)); textEntry.text = num + ". " + name.Get("fullstring") as string; textEntry.rectTransform.parent = listParent; textEntry.color = normalColor; num++; } }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_RECEIVE_MAGICAL_ATTACK) { if (ev.data.ContainsKey("type")) { if ((Stat.ELEMENT)ev.Get("type") == eLEMENT) { int dmg = (int)ev.Get("damage"); dmg = (int)Mathf.Round((float)dmg * modifier); ev.Set("damage", dmg); } } } return(ev); }
public void UpdateInterface() { StatBlockComponent stats = playerEntity.GetComponent <StatBlockComponent>(); hpText.text = "HP: " + stats.hp + "/" + stats.max_hp; FEvent list = playerEntity.PropagateEvent(new FEvent(FEventCodes.GET_WIELDED_LIST, "list", new List <FEntity>())); List <FEntity> items = list.Get("list") as List <FEntity>; string listOfItems = ""; for (int i = 0; i < items.Count; i++) { string nameOfItem = items[i].PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME)).Get("name") as string; listOfItems += nameOfItem; if (i < items.Count - 1) { listOfItems += ", "; } } wieldingText.text = "Equipped: " + listOfItems; FEvent groundList = GameMap.instance.PropagateEventToTile(new FEvent(FEventCodes.GET_VISIBLE_LIST, "list", new List <string>()), playerEntity); List <string> onFloor = groundList.Get("list") as List <string>; string listOnFloor = ""; for (int i = 0; i < onFloor.Count; i++) { listOnFloor += onFloor[i]; if (i < onFloor.Count - 1) { listOnFloor += ", "; } } onGroundText.text = "Here: " + listOnFloor; }
public override FEvent PropagateEvent(FEvent e) { if (e.eventName == FEventCodes.ENTITY_MELEE_ATTACK) { int dmg = e.Get("damage") == null ? 0 : (int)e.Get("damage"); dmg += damage; e.Set("damage", dmg); } if (e.eventName == FEventCodes.THROWN) { //Collect a damage event as if we were attacking? FEvent attack = parentEntity.PropagateEvent(new FEvent(FEventCodes.ENTITY_MELEE_ATTACK)); GameMap.instance.PropagateEventToTile(new FEvent(FEventCodes.ENTITY_RECEIVE_THROWN_ATTACK, "attacker", this.parentEntity, "damage", (int)attack.Get("damage")), parentEntity, true); } return(e); }
public void SelectInventoryItem(int item) { if (item < 1 || item > inventory.Count) { return; } else { //Get affordances FEvent getaffs = inventory[item - 1].PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_AFFORDANCES, "list", new List <string>())); List <string> affs = getaffs.Get("list") as List <string>; string suff = ""; for (int i = 0; i < affs.Count; i++) { if (i == 0) { suff += " ("; } suff += affs[i]; if (i < affs.Count - 1) { suff += ", "; } else { suff += ")"; } } selectedIndex = item; //Select the item ItemListWindow.instance.SelectItem(item - 1, suff); selectedInventoryItem = inventory[item - 1]; } }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_MELEE_ATTACK) { FEntity target = (FEntity)ev.Get("target"); FEvent nameEvent = parentEntity.PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME, "name", "????")); string ourName = (string)nameEvent.Get("fullstring"); nameEvent = target.PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME, "name", "????")); string theirName = (string)nameEvent.Get("fullstring"); MessageLog.instance.Log(ourName + " attacks the " + theirName + "!"); target.PropagateEvent(new FEvent(FEventCodes.ENTITY_RECEIVE_MELEE_ATTACK, "attacker", this.parentEntity, "damage", (int)ev.Get("damage"))); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.GET_ENTITY_AFFORDANCES) { List <string> affs = ev.Get("list") as List <string>; affs.Add("[t]hrow"); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_RECEIVE_MELEE_ATTACK) { FEntity attacker = ev.Get("attacker") as FEntity; attacker.PropagateEvent(new FEvent(FEventCodes.ENTITY_RECEIVE_MAGICAL_ATTACK, "damage", thornsAmount, "attacker", parentEntity, "element", Stat.ELEMENT.NONE)); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.GET_ALL_PICKABLES) { List <FEntity> l = ev.Get("items") as List <FEntity>; l.Add(parentEntity); ev.Set("items", l); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_MELEE_ATTACK) { FEntity target = ev.Get("target") as FEntity; target.PropagateEvent(new FEvent(FEventCodes.INFLICT_BLEEDING)); } return(ev); }
public int StraightLineDistanceBetween(FEntity e1, FEntity e2) { // LocationComponent l1 = e1.GetComponent<LocationComponent>(); // LocationComponent l2 = e2.GetComponent<LocationComponent>(); FEvent loc1 = e1.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); FEvent loc2 = e2.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); return(Mathf.Max(Mathf.Abs(((int)loc1.Get("x") - ((int)loc2.Get("x")))), ((int)loc1.Get("y") - ((int)loc2.Get("y"))))); // return (e1.gameObject.transform.position-e2.gameObject.transform.position).magnitude; }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.GET_ENTITY_NAME) { FEvent mods = parentEntity.PropagateEvent(new FEvent(FEventCodes.GET_NAME_MODIFIERS, "prefixes", new List <string>(), "suffixes", new List <string>())); string pref = ""; foreach (string s in mods.Get("prefixes") as List <string> ) { pref += s + " "; } string suff = ""; foreach (string s in mods.Get("suffixes") as List <string> ) { suff += s + " "; } ev.Set("name", pref + _name + suff); ev.Set("namecolor", hexColor); ev.Set("fullstring", pref + "<#" + hexColor + ">" + _name + "<#ffffff>" + suff); } if (ev.eventName == FEventCodes.GET_VISIBLE_LIST) { FEvent mods = parentEntity.PropagateEvent(new FEvent(FEventCodes.GET_NAME_MODIFIERS, "prefixes", new List <string>(), "suffixes", new List <string>())); string pref = ""; foreach (string s in mods.Get("prefixes") as List <string> ) { pref += s + " "; } string suff = ""; foreach (string s in mods.Get("suffixes") as List <string> ) { suff += s + " "; } if (suff.Length > 0) { suff = " " + suff; } List <string> list = ev.Get("list") as List <string>; list.Add(pref + "<#" + hexColor + ">" + _name + "<#ffffff>" + suff); ev.Set("list", list); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (dead && ev.eventName == FEventCodes.GET_NAME_MODIFIERS) { List <string> ss = (ev.Get("suffixes") as List <string>); ss.Add("(dead)"); ev.Set("suffixes", ss); } if (dead) { return(ev); } if (ev.eventName == FEventCodes.ENTITY_TRY_MOVE_INTO) { FEntity mover = (FEntity)ev.Get("entity"); //If the player tries to move into us, fight them if (mover.HasComponent(typeof(PlayerComponent))) { //Request attack ev.Set("moveBlockedByEntity", true); ev.Set("moveCancelled", true); ev.Set("blockingEntity", this.parentEntity); return(ev); } else { ev.Set("moveCancelled", true); } } else if (ev.eventName == FEventCodes.ENTITY_DIED) { //Change the avatar dead = true; parentEntity.PropagateEvent(new FEvent(FEventCodes.CHANGE_SPRITE, "spriteName", deathSpriteName)); parentEntity.PropagateEvent(new FEvent(FEventCodes.CHANGE_SPRITE_LAYER, "spriteLayer", Model.instance.backgroundLayerName)); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_MELEE_ATTACK) { if (Random.Range(0f, 1f) < disarmChance) { (ev.Get("target") as FEntity).PropagateEvent(new FEvent(FEventCodes.DISARM_WEAPON)); } } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.PICKED_UP) { spriteRenderer.enabled = false; } if (ev.eventName == FEventCodes.THROWN || ev.eventName == FEventCodes.DROP_ITEM_HERE) { spriteRenderer.enabled = true; } if (ev.eventName == FEventCodes.CHANGE_SPRITE) { SetSprite((string)ev.Get("spriteName")); } if (ev.eventName == FEventCodes.CHANGE_SPRITE_LAYER) { SetSpriteLayer((string)ev.Get("spriteLayer")); } return(ev); }
public void ShowInventory() { FEvent getInventory = playerEntity.PropagateEvent(new FEvent(FEventCodes.GET_CARRIED_LIST, "list", new List <FEntity>())); List <FEntity> inventoryOptions = getInventory.Get("list") as List <FEntity>; FEvent wieldedList = playerEntity.PropagateEvent(new FEvent(FEventCodes.GET_WIELDED_LIST, "list", new List <FEntity>())); inventory = new List <FEntity>(); inventory.AddRange(wieldedList.Get("list") as List <FEntity>); inventory.AddRange(inventoryOptions); ItemListWindow.instance.OpenWindow("Inventory", "Number: Select\tESC: Close", inventory); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_MELEE_ATTACK) { int dmg = ev.Get("damage") == null ? 0 : (int)ev.Get("damage"); dmg -= penalty; ev.Set("damage", dmg); } /* * I think this is the only example of this in the game, but I like it a lot. * Rusty weapons are called "Rusty <name>" and the word rusty is in a nice brown. Mmm! */ if (ev.eventName == FEventCodes.GET_NAME_MODIFIERS) { List <string> ps = (ev.Get("prefixes") as List <string>); ps.Add("<#AB5236>rusty<#ffffff>"); ev.Set("prefixes", ps); } return(ev); }
public void SelectItem(int item, string suffix = "") { if (selected > -1) { texts[selected].color = normalColor; FEvent name = entityList[selected].PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME)); texts[selected].text = (selected + 1) + ". " + name.Get("fullstring") as string; } selected = item; texts[selected].color = selectedColor; texts[selected].text = texts[selected].text + suffix; }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_RECEIVE_MELEE_ATTACK || ev.eventName == FEventCodes.ENTITY_RECEIVE_THROWN_ATTACK) { int dmg = (int)ev.Get("damage"); dmg -= damageReduction; dmg = dmg < 0 ? 0 : dmg; ev.Set("damage", dmg); } return(ev); }
/* * Potions were one of the last things I implemented before stopping on the example. This is a good example of a branch * point for detail in an ECS. A potion could be a container filled with a liquid, and the liquid has effects when it * touches things (the floor, a human, a zombie). However that felt too detailed/granular, so instead potions are things * that can be drunk or thrown, and then apply affects to the things they're drunk by or thrown at. So you can't find * a fountain of healing liquid or find someone who cries tears of healing (or maybe you could but it'd be another case * rather than reusing the same healing liquid in a new context). */ public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.DRINK) { //INGEST FEntity drinker = ev.Get("drinker") as FEntity; drinker.PropagateEvent(new FEvent(FEventCodes.HEAL_HP, "amount", 5)); } else if (ev.eventName == FEventCodes.CONTAINER_BREAK) { //BROKE GameMap.instance.PropagateEventToTile(new FEvent(FEventCodes.HEAL_HP, "amount", 5), parentEntity, true); } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.ENTITY_MELEE_ATTACK && Random.Range(0f, 1f) < mugChance) { FEntity target = (FEntity)ev.Get("target"); List <FEntity> targetCarries = target.PropagateEvent(new FEvent(FEventCodes.GET_CARRIED_LIST, "list", new List <FEntity>())).Get("list") as List <FEntity>; if (targetCarries.Count > 0) { FEntity stolenItem = targetCarries[Random.Range(0, targetCarries.Count)]; //Take the item target.PropagateEvent(new FEvent(FEventCodes.TRY_PICK_UP_OBJECT, "object", stolenItem)); stolenItem.PropagateEvent(new FEvent(FEventCodes.PICKED_UP, "carrier", parentEntity)); parentEntity.PropagateEvent(new FEvent(FEventCodes.RECEIVE_ITEM, "item", stolenItem)); Debug.Log("Stolen item"); // MessageLog.instance.Log("") } } return(ev); }
internal List <FEntity> GetPickUppableItemsAt(FEntity entity, bool excludeSelf = true) { string key = GetPosition(entity); List <FEntity> res = new List <FEntity>(); foreach (FEntity fe in entityLocationMap[key]) { //We probably never want to pick stuff up off the thing we're looking at? if (excludeSelf && fe == entity) { continue; } FEvent takeables = fe.PropagateEvent(new FEvent(FEventCodes.GET_ALL_PICKABLES, "items", new List <FEntity>())); foreach (FEntity item in takeables.Get("items") as List <FEntity> ) { res.Add(item); } } return(res); }
public void DrinkSelected() { if (selectedInventoryItem == null || !selectedInventoryItem.HasComponent(typeof(Drinkable))) { return; } string _n = selectedInventoryItem.PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME)).Get("name") as string; MessageLog.instance.Log("You drink the " + _n + "."); FEvent drink = selectedInventoryItem.PropagateEvent(new FEvent(FEventCodes.DRINK, "drinker", playerEntity, "consumed", false)); if ((bool)drink.Get("consumed")) { inventory.Remove(selectedInventoryItem); playerEntity.PropagateEvent(new FEvent(FEventCodes.CONSUME_ITEM, "item", selectedInventoryItem)); } selectedInventoryItem = null; selectedIndex = -1; ItemListWindow.instance.RefreshWindow(inventory); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.WAS_EQUIPPED) { equipped = true; } if (ev.eventName == FEventCodes.WAS_UNEQUIPPED) { equipped = false; } if (ev.eventName == FEventCodes.GET_ENTITY_AFFORDANCES) { List <string> affs = ev.Get("list") as List <string>; if (!equipped) { affs.Add("[e]quip"); } else { affs.Add("[u]nequip"); } } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.TRY_PICK_UP_OBJECT) { FEntity entity = ev.Get("object") as FEntity; if (contents.Contains(entity)) { contents.Remove(entity); } } if (ev.eventName == FEventCodes.LOSE_ITEM || ev.eventName == FEventCodes.CONSUME_ITEM || ev.eventName == FEventCodes.EQUIP_ITEM) { FEntity entity = ev.Get("item") as FEntity; if (contents.Contains(entity)) { contents.Remove(entity); } } if (ev.eventName == FEventCodes.RECEIVE_ITEM || ev.eventName == FEventCodes.UNEQUIP_ITEM) { string name = (ev.Get("item") as FEntity).PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME)).Get("fullstring") as string; // Debug.Log("Added item to my inventory: "+name); FEntity entity = (FEntity)ev.Get("item"); contents.Add(entity); return(ev); } else if (ev.eventName == FEventCodes.GET_VISIBLE_LIST || ev.eventName == FEventCodes.GET_ALL_PICKABLES) { //nothing to do here because we probably can't see our contents //q: is this a container's property? i'm not really sure. if (concealed) { return(ev); } else { foreach (FEntity ent in contents) { ev = ent.PropagateEvent(ev); } } } else if (ev.eventName == FEventCodes.GET_CARRIED_LIST) { List <FEntity> list = ev.Get("list") as List <FEntity>; foreach (FEntity en in contents) { list.Add(en); } ev.Set("list", list); } else { foreach (FEntity fe in contents) { //Hmm. } } return(ev); }
public override FEvent PropagateEvent(FEvent ev) { if (ev.eventName == FEventCodes.GET_NAME_MODIFIERS || ev.eventName == FEventCodes.GET_LOCATION) { return(ev); } if (ev.eventName == FEventCodes.ENTITY_DIED) { foreach (EntitySlot slot in slots.Values) { if (slot.slot != null) { parentEntity.PropagateEvent(new FEvent(FEventCodes.UNEQUIP_ITEM, "item", slot.slot)); } } } if (ev.eventName == FEventCodes.DISARM_WEAPON) { List <FEntity> weapons = new List <FEntity>(); //What can be disarmed? foreach (EntitySlot slot in slots.Values) { if (slot.slot != null && slot.slot.HasComponent(typeof(MeleeWeaponComponent))) { weapons.Add(slot.slot); } } if (weapons.Count > 0) { FEntity disarmTarget = weapons[Random.Range(0, weapons.Count)]; parentEntity.PropagateEvent(new FEvent(FEventCodes.UNEQUIP_ITEM, "item", disarmTarget)); FEvent lev = parentEntity.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); parentEntity.PropagateEvent(new FEvent(FEventCodes.LOSE_ITEM, "item", disarmTarget, "x", (int)lev.Get("x"), "y", (int)lev.Get("y"))); disarmTarget.PropagateEvent(new FEvent(FEventCodes.DROP_ITEM_HERE, "item", disarmTarget, "x", (int)lev.Get("x"), "y", (int)lev.Get("y"))); FEvent name = disarmTarget.PropagateEvent(new FEvent(FEventCodes.GET_ENTITY_NAME)); MessageLog.instance.Log(You("drop the " + name.Get("fullstring") as string)); } return(ev); } if (ev.eventName == FEventCodes.ENTITY_SPAWN || ev.eventName == FEventCodes.GET_ENTITY_NAME) { //Ok so we clearly need better logic to determine what events propagate to children. return(ev); } foreach (EntitySlot slot in slots.Values) { if (slot.slot != null) { ev = slot.slot.PropagateEvent(ev); } } // if(ev.eventName == FEventCodes.TRY_PICK_UP_OBJECT){ // FEntity entity = ev.Get("object") as FEntity; // foreach(EntitySlot slot in slots.Values){ // if(slot.slot != null && slot.slot == entity){ // slot.slot = null; // entity.PropagateEvent(new FEvent(FEventCodes.WAS_UNEQUIPPED)); // } // } // } if (ev.eventName == FEventCodes.EQUIP_ITEM) { string sn = ev.Get("slotName") as string; if (sn == null) { Debug.LogWarning("No slot provided for equip request"); foreach (EntitySlot s in slots.Values) { if (s.slot == null) { sn = s.slotName; } } } if (sn == null) { return(ev); } FEntity en = ev.Get("item") as FEntity; if (EquipInSlot(sn, en)) { en.PropagateEvent(new FEvent(FEventCodes.WAS_EQUIPPED)); } } if (ev.eventName == FEventCodes.UNEQUIP_ITEM) { FEntity en = ev.Get("item") as FEntity; foreach (EntitySlot slot in slots.Values) { if (slot.slot != null && slot.slot == en) { slot.slot = null; en.PropagateEvent(new FEvent(FEventCodes.WAS_UNEQUIPPED)); } } } //This is actually identical to unequipping it, but I duplicated it for clarity >_> if (ev.eventName == FEventCodes.LOSE_ITEM) { FEntity en = ev.Get("item") as FEntity; foreach (EntitySlot slot in slots.Values) { if (slot.slot != null && slot.slot == en) { slot.slot = null; en.PropagateEvent(new FEvent(FEventCodes.WAS_UNEQUIPPED)); } } } if (ev.eventName == FEventCodes.GET_WIELDED_LIST) { List <FEntity> names = (List <FEntity>)ev.Get("list"); foreach (EntitySlot slot in slots.Values) { if (slot.slot == null) { continue; } names.Add(slot.slot); } ev.Set("list", names); } return(ev); }
public string GetPosition(FEntity entity) { FEvent loc = entity.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); return(((int)loc.Get("x")) + "," + ((int)loc.Get("y"))); }
public Vector3 GetMapLocation(FEntity entity) { FEvent loc = entity.PropagateEvent(new FEvent(FEventCodes.GET_LOCATION, "x", -1, "y", -1)); return(GetMapLocation(((int)loc.Get("x")), ((int)loc.Get("y")))); }