예제 #1
0
        public BattleShip(BattleShipPrototype prototype, IPlayer player, HexTile initialTile)
        {
            using var _ = Game.Instance.GetCacheLock();

            Game.Instance.RegisterInfinityObject(this, true);

            CurrentTile = initialTile;
            CurrentTile.AddTileObject(this);

            IdentifierName      = prototype.IdentifierName;
            Properties          = prototype.Properties;
            AttackDamageType    = prototype.AttackDamageType;
            BaseAttackPower     = prototype.BaseAttackPower;
            BaseMaxHp           = prototype.BaseMaxHp;
            BaseMaxMovePoint    = prototype.BaseMaxMovePoint;
            BaseResourceStorage = prototype.BaseResourceStorage;

            OwnPlayer = player;

            foreach (var s in prototype.BasicSpecialActions)
            {
                AddSpecialAction(s);
            }

            foreach (var m in prototype.BasicModifiers)
            {
                AddModifier(m, Id, -1, true, false);
            }
        }
예제 #2
0
        public BattleShip(InfinityObjectData data, HexTile initialTile)
        {
            var dict = data.Dict;

            Game.Instance.RegisterInfinityObject(this, true, dict.GetInt("Id"));

            CurrentTile = initialTile;
            CurrentTile.AddTileObject(this);

            IdentifierName = dict.GetString("IdentifierName");
            CustomName     = dict.GetString("CustomName");

            foreach (var kv in dict.GetDict("Storage"))
            {
                Storage.Set(kv.Key, kv.Value);
            }

            OwnPlayer = Game.Instance.GetPlayer(dict.GetString("OwnPlayer"));

            _remainHp       = dict.GetInt("RemainHp");
            RemainMovePoint = dict.GetInt("RemainMovePoint");
            foreach (var kv in dict.GetDict("RemainResourceStorage"))
            {
                _remainResourceStorage[kv.Key] = Convert.ToInt32(kv.Value);
            }

            var prototype = BattleShipData.Instance.GetPrototype(IdentifierName);

            Properties          = prototype.Properties;
            AttackDamageType    = prototype.AttackDamageType;
            BaseAttackPower     = prototype.BaseAttackPower;
            BaseMaxHp           = prototype.BaseMaxHp;
            BaseMaxMovePoint    = prototype.BaseMaxMovePoint;
            BaseResourceStorage = prototype.BaseResourceStorage;

            foreach (var s in prototype.BasicSpecialActions)
            {
                AddSpecialAction(s);
            }

            foreach (var m in prototype.BasicModifiers)
            {
                AddModifier(m, Id, -1, true, true);
            }

            foreach (var m in dict.GetDictList("Modifiers"))
            {
                AddModifier(m.GetString("Name"), m.GetInt("AdderObjectId"), m.GetInt("LeftWeek"), false, true);
            }
        }
예제 #3
0
        public void TeleportToTile(HexTile tile)
        {
            var destHolder = tile.TileMap.Holder;
            var curHolder  = CurrentTile.TileMap.Holder;

            if (destHolder.TypeName != nameof(StarSystem))
            {
                Logger.Log(LogType.Warning, $"{nameof(Planet)}.{nameof(TeleportToTile)}",
                           "Planet can exist only on StarSystem!");
                return;
            }

            var toRemove = new HashSet <IModifier>();
            var toAdd    = new HashSet <IModifier>(destHolder.GetAllTiledModifiers(OwnPlayer.PlayerName));

            foreach (var m in AffectedTiledModifiers)
            {
                if (toAdd.Contains(m))
                {
                    toAdd.Remove(m);
                }
                else
                {
                    toRemove.Add(m);
                }
            }

            // Should consider non-tiled modifiers when the tilemap holder changes
            if (curHolder.Id != destHolder.Id)
            {
                foreach (var m in destHolder.GetModifiers(OwnPlayer.PlayerName))
                {
                    toAdd.Add(m);
                }

                foreach (var m in curHolder.GetModifiers(OwnPlayer.PlayerName))
                {
                    if (toAdd.Contains(m))
                    {
                        toAdd.Remove(m);
                    }
                    else
                    {
                        toRemove.Add(m);
                    }
                }
            }

            // Remove modifier effect before detaching
            foreach (var m in toRemove)
            {
                ApplyModifierChangeToDownward(OwnPlayer.PlayerName, m, true, false);
            }
            CurrentTile.RemoveTileObject(TypeName);

            CurrentTile = tile;

            // Add modifier effect after attaching
            tile.AddTileObject(this);
            foreach (var m in toAdd)
            {
                ApplyModifierChangeToDownward(OwnPlayer.PlayerName, m, false, false);
            }
        }