Exemplo n.º 1
0
 public void Add(Entity e)
 {
     if (e.Has<ImageComponent>())
     {
         var i = e.Get<ImageComponent>();
         this.images.Add(i);
     }
     else if (e.Has<SpriteSheetComponent>())
     {
         var i = e.Get<SpriteSheetComponent>();
         this.images.Add(i);
     }
 }
Exemplo n.º 2
0
        internal void OnInteract(Entity entity, MessageSession session, InteractMsg msg)
        {
            if (entity.Has<Fightable>())
            {
                var template = DataCenter.Instance.GetDatum<InteractTemplate>(msg.InteractId);
                if (template == null)
                {
                    Logger.Write("Request a invalid interact[{0}]", msg.InteractId);
                    return;
                }

                EffectSystem.Affect(entity, template);
            }
            else
            {
                PositionSystem.Global.Interact(entity, targets =>
                    {
                        // default interaction - remove removables
                        foreach (var target in targets.Where(target => target.Has<Removable>() && target.Get<Removable>().Action))
                        {
                            // despawn target
                            PositionSystem.Global.Disappear(target);
                            EntityBinder.Instance.Remove(target);
                            EntityManager.Instance.Remove(target.Id);
                        }
                    });
            }
        }
Exemplo n.º 3
0
 public void TryPoison(Entity attacker, Entity defender)
 {
     if (attacker.Has<Poison> ()) {
         if (defender.Has<Health> ()) {
             float poisonChanceMult = defender.Has<PoisonChanceMultiplier> () ? defender.Get<PoisonChanceMultiplier> ().Multiplier : 1;
             if (Utils.DropChance ((int)(attacker.Get<Poison> ().Chance * poisonChanceMult))) {
                 if (defender.Has<Execute> ()) {
                     var poisonLoop = new Loop (new DoPoisonEntity (defender, attacker.Get<Poison> ().Damage, m_onPoisoned),
                                             attacker.Get<Poison> ().Speed);
                     defender.Get<Execute> ().AddNew (poisonLoop, "poison_effect");
                     IsPoisoned = true;
                 }
             }
         }
     }
 }
Exemplo n.º 4
0
 public bool IsFoe(Entity target)
 {
     if (target.Has<IFFSystem> ()) {
         return ID != target.Get<IFFSystem> ().ID;
     }
     return false;
 }
Exemplo n.º 5
0
 public void testEntityHas()
 {
     Entity entity = new Entity();
     Id id = new Id();
     id.Value = 1;
     entity.Add(id);
     Assert.AreEqual(entity.Has<Id>(), true);
 }
Exemplo n.º 6
0
        internal bool ChangeMe(Entity admin,
                               [CommandArgument("새로운 Resource Id")] int newResourceId)
        {
            if (!admin.Has<Displayable>())
                return false;

            ChangeResourceAndBroadcast(admin, newResourceId);
            return true;
        }
Exemplo n.º 7
0
        internal bool SetPos(Entity admin,
                             [CommandArgument("새로운 X 위치", 0)] double newX,
                             [CommandArgument("새로운 Y 위치", 0)] double newY)
        {
            if (!admin.Has<Pos>())
                return false;

            var msg = new UpdatePositionMsg {X = newX, Y = newY, InstanceMove = true};
            admin.Assign(msg);

            PositionSystem.Global.Move(admin);
            return true;
        }
Exemplo n.º 8
0
        public void Attack(Entity attacker, Entity defender)
        {
            if (attacker.Has<Attack> ()) {
                if (defender.Has<Health> ()) {
                    int basedmg = attacker.Get<Attack> ().Damage;
                    int criticaldmg = 0;
                    if (attacker.Has<CriticalHit> ()) {
                        if (Utils.DropChance (attacker.Get<CriticalHit> ().HitChance)) {
                            criticaldmg = attacker.Get<CriticalHit> ().CriticalDamage;
                        }
                    }
                    float attackMult = attacker.Has<AttackMultiplier> () ? attacker.Get<AttackMultiplier> ().Multiplier : 1;
                    int defence = defender.Has<Armor> () ? defender.Get<Armor> ().Defence : 0;
                    basedmg = (int)(basedmg * attackMult);
                    criticaldmg = (int)(criticaldmg * attackMult);
                    int damage = Math.Max(0, basedmg + criticaldmg - defence);

                    if (m_onAttack != null)
                        m_onAttack (attacker, damage, criticaldmg);

                    defender.Get<Health> ().HP = Math.Max (0, defender.Get<Health> ().HP - damage);
                }
            }
        }
