public static Entity CreateHound(int x, int y, int dungeonLevel) { var hound = new Entity("Hound", x, y, 'h', Colours.Hound, true) { SpriteIndex = EntitySprites.Hound, RenderLayer = Renderer.ActorLayer }; var health = 8 + 8 * (dungeonLevel / 3); var power = 3 + 3 * (dungeonLevel / 3); var defence = 1 + 1 * (dungeonLevel / 3); var xp = 20 + 20 * (dungeonLevel / 3); var fighterComponent = new FighterComponent { XP = xp, DeathFunction = DeathFunctions.MonsterDeath }; fighterComponent.Health.Base = health; fighterComponent.Power.Base = power; fighterComponent.Defense.Base = defence; hound.AddComponent(fighterComponent); hound.AddComponent(new BasicMonsterComponent()); return(hound); }
void CastTeleport(FighterComponent casterFighter, PositionComponent positionComponent, string abDesc) { Vector2 moveDir = new Vector2(positionComponent.directionData.X, positionComponent.directionData.Y) * 2; //Vector2 curDest = new Vector2(positionComponent.moveData.X, positionComponent.moveData.Y) + moveDir; //if (MapManager.instance.CanMoveTo(new MoveData(curDest.x, curDest.y)) == false){ // // try normal move // if MapManager.instance.CanMoveTo(new MoveData(curDest.x, curDest.y)) == false) // { // return; // } //} //positionComponent.moveData = new MoveData(positionComponent.moveData.) // Caster takes 40% of its health float dmg = casterFighter.curHP * 0.40f; casterFighter.ReceiveDamage(dmg); MessageLog_Manager.NewMessage(abDesc, Color.green); MoveData destData = new MoveData(moveDir.x, moveDir.y); positionComponent.Move(destData, true); }
public static Entity CreateRat(int x, int y, int dungeonLevel) { var rat = new Entity("Rat", x, y, 'r', Colours.Rat, true) { SpriteIndex = EntitySprites.Rat, RenderLayer = Renderer.ActorLayer }; var health = 3 + 3 * (dungeonLevel / 3); var power = 1 + 1 * (dungeonLevel / 3); var defence = 0 + 1 * (dungeonLevel / 3); var xp = 5 + 5 * (dungeonLevel / 3); var fighterComponent = new FighterComponent { XP = xp, DeathFunction = DeathFunctions.MonsterDeath }; fighterComponent.Health.Base = health; fighterComponent.Power.Base = power; fighterComponent.Defense.Base = defence; rat.AddComponent(fighterComponent); rat.AddComponent(new BasicMonsterComponent()); return(rat); }
public void Initialize(bool newGame) { Random = new Random(Seed); MessageLog.Clear(); if (newGame) { Player = new Entity("Player", 25, 23, '@', Colours.Player, true) { SpriteIndex = EntitySprites.Player, RenderLayer = Renderer.ActorLayer }; var fighterComponent = new FighterComponent { DeathFunction = DeathFunctions.PlayerDeath }; fighterComponent.Health.Base = 30; fighterComponent.Power.Base = 5; fighterComponent.Defense.Base = 2; Player.AddComponent(fighterComponent); Player.AddComponent(new PlayerInputComponent()); Player.AddComponent(new InventoryComponent()); Entities.Add(Player); Map = new BspMapGenerator().Generate(80, 50); } Map.UpdateFovMap(); Map.FovMap.ComputeFov(Player.X, Player.Y, Entity.PlayerFovRadius, true); }
/// <summary> /// Handle entity combat. /// Return true if combat resulted in defender's death /// and attacker is allowed to move unto that tile. /// </summary> /// <param name="attacker"></param> /// <param name="defender"></param> /// <returns></returns> private bool DoCombat(FighterComponent attacker, FighterComponent defender) { int attackPower = attacker.GetAttackPower(); // Debug.Log("Attacker attacks with power " + attackPower); //Debug.Log("Defender defends with power " + defender.GetDefensePower()); //if (attacker.thisEntity.isPlayer == true) //{ // MessageLog_Manager.NewMessage("You attack the " + defender.thisEntity.Name + " with " + attackPower + " attack!", Color.red); //} int damage = attackPower - defender.GetDefensePower(); //Debug.Log("After defense mitigation... damage is " + damage); if (damage > 0) { if (defender.thisEntity.isPlayer == true) { cameraShaker.AddTrauma(5.2f, 2.8f); MessageLog_Manager.NewMessage(attacker.thisEntity.Name + " hits you for " + damage.ToString() + "!", Color.white); } else { MessageLog_Manager.NewMessage("You hit the " + defender.thisEntity.Name + " for " + damage.ToString() + "!", Color.red); } } else { if (attacker.thisEntity.isPlayer == true) { MessageLog_Manager.NewMessage(defender.thisEntity.Name + "'s defense absorb your attack!", Color.white); } else { MessageLog_Manager.NewMessage("Your defenses absorb the attack!", Color.white); } } bool result = defender.ReceiveDamage(damage); if (result == true) { if (attacker.thisEntity.isPlayer == true) { MessageLog_Manager.NewMessage(defender.thisEntity.Name + " DIES!", Color.red); // Gain xp for kill XPComponent xPComponent = (XPComponent)attacker.thisEntity.GetEntityComponent(ComponentID.XP); EnemyComponent enemy = (EnemyComponent)defender.thisEntity.GetEntityComponent(ComponentID.AI); XPSystem.instance.DoXPGainAction(xPComponent.xpData, enemy.enemyLevel); } else { MessageLog_Manager.NewMessage(attacker.thisEntity.Name + " KILLS YOU!", Color.red); } } return(result); }
void CastBloodForLight(FighterComponent casterFighter, MoveData position, MoveData direction, string abDesc) { if (MapManager.instance.ClearDarkTile(new Vector2(position.X + direction.X, position.Y + direction.Y)) == false) { return; } // Caster takes 25% of its health float dmg = casterFighter.curHP * 0.25f; casterFighter.ReceiveDamage(dmg); MessageLog_Manager.NewMessage(abDesc, Color.green); }
/// <summary> /// Interact with entity on tile /// Returns false if it blocks the entity actor's movement /// </summary> /// <param name="interactor"></param> /// <param name="nextTile"></param> /// <returns></returns> private bool InteractTileEntities(Entity interactor, MapTile nextTile) { Entity activeTileEntity = nextTile.entities[0]; if (nextTile.entities.Count > 1) { // figure this out... for (int i = 0; i < nextTile.entities.Count; i++) { if (nextTile.entities[i].entityType == EntityType.Unit) { activeTileEntity = nextTile.entities[i]; break; } } } if (activeTileEntity.entityType == EntityType.Unit) { if (activeTileEntity.faction == interactor.faction) { return(false); } FighterComponent attacker = (FighterComponent)interactor.GetEntityComponent(ComponentID.Fighter); FighterComponent defender = (FighterComponent)activeTileEntity.GetEntityComponent(ComponentID.Fighter); return(DoCombat(attacker, defender)); } else if (activeTileEntity.entityType == EntityType.Item) { Debug.Log("ON AN ITEM TILE!!"); // do item pick up EntityComponent comp = interactor.GetEntityComponent(ComponentID.Inventory); if (comp == null) { return(true); } ItemComponent item = (ItemComponent)activeTileEntity.GetEntityComponent(ComponentID.Item); InventoryComponent inventory = (InventoryComponent)comp; if (inventory.AddItem(item) == true) { item.PickUp(); } return(true); } return(true); }
private void CastAbility(Entity caster, AbilityID abilityID, string description) { PositionComponent poC = (PositionComponent)caster.GetEntityComponent(ComponentID.Position); FighterComponent fighter = (FighterComponent)caster.GetEntityComponent(ComponentID.Fighter); switch (abilityID) { case AbilityID.Blood_For_Light: CastBloodForLight(fighter, poC.moveData, poC.directionData, description); break; case AbilityID.Teleport: CastTeleport(fighter, poC, description); break; default: break; } }
public static Entity Get(string monsterName, int x, int y) { FighterComponent fighterComponent; AiComponent aiComponent; Entity entity; switch (monsterName) { case Orc: fighterComponent = new FighterComponent { BaseMaxHp = 20, Hp = 20, BaseDefense = 0, BasePower = 4, Xp = 35 }; aiComponent = new BasicMonster(); entity = new Entity { X = x, Y = y, Character = 'o', Color = Color.LightGreen, Name = "Orc", Blocks = true, RenderOrder = RenderOrder.Actor }; entity.Add(fighterComponent); entity.Add(aiComponent); return(entity); case Troll: fighterComponent = new FighterComponent { BaseMaxHp = 30, Hp = 30, BaseDefense = 2, BasePower = 8, Xp = 100 }; aiComponent = new BasicMonster(); entity = new Entity { X = x, Y = y, Character = 'T', Color = Color.DarkGreen, Name = "Troll", Blocks = true, RenderOrder = RenderOrder.Actor }; entity.Add(fighterComponent); entity.Add(aiComponent); return(entity); default: throw new ArgumentException($"{monsterName} is not a valid monster type.", nameof(monsterName)); } }
public bool AddItem(ItemComponent item) { //int emptyIndex = FindEmptyIndex(); //if (emptyIndex < 0) // return false; if (item.itemType == ItemType.Armor || item.itemType == ItemType.Weapon) { equipment.AddEquipment(item); return(true); } else { FighterComponent fighterComponent = (FighterComponent)thisEntity.GetEntityComponent(ComponentID.Fighter); HealthDropComponent consumable = (HealthDropComponent)item.thisEntity.GetEntityComponent(ComponentID.Consumable); fighterComponent.GainHealth(consumable.HealthGained); MessageLog_Manager.NewMessage("You consume " + item.itemName, Color.green); return(true); } //items[emptyIndex] = item; //Debug.Log(item.itemName + " added to inventory at index " + emptyIndex); //MessageLog_Manager.NewMessage("You pick up " + item.itemName, Color.yellow); //return true; }
public override void Init(Entity entity, GameObject entityGO) { entity.OnActiveChanged += HandleCB; fighter = (FighterComponent)entity.GetEntityComponent(ComponentID.Fighter); abilityComponent = (AbilityComponent)entity.GetEntityComponent(ComponentID.Abilities); }
/// <summary> /// Returns true if Entity can move to next tile, /// if false it will call the correct action to do /// </summary> /// <param name="entity"></param> /// <param name="lastPositionData"></param> /// <param name="newPositionData"></param> /// <returns></returns> public bool DoTileAction(Entity entity, MoveData lastPositionData, MoveData newPositionData) { MapTile curTile = mapManager.Map.GetTile(new Vector2(lastPositionData.X, lastPositionData.Y)); if (curTile == null) { Debug.LogError("Entity: " + entity.Name + " is standing on a NULL TILE!!"); return(false); } MapTile nextTile = mapManager.Map.GetTile(new Vector2(newPositionData.X, newPositionData.Y)); if (nextTile == null) { Debug.LogError("Entity: " + entity.Name + " is moving to a NULL TILE!!"); return(false); } if (nextTile.entities.Count > 0) { if (InteractTileEntities(entity, nextTile) == false) { // check if this can end turn //if (entity.CanEndTurnCB != null) //{ // if (entity.CanEndTurnCB() == true) // { // TurnManager.instance.FinishTurn(); // } //} return(false); } } // DARKNESS DAMAGE if (curTile.tileType == TileType.Darkness) { FighterComponent attacker = (FighterComponent)entity.GetEntityComponent(ComponentID.Fighter); attacker.ReceiveDamage(1000, true); return(false); } // Normal move action happens if (nextTile != curTile) { curTile.UnRegisterEntity(entity); nextTile.RegisterEntity(entity); if (entity.isPlayer == true && nextTile.tileType == TileType.Exit) { Global.PlayerReachedExit playerReachedExit = new Global.PlayerReachedExit(); playerReachedExit.exitPosition = nextTile.WorldPosition; playerReachedExit.FireEvent(); return(false); } } // check if this can end turn //if (entity.CanEndTurnCB != null) //{ // if (entity.CanEndTurnCB() == true) // { // TurnManager.instance.FinishTurn(); // } //} return(true); }
private void Update() { if (inputState == InputState.Off) { return; } Vector2 inputV2 = Vector2.zero; if (Input.GetButtonDown("DiagTopLeft")) { inputV2 = Vector2.up + Vector2.left; } else if (Input.GetButtonDown("DiagTopRight")) { inputV2 = Vector2.up + Vector2.right; } else if (Input.GetButtonDown("DiagBottomRight")) { inputV2 = Vector2.down + Vector2.right; } else if (Input.GetButtonDown("DiagBottomLeft")) { inputV2 = Vector2.down + Vector2.left; } else { inputV2 = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); } if (inputV2 != lastV2) { lastV2 = inputV2; if (inputV2 == Vector2.zero) { return; } if (OnMoveInput != null) { OnMoveInput(new MoveData(inputV2.x, inputV2.y)); } } if (dynamicKeyActions.Count > 0) { for (int i = 0; i < dynamicKeyActions.Count; i++) { if (Input.GetKeyDown(dynamicKeyActions[i].dynamicKey)) { dynamicKeyActions[i].action(); } } } if (canFindTile == false) { return; } mousePos = Vector2Int.FloorToInt(Camera.main.ScreenToWorldPoint(Input.mousePosition)); if (mousePos != lastMousePos) { lastMousePos = mousePos; infoUI.Clear(); MapTile tile = mapManager.Map.GetTile(mousePos.x, mousePos.y); if (tile == null) { infoUI.DeActivate(); return; } if (tile.tileType == TileType.Darkness) { infoUI.Activate(); infoUI.UpdateTexts(new Message[] { new Message("Poison", Color.magenta), new Message("100%", Color.red), new Message("Lethal!", Color.red) }); infoUI.UpdatePosition(mousePos + Vector2.left * 2, canvas); return; } if (tile.tileType == TileType.SemiDark) { infoUI.Activate(); infoUI.UpdateTexts(new Message[] { new Message("Poison", Color.magenta), new Message("50%", Color.yellow), new Message("Dangerous!", Color.yellow) }); infoUI.UpdatePosition(mousePos + Vector2.left * 2, canvas); return; } if (tile.entities.Count <= 0) { infoUI.DeActivate(); return; } else { Message[] info = new Message[3]; if (tile.entities[0].entityType == EntityType.Unit) { FighterComponent fighter = (FighterComponent)tile.entities[0].GetEntityComponent(ComponentID.Fighter); info[0] = new Message(fighter.thisEntity.Name, Color.white); info[1] = new Message(fighter.GetAttackPower().ToString(), Color.red); info[2] = new Message(fighter.GetDefensePower().ToString(), Color.cyan); } else if (tile.entities[0].entityType == EntityType.Item) { ItemComponent item = (ItemComponent)tile.entities[0].GetEntityComponent(ComponentID.Item); info[0] = new Message(item.itemName, Color.white); if (item.itemType == ItemType.Weapon) { WeaponComponent wpn = (WeaponComponent)tile.entities[0].GetEntityComponent(ComponentID.Weapon); info[1] = new Message(wpn.weaponAttackStats.AttackPower.ToString(), Color.red); info[2] = new Message(wpn.weaponAttackStats.DefensePower.ToString(), Color.cyan); } else if (item.itemType == ItemType.Armor) { ArmorComponent armor = (ArmorComponent)tile.entities[0].GetEntityComponent(ComponentID.Armor); info[1] = new Message(armor.armorAttackStats.AttackPower.ToString(), Color.red); info[2] = new Message(armor.armorAttackStats.DefensePower.ToString(), Color.cyan); } else { HealthDropComponent consumable = (HealthDropComponent)tile.entities[0].GetEntityComponent(ComponentID.Consumable); info[1] = new Message(consumable.HealthGained.ToString(), Color.cyan); } } infoUI.Activate(); infoUI.UpdateTexts(info); infoUI.UpdatePosition(mousePos + Vector2.left * 2, canvas); } } }