public int GetDonateCount(LogicLong avatarId, LogicCombatItemData data) { return(LogicDonationHelper.GetDonateCount(this.m_donationContainerList, avatarId, data)); }
/// <summary> /// Adds the specified unit. /// </summary> public void AddUnit(LogicCombatItemData data) { this.AddUnitImpl(data, -1); }
public virtual void AllianceUnitDonateOk(LogicCombatItemData data, int upgLevel, LogicLong streamId, bool quickDonate) { }
public void Load(LogicJSONObject root) { if (this.m_timer != null) { this.m_timer.Destruct(); this.m_timer = null; } if (this.m_boostTimer != null) { this.m_boostTimer.Destruct(); this.m_boostTimer = null; } for (int i = this.m_slots.Size() - 1; i >= 0; i--) { this.m_slots[i].Destruct(); this.m_slots.Remove(i); } LogicJSONObject jsonObject = root.GetJSONObject("unit_prod"); if (jsonObject != null) { LogicJSONArray slotArray = jsonObject.GetJSONArray("slots"); if (slotArray != null) { for (int i = 0; i < slotArray.Size(); i++) { LogicJSONObject slotObject = slotArray.GetJSONObject(i); if (slotObject != null) { LogicJSONNumber dataObject = slotObject.GetJSONNumber("id"); if (dataObject != null) { LogicData data = LogicDataTables.GetDataById(dataObject.GetIntValue()); if (data != null) { LogicJSONNumber countObject = slotObject.GetJSONNumber("cnt"); LogicJSONBoolean termineObject = slotObject.GetJSONBoolean("t"); if (countObject != null) { if (countObject.GetIntValue() > 0) { LogicUnitProductionSlot slot = new LogicUnitProductionSlot(data, countObject.GetIntValue(), false); if (termineObject != null) { slot.SetTerminate(termineObject.IsTrue()); } this.m_slots.Add(slot); } } } } } } } if (this.m_slots.Size() > 0) { LogicUnitProductionSlot slot = this.GetCurrentlyTrainedSlot(); if (slot != null) { LogicJSONNumber timeObject = jsonObject.GetJSONNumber("t"); if (timeObject != null) { this.m_timer = new LogicTimer(); this.m_timer.StartTimer(timeObject.GetIntValue(), this.m_level.GetLogicTime(), false, -1); } else { LogicCombatItemData combatItemData = (LogicCombatItemData)slot.GetData(); LogicAvatar avatar = this.m_level.GetHomeOwnerAvatar(); int upgradeLevel = 0; if (avatar != null) { upgradeLevel = avatar.GetUnitUpgradeLevel(combatItemData); } this.m_timer = new LogicTimer(); this.m_timer.StartTimer(combatItemData.GetTrainingTime(upgradeLevel, this.m_level, 0), this.m_level.GetLogicTime(), false, -1); Debugger.Print("LogicUnitProduction::load null timer, restart: " + this.m_timer.GetRemainingSeconds(this.m_level.GetLogicTime())); } } } LogicJSONNumber boostTimeObject = jsonObject.GetJSONNumber("boost_t"); if (boostTimeObject != null) { this.m_boostTimer = new LogicTimer(); this.m_boostTimer.StartTimer(boostTimeObject.GetIntValue(), this.m_level.GetLogicTime(), false, -1); } LogicJSONBoolean boostPauseObject = jsonObject.GetJSONBoolean("boost_pause"); if (boostPauseObject != null) { this.m_boostPause = boostPauseObject.IsTrue(); } } else { Debugger.Warning("LogicUnitProduction::load - Component wasn't found from the JSON"); } }
public bool RemoveUnit(LogicCombatItemData data, int index) { LogicUnitProductionSlot slot = null; bool removed = false; if (index > -1 && this.m_slots.Size() > index && this.m_slots[index].GetData() == data) { slot = this.m_slots[index]; } else { index = -1; for (int i = 0; i < this.m_slots.Size(); i++) { LogicUnitProductionSlot tmp = this.m_slots[i]; if (tmp.GetData() == data) { index = i; break; } } if (index == -1) { return(false); } slot = this.m_slots[index]; } int count = slot.GetCount(); if (count > 0) { removed = true; slot.SetCount(count - 1); if (count == 1) { int prodIdx = this.GetCurrentlyTrainedIndex(); if (prodIdx == index) { if (this.m_timer != null) { this.m_timer.Destruct(); this.m_timer = null; } } this.m_slots[index].Destruct(); this.m_slots.Remove(index); } } if (this.m_slots.Size() > 0) { LogicUnitProductionSlot productionSlot = this.GetCurrentlyTrainedSlot(); if (productionSlot == null || this.m_timer != null) { if (!removed) { return(false); } this.MergeSlots(); } else { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); LogicCombatItemData productionData = (LogicCombatItemData)productionSlot.GetData(); this.m_timer = new LogicTimer(); this.m_timer.StartTimer(productionData.GetTrainingTime(homeOwnerAvatar.GetUnitUpgradeLevel(productionData), this.m_level, 0), this.m_level.GetLogicTime(), false, -1); if (removed) { this.MergeSlots(); } } } else { if (!removed) { return(false); } this.MergeSlots(); } return(true); }
public virtual void UnitRemoved(LogicCombatItemData data) { // UnitRemoved. }
public LogicCalendarUseTroop(LogicCombatItemData data) { this.m_data = data; this.m_parameters = new LogicArrayList <int>(); }
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 LogicUpgradeUnitCommand(LogicCombatItemData combatItemData, int gameObjectId) { this.m_unitData = combatItemData; this.m_gameObjectId = gameObjectId; this.m_unitType = this.m_unitData.GetDataType(); }
/// <summary> /// Divides the avatar units to storages. /// </summary> public void DivideAvatarUnitsToStorages(int villageType) { if (this._level.GetHomeOwnerAvatar() != null) { if (villageType == 1) { // TODO: Implement divideAvatarUnitsToStorages(vType) for village type 1. } else { if (this._units.Count != 0) { do { this._units[0].Destruct(); this._units.Remove(0); } while (this._units.Count != 0); } LogicArrayList <LogicComponent> components = this._components[0]; for (int i = 0; i < components.Count; i++) { LogicUnitStorageComponent storageComponent = (LogicUnitStorageComponent)components[i]; for (int j = 0; j < storageComponent.GetUnitTypeCount(); j++) { LogicCombatItemData unitType = storageComponent.GetUnitType(j); Int32 unitCount = storageComponent.GetUnitCount(j); Int32 index = -1; for (int k = 0; k < this._units.Count; k++) { LogicDataSlot tmp = this._units[k]; if (tmp.GetData() == unitType) { index = k; break; } } if (index != -1) { this._units[index].SetCount(this._units[index].GetCount() - unitCount); } else { this._units.Add(new LogicDataSlot(unitType, -unitCount)); } } } LogicArrayList <LogicDataSlot> units = this._level.GetHomeOwnerAvatar().GetUnits(); for (int i = 0; i < units.Count; i++) { LogicDataSlot slot = units[i]; Int32 index = -1; for (int j = 0; j < this._units.Count; j++) { LogicDataSlot tmp = this._units[j]; if (tmp.GetData() == slot.GetData()) { index = j; break; } } if (index != -1) { this._units[index].SetCount(this._units[index].GetCount() + slot.GetCount()); } else { this._units.Add(new LogicDataSlot(slot.GetData(), slot.GetCount())); } } LogicArrayList <LogicDataSlot> spells = this._level.GetHomeOwnerAvatar().GetSpells(); for (int i = 0; i < spells.Count; i++) { LogicDataSlot slot = spells[i]; Int32 index = -1; for (int j = 0; j < this._units.Count; j++) { LogicDataSlot tmp = this._units[j]; if (tmp.GetData() == slot.GetData()) { index = j; break; } } if (index != -1) { this._units[index].SetCount(this._units[index].GetCount() + slot.GetCount()); } else { this._units.Add(new LogicDataSlot(slot.GetData(), slot.GetCount())); } } for (int i = 0; i < this._units.Count; i++) { LogicDataSlot slot = this._units[i]; LogicCombatItemData data = (LogicCombatItemData)slot.GetData(); Int32 unitCount = slot.GetCount(); if (unitCount != 0) { for (int j = 0; j < components.Count; 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; } } } } } } } } }
/// <summary> /// Called when the training of unit is ended. /// </summary> public bool TrainingFinished() { bool success = false; if (this._timer != null) { this._timer.Destruct(); this._timer = null; } if (this._slots.Count > 0) { LogicUnitProductionSlot prodSlot = this.GetCurrentlyTrainedSlot(); Int32 prodIdx = this.GetCurrentlyTrainedIndex(); if (prodSlot != null) { if (prodSlot.GetCount() == 1) { prodSlot.SetTerminate(true); } else { prodSlot.SetCount(prodSlot.GetCount() - 1); LogicUnitProductionSlot previousSlot = this._slots[LogicMath.Max(prodIdx - 1, 0)]; if (previousSlot != null && previousSlot.IsTerminate() && previousSlot.GetData().GetGlobalID() == prodSlot.GetData().GetGlobalID()) { previousSlot.SetCount(previousSlot.GetCount() + 1); } else { this._slots.Add(prodIdx, new LogicUnitProductionSlot(prodSlot.GetData(), 1, true)); } } } if (this._slots.Count > 0) { LogicCombatItemData nextProductionData = this.GetCurrentlyTrainedUnit(); if (nextProductionData != null && this._timer == null) { this._timer = new LogicTimer(); this._timer.StartTimer(nextProductionData.GetTrainingTime(this._level.GetHomeOwnerAvatar().GetUnitUpgradeLevel(nextProductionData), this._level, 0), this._level.GetLogicTime(), false, -1); this.MergeSlots(); success = true; } } } this.MergeSlots(); return(success); }
public override int Execute(LogicLevel level) { if (level.IsReadyForAttack()) { if (level.GetVillageType() == 0) { if (LogicDataTables.GetGlobals().AllowClanCastleDeployOnObstacles()) { if (!level.GetTileMap().IsValidAttackPos(this.m_x >> 9, this.m_y >> 9)) { return(-2); } } else { LogicTile tile = level.GetTileMap().GetTile(this.m_x >> 9, this.m_y >> 9); if (tile == null) { return(-4); } if (tile.GetPassableFlag() == 0) { return(-3); } } LogicClientAvatar playerAvatar = level.GetPlayerAvatar(); if (playerAvatar != null) { if (this.m_data != null) { LogicGameObjectManager gameObjectManager = level.GetGameObjectManagerAt(0); if (gameObjectManager.GetGameObjectCountByData(this.m_data) <= 0 && playerAvatar.GetAllianceCastleUsedCapacity() > 0) { LogicAlliancePortal alliancePortal = (LogicAlliancePortal)LogicGameObjectFactory.CreateGameObject(this.m_data, level, level.GetVillageType()); LogicBunkerComponent bunkerComponent = alliancePortal.GetBunkerComponent(); alliancePortal.SetInitialPosition(this.m_x, this.m_y); if (bunkerComponent != null) { bunkerComponent.SetMaxCapacity(playerAvatar.GetAllianceCastleTotalCapacity()); if (level.GetBattleLog() != null) { if (!level.GetBattleLog().HasDeployedUnits() && level.GetTotalAttackerHeroPlaced() == 0) { level.UpdateLastUsedArmy(); } } if (level.GetGameMode().IsInAttackPreparationMode()) { level.GetGameMode().EndAttackPreparation(); } bunkerComponent.RemoveAllUnits(); LogicArrayList <LogicUnitSlot> allianceUnits = playerAvatar.GetAllianceUnits(); for (int i = 0; i < allianceUnits.Size(); i++) { LogicUnitSlot slot = allianceUnits[i]; LogicCombatItemData data = (LogicCombatItemData)slot.GetData(); if (data != null) { int count = slot.GetCount(); if (data.GetCombatItemType() == LogicCombatItemData.COMBAT_ITEM_TYPE_CHARACTER) { for (int j = 0; j < count; j++) { if (bunkerComponent.GetUnusedCapacity() >= data.GetHousingSpace()) { bunkerComponent.AddUnitImpl(data, slot.GetLevel()); } } } } else { Debugger.Error("LogicPlaceAlliancePortalCommand::execute - NULL alliance character"); } } } gameObjectManager.AddGameObject(alliancePortal, -1); return(0); } } } return(-5); } } return(-1); }
public virtual void AllianceUnitCountChanged(LogicCombatItemData data, int upgLevel, int count) { }
public virtual void WarDonateFailed(LogicCombatItemData data, int upgLevel, LogicLong streamId, bool quickDonate) { }
public void RemoveDonation(LogicLong avatarId, LogicCombatItemData data, int upgLevel) { LogicDonationHelper.RemoveDonation(this.m_donationContainerList, avatarId, data, upgLevel); }
public int GetTrainingTime(LogicCombatItemData data) { return(data.GetTrainingTime(this.m_parent.GetLevel().GetHomeOwnerAvatar().GetUnitUpgradeLevel(data), this.m_parent.GetLevel(), 0)); }
public bool IsUnlocked(LogicCombatItemData data) { return(data.IsUnlockedForProductionHouseLevel(this.m_level.GetGameObjectManager().GetHighestBuildingLevel(data.GetProductionHouseData()))); }
public LogicTrainUnitVillage2Command(int gameObjectId, LogicCombatItemData combatItemData) { this.m_gameObjectId = gameObjectId; this.m_unitData = combatItemData; this.m_unitType = this.m_unitData.GetDataType() == LogicDataType.SPELL ? 1 : 0; }
public virtual void AllianceUnitRemoved(LogicCombatItemData data, int upgLevel) { }
/// <summary> /// Executes this instance. /// </summary> public override int Execute(LogicLevel level) { for (int i = 0; i < this._unitsCount.Count; i++) { if (this._unitsCount[i] < 0) { return(-1); } } if (LogicDataTables.GetGlobals().EnableTroopDeletion() && level.GetState() == 1 && this._unitsData.Count > 0) { LogicClientAvatar playerAvatar = level.GetPlayerAvatar(); Int32 removedUnits = 0; for (int i = 0; i < this._unitsData.Count; i++) { LogicCombatItemData data = this._unitsData[i]; Int32 unitCount = this._unitsCount[i]; if (this._removeType[i] != 0) { Int32 upgLevel = this._unitsUpgLevel[i]; if (data.GetCombatItemType() != 0) { if (data.GetCombatItemType() == 1) { playerAvatar.SetAllianceUnitCount(data, upgLevel, LogicMath.Max(0, playerAvatar.GetAllianceUnitCount(data, upgLevel) - unitCount)); if (unitCount > 0) { do { playerAvatar.GetChangeListener().AllianceUnitRemoved(data, upgLevel); } while (--unitCount != 0); } removedUnits |= 2; } } else { LogicBuilding allianceCastle = level.GetGameObjectManagerAt(0).GetAllianceCastle(); if (allianceCastle != null) { LogicBunkerComponent bunkerComponent = allianceCastle.GetBunkerComponent(); Int32 unitTypeIndex = bunkerComponent.GetUnitTypeIndex(data); if (unitTypeIndex != -1) { Int32 cnt = bunkerComponent.GetUnitCount(unitTypeIndex); if (cnt > 0) { bunkerComponent.RemoveUnits(data, upgLevel, cnt); playerAvatar.SetAllianceUnitCount(data, upgLevel, LogicMath.Max(0, playerAvatar.GetAllianceUnitCount(data, upgLevel) - unitCount)); removedUnits |= 1; if (unitCount > 0) { do { playerAvatar.GetChangeListener().AllianceUnitRemoved(data, upgLevel); } while (--unitCount != 0); } } } } } } else { if (playerAvatar != null && data != null) { playerAvatar.CommodityCountChangeHelper(0, data, -unitCount); } LogicArrayList <LogicComponent> components = level.GetComponentManager().GetComponents(0); for (int j = 0; j < components.Count; j++) { if (unitCount > 0) { LogicUnitStorageComponent storageComponent = (LogicUnitStorageComponent)components[j]; Int32 unitTypeIndex = storageComponent.GetUnitTypeIndex(data); if (unitTypeIndex != -1) { Int32 cnt = storageComponent.GetUnitCount(unitTypeIndex); if (cnt > 0) { cnt = LogicMath.Min(cnt, unitCount); storageComponent.RemoveUnits(data, cnt); int type = 2; if (data.GetCombatItemType() == 0) { if (storageComponent.GetParentListener() != null) { LogicGameObjectListener listener = storageComponent.GetParentListener(); for (int k = 0; k < cnt; k++) { listener.UnitRemoved(data); } } type = 1; } unitCount -= cnt; removedUnits |= type; } } } } } } switch (removedUnits) { case 3: if (LogicDataTables.GetGlobals().UseNewTraining()) { level.GetGameObjectManager().GetUnitProduction().MergeSlots(); level.GetGameObjectManager().GetSpellProduction().MergeSlots(); } break; case 2: if (LogicDataTables.GetGlobals().UseNewTraining()) { level.GetGameObjectManager().GetSpellProduction().MergeSlots(); } break; case 1: if (LogicDataTables.GetGlobals().UseNewTraining()) { level.GetGameObjectManager().GetUnitProduction().MergeSlots(); } break; default: Debugger.Print("WTF: " + removedUnits); break; } } return(0); }
public void FastForwardTime(int secs) { if (this.m_boostTimer != null && !this.m_boostPause) { int remainingSecs = this.m_boostTimer.GetRemainingSeconds(this.m_level.GetLogicTime()); if (remainingSecs <= secs) { this.m_boostTimer.Destruct(); this.m_boostTimer = null; } else { this.m_boostTimer.StartTimer(remainingSecs - secs, this.m_level.GetLogicTime(), false, -1); } } if (this.GetRemainingBoostTimeSecs() > 0) { if (this.GetBoostMultiplier() >= 2 && !this.IsBoostPaused()) { secs = LogicMath.Min(secs, this.GetRemainingBoostTimeSecs()) * (this.GetBoostMultiplier() - 1) + secs; } if (this.m_timer != null) { if (!this.IsBoostPaused()) { this.m_timer.FastForwardSubticks(4 * this.GetBoostMultiplier() - 4); } } } do { if (secs <= 0) { break; } LogicUnitProductionSlot productionSlot = this.GetCurrentlyTrainedSlot(); if (productionSlot == null) { break; } if (this.m_timer == null) { LogicCombatItemData productionData = (LogicCombatItemData)productionSlot.GetData(); this.m_timer = new LogicTimer(); this.m_timer.StartTimer(productionData.GetTrainingTime(this.m_level.GetHomeOwnerAvatar().GetUnitUpgradeLevel(productionData), this.m_level, 0), this.m_level.GetLogicTime(), false, -1); } int remainingSecs = this.m_timer.GetRemainingSeconds(this.m_level.GetLogicTime()); if (secs < remainingSecs) { this.m_timer.StartTimer(remainingSecs - secs, this.m_level.GetLogicTime(), false, -1); break; } secs -= remainingSecs; this.m_timer.StartTimer(0, this.m_level.GetLogicTime(), false, -1); } while (this.ProductionCompleted(false)); }
public void SetData(LogicCombatItemData data, LogicLong streamId, bool quickDonate) { this.m_unitData = data; this.m_streamId = streamId; this.m_quickDonate = quickDonate; }
public bool ProductionCompleted(bool speedUp) { bool success = false; if (!this.m_locked) { LogicComponentFilter filter = new LogicComponentFilter(); filter.SetComponentType(0); while (true) { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); LogicComponentManager componentManager = this.m_level.GetComponentManagerAt(this.m_villageType); LogicCombatItemData productionData = this.GetWaitingForSpaceUnit(); if (speedUp) { if (this.m_slots.Size() <= 0) { return(false); } productionData = (LogicCombatItemData)this.m_slots[0].GetData(); } if (productionData == null) { filter.Destruct(); return(false); } bool productionTerminate = this.m_slots[0].IsTerminate(); LogicBuildingData buildingProductionData = productionData.GetProductionHouseData(); LogicGameObjectManager gameObjectManager = this.m_level.GetGameObjectManagerAt(this.m_villageType); LogicBuilding productionHouse = gameObjectManager.GetHighestBuilding(buildingProductionData); if (LogicDataTables.GetGlobals().UseTroopWalksOutFromTraining()) { int gameObjectCount = gameObjectManager.GetNumGameObjects(); for (int i = 0; i < gameObjectCount; i++) { LogicGameObject gameObject = gameObjectManager.GetGameObjectByIndex(i); if (gameObject.GetGameObjectType() == LogicGameObjectType.BUILDING) { LogicBuilding building = (LogicBuilding)gameObject; LogicUnitProductionComponent unitProductionComponent = building.GetUnitProductionComponent(); if (unitProductionComponent != null) { if (unitProductionComponent.GetProductionType() == productionData.GetCombatItemType()) { if (building.GetBuildingData().GetProducesUnitsOfType() == productionData.GetUnitOfType() && !building.IsUpgrading() && !building.IsConstructing()) { if (productionData.IsUnlockedForProductionHouseLevel(building.GetUpgradeLevel())) { if (productionHouse != null) { int seed = this.m_level.GetPlayerAvatar().GetExpPoints(); if (building.Rand(seed) % 1000 > 750) { productionHouse = building; } } else { productionHouse = building; } } } } } } } } if (productionHouse != null) { LogicUnitStorageComponent unitStorageComponent = (LogicUnitStorageComponent)componentManager.GetClosestComponent(productionHouse.GetX(), productionHouse.GetY(), filter); if (unitStorageComponent != null) { if (unitStorageComponent.CanAddUnit(productionData)) { homeOwnerAvatar.CommodityCountChangeHelper(0, productionData, 1); unitStorageComponent.AddUnit(productionData); if (productionTerminate) { this.RemoveUnit(productionData, -1); } else { this.StartProducingNextUnit(); } success = true; if (this.m_slots.Size() > 0 && this.m_slots[0].IsTerminate() && this.m_slots[0].GetCount() > 0) { continue; } break; } filter.AddIgnoreObject(unitStorageComponent.GetParent()); } else { if (this.m_timer != null && this.m_timer.GetRemainingSeconds(this.m_level.GetLogicTime()) == 0) { success = this.TrainingFinished(); } break; } } else { break; } } filter.Destruct(); if (success) { this.m_nextProduction = 0; } else { this.m_nextProduction = 2000; } } return(success); }
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 MergeSlots() { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); if (this.m_slots.Size() > 0) { if (this.m_slots.Size() > 1) { for (int i = 1; i < this.m_slots.Size(); i++) { LogicUnitProductionSlot slot1 = this.m_slots[i]; LogicUnitProductionSlot slot2 = this.m_slots[i - 1]; if (slot1.GetData() == slot2.GetData()) { if (slot1.IsTerminate() == slot2.IsTerminate()) { this.m_slots.Remove(i--); slot2.SetCount(slot2.GetCount() + slot1.GetCount()); slot1.Destruct(); slot1 = null; } } } } } LogicComponentManager componentManager = this.m_level.GetComponentManagerAt(this.m_villageType); int usedCapacity = this.m_unitProductionType == LogicDataType.SPELL ? homeOwnerAvatar.GetSpellsTotalCapacity() : homeOwnerAvatar.GetUnitsTotalCapacity(); int totalCapacity = componentManager.GetTotalMaxHousing(this.m_unitProductionType != LogicDataType.CHARACTER ? 1 : 0); int freeCapacity = totalCapacity - usedCapacity; for (int i = 0, j = freeCapacity; i < this.m_slots.Size(); i++) { LogicUnitProductionSlot slot = this.m_slots[i]; LogicCombatItemData data = (LogicCombatItemData)slot.GetData(); int count = slot.GetCount(); int housingSpace = data.GetHousingSpace() * count; if (j < housingSpace) { if (count > 1) { int maxInProduction = j / data.GetHousingSpace(); if (maxInProduction > 0) { int inQueue = count - maxInProduction; if (inQueue > 0) { slot.SetCount(maxInProduction); this.m_slots.Add(i + 1, new LogicUnitProductionSlot(data, inQueue, slot.IsTerminate())); } } } break; } j -= housingSpace; } }
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; } } } } } } } } }
/// <summary> /// Removes the number of specified units. /// </summary> public void RemoveUnits(LogicCombatItemData data, int count) { this.RemoveUnitsImpl(data, -1, count); }
public void SetAllianceUnitData(LogicCombatItemData data) { this.m_unitData = data; }