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); } }
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); } }
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); } }