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);
        }
Esempio n. 2
0
    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);
        }
Esempio n. 5
0
    /// <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);
    }
Esempio n. 6
0
    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);
    }
Esempio n. 7
0
    /// <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);
    }
Esempio n. 8
0
    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;
        }
    }
Esempio n. 9
0
        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));
            }
        }
Esempio n. 10
0
    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;
    }
Esempio n. 11
0
 public override void Init(Entity entity, GameObject entityGO)
 {
     entity.OnActiveChanged += HandleCB;
     fighter          = (FighterComponent)entity.GetEntityComponent(ComponentID.Fighter);
     abilityComponent = (AbilityComponent)entity.GetEntityComponent(ComponentID.Abilities);
 }
Esempio n. 12
0
    /// <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);
    }
Esempio n. 13
0
    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);
            }
        }
    }