Exemplo n.º 9
0
        internal bool SpawnNpc(Entity admin,
                               [CommandArgument("Npc의 이름")] string npcName,
                               [CommandArgument("Npc의 X 위치", 0)] double newX,
                               [CommandArgument("Npc의 Y 위치", 0)] double newY)
        {
            if (!admin.Has<Pos>())
                return false;

            var npc = EntityManager.Instance.Create(EntityTemplate.Ids.Npc);
            npc.Get<Motion>().Dir = admin.Get<Motion>().Dir;
            npc.Get<Nameplate>().Name = npcName;
            npc.Get<Pos>().Assign(new Pos {X = newX, Y = newY});

            PositionSystem.Global.Appear(npc);
            EntityBinder.Instance.Add(npc);
            return true;
        }
Exemplo n.º 10
0
        internal bool SpawnEntity(Entity admin,
                                  [CommandArgument("생성할 Entity의 TemplateId")] int templateId)
        {
            var entityTemplate = DataCenter.Instance.GetEntityTemplate(templateId);
            if (entityTemplate == null)
                return false;

            var entity = EntityManager.Instance.Create(DataCenter.Instance.GetCreateInfo(entityTemplate));
            if (entity.Has<Pos>() && admin.Has<Pos>())
            {
                entity.Get<Pos>().Assign(admin.Get<Pos>());
                PositionSystem.Global.Appear(entity);
            }

            EntityBinder.Instance.Add(entity);
            return true;
        }
Exemplo n.º 11
0
        internal void OnResetPeer(Entity entity, MessageSession session, ResetPeerMessage msg)
        {
            PositionSystem.Global.Disappear(entity);

            if (entity.Has<Player>())
                entity.Get<Player>().Logged = false;

            if (entity.Has<Tickable>())
                entity.Detach<Tickable>();

            EntityBinder.Instance.Update(entity);

            if (entity.Has<Nameplate>())
                Logger.Write("{0} is logout.", entity.Get<Nameplate>().Name);
        }
Exemplo n.º 12
0
        void OnArmorTriggered(Entity item, Entity attacker)
        {
            var gameState = (IGameState)Game.Services.GetService (typeof(IGameState));
            var hud = (HUDLayer)Scene.GetLayer ("hud");

            if (attacker.Has<Consumable<ConsumableTypes>> ()) {
                int cost = item.Get<Price> ().Cost;
                int armorId = item.Get<Loot> ().Drop;

                if (attacker.Has<Armor> () && attacker.Get<Armor> ().ArchetypeID >= armorId) {
                    hud.FeedbackMessage ("Already weared", Color.Red);
                } else {
                    if (attacker.Get<Consumable<ConsumableTypes>> ().TryConsume (ConsumableTypes.Money, cost)) {
                        if (!attacker.Has<Armor> ()) {
                            attacker.Register (new Armor (Archetypes.Armors [armorId] ["defence"], armorId));
                        } else {
                            attacker.Get<Armor> ().ArchetypeID = armorId;
                            attacker.Get<Armor> ().Defence = Archetypes.Armors [armorId] ["defence"];
                        }
                        gameState.PlayerArmorID = armorId;
                        RemoveEntityByTag (item.Tag);
                        hud.FeedbackMessage ("Picked up new armor", Color.Yellow);
                    } else {
                        string feedbackMsg = string.Format ("Need {0} money", cost);
                        hud.FeedbackMessage (feedbackMsg, Color.Red);
                    }
                }
            }
        }
Exemplo n.º 13
0
        void OnHealthTriggered(Entity item, Entity from)
        {
            var hud = (HUDLayer)Scene.GetLayer ("hud");

            if (from.Has<Health> ()) {
                if (from.Get<Health> ().HP < from.Get<Health> ().MaxHP) {
                    from.Get<Health> ().HP = from.Get<Health> ().HP + item.Get<Loot>().Drop;
                    RemoveEntityByTag (item.Tag);
                    hud.FeedbackMessage ("Picked up health potion", Color.Yellow);
                }
            }
        }
