public void SetFullHealth() { LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); homeOwnerAvatar.SetHeroHealth(this.m_hero, 0); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(0, this.m_hero, 0); }
public void StartUpgrading() { if (this.CanStartUpgrading(true)) { ((LogicBuilding)this.m_parent).DestructBoost(); if (this.m_timer != null) { this.m_timer.Destruct(); this.m_timer = null; } LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); this.m_parent.GetLevel().GetWorkerManagerAt(this.m_parent.GetData().GetVillageType()).AllocateWorker(this.m_parent); this.m_timer = new LogicTimer(); this.m_timer.StartTimer(this.GetTotalSeconds(), this.m_parent.GetLevel().GetLogicTime(), true, this.m_parent.GetLevel().GetHomeOwnerAvatarChangeListener().GetCurrentTimestamp()); this.m_upgLevel = homeOwnerAvatar.GetUnitUpgradeLevel(this.m_hero) + 1; homeOwnerAvatar.SetHeroState(this.m_hero, 1); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 1); } }
public override int Execute(LogicLevel level) { LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle(); if (allianceCastle != null) { LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent(); if (bunkerComponent != null && bunkerComponent.GetRequestCooldownTime() == 0) { LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar(); homeOwnerAvatar.GetChangeListener().RequestAllianceUnits(allianceCastle.GetUpgradeLevel(), bunkerComponent.GetUsedCapacity(), bunkerComponent.GetMaxCapacity(), homeOwnerAvatar.GetAllianceCastleUsedSpellCapacity(), homeOwnerAvatar.GetAllianceCastleTotalSpellCapacity(), this.m_message); bunkerComponent.StartRequestCooldownTime(); return(0); } } return(-1); }
public void FinishUpgrading(bool tick) { if (this.m_timer != null) { LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); if (homeOwnerAvatar.GetUnitUpgradeLevel(this.m_hero) < this.m_upgLevel || this.m_upgLevel == 0) { homeOwnerAvatar.CommodityCountChangeHelper(1, this.m_hero, 1); } this.m_parent.GetLevel().GetWorkerManagerAt(this.m_parent.GetData().GetVillageType()).DeallocateWorker(this.m_parent); homeOwnerAvatar.SetHeroState(this.m_hero, 3); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 3); this.SetFullHealth(); this.m_timer.Destruct(); this.m_timer = null; } else { Debugger.Warning("LogicHeroBaseComponent::finishUpgrading called and m_pHero is NULL"); } }
public void StartUseTroopEvent(LogicAvatar homeOwnerAvatar, LogicLevel level) { if (homeOwnerAvatar != null) { for (int i = 0; i < this.m_useTroops.Size(); i++) { LogicCalendarUseTroop calendarUseTroop = this.m_useTroops[i]; LogicCombatItemData data = calendarUseTroop.GetData(); int housingSpace; int totalMaxHousing; int unitCount; if (data.GetCombatItemType() != LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER) { housingSpace = data.GetHousingSpace() * 2; totalMaxHousing = data.GetHousingSpace() + 2 * (level.GetComponentManagerAt(data.GetVillageType()).GetTotalMaxHousing(data.GetCombatItemType()) * calendarUseTroop.GetParameter(1) / 100); unitCount = totalMaxHousing / housingSpace; } else { LogicBuildingData troopHousingData = LogicDataTables.GetBuildingByName("Troop Housing", null); LogicBuildingData barrackData = LogicDataTables.GetBuildingByName("Barrack", null); LogicBuildingData darkElixirBarrackData = LogicDataTables.GetBuildingByName("Dark Elixir Barrack", null); int townHallLevel = homeOwnerAvatar.GetTownHallLevel(); int maxUpgradeLevelForTH = troopHousingData.GetMaxUpgradeLevelForTownHallLevel(townHallLevel); int unitStorageCapacity = troopHousingData.GetUnitStorageCapacity(maxUpgradeLevelForTH); housingSpace = data.GetHousingSpace(); if (data.GetUnitOfType() == 1 && barrackData.GetRequiredTownHallLevel(data.GetRequiredProductionHouseLevel()) <= townHallLevel || data.GetUnitOfType() == 2 && darkElixirBarrackData.GetRequiredTownHallLevel(data.GetRequiredProductionHouseLevel()) <= townHallLevel) { int totalHousing = (int)((long)LogicDataTables.GetTownHallLevel(townHallLevel).GetUnlockedBuildingCount(troopHousingData) * calendarUseTroop.GetParameter(1) * unitStorageCapacity); unitCount = (int)((housingSpace * 0.5f + totalHousing / 100) / housingSpace); } else { LogicBuildingData allianceCastleData = LogicDataTables.GetBuildingByName("Alliance Castle", null); totalMaxHousing = allianceCastleData.GetUnitStorageCapacity(allianceCastleData.GetMaxUpgradeLevelForTownHallLevel(townHallLevel)); unitCount = totalMaxHousing / housingSpace; } } int eventCounter = LogicMath.Max(1, unitCount) << 16; homeOwnerAvatar.SetCommodityCount(6, data, eventCounter); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(6, data, eventCounter); Debugger.HudPrint("EVENT: Use troop/spell event started!"); } } }
public override bool Deliver(LogicLevel level) { LogicAvatar avatar = level.GetHomeOwnerAvatar(); int count = avatar.GetResourceCount(this.m_resourceData) + this.m_resourceAmount; avatar.SetResourceCount(this.m_resourceData, count); avatar.GetChangeListener().CommodityCountChanged(0, this.m_resourceData, count); return(true); }
public void SetUnitPresetCount(LogicCombatItemData data, int count) { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); if (homeOwnerAvatar.GetUnitPresetCount(data, this.m_presetId) != count) { homeOwnerAvatar.SetUnitPresetCount(data, this.m_presetId, count); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(3, data, count); } }
public void UpdateHeroHealthToAvatar(int hitpoint) { LogicAvatar avatar = this.m_team == 1 ? this.m_parent.GetLevel().GetHomeOwnerAvatar() : this.m_parent.GetLevel().GetVisitorAvatar(); LogicHeroData data = null; int upgLevel = 0; if (this.m_parent.IsHero()) { LogicCharacter character = (LogicCharacter)this.m_parent; data = (LogicHeroData)character.GetCharacterData(); upgLevel = character.GetUpgradeLevel(); } else if (this.m_parent.GetGameObjectType() == LogicGameObjectType.BUILDING) { LogicBuilding building = (LogicBuilding)this.m_parent; LogicHeroBaseComponent heroBaseComponent = building.GetHeroBaseComponent(); if (heroBaseComponent == null) { return; } LogicBuildingData buildingData = building.GetBuildingData(); if (!buildingData.GetShareHeroCombatData()) { return; } LogicCombatComponent combatComponent = building.GetCombatComponent(); if (combatComponent == null || !combatComponent.IsEnabled()) { return; } data = buildingData.GetHeroData(); upgLevel = avatar.GetUnitUpgradeLevel(data); } if (data != null) { int secs = LogicMath.Min(data.GetSecondsToFullHealth(hitpoint, upgLevel), data.GetFullRegenerationTimeSec(upgLevel)); if (avatar != null) { avatar.GetChangeListener().CommodityCountChanged(0, data, secs); avatar.SetHeroHealth(data, secs); } } }
public bool SetHeroMode(int mode) { LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); if (homeOwnerAvatar.GetHeroMode(this.m_hero) == mode) { return(false); } homeOwnerAvatar.SetHeroMode(this.m_hero, mode); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(3, this.m_hero, mode); return(true); }
public override int Execute(LogicLevel level) { LogicClientAvatar playerAvatar = level.GetPlayerAvatar(); if (playerAvatar != null) { playerAvatar.SetDuelScore(playerAvatar.GetDuelScore() + this.m_scoreGain); switch (this.m_resultType) { case 0: playerAvatar.SetDuelLoseCount(playerAvatar.GetDuelLoseCount() + 1); break; case 1: playerAvatar.SetDuelWinCount(playerAvatar.GetDuelWinCount() + 1); break; case 2: playerAvatar.SetDuelDrawCount(playerAvatar.GetDuelDrawCount() + 1); break; } level.GetAchievementManager().RefreshStatus(); LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar(); if (homeOwnerAvatar.GetChangeListener() != null) { homeOwnerAvatar.GetChangeListener().DuelScoreChanged(homeOwnerAvatar.GetAllianceId(), this.m_scoreGain, this.m_resultType, true); } return(0); } return(-1); }
public override void DeathEvent() { LogicHitpointComponent hitpointComponent = this.GetHitpointComponent(); LogicCharacterData data = this.GetCharacterData(); if (hitpointComponent != null && hitpointComponent.GetTeam() == 1 && !this.IsHero() && !data.IsSecondaryTroop() && this.m_level.GetVillageType() == 0 && this.m_allianceUnit) { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); homeOwnerAvatar.RemoveAllianceUnit(data, this.m_upgradeLevel); homeOwnerAvatar.GetChangeListener().AllianceUnitRemoved(data, this.m_upgradeLevel); } if (data.GetSpecialAbilityType() != LogicCharacterData.SPECIAL_ABILITY_TYPE_RESPAWN_AS_CANNON || data.GetSpecialAbilityLevel(this.m_upgradeLevel) <= 0) { if (data.GetSpecialAbilityType() == LogicCharacterData.SPECIAL_ABILITY_TYPE_SPAWN_UNITS) { if (data.GetSpecialAbilityLevel(this.m_upgradeLevel) > 0) { this.CheckSpawning(null, data.GetSpecialAbilityAttribute(this.m_upgradeLevel), 0, 0); } } else if (data.GetSecondaryTroop() != null) { this.CheckSpawning(null, 0, 0, 0); } } else if (!this.m_ejected) { this.CheckSpawning(LogicDataTables.GetCharacterByName("MovingCannonSecondary", null), 1, data.GetSpecialAbilityAttribute(this.m_upgradeLevel), 500); } this.AddTombstoneIfNeeded(); if (this.m_parent != null) { this.m_parent.RemoveChildren(this); this.m_parent = null; } base.DeathEvent(); }
public override int Execute(LogicLevel level) { if (this.m_excludeMemberList == null || this.m_excludeMemberList.Size() <= LogicDataTables.GetGlobals().GetWarMaxExcludeMembers()) { if (this.m_enemyAllianceId != null) { LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar(); if (homeOwnerAvatar.IsInAlliance()) { if (homeOwnerAvatar.GetAllianceRole() == LogicAvatarAllianceRole.LEADER || homeOwnerAvatar.GetAllianceRole() == LogicAvatarAllianceRole.CO_LEADER) { LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle(); if (allianceCastle != null) { LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent(); if (bunkerComponent != null && bunkerComponent.GetArrangedWarCooldownTime() == 0) { bunkerComponent.StartArrangedWarCooldownTime(); homeOwnerAvatar.GetChangeListener().StartArrangedWar(this.m_excludeMemberList, this.m_enemyAllianceId, 0, 0, 0); return(0); } return(-5); } return(-4); } return(-3); } return(-2); } return(-3); } return(-1); }
public bool SetSleep(bool enabled) { LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); int state = homeOwnerAvatar.GetHeroState(this.m_hero); if (state != 0) { int newState = enabled ? 2 : 3; if (state != newState) { homeOwnerAvatar.SetHeroState(this.m_hero, newState); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, newState); return(true); } } return(false); }
public override int Execute(LogicLevel level) { if (this.m_excludeMemberList == null || this.m_excludeMemberList.Size() <= LogicDataTables.GetGlobals().GetWarMaxExcludeMembers()) { LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar(); if (homeOwnerAvatar.IsInAlliance()) { if (homeOwnerAvatar.GetAllianceRole() == LogicAvatarAllianceRole.LEADER || homeOwnerAvatar.GetAllianceRole() == LogicAvatarAllianceRole.CO_LEADER) { homeOwnerAvatar.GetChangeListener().StartWar(this.m_excludeMemberList); return(0); } return(-3); } return(-2); } return(-1); }
public void CancelUpgrade() { if (this.m_timer != null) { LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); int upgradeLevel = homeOwnerAvatar.GetUnitUpgradeLevel(this.m_hero); int upgradeCost = this.m_hero.GetUpgradeCost(upgradeLevel); LogicResourceData upgradeResourceData = this.m_hero.GetUpgradeResource(upgradeLevel); homeOwnerAvatar.CommodityCountChangeHelper(0, upgradeResourceData, LogicDataTables.GetGlobals().GetHeroUpgradeCancelMultiplier() * upgradeCost / 100); this.m_parent.GetLevel().GetWorkerManagerAt(this.m_parent.GetData().GetVillageType()).DeallocateWorker(this.m_parent); homeOwnerAvatar.SetHeroState(this.m_hero, 3); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 3); this.m_timer.Destruct(); this.m_timer = null; } else { Debugger.Warning("LogicHeroBaseComponent::cancelUpgrade called even upgrade is not on going!"); } }
public void SetBattleOver() { if (this.m_battleOver) { return; } this.m_level.GetBattleLog().SetBattleEnded(LogicDataTables.GetGlobals().GetAttackLengthSecs() - this.GetRemainingAttackSeconds()); this.m_level.GetMissionManager().Tick(); LogicArrayList <LogicComponent> components = this.m_level.GetComponentManager().GetComponents(LogicComponentType.COMBAT); for (int i = 0; i < components.Size(); i++) { ((LogicCombatComponent)components[i]).Boost(0, 0, 0); } bool duelMatch = (this.m_level.GetMatchType() & 0xFFFFFFFE) == 8; if (duelMatch) { LogicAvatar avatar = this.m_level.GetVisitorAvatar(); if (avatar != null && avatar.IsClientAvatar()) { ((LogicClientAvatar)avatar).RemoveUnitsVillage2(); } } if (this.m_state == 3) { this.EndDefendState(); } else { LogicBattleLog battleLog = this.m_level.GetBattleLog(); if (battleLog.GetBattleStarted()) { LogicAvatar visitorAvatar = this.m_level.GetVisitorAvatar(); LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); int stars = battleLog.GetStars(); if (!this.m_level.GetVisitorAvatar().IsClientAvatar() || !this.m_level.GetHomeOwnerAvatar().IsClientAvatar()) { if (visitorAvatar.IsClientAvatar() && homeOwnerAvatar.IsNpcAvatar()) { LogicNpcAvatar npcAvatar = (LogicNpcAvatar)homeOwnerAvatar; LogicNpcData npcData = npcAvatar.GetNpcData(); int npcStars = visitorAvatar.GetNpcStars(npcData); if (stars > npcStars && npcData.IsSinglePlayer()) { visitorAvatar.SetNpcStars(npcData, stars); visitorAvatar.GetChangeListener().CommodityCountChanged(0, npcData, stars); } // TODO: LogicBattleLog::sendNpcAttackEndEvents. } } else { LogicClientAvatar attacker = (LogicClientAvatar)visitorAvatar; LogicClientAvatar defender = (LogicClientAvatar)homeOwnerAvatar; int originalAttackerScore = attacker.GetScore(); int originalDefenderScore = defender.GetScore(); int matchType = this.m_level.GetMatchType(); if (matchType == 1 || !LogicDataTables.GetGlobals().ScoringOnlyFromMatchedMode() && (matchType == 0 || matchType == 2 || matchType == 4 || matchType == 6)) { LogicGamePlayUtil.CalculateCombatScore(attacker, defender, stars, false, matchType == 4, battleLog.GetDestructionPercentage(), this.m_calendar.GetStarBonusMultiplier(), duelMatch); if (!duelMatch && homeOwnerAvatar.GetTownHallLevel() >= LogicDataTables.GetGlobals().GetLootCartEnabledTownHall()) { LogicDataTable resourceTable = LogicDataTables.GetTable(LogicDataType.RESOURCE); if (resourceTable.GetItemCount() > 0) { bool hasStolen = false; for (int i = 0; i < resourceTable.GetItemCount(); i++) { LogicResourceData data = (LogicResourceData)resourceTable.GetItemAt(i); if (!data.IsPremiumCurrency()) { if (battleLog.GetStolenResources(data) > 0) { hasStolen = true; } } } if (hasStolen) { LogicGameObjectManager gameObjectManager = this.m_level.GetGameObjectManagerAt(0); LogicObstacle lootCart = gameObjectManager.GetLootCart(); if (lootCart == null) { gameObjectManager.AddLootCart(); lootCart = gameObjectManager.GetLootCart(); } if (lootCart != null) { LogicLootCartComponent lootCartComponent = lootCart.GetLootCartComponent(); if (lootCartComponent != null) { for (int i = 0; i < resourceTable.GetItemCount(); i++) { LogicResourceData data = (LogicResourceData)resourceTable.GetItemAt(i); if (!data.IsPremiumCurrency() && data.GetWarResourceReferenceData() == null) { int lootPercentage = lootCart.GetObstacleData().GetLootDefensePercentage(); int lootCount = battleLog.GetStolenResources(data) * lootPercentage / 100; lootCartComponent.SetResourceCount(i, LogicMath.Min(LogicMath.Max(lootCount, lootCartComponent.GetResourceCount(i)), lootCartComponent.GetCapacityCount(i))); } } } } } } } this.m_level.UpdateBattleShieldStatus(false); if (stars > 0) { LogicArrayList <LogicDataSlot> castedUnits = battleLog.GetCastedUnits(); LogicArrayList <LogicDataSlot> castedSpells = battleLog.GetCastedSpells(); LogicArrayList <LogicUnitSlot> castedAllianceUnits = battleLog.GetCastedAllianceUnits(); LogicArrayList <LogicDataSlot> placedUnits = new LogicArrayList <LogicDataSlot>(castedUnits.Size()); for (int i = 0; i < castedUnits.Size(); i++) { placedUnits.Add(new LogicDataSlot(castedUnits[i].GetData(), castedUnits[i].GetCount())); } for (int i = 0; i < castedSpells.Size(); i++) { int idx = -1; for (int j = 0; j < placedUnits.Size(); j++) { if (placedUnits[j].GetData() == castedSpells[i].GetData()) { idx = j; break; } } if (idx != -1) { placedUnits[idx].SetCount(placedUnits[idx].GetCount() + castedSpells[i].GetCount()); } else { placedUnits.Add(new LogicDataSlot(castedSpells[i].GetData(), castedSpells[i].GetCount())); } } for (int i = 0; i < castedAllianceUnits.Size(); i++) { placedUnits.Add(new LogicDataSlot(castedAllianceUnits[i].GetData(), castedAllianceUnits[i].GetCount())); } for (int i = 0; i < placedUnits.Size(); i++) { LogicCombatItemData data = (LogicCombatItemData)placedUnits[i].GetData(); LogicCalendarUseTroop calendarUseTroopEvent = this.m_calendar.GetUseTroopEvents(data); if (calendarUseTroopEvent != null) { int count = attacker.GetEventUnitCounterCount(data); if (placedUnits[i].GetCount() >= count >> 16) { int progressCount = (short)count + 1; int eventCounter = progressCount | (int)(count & 0xFFFF0000); attacker.SetCommodityCount(6, data, eventCounter); attacker.GetChangeListener().CommodityCountChanged(6, data, eventCounter); if (calendarUseTroopEvent.GetParameter(0) == progressCount) { int diamonds = calendarUseTroopEvent.GetParameter(2); int xp = calendarUseTroopEvent.GetParameter(3); attacker.XpGainHelper(xp); attacker.SetDiamonds(attacker.GetDiamonds() + diamonds); attacker.SetFreeDiamonds(attacker.GetFreeDiamonds() + diamonds); attacker.GetChangeListener().FreeDiamondsAdded(diamonds, 9); Debugger.HudPrint(string.Format("USE TROOP Event: Awarding XP: {0} GEMS {1}", xp, diamonds)); } } } } for (int i = 0; i < placedUnits.Size(); i++) { placedUnits[i].Destruct(); } placedUnits.Destruct(); } } if (this.m_state != 5 && this.m_level.GetDefenseShieldActivatedHours() == 0 && battleLog.GetDestructionPercentage() > 0) { int defenseVillageGuardCounter = defender.GetDefenseVillageGuardCounter() + 1; defender.SetDefenseVillageGuardCounter(defenseVillageGuardCounter); defender.GetChangeListener().DefenseVillageGuardCounterChanged(defenseVillageGuardCounter); int villageGuardMins = (defenseVillageGuardCounter & 0xFFFFFF) == 3 * ((defenseVillageGuardCounter & 0xFFFFFF) / 3) ? defender.GetLeagueTypeData().GetVillageGuardInMins() : LogicDataTables.GetGlobals().GetDefaultDefenseVillageGuard(); this.m_level.GetHome().GetChangeListener().GuardActivated(60 * villageGuardMins); Debugger.HudPrint(string.Format("Battle end. No Shield, Village Guard for defender: {0}", villageGuardMins)); } battleLog.SetAttackerScore(attacker.GetScore() - originalAttackerScore); battleLog.SetDefenderScore(defender.GetScore() - originalDefenderScore); battleLog.SetOriginalAttackerScore(originalAttackerScore); battleLog.SetOriginalDefenderScore(originalDefenderScore); if (this.m_state != 5) { if (stars != 0) { if (matchType != 3 && matchType != 7 && matchType != 8 && matchType != 9) { if (matchType == 5) { if (stars > this.m_level.GetPreviousAttackStars() && !this.m_level.GetIgnoreAttack()) { this.m_level.GetAchievementManager().IncreaseWarStars(stars); } } else { this.m_level.GetAchievementManager().PvpAttackWon(); } } } else if (matchType > 9 || matchType == 3 || matchType == 5 || matchType == 7 || matchType == 8 || matchType == 9) { this.m_level.GetAchievementManager().PvpDefenseWon(); } } } } } this.m_battleOver = true; }
public override void LoadingFinished() { if (this.m_parent.GetLevel().IsInCombatState()) { if (this.m_parent.GetVillageType() == this.m_parent.GetLevel().GetVillageType()) { if (this.m_parent.GetLevel().GetVillageType() == this.m_parent.GetVillageType()) { this.m_patrolPath = this.CreatePatrolPath(); } } } LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); LogicBuilding building = (LogicBuilding)this.m_parent; if (!building.IsLocked() && homeOwnerAvatar.GetHeroState(this.m_hero) == 0) { homeOwnerAvatar.SetHeroState(this.m_hero, 3); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 3); } if (this.m_timer != null) { int remainingSecs = this.m_timer.GetRemainingSeconds(this.m_parent.GetLevel().GetLogicTime()); int totalSecs = this.GetTotalSeconds(); if (LogicDataTables.GetGlobals().ClampUpgradeTimes()) { if (remainingSecs > totalSecs) { this.m_timer.StartTimer(totalSecs, this.m_parent.GetLevel().GetLogicTime(), true, this.m_parent.GetLevel().GetHomeOwnerAvatarChangeListener().GetCurrentTimestamp()); } } else { this.m_timer.StartTimer(LogicMath.Min(remainingSecs, totalSecs), this.m_parent.GetLevel().GetLogicTime(), false, -1); } if (!building.IsLocked() && homeOwnerAvatar.GetHeroState(this.m_hero) != 1) { homeOwnerAvatar.SetHeroState(this.m_hero, 1); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 1); } } else { if (!building.IsLocked() && homeOwnerAvatar.GetHeroState(this.m_hero) == 1) { homeOwnerAvatar.SetHeroState(this.m_hero, 3); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 3); } } if (this.m_hero.HasNoDefence() && !this.m_parent.GetLevel().IsInCombatState() && homeOwnerAvatar.GetHeroState(this.m_hero) == 3) { homeOwnerAvatar.SetHeroState(this.m_hero, 2); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(2, this.m_hero, 2); } if (homeOwnerAvatar.GetHeroState(this.m_hero) == 3) { if (this.m_parent.GetLevel().IsInCombatState()) { if (!this.m_sharedHeroCombatData && !this.m_hero.HasNoDefence()) { if (this.m_parent.GetVillageType() == this.m_parent.GetLevel().GetVillageType()) { this.AddDefendingHero(); } } } } int heroHealth = homeOwnerAvatar.GetHeroHealth(this.m_hero); int fullRegenerationTime = this.m_hero.GetFullRegenerationTimeSec(homeOwnerAvatar.GetUnitUpgradeLevel(this.m_hero)); if (fullRegenerationTime < heroHealth) { homeOwnerAvatar.GetChangeListener().CommodityCountChanged(0, this.m_hero, fullRegenerationTime); homeOwnerAvatar.SetHeroHealth(this.m_hero, fullRegenerationTime); } }
public override void Tick() { LogicAvatar homeOwnerAvatar = this.m_parent.GetLevel().GetHomeOwnerAvatar(); if (homeOwnerAvatar != null) { this.m_updateAvatarCooldown += 64; if (this.m_updateAvatarCooldown > 1000) { homeOwnerAvatar.UpdateStarBonusLimitCooldown(); homeOwnerAvatar.UpdateLootLimitCooldown(); this.m_updateAvatarCooldown -= 1000; } } if (this.m_parent.IsAlive()) { if (!this.IsEmpty()) { if (this.m_bunkerSearchTime > 0) { this.m_bunkerSearchTime -= 64; } else { bool airTriggered = false; bool groundLocked = false; if (this.m_team == 1) { bool inAirDistance = false; bool inGroundDistance = false; int clanCastleRadius = LogicDataTables.GetGlobals().GetClanCastleRadius(); if (LogicDataTables.GetGlobals().CastleTroopTargetFilter()) { LogicCharacter closestGroundAttacker = this.ClosestAttacker(false); LogicCharacter closestAirAttacker = this.ClosestAttacker(true); if (closestAirAttacker != null) { inAirDistance = closestAirAttacker.GetPosition().GetDistanceSquaredTo(this.m_parent.GetX(), this.m_parent.GetY()) < clanCastleRadius * clanCastleRadius; } if (closestGroundAttacker != null) { inGroundDistance = closestGroundAttacker.GetPosition().GetDistanceSquaredTo(this.m_parent.GetX(), this.m_parent.GetY()) < clanCastleRadius * clanCastleRadius; } } else { LogicCharacter closestAttacker = (LogicCharacter)this.m_parent.GetLevel().GetGameObjectManager() .GetClosestGameObject(this.m_parent.GetX(), this.m_parent.GetY(), this.m_filter); if (closestAttacker != null) { inAirDistance = inGroundDistance = closestAttacker.GetPosition().GetDistanceSquaredTo(this.m_parent.GetX(), this.m_parent.GetY()) < clanCastleRadius * clanCastleRadius; } } groundLocked = !inGroundDistance; airTriggered = inAirDistance; if (!airTriggered && groundLocked) { this.m_bunkerSearchTime = LogicDataTables.GetGlobals().GetBunkerSearchTime(); return; } } else { airTriggered = true; } LogicCharacterData spawnData = null; int spawnLevel = -1; for (int i = 0; i < this.GetUnitTypeCount(); i++) { LogicCombatItemData data = this.GetUnitType(i); if (data != null) { int count = this.GetUnitCount(i); if (count > 0) { int upgLevel = this.GetUnitLevel(i); if (data.GetCombatItemType() == LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER) { LogicCharacterData characterData = (LogicCharacterData)data; LogicAttackerItemData attackerItemData = characterData.GetAttackerItemData(upgLevel); if (!(airTriggered & groundLocked) || attackerItemData.GetTrackAirTargets(false)) { if (airTriggered | groundLocked || attackerItemData.GetTrackGroundTargets(false)) { this.RemoveUnits(data, upgLevel, 1); spawnData = characterData; spawnLevel = upgLevel; } } } } } if (spawnData != null) { break; } } if (spawnData != null) { LogicCharacter character = (LogicCharacter)LogicGameObjectFactory.CreateGameObject(spawnData, this.m_parent.GetLevel(), this.m_parent.GetVillageType()); character.GetHitpointComponent().SetTeam(this.m_team); if (character.GetChildTroops() != null) { LogicArrayList <LogicCharacter> childrens = character.GetChildTroops(); for (int i = 0; i < childrens.Size(); i++) { childrens[i].GetHitpointComponent().SetTeam(this.m_team); } } character.SetUpgradeLevel(spawnLevel == -1 ? 0 : spawnLevel); character.SetAllianceUnit(); if (character.GetCharacterData().IsJumper()) { character.GetMovementComponent().EnableJump(3600000); } if (this.m_team == 1) { if (LogicDataTables.GetGlobals().EnableDefendingAllianceTroopJump()) { character.GetMovementComponent().EnableJump(3600000); } if (LogicDataTables.GetGlobals().AllianceTroopsPatrol()) { character.GetCombatComponent().SetSearchRadius(LogicDataTables.GetGlobals().GetClanCastleRadius() >> 9); if (this.m_parent.GetGameObjectType() == LogicGameObjectType.BUILDING) { character.GetMovementComponent().SetBaseBuilding((LogicBuilding)this.m_parent); } } } else { LogicAvatar visitorAvatar = this.m_parent.GetLevel().GetVisitorAvatar(); visitorAvatar.RemoveAllianceUnit(spawnData, spawnLevel); visitorAvatar.GetChangeListener().AllianceUnitRemoved(spawnData, spawnLevel); LogicBattleLog battleLog = this.m_parent.GetLevel().GetBattleLog(); battleLog.IncrementDeployedAllianceUnits(spawnData, 1, spawnLevel); battleLog.SetAllianceUsed(true); } if (this.m_team == 1) { int spawnOffsetX = 0; int spawnOffsetY = 0; switch (this.m_troopSpawnOffset) { case 0: spawnOffsetX = 1; spawnOffsetY = 0; break; case 1: spawnOffsetX = -1; spawnOffsetY = 0; break; case 2: spawnOffsetX = 0; spawnOffsetY = 1; break; case 3: spawnOffsetX = 0; spawnOffsetY = -1; break; } character.SetInitialPosition(this.m_parent.GetMidX() + ((this.m_parent.GetWidthInTiles() << 8) - 128) * spawnOffsetX, this.m_parent.GetMidY() + ((this.m_parent.GetHeightInTiles() << 8) - 128) * spawnOffsetY); if (++this.m_troopSpawnOffset > 3) { this.m_troopSpawnOffset = 0; } } else if (LogicDataTables.GetGlobals().AllowClanCastleDeployOnObstacles()) { int posX = this.m_parent.GetX() + (this.m_parent.GetWidthInTiles() << 9) - 128; int posY = this.m_parent.GetY() + (this.m_parent.GetHeightInTiles() << 8); if (LogicGamePlayUtil.GetNearestValidAttackPos(this.m_parent.GetLevel(), posX, posY, out int outputX, out int outputY)) { character.SetInitialPosition(outputX, outputY); } else { character.SetInitialPosition(posX, posY); } } else { character.SetInitialPosition(this.m_parent.GetX() + (this.m_parent.GetWidthInTiles() << 9) - 128, this.m_parent.GetY() + (this.m_parent.GetHeightInTiles() << 8)); } this.m_parent.GetGameObjectManager().AddGameObject(character, -1); } this.m_bunkerSearchTime = LogicDataTables.GetGlobals().GetBunkerSearchTime(); } } }
public void DivideAvatarUnitsToStorages(int villageType) { if (this.m_level.GetHomeOwnerAvatar() != null) { if (villageType == 1) { for (int i = this.m_units.Size() - 1; i >= 0; i--) { this.m_units[i].Destruct(); this.m_units.Remove(i); } LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); LogicArrayList <LogicComponent> components = this.m_components[(int)LogicComponentType.VILLAGE2_UNIT]; if (homeOwnerAvatar.GetUnitsNewTotalVillage2() <= 0 || LogicDataTables.GetGlobals().Village2TrainingOnlyUseRegularStorage()) { for (int i = 0; i < components.Size(); i++) { LogicVillage2UnitComponent village2UnitComponent = (LogicVillage2UnitComponent)components[i]; LogicCombatItemData unitData = village2UnitComponent.GetUnitData(); int idx = -1; for (int j = 0; j < this.m_units.Size(); j++) { if (this.m_units[j].GetData() == unitData) { idx = j; break; } } if (idx == -1) { this.m_units.Add(new LogicDataSlot(unitData, -village2UnitComponent.GetUnitCount())); } else { this.m_units[idx].SetCount(this.m_units[idx].GetCount() - village2UnitComponent.GetUnitCount()); } } LogicArrayList <LogicDataSlot> units = homeOwnerAvatar.GetUnitsVillage2(); for (int i = 0; i < units.Size(); i++) { LogicDataSlot slot = units[i]; LogicCombatItemData data = (LogicCombatItemData)slot.GetData(); int count = slot.GetCount(); int idx = -1; for (int j = 0; j < this.m_units.Size(); j++) { if (this.m_units[j].GetData() == data) { idx = j; break; } } if (idx == -1) { this.m_units.Add(new LogicDataSlot(data, count)); } else { this.m_units[idx].SetCount(this.m_units[idx].GetCount() + count); } } for (int i = 0; i < this.m_units.Size(); i++) { LogicDataSlot slot = this.m_units[i]; LogicCharacterData unitData = (LogicCharacterData)slot.GetData(); int unitCount = slot.GetCount(); if (unitCount != 0) { for (int j = 0; j < components.Size(); j++) { LogicVillage2UnitComponent component = (LogicVillage2UnitComponent)components[j]; if (component.GetUnitData() == unitData) { int highestBuildingLevel = this.m_level.GetGameObjectManagerAt(1).GetHighestBuildingLevel(unitData.GetProductionHouseData()); if (unitData.IsUnlockedForProductionHouseLevel(highestBuildingLevel)) { if (unitCount < 0) { int count = component.GetUnitCount(); if (count >= -unitCount) { component.SetUnit(unitData, LogicMath.Max(0, count + unitCount)); unitCount += count; } else { component.SetUnit(unitData, 0); unitCount += count; } } else { int maxUnits = component.GetMaxUnitsInCamp(unitData); int addCount = LogicMath.Min(maxUnits, unitCount); component.SetUnit(unitData, addCount); unitCount -= addCount; } component.TrainUnit(unitData); } else { component.RemoveUnits(); } } if (unitCount == 0) { break; } } if (unitCount > 0) { homeOwnerAvatar.SetUnitCountVillage2(unitData, 0); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(7, unitData, 0); } } } } else { LogicArrayList <LogicDataSlot> unitsNew = homeOwnerAvatar.GetUnitsNewVillage2(); for (int i = 0; i < unitsNew.Size(); i++) { LogicDataSlot slot = unitsNew[i]; LogicCharacterData data = (LogicCharacterData)slot.GetData(); int count = slot.GetCount(); int index = -1; for (int j = 0; j < this.m_units.Size(); j++) { if (this.m_units[j].GetData() == data) { index = j; break; } } if (count > 0) { if (index != -1) { this.m_units[index].SetCount(this.m_units[index].GetCount() + count); this.m_units.Add(new LogicDataSlot(data, count)); } else { this.m_units.Add(new LogicDataSlot(data, count)); } } } for (int i = 0; i < this.m_units.Size(); i++) { homeOwnerAvatar.CommodityCountChangeHelper(8, this.m_units[i].GetData(), -this.m_units[i].GetCount()); } for (int i = 0; i < this.m_units.Size(); i++) { LogicDataSlot slot = this.m_units[i]; LogicCharacterData data = (LogicCharacterData)slot.GetData(); int count = slot.GetCount(); if (count > 0) { for (int j = 0; j < components.Size(); j++) { LogicVillage2UnitComponent village2UnitComponent = (LogicVillage2UnitComponent)components[j]; int maxUnitsInCamp = village2UnitComponent.GetMaxUnitsInCamp(data); int addCount = LogicMath.Min(count, maxUnitsInCamp); village2UnitComponent.SetUnit(data, addCount); village2UnitComponent.TrainUnit(data); count -= addCount; if (count <= 0) { break; } } } } } } else { for (int i = this.m_units.Size() - 1; i >= 0; i--) { this.m_units[i].Destruct(); this.m_units.Remove(i); } LogicArrayList <LogicComponent> components = this.m_components[(int)LogicComponentType.UNIT_STORAGE]; for (int i = 0; i < components.Size(); i++) { LogicUnitStorageComponent storageComponent = (LogicUnitStorageComponent)components[i]; for (int j = 0; j < storageComponent.GetUnitTypeCount(); j++) { LogicCombatItemData unitType = storageComponent.GetUnitType(j); int unitCount = storageComponent.GetUnitCount(j); int index = -1; for (int k = 0; k < this.m_units.Size(); k++) { LogicDataSlot tmp = this.m_units[k]; if (tmp.GetData() == unitType) { index = k; break; } } if (index != -1) { this.m_units[index].SetCount(this.m_units[index].GetCount() - unitCount); } else { this.m_units.Add(new LogicDataSlot(unitType, -unitCount)); } } } LogicArrayList <LogicDataSlot> units = this.m_level.GetHomeOwnerAvatar().GetUnits(); for (int i = 0; i < units.Size(); i++) { LogicDataSlot slot = units[i]; int index = -1; for (int j = 0; j < this.m_units.Size(); j++) { LogicDataSlot tmp = this.m_units[j]; if (tmp.GetData() == slot.GetData()) { index = j; break; } } if (index != -1) { this.m_units[index].SetCount(this.m_units[index].GetCount() + slot.GetCount()); } else { this.m_units.Add(new LogicDataSlot(slot.GetData(), slot.GetCount())); } } LogicArrayList <LogicDataSlot> spells = this.m_level.GetHomeOwnerAvatar().GetSpells(); for (int i = 0; i < spells.Size(); i++) { LogicDataSlot slot = spells[i]; int index = -1; for (int j = 0; j < this.m_units.Size(); j++) { LogicDataSlot tmp = this.m_units[j]; if (tmp.GetData() == slot.GetData()) { index = j; break; } } if (index != -1) { this.m_units[index].SetCount(this.m_units[index].GetCount() + slot.GetCount()); } else { this.m_units.Add(new LogicDataSlot(slot.GetData(), slot.GetCount())); } } for (int i = 0; i < this.m_units.Size(); i++) { LogicDataSlot slot = this.m_units[i]; LogicCombatItemData data = (LogicCombatItemData)slot.GetData(); int unitCount = slot.GetCount(); if (unitCount != 0) { for (int j = 0; j < components.Size(); j++) { LogicUnitStorageComponent unitStorageComponent = (LogicUnitStorageComponent)components[j]; if (unitCount >= 0) { while (unitStorageComponent.CanAddUnit(data)) { unitStorageComponent.AddUnit(data); if (--unitCount <= 0) { break; } } } else { int idx = unitStorageComponent.GetUnitTypeIndex(data); if (idx != -1) { int count = unitStorageComponent.GetUnitCount(idx); if (count < -unitCount) { unitStorageComponent.RemoveUnits(data, count); unitCount += count; } else { unitStorageComponent.RemoveUnits(data, -unitCount); break; } } } } } } } } }
public void ValidateTroopUpgradeLevels() { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); if (homeOwnerAvatar != null) { if (homeOwnerAvatar.IsClientAvatar()) { int[] laboratoryLevels = new int[2]; for (int i = 0; i < 2; i++) { LogicBuilding laboratory = this.m_level.GetGameObjectManagerAt(i).GetLaboratory(); if (laboratory != null) { laboratoryLevels[i] = laboratory.GetUpgradeLevel(); } } LogicDataTable characterTable = LogicDataTables.GetTable(LogicDataType.CHARACTER); for (int i = 0; i < characterTable.GetItemCount(); i++) { LogicCharacterData characterData = (LogicCharacterData)characterTable.GetItemAt(i); int upgradeLevel = homeOwnerAvatar.GetUnitUpgradeLevel(characterData); int villageType = characterData.GetVillageType(); int newUpgradeLevel = upgradeLevel; if (upgradeLevel >= characterData.GetUpgradeLevelCount()) { newUpgradeLevel = characterData.GetUpgradeLevelCount() - 1; } int laboratoryLevel = laboratoryLevels[villageType]; int requireLaboratoryLevel; do { requireLaboratoryLevel = characterData.GetRequiredLaboratoryLevel(newUpgradeLevel--); } while (newUpgradeLevel >= 0 && requireLaboratoryLevel > laboratoryLevel); newUpgradeLevel += 1; if (upgradeLevel > newUpgradeLevel) { homeOwnerAvatar.SetUnitUpgradeLevel(characterData, newUpgradeLevel); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(1, characterData, newUpgradeLevel); } } LogicDataTable spellTable = LogicDataTables.GetTable(LogicDataType.SPELL); for (int i = 0; i < spellTable.GetItemCount(); i++) { LogicSpellData spellData = (LogicSpellData)spellTable.GetItemAt(i); int upgradeLevel = homeOwnerAvatar.GetUnitUpgradeLevel(spellData); int villageType = spellData.GetVillageType(); int newUpgradeLevel = upgradeLevel; if (upgradeLevel >= spellData.GetUpgradeLevelCount()) { newUpgradeLevel = spellData.GetUpgradeLevelCount() - 1; } int laboratoryLevel = laboratoryLevels[villageType]; int requireLaboratoryLevel; do { requireLaboratoryLevel = spellData.GetRequiredLaboratoryLevel(newUpgradeLevel--); } while (newUpgradeLevel >= 0 && requireLaboratoryLevel > laboratoryLevel); newUpgradeLevel += 1; if (upgradeLevel > newUpgradeLevel) { homeOwnerAvatar.SetUnitUpgradeLevel(spellData, newUpgradeLevel); homeOwnerAvatar.GetChangeListener().CommodityCountChanged(1, spellData, newUpgradeLevel); } } } } }