Exemplo n.º 14
0
        void OnMoneyTriggered(Entity item, Entity attacker)
        {
            var hud = (HUDLayer)Scene.GetLayer ("hud");

            if (attacker.Has<Consumable<ConsumableTypes>> ()) {
                int droppedMoney = item.Get<Loot>().Drop;
                float moneyMult = attacker.Get<MoneyMultiplier> ().Multiplier;
                droppedMoney = (int)(droppedMoney * moneyMult);
                attacker.Get<Consumable<ConsumableTypes>> ().Refill (ConsumableTypes.Money, droppedMoney);
                RemoveEntityByTag (item.Tag);

                string feedbackMsg = string.Format ("Picked {0} money", droppedMoney);
                hud.FeedbackMessage (feedbackMsg, Color.Yellow);
            }
        }
Exemplo n.º 15
0
        void TryFindEnemyOnRoute(Entity monster, IEnumerable<Entity> targets)
        {
            if (!monster.Has<IFFSystem> ())
                return;

            foreach (var enemy in monster.Get<IFFSystem> ().GetFoes (targets)) {
                var enemyPos = enemy.Get<Position> ().MapPos;
                var monsterPos = monster.Get<Position> ().MapPos;

                var distToEnemy = Utils.DirectionDist (monsterPos, enemyPos, monster.Get<LookDirection> ().Direction);
                if (distToEnemy < monster.Get<Perception> ().AlertDistance) {
                    monster.Get<Patrol> ().Steps += monster.Get<Perception> ().AlertDistance - distToEnemy + 1;
                    if (monster.Has<DirectLight> ()) {
                        monster.Get<DirectLight> ().LightColor = Color.Red;
                    }
                    break;
                } else {
                    if (monster.Has<DirectLight> ()) {
                        monster.Get<DirectLight> ().LightColor = Color.White;
                    }
                }
            }
        }
Exemplo n.º 16
0
        bool TryFindEnemyAround(Entity monster, IEnumerable<Entity> targets)
        {
            if (!monster.Has<IFFSystem> ())
                return false;

            var world = (IWorld)Game.Services.GetService (typeof(IWorld));
            var gameState = (IGameState)Game.Services.GetService (typeof(IGameState));
            var mapGrid = world.GetLevel(gameState.Level);

            foreach (var enemy in monster.Get<IFFSystem> ().GetFoes (targets)) {
                var enemyPos = enemy.Get<Position> ().MapPos;
                var monsterPos = monster.Get<Position> ().MapPos;

                var mapLine = mapGrid.GetLine (monsterPos, enemyPos);

                if (mapLine.Any() && !mapLine.Any (e => e.Type != monster.Get<AllowedMapArea> ().Area)) {
                    Utils.Direction lookDir;
                    if (Utils.FindDirection (monsterPos, enemyPos, out lookDir)) {
                        var distToEnemy = Utils.DirectionDist (monsterPos, enemyPos, lookDir);
                        if (distToEnemy < monster.Get<Perception> ().AlertDistance) {
                            monster.Get<LookDirection> ().Direction = lookDir;
                            monster.Get<Patrol> ().Steps = Math.Min (monster.Get<Patrol> ().MaxSteps,
                                monster.Get<Perception> ().AlertDistance - distToEnemy + 1);
                            if (monster.Has<DirectLight> ()) {
                                monster.Get<DirectLight> ().LightColor = Color.Red;
                            }
                            return true;
                        }
                    }
                }
            }
            return false;
        }
Exemplo n.º 17
0
        void DoPatrol(Entity monster, IEnumerable<Entity> targets)
        {
            var world = (IWorld)Game.Services.GetService (typeof(IWorld));
            var gameState = (IGameState)Game.Services.GetService (typeof(IGameState));
            var map = world.GetLevel(gameState.Level);

            var foes = new List<Entity> ();
            if (monster.Has<IFFSystem> ())
                foes = monster.Get<IFFSystem> ().GetFoes (targets).ToList();

            var newPos = monster.Get<Position> ().MapPos;
            if (monster.Get<LookDirection> ().Direction == Utils.Direction.Down)
                newPos.Y++;
            else if (monster.Get<LookDirection> ().Direction == Utils.Direction.Up)
                newPos.Y--;
            else if (monster.Get<LookDirection> ().Direction == Utils.Direction.Right)
                newPos.X++;
            else if (monster.Get<LookDirection> ().Direction == Utils.Direction.Left)
                newPos.X--;

            if (map.GetID (newPos.X, newPos.Y) != monster.Get<AllowedMapArea>().Area) {
                monster.Get<Patrol> ().Steps = 0;
                monster.Get<Execute> ().Add (new ActionEntity (monster, (_) => {
                    StartPatrol (monster);
                }), "patrol_loop");
            } else {
                var foe = foes.FirstOrDefault (e => e.Get<Position> ().MapPos == newPos);
                if (foe != null) {
                    var seq = new Sequence ();
                    seq.Add (new Delay (Utils.ThrowDice(monster.Get<AttackSpeed>().Speed)));
                    seq.Add (new AttackEntity (monster, foe));
                    seq.Add (new TryPoisonEntity (monster, foe));
                    seq.Add (new Delay (monster.Get<AttackSpeed>().Speed));
                    seq.Add (new ActionEntity (monster, (_) => {
                        StartPatrol (monster);
                    }));
                    monster.Get<Execute> ().Add (seq, "patrol_loop");
                } else {
                    var seq = new Sequence ();
                    seq.Add (new MoveSpriteTo (monster, new Vector2 (newPos.X * Globals.CELL_WIDTH, newPos.Y * Globals.CELL_HEIGHT), monster.Get<MoveSpeed> ().Speed));
                    seq.Add (new ActionEntity (monster, (_) => {
                        monster.Get<Position> ().MapPos = newPos;
                    }));
                    seq.Add (new ActionEntity (monster, (_) => {
                        monster.Get<Patrol> ().Steps--;
                    }));
                    seq.Add (new ActionEntity (monster, (_) => {
                        StartPatrol (monster);
                    }));
                    monster.Get<Execute> ().Add (seq, "patrol_loop");
                }
            }
        }
Exemplo n.º 18
0
        void OnWeaponTriggered(Entity item, Entity attacker)
        {
            var gameState = (IGameState)Game.Services.GetService (typeof(IGameState));
            var hud = (HUDLayer)Scene.GetLayer ("hud");

            if (attacker.Has<Consumable<ConsumableTypes>> ()) {
                int cost = item.Get<Price> ().Cost;
                int weaponId = item.Get<Loot> ().Drop;

                if (attacker.Has<Attack> () && attacker.Get<Attack> ().ArchetypeID >= weaponId) {
                    hud.FeedbackMessage ("Already weared", Color.Red);
                } else {
                    if (attacker.Get<Consumable<ConsumableTypes>> ().TryConsume (ConsumableTypes.Money, cost)) {
                        attacker.Get<Attack> ().ArchetypeID = weaponId;
                        attacker.Get<Attack> ().Damage = Archetypes.Weapons [weaponId] ["attack"];
                        attacker.Get<CriticalHit> ().HitChance = Archetypes.Weapons [weaponId] ["critical_chance"];
                        attacker.Get<CriticalHit> ().CriticalDamage = Archetypes.Weapons [weaponId] ["critical_damage"];
                        gameState.PlayerWeaponID = weaponId;

                        RemoveEntityByTag (item.Tag);
                        hud.FeedbackMessage ("Picked up new weapon", Color.Yellow);
                    } else {
                        string feedbackMsg = string.Format ("Need {0} money", cost);
                        hud.FeedbackMessage (feedbackMsg, Color.Red);
                    }
                }
            }
        }
Exemplo n.º 19
0
 public void CancelPoison(Entity defender)
 {
     if (defender.Has<Execute> ()) {
         defender.Get<Execute> ().Cancel ("poison_effect");
     }
 }
Exemplo n.º 20
0
        void OnAntitodTriggered(Entity item, Entity from)
        {
            var hud = (HUDLayer)Scene.GetLayer ("hud");

            if (from.Has<Poisonable> ()) {
                if (from.Get<Poisonable> ().IsPoisoned) {
                    from.Get<Poisonable> ().CancelPoison (from);
                    RemoveEntityByTag (item.Tag);
                } else {
                    var gameState = (IGameState)Game.Services.GetService (typeof(IGameState));
                    if (from.Get<Consumable<ConsumableTypes>> ().Amount (ConsumableTypes.Antitod) < gameState.PlayerAntitodPotionsMax) {
                        from.Get<Consumable<ConsumableTypes>> ().Refill (ConsumableTypes.Antitod, 1);
                        RemoveEntityByTag (item.Tag);
                        hud.FeedbackMessage ("Picked up antitod potion", Color.Yellow);
                    }
                }
            }
        }