public override void LoadFromJSON(LogicJSONObject jsonRoot) { LogicJSONObject baseObject = jsonRoot.GetJSONObject("base"); if (baseObject == null) { Debugger.Error("Replay LogicCastSpellCommand load failed! Base missing!"); } base.LoadFromJSON(baseObject); LogicJSONNumber dataNumber = jsonRoot.GetJSONNumber("d"); if (dataNumber != null) { this.m_data = (LogicSpellData)LogicDataTables.GetDataById(dataNumber.GetIntValue(), LogicDataType.SPELL); } if (this.m_data == null) { Debugger.Error("Replay LogicCastSpellCommand load failed! Data is NULL!"); } this.m_x = jsonRoot.GetJSONNumber("x").GetIntValue(); this.m_y = jsonRoot.GetJSONNumber("y").GetIntValue(); LogicJSONNumber dataLevelNumber = jsonRoot.GetJSONNumber("dl"); if (dataLevelNumber != null) { this.m_allianceSpell = true; this.m_upgLevel = dataLevelNumber.GetIntValue(); } }
public static LogicSpell CastSpell(LogicAvatar avatar, LogicSpellData spellData, bool allianceSpell, int upgLevel, LogicLevel level, int x, int y) { if (allianceSpell) { avatar.RemoveAllianceUnit(spellData, upgLevel); } else { avatar.CommodityCountChangeHelper(0, spellData, -1); } if (!allianceSpell) { upgLevel = avatar.GetUnitUpgradeLevel(spellData); } LogicSpell spell = (LogicSpell)LogicGameObjectFactory.CreateGameObject(spellData, level, level.GetVillageType()); spell.SetUpgradeLevel(upgLevel); spell.SetInitialPosition(x, y); level.GetGameObjectManager().AddGameObject(spell, -1); level.GetGameListener().AttackerPlaced(spellData); LogicBattleLog battleLog = level.GetBattleLog(); if (battleLog != null) { battleLog.IncrementCastedSpells(spellData, 1); battleLog.SetCombatItemLevel(spellData, upgLevel); } return(spell); }
internal override void Decode() { this.Spell = this.Stream.ReadDataReference <LogicSpellData>(); this.Slot = this.Stream.ReadInt(); this.ReadHeader(); }
public void IncrementCastedSpells(LogicSpellData data, int count) { this.m_deployedHousingSpace += LogicDataTables.GetGlobals().GetSpellHousingCostMultiplier() * data.GetHousingSpace() * count / 100; this.m_armyDeploymentPercentage = (100000 * this.m_deployedHousingSpace / LogicDataTables.GetTownHallLevel(this.m_level.GetTownHallLevel(0)).GetMaxHousingSpace() + 50) / 100; int index = -1; for (int i = 0; i < this.m_castedSpellCount.Size(); i++) { if (this.m_castedSpellCount[i].GetData() == data) { index = i; break; } } if (index != -1) { this.m_castedSpellCount[index].SetCount(this.m_castedSpellCount[index].GetCount() + count); } else { this.m_castedSpellCount.Add(new LogicDataSlot(data, count)); } }
public override void Decode(ByteStream stream) { this.m_x = stream.ReadInt(); this.m_y = stream.ReadInt(); this.m_data = (LogicSpellData)ByteStreamHelper.ReadDataReference(stream, LogicDataType.SPELL); this.m_allianceSpell = stream.ReadBoolean(); this.m_upgLevel = stream.ReadInt(); base.Decode(stream); }
/// <summary> /// Decodes this instnace. /// </summary> public override void Decode(ByteStream stream) { this._x = stream.ReadInt(); this._y = stream.ReadInt(); this._data = (LogicSpellData)stream.ReadDataReference(25); this._allianceSpell = stream.ReadBoolean(); this._upgLevel = stream.ReadInt(); base.Decode(stream); }
public bool HasEnoughFreeHousingSpace() { LogicCalendar calendar = this.m_level.GetCalendar(); LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); LogicUnitProduction unitProduction = this.m_level.GetGameObjectManagerAt(0).GetUnitProduction(); LogicDataTable characterTable = LogicDataTables.GetTable(LogicDataType.CHARACTER); int freeHousingSpace = unitProduction.GetMaxTrainCount() - (homeOwnerAvatar.GetUnitsTotalCapacity() - unitProduction.GetTotalCount()); int requiredHousingSpace = 0; for (int i = 0; i < characterTable.GetItemCount(); i++) { LogicCharacterData data = (LogicCharacterData)characterTable.GetItemAt(i); if (calendar.IsProductionEnabled(data) && !data.IsSecondaryTroop()) { int count = homeOwnerAvatar.GetUnitPresetCount(data, this.m_presetId); if (count > 0) { requiredHousingSpace += data.GetHousingSpace() * count; } } } if (requiredHousingSpace <= freeHousingSpace) { LogicUnitProduction spellProduction = this.m_level.GetGameObjectManagerAt(0).GetSpellProduction(); LogicDataTable spellTable = LogicDataTables.GetTable(LogicDataType.SPELL); int freeSpellHousingSpace = spellProduction.GetMaxTrainCount() - (homeOwnerAvatar.GetSpellsTotalCapacity() - spellProduction.GetTotalCount()); int requiredSpellHousingSpace = 0; for (int i = 0; i < spellTable.GetItemCount(); i++) { LogicSpellData data = (LogicSpellData)spellTable.GetItemAt(i); if (calendar.IsProductionEnabled(data)) { int count = homeOwnerAvatar.GetUnitPresetCount(data, this.m_presetId); if (count > 0) { requiredSpellHousingSpace += data.GetHousingSpace() * count; } } } return(requiredSpellHousingSpace <= freeSpellHousingSpace); } return(false); }
public void TrainUnits() { LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); LogicDataTable characterTable = LogicDataTables.GetTable(LogicDataType.CHARACTER); LogicDataTable spellTable = LogicDataTables.GetTable(LogicDataType.SPELL); LogicArrayList <LogicCombatItemData> productionUnits = new LogicArrayList <LogicCombatItemData>(characterTable.GetItemCount()); LogicArrayList <LogicCombatItemData> productionSpells = new LogicArrayList <LogicCombatItemData>(spellTable.GetItemCount()); for (int i = 0; i < characterTable.GetItemCount(); i++) { LogicCharacterData data = (LogicCharacterData)characterTable.GetItemAt(i); if (this.m_level.GetCalendar().IsProductionEnabled(data) && !data.IsSecondaryTroop()) { productionUnits.Add(data); } } this.SortProduction(productionUnits); for (int i = 0; i < productionUnits.Size(); i++) { int unitCount = homeOwnerAvatar.GetUnitPresetCount(productionUnits[i], this.m_presetId); if (unitCount > 0) { this.AddUnitsToQueue(productionUnits[i], unitCount); } } for (int i = 0; i < spellTable.GetItemCount(); i++) { LogicSpellData data = (LogicSpellData)spellTable.GetItemAt(i); if (this.m_level.GetCalendar().IsProductionEnabled(data)) { productionSpells.Add(data); } } this.SortProduction(productionSpells); for (int i = 0; i < productionSpells.Size(); i++) { int spellCount = homeOwnerAvatar.GetUnitPresetCount(productionSpells[i], this.m_presetId); if (spellCount > 0) { this.AddUnitsToQueue(productionSpells[i], spellCount); } } }
public static float GetSpellStrength(LogicSpellData data, int upgLevel) { if (data.IsProductionEnabled()) { int damage = data.GetDamage(upgLevel); if (!data.IsDamageSpell()) { damage = -damage; } int buildingDamage = data.GetBuildingDamagePermil(upgLevel); int troopDamage = data.GetTroopDamagePermil(upgLevel); int sumDamage = damage / 100 + buildingDamage + troopDamage; if (data.GetDamageBoostPercent(upgLevel) > 0) { sumDamage += data.GetDamageBoostPercent(upgLevel) - 100; } int damageStrength = sumDamage + data.GetSpeedBoost(upgLevel); if (damageStrength == 0) { if (data.GetJumpBoostMS(upgLevel) != 0) { damageStrength = data.GetJumpBoostMS(upgLevel) / 1000; } if (data.GetFreezeTimeMS(upgLevel) != 0) { damageStrength = data.GetFreezeTimeMS(upgLevel) / 1000; } if (data.GetDuplicateHousing(upgLevel) != 0) { damageStrength = data.GetDuplicateHousing(upgLevel); } if (data.GetUnitsToSpawn(upgLevel) != 0) { damageStrength = data.GetUnitsToSpawn(upgLevel); } } return(damageStrength * 0.014286f * data.GetStrengthWeight(upgLevel)); } return(0f); }
public int GetResourceCost(LogicResourceData resourceData) { int cost = 0; LogicAvatar homeOwnerAvatar = this.m_level.GetHomeOwnerAvatar(); LogicCalendar calendar = this.m_level.GetCalendar(); LogicDataTable table = LogicDataTables.GetTable(LogicDataType.CHARACTER); for (int i = 0; i < table.GetItemCount(); i++) { LogicCharacterData data = (LogicCharacterData)table.GetItemAt(i); if (calendar.IsProductionEnabled(data) && !data.IsSecondaryTroop()) { int count = homeOwnerAvatar.GetUnitPresetCount(data, this.m_presetId); if (count > 0) { if (data.GetTrainingResource() == resourceData) { cost += count * calendar.GetTrainingCost(data, homeOwnerAvatar.GetUnitUpgradeLevel(data)); } } } } table = LogicDataTables.GetTable(LogicDataType.SPELL); for (int i = 0; i < table.GetItemCount(); i++) { LogicSpellData data = (LogicSpellData)table.GetItemAt(i); if (calendar.IsProductionEnabled(data)) { int count = homeOwnerAvatar.GetUnitPresetCount(data, this.m_presetId); if (count > 0) { if (data.GetTrainingResource() == resourceData) { cost += count * calendar.GetTrainingCost(data, homeOwnerAvatar.GetUnitUpgradeLevel(data)); } } } } return(cost); }
/// <summary> /// Resets this instance. /// </summary> internal void Reset(LogicSpellData toRemove) { if (this.Spells.Count > 0) { if (this.SpellIDs.Contains(toRemove.GlobalID)) { int newTime = this.Timer.RemainingSecs - toRemove.CreateTime; this.Spells.Remove(toRemove); this.SpellIDs.Remove(this.SpellIDs.FindIndex(value => value.Equals(toRemove.GlobalID))); this.Timer.StopTimer(); this.Timer.StartTimer(this.Avatar.Time, newTime); } } }
/// <summary> /// Casts the specified spell. /// </summary> public static LogicSpell CastSpell(LogicAvatar avatar, LogicSpellData spellData, bool allianceSpell, int upgLevel, LogicLevel level, int x, int y) { if (allianceSpell) { avatar.RemoveAllianceUnit(spellData, upgLevel); } else { avatar.CommodityCountChangeHelper(0, spellData, -1); } LogicSpell spell = (LogicSpell)LogicGameObjectFactory.CreateGameObject(spellData, level, level.GetVillageType()); spell.SetUpgradeLevel(upgLevel); return(spell); }
public void StartAbility() { if (this.IsHero()) { LogicHeroData heroData = (LogicHeroData)this.m_data; this.m_abilityCooldown = 60 * heroData.GetAbilityCooldown() / 4000; this.m_abilityTriggerTime = 5; this.m_abilityTime = 60 * heroData.GetAbilityTime(this.m_upgradeLevel) / 20000; this.m_summonSpawnCount = 0; this.GetHitpointComponent().CauseDamage(-100 * heroData.GetAbilityHealthIncrease(this.m_upgradeLevel), 0, this); this.m_abilityAttackCount = this.GetCombatComponent().GetHitCount() + heroData.GetAbilityAttackCount(this.m_upgradeLevel); if (heroData.GetAbilityDelay() > 0) { this.GetCombatComponent().SetAttackDelay(0, heroData.GetAbilityDelay()); // Listener. } LogicSpellData abilitySpellData = heroData.GetAbilitySpell(this.m_upgradeLevel); if (abilitySpellData != null) { this.m_abilitySpell = (LogicSpell)LogicGameObjectFactory.CreateGameObject(abilitySpellData, this.m_level, this.m_villageType); this.m_abilitySpell.SetUpgradeLevel(heroData.GetAbilitySpellLevel(this.m_upgradeLevel)); this.m_abilitySpell.SetInitialPosition(this.GetX(), this.GetY()); this.m_abilitySpell.AllowDestruction(false); this.GetGameObjectManager().AddGameObject(this.m_abilitySpell, -1); } if (heroData.GetActivationTime() > 0) { this.m_activationTimeState = 1; this.m_activationTime = heroData.GetActivationTime(); this.GetMovementComponent().GetMovementSystem().SetFreezeTime(this.m_activationTime); this.GetCombatComponent().SetActivationTime(this.m_activationTime); // Listener. } this.m_abilityUsed = true; } }
public void AlianceSpellDonated(LogicSpellData data) { if (data != null) { LogicClientAvatar playerAvatar = this.m_level.GetPlayerAvatar(); LogicDataTable dataTable = LogicDataTables.GetTable(LogicDataType.ACHIEVEMENT); for (int i = 0; i < dataTable.GetItemCount(); i++) { LogicAchievementData achievementData = (LogicAchievementData)dataTable.GetItemAt(i); if (achievementData.GetActionType() == LogicAchievementData.ACTION_TYPE_DONATE_SPELLS) { this.RefreshAchievementProgress(playerAvatar, achievementData, playerAvatar.GetAchievementProgress(achievementData) + data.GetHousingSpace()); } } } }
public void AddSpell(LogicSpellData data, int count) { int index = -1; for (int i = 0; i < this.m_spellCount.Size(); i++) { if (this.m_spellCount[i].GetData() == data) { index = i; break; } } if (index != -1) { this.m_spellCount[index].SetCount(this.m_spellCount[index].GetCount() + count); } else { this.m_spellCount.Add(new LogicDataSlot(data, count)); } }
/// <summary> /// Creates the data for the specified row. /// </summary> internal LogicData Create(Row row) { LogicData data; switch (this.Index) { case 1: { data = new LogicLocaleData(row, this); break; } case 2: { data = new LogicResourceData(row, this); break; } case 3: { data = new LogicEffectData(row, this); break; } case 4: { data = new LogicParticleEmitterData(row, this); break; } case 5: { data = new LogicGlobalData(row, this); break; } case 6: { data = new LogicQuestData(row, this); break; } case 8: { data = new LogicAchievementData(row, this); break; } case 10: { data = new LogicWorldData(row, this); break; } case 11: { data = new LogicHeroData(row, this); break; } case 12: { data = new LogicExperienceLevelData(row, this); break; } case 13: { data = new LogicLeagueData(row, this); break; } case 21: { data = new LogicAllianceBadgeData(row, this); break; } case 24: { data = new LogicTauntData(row, this); break; } case 25: { data = new LogicDecoData(row, this); break; } case 26: { data = new LogicVariableData(row, this); break; } case 28: { data = new LogicBoosterData(row, this); break; } case 32: { data = new LogicEnergyPackageData(row, this); break; } case 35: { data = new LogicSpellData(row, this); break; } case 36: { data = new LogicObstacleData(row, this); break; } case 37: { data = new LogicItemsData(row, this); break; } default: { data = new LogicData(row, this); break; } } return(data); }
public override void SubTick() { base.SubTick(); LogicSpellData data = this.GetSpellData(); if (!this.m_preDeployEffectPlayed) { this.GetListener().PlayEffect(data.GetPreDeployEffect(this.m_upgradeLevel)); this.m_preDeployEffectPlayed = true; } if (++this.m_deployTime >= data.GetDeployTimeMS() * 60 / 1000) { if (!this.m_deployed) { this.GetListener().PlayEffect(this.m_team != 0 && data.GetEnemyDeployEffect(this.m_upgradeLevel) != null ? data.GetEnemyDeployEffect(this.m_upgradeLevel) : data.GetDeployEffect(this.m_upgradeLevel), this.m_playEffectOffsetX, this.m_playEffectOffsetY); this.m_deployEffect2Cooldown = data.GetDeployEffect2Delay(); if (this.m_deployEffect2Cooldown <= 0) { this.GetListener().PlayEffect(data.GetDeployEffect2(this.m_upgradeLevel), this.m_playEffectOffsetX, this.m_playEffectOffsetY); this.m_deployEffect2Cooldown = 0; } this.m_deployed = true; } if (++this.m_chargingTime >= (data.GetChargingTimeMS() * 60 / 1000) + this.m_chargingCount * (data.GetTimeBetweenHitsMS(this.m_upgradeLevel) * 60 / 1000) && this.m_chargingCount < data.GetNumberOfHits(this.m_upgradeLevel)) { this.CalculateRandomOffset(this.m_chargingCount); this.GetListener().PlayTargetedEffect(data.GetChargingEffect(this.m_upgradeLevel), this, this.m_randomOffset); ++this.m_chargingCount; } if (++this.m_hitTime >= (data.GetHitTimeMS() * 60 / 1000) + this.m_hitCount * (data.GetTimeBetweenHitsMS(this.m_upgradeLevel) * 60 / 1000) && this.m_hitCount < data.GetNumberOfHits(this.m_upgradeLevel)) { this.CalculateRandomOffset(this.m_hitCount); this.GetListener().PlayTargetedEffect(data.GetHitEffect(this.m_upgradeLevel), this, this.m_randomOffset); int randomRadiusX = 0; int randomRadiusY = 0; if (!data.GetRandomRadiusAffectsOnlyGfx()) { randomRadiusX = this.m_randomOffset.m_x; randomRadiusY = this.m_randomOffset.m_y; } int damage = data.GetDamage(this.m_upgradeLevel); if (damage != 0 && data.IsScaleByTownHall()) { int scaledDamage = damage * (700 * this.m_level.GetPlayerAvatar().GetTownHallLevel() / (LogicDataTables.GetTownHallLevelCount() - 1) / 10 + 30) / 100; damage = 1; if (scaledDamage > 0) { damage = scaledDamage; } } if (damage != 0 && data.GetRadius(this.m_upgradeLevel) > 0) { int areaDamageX = randomRadiusX + this.GetMidX(); int areaDamageY = randomRadiusY + this.GetMidY(); int preferredTargetDamagePercent = 100 * data.GetPreferredTargetDamageMod(); if (data.GetTroopsOnly()) { this.m_level.AreaDamage(0, areaDamageX, areaDamageY, data.GetRadius(this.m_upgradeLevel), damage, data.GetPreferredTarget(), preferredTargetDamagePercent, null, this.m_team, null, 2, 2, 0, true, damage < 0, data.GetHeroDamageMultiplier(), data.GetMaxUnitsHit(this.m_upgradeLevel), null, data.GetDamageTHPercent(), data.GetPauseCombatComponentMs()); } else { this.m_level.AreaDamage(0, areaDamageX, areaDamageY, data.GetRadius(this.m_upgradeLevel), damage, data.GetPreferredTarget(), preferredTargetDamagePercent, null, this.m_team, null, 2, 1, 0, true, damage < 0, data.GetHeroDamageMultiplier(), data.GetMaxUnitsHit(this.m_upgradeLevel), null, data.GetDamageTHPercent(), data.GetPauseCombatComponentMs()); } } if (data.GetDuplicateHousing(this.m_upgradeLevel) != 0 && data.GetRadius(this.m_upgradeLevel) > 0) { this.SelectDuplicableCharacters(); this.DuplicateCharacter(); } if ((data.GetBuildingDamagePermil(this.m_upgradeLevel) != 0 || data.GetTroopDamagePermil(this.m_upgradeLevel) != 0) && data.GetRadius(this.m_upgradeLevel) > 0) { this.ApplyDamagePermil(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), 0, this.m_team, 0, 2, 1, 0, data.GetTroopDamagePermil(this.m_upgradeLevel) < 0); } if (data.GetPoisonDamage(this.m_upgradeLevel) != 0 && data.GetRadius(this.m_upgradeLevel) > 0) { int areaDamageX = randomRadiusX + this.GetMidX(); int areaDamageY = randomRadiusY + this.GetMidY(); int poisonDamage = data.GetPoisonDamage(this.m_upgradeLevel); if (data.GetTroopsOnly()) { this.m_level.AreaPoison(0, areaDamageX, areaDamageY, data.GetRadius(this.m_upgradeLevel), data.GetPoisonDamage(this.m_upgradeLevel), null, 0, null, this.m_team, null, data.GetPoisonAffectAir() ? 2 : 1, 2, 0, poisonDamage < 0, data.GetHeroDamageMultiplier(), data.GetPoisonIncreaseSlowly()); } else { this.m_level.AreaPoison(0, areaDamageX, areaDamageY, data.GetRadius(this.m_upgradeLevel), data.GetPoisonDamage(this.m_upgradeLevel), null, 0, null, this.m_team, null, data.GetPoisonAffectAir() ? 2 : 1, 1, 0, poisonDamage < 0, data.GetHeroDamageMultiplier(), data.GetPoisonIncreaseSlowly()); } } if (data.GetSpeedBoost(this.m_upgradeLevel) != 0 || data.GetAttackSpeedBoost(this.m_upgradeLevel) != 0) { this.m_level.AreaBoost(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), data.GetSpeedBoost(this.m_upgradeLevel), data.GetSpeedBoost2(this.m_upgradeLevel), data.GetDamageBoostPercent(this.m_upgradeLevel), data.GetAttackSpeedBoost(this.m_upgradeLevel), 60 * data.GetBoostTimeMS(this.m_upgradeLevel) / 1000, data.GetBoostDefenders() ? this.m_team != 1 ? 1 : 0 : this.m_team, data.GetBoostLinkedToPoison()); } if (data.GetJumpBoostMS(this.m_upgradeLevel) != 0) { if (this.m_team == 0) { this.m_level.AreaJump(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), data.GetJumpBoostMS(this.m_upgradeLevel), data.GetJumpHousingLimit(this.m_upgradeLevel), this.m_team); if (this.m_hitCount == 0) { if (LogicDataTables.GetGlobals().UseWallWeightsForJumpSpell()) { int numberOfHits = data.GetNumberOfHits(this.m_upgradeLevel); int timeBetweenHitsMS = data.GetTimeBetweenHitsMS(this.m_upgradeLevel); int radius = data.GetRadius(this.m_upgradeLevel); int jumpTime = numberOfHits * timeBetweenHitsMS - LogicDataTables.GetGlobals().GetForgetTargetTime(); LogicArrayList <LogicGameObject> buildings = this.GetGameObjectManager().GetGameObjects(LogicGameObjectType.BUILDING); for (int i = 0; i < buildings.Size(); i++) { LogicBuilding building = (LogicBuilding)buildings[i]; if (building.IsWall() && building.IsAlive()) { int distanceX = this.GetMidX() - building.GetMidX(); int distanceY = this.GetMidY() - building.GetMidY(); if (LogicMath.Abs(distanceX) < radius && LogicMath.Abs(distanceY) < radius && distanceX * distanceX + distanceY * distanceY < (uint)(radius * radius)) { building.SetHitWallDelay(jumpTime); } } } this.m_level.GetTileMap().GetPathFinder().InvalidateCache(); LogicArrayList <LogicComponent> components = this.GetComponentManager().GetComponents(LogicComponentType.MOVEMENT); for (int i = 0; i < components.Size(); i++) { LogicMovementComponent movementComponent = (LogicMovementComponent)components[i]; LogicGameObject parent = movementComponent.GetParent(); LogicCombatComponent combatComponent = parent.GetCombatComponent(); if (combatComponent != null && combatComponent.GetTarget(0) != null) { if (combatComponent.GetTarget(0).IsWall()) { combatComponent.ForceNewTarget(); } } } } } } } if (data.GetShrinkReduceSpeedRatio() != 0 || data.GetShrinkHitpointsRatio() != 0) { this.m_level.AreaShrink(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), data.GetShrinkReduceSpeedRatio(), data.GetShrinkHitpointsRatio(), 1000 * LogicDataTables.GetGlobals().GetShrinkSpellDurationSeconds() / 64, this.m_team); } if (data.GetFreezeTimeMS(this.m_upgradeLevel) != 0) { this.m_level.AreaFreeze(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), 60 * data.GetFreezeTimeMS(this.m_upgradeLevel) / 1000, this.m_team); } if (data.GetBuildingDamageBoostPercent(this.m_upgradeLevel) != 0) { this.m_level.AreaBoost(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), data.GetBuildingDamageBoostPercent(this.m_upgradeLevel), 0, 60 * data.GetBoostTimeMS(this.m_upgradeLevel) / 1000); } if (data.GetSummonTroop() != null) { this.SpawnSummon(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY()); } if (data.GetSpawnObstacle() != null) { this.SpawnObstacle(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), 5); } if (data.GetExtraHealthPermil(this.m_upgradeLevel) != 0) { this.ApplyExtraHealthPermil(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), this.m_team, data.GetExtraHealthPermil(this.m_upgradeLevel), data.GetExtraHealthMin(this.m_upgradeLevel), data.GetExtraHealthMax(this.m_upgradeLevel), data.GetHitTimeMS() + 64, 2); } if (data.GetInvulnerabilityTime(this.m_upgradeLevel) != 0) { this.m_level.AreaShield(randomRadiusX + this.GetMidX(), randomRadiusY + this.GetMidY(), data.GetRadius(this.m_upgradeLevel), data.GetInvulnerabilityTime(this.m_upgradeLevel), this.m_team); } if (++this.m_hitCount >= data.GetNumberOfHits(this.m_upgradeLevel)) { this.m_hitsCompleted = true; this.m_level.UpdateBattleStatus(); } } } }
public void SpawnSummon(int x, int y) { LogicSpellData data = this.GetSpellData(); LogicCharacterData summonData = data.GetSummonTroop(); LogicVector2 position = new LogicVector2(); int summonCount = data.GetUnitsToSpawn(this.m_upgradeLevel); int spawnDuration = data.GetSpawnDuration(this.m_upgradeLevel); int totalSpawnDuration = -(spawnDuration * data.GetSpawnFirstGroupSize()); for (int i = 0, k = 0, angle = y + 7 * x; i < summonCount; i++, k += 7, angle += 150, totalSpawnDuration += spawnDuration) { if (!summonData.IsFlying()) { if (!this.m_level.GetTileMap().GetNearestPassablePosition(this.GetX(), this.GetY(), position, 1536)) { return; } } else { position.m_x = x + LogicMath.GetRotatedX(summonData.GetSecondarySpawnOffset(), 0, angle); position.m_y = y + LogicMath.GetRotatedY(summonData.GetSecondarySpawnOffset(), 0, angle); } LogicCharacter summon = (LogicCharacter)LogicGameObjectFactory.CreateGameObject(summonData, this.m_level, this.m_villageType); summon.GetHitpointComponent().SetTeam(0); summon.SetInitialPosition(position.m_x, position.m_y); LogicRandom random = new LogicRandom(k + this.m_globalId); int rnd = ((random.Rand(150) << 9) + 38400) / 100; position.Set(LogicMath.Cos(angle, rnd), LogicMath.Sin(angle, rnd)); int pushBackSpeed = summonData.GetPushbackSpeed() > 0 ? summonData.GetPushbackSpeed() : 1; int pushBackTime = 2 * rnd / (3 * pushBackSpeed); int spawnDelay = pushBackTime + totalSpawnDuration / summonCount; if (data.GetSpawnFirstGroupSize() > 0) { spawnDelay = LogicMath.Max(200, spawnDelay); } summon.SetSpawnTime(spawnDelay); summon.GetMovementComponent().GetMovementSystem().PushTrap(position, pushBackTime, 0, false, false); if (summon.GetCharacterData().IsJumper()) { summon.GetMovementComponent().EnableJump(3600000); summon.GetCombatComponent().RefreshTarget(true); } LogicCombatComponent combatComponent = summon.GetCombatComponent(); if (combatComponent != null) { combatComponent.SetSkeletonSpell(); } this.GetGameObjectManager().AddGameObject(summon, -1); } }
/// <summary> /// Destructs this instance. /// </summary> public override void Destruct() { base.Destruct(); this._data = null; }
public override int Execute(LogicLevel level) { this.m_level = level; if (LogicDataTables.GetGlobals().EnablePresets()) { LogicAvatar homeOwnerAvatar = level.GetHomeOwnerAvatar(); if (homeOwnerAvatar.GetTownHallLevel() >= LogicDataTables.GetGlobals().GetEnablePresetsTownHallLevel()) { if (this.m_presetId <= 3) { LogicDataTable table = LogicDataTables.GetTable(LogicDataType.CHARACTER); LogicComponentManager componentManager = level.GetComponentManager(); int totalMaxHousing = componentManager.GetTotalMaxHousing(0); for (int i = 0, housingSpace = 0; i < table.GetItemCount(); i++) { LogicCharacterData data = (LogicCharacterData)table.GetItemAt(i); if (level.GetGameMode().GetCalendar().IsProductionEnabled(data) && !data.IsSecondaryTroop()) { int count = 0; if (this.m_slots.Size() > 0) { for (int j = 0; j < this.m_slots.Size(); j++) { if (this.m_slots[j].GetData() == data) { count = this.m_slots[j].GetCount(); break; } } } housingSpace += count * data.GetHousingSpace(); if (housingSpace > totalMaxHousing || !this.IsUnlocked(data)) { this.SetUnitPresetCount(data, 0); } else { this.SetUnitPresetCount(data, count); } } } table = LogicDataTables.GetTable(LogicDataType.SPELL); totalMaxHousing = componentManager.GetTotalMaxHousing(0); for (int i = 0, housingSpace = 0; i < table.GetItemCount(); i++) { LogicSpellData data = (LogicSpellData)table.GetItemAt(i); if (level.GetGameMode().GetCalendar().IsProductionEnabled(data)) { int count = 0; if (this.m_slots.Size() > 0) { for (int j = 0; j < this.m_slots.Size(); j++) { if (this.m_slots[j].GetData() == data) { count = this.m_slots[j].GetCount(); break; } } } housingSpace += count * data.GetHousingSpace(); if (housingSpace > totalMaxHousing || !this.IsUnlocked(data)) { this.SetUnitPresetCount(data, 0); } else { this.SetUnitPresetCount(data, count); } } } return(0); } return(-2); } } return(-1); }
public void TargetReached(int damagePercent) { this.m_damageTime = this.GetProjectileData().GetDamageDelay(); this.UpdateDamage(damagePercent); this.m_targetReached = true; if (!this.m_dummy) { if (this.m_hitEffect != null) { if (this.m_target != null) { LogicHitpointComponent hitpointComponent = this.m_target.GetHitpointComponent(); if (hitpointComponent != null) { if (!this.m_bounceProjectile) { // Listener. } } } else if (!this.m_penetrating && this.m_shockwavePushStrength == 0) { // Listener. } } if (this.m_hitEffect2 != null) { if (this.m_target != null) { LogicHitpointComponent hitpointComponent = this.m_target.GetHitpointComponent(); if (hitpointComponent != null) { if (!this.m_bounceProjectile) { // Listener. } } } else if (!this.m_penetrating && this.m_shockwavePushStrength == 0) { // Listener. } } if (this.m_target != null) { if (this.m_bounceCount > 0) { this.m_bounceTargets[this.m_bounceCount - 1] = this.m_target; this.UpdateBounces(); } } LogicSpellData hitSpell = this.GetProjectileData().GetHitSpell(); if (hitSpell != null) { LogicSpell spell = (LogicSpell)LogicGameObjectFactory.CreateGameObject(hitSpell, this.m_level, this.m_villageType); spell.SetUpgradeLevel(this.GetProjectileData().GetHitSpellLevel()); spell.SetInitialPosition(this.GetMidX(), this.GetMidY()); spell.SetTeam(1); this.GetGameObjectManager().AddGameObject(spell, -1); } if (this.m_bounceProjectile) { int idx = -1; for (int i = 0; i < LogicProjectile.MAX_BOUNCES; i++) { if (this.m_bouncePositions[i] != null) { idx = i; break; } } if (idx != -1) { LogicVector2 bouncePosition = this.m_bouncePositions[idx]; this.m_bouncePositions[idx] = null; this.m_target = null; LogicEffectData bounceEffect = this.GetProjectileData().GetBounceEffect(); if (bounceEffect != null) { this.m_listener.PlayEffect(bounceEffect); } this.m_targetPosition.m_x = 8 * bouncePosition.m_x; this.m_targetPosition.m_y = 8 * bouncePosition.m_y; this.m_randomHitRange = this.m_flyingTarget ? 1000 : 0; // Listener. this.m_targetReached = false; this.m_travelTime = 0; bouncePosition.Destruct(); } else { this.m_target = null; } } if (this.m_targetReached) { LogicEffectData destroyedEffect = this.GetProjectileData().GetDestroyedEffect(); if (destroyedEffect != null) { // Listener. } } } }
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); } } } } }
public override int Execute(LogicLevel level) { if (level.IsReadyForAttack()) { int tileX = this.m_x >> 9; int tileY = this.m_y >> 9; if (level.GetTileMap().GetTile(tileX, tileY) != null) { if (level.GetTileMap().IsPassablePathFinder(this.m_x >> 8, this.m_y >> 8)) { if (level.GetTileMap().IsValidAttackPos(tileX, tileY)) { LogicClientAvatar playerAvatar = level.GetPlayerAvatar(); if (playerAvatar != null) { int unitCount = level.GetVillageType() == 1 ? playerAvatar.GetUnitCountVillage2(this.m_data) : playerAvatar.GetUnitCount(this.m_data); if (unitCount > 0) { if (level.GetBattleLog() != null) { if (!level.GetBattleLog().HasDeployedUnits() && level.GetTotalAttackerHeroPlaced() == 0) { level.UpdateLastUsedArmy(); } } if (level.GetGameMode().IsInAttackPreparationMode()) { level.GetGameMode().EndAttackPreparation(); } LogicCharacter character = LogicPlaceAttackerCommand.PlaceAttacker(playerAvatar, this.m_data, level, this.m_x, this.m_y); if (character != null && character.HasSpecialAbility()) { if (this.m_data.GetSpecialAbilityType() == LogicCharacterData.SPECIAL_ABILITY_TYPE_START_RAGE) { LogicSpellData specialAbilitySpellData = this.m_data.GetSpecialAbilitySpell(); level.BoostGameObject(character, specialAbilitySpellData.GetSpeedBoost(0), specialAbilitySpellData.GetSpeedBoost2(0), specialAbilitySpellData.GetDamageBoostPercent(0), specialAbilitySpellData.GetAttackSpeedBoost(0), 60 * this.m_data.GetSpecialAbilityAttribute(character.GetUpgradeLevel()), specialAbilitySpellData.GetBoostLinkedToPoison()); } else if (this.m_data.GetSpecialAbilityType() == LogicCharacterData.SPECIAL_ABILITY_TYPE_START_CLOAK) { character.SetStealthTime(15 * this.m_data.GetSpecialAbilityAttribute(character.GetUpgradeLevel())); } } return(0); } return(-7); } return(-5); } return(-4); } return(-2); } return(-3); } return(-1); }
public void ApplyDamagePermil(int x, int y, int unk1, int team, int unk2, int targetType, int damageType, int unk3, bool healing) { LogicSpellData spellData = this.GetSpellData(); int radius = spellData.GetRadius(this.m_upgradeLevel); int troopDamagePermil = spellData.GetTroopDamagePermil(this.m_upgradeLevel); int buildingDamagePermil = spellData.GetBuildingDamagePermil(this.m_upgradeLevel); int executeHealthPermil = spellData.GetExecuteHealthPermil(this.m_upgradeLevel); int damagePermilMin = spellData.GetDamagePermilMin(this.m_upgradeLevel); int preferredTargetDamageMod = spellData.GetPreferredTargetDamageMod(); int preferredDamagePermilMin = spellData.GetPreferredDamagePermilMin(this.m_upgradeLevel); LogicData preferredTarget = spellData.GetPreferredTarget(); LogicVector2 pushBackPosition = new LogicVector2(); LogicArrayList <LogicComponent> components = this.GetComponentManager().GetComponents(LogicComponentType.HITPOINT); int tmp = troopDamagePermil + 2 * buildingDamagePermil; for (int i = 0; i < components.Size(); i++) { LogicHitpointComponent hitpointComponent = (LogicHitpointComponent)components[i]; LogicGameObject parent = hitpointComponent.GetParent(); if (!parent.IsHidden() && hitpointComponent.GetHitpoints() != 0) { if (hitpointComponent.GetTeam() == team) { if (tmp > 0 || tmp < 0 && parent.IsPreventsHealing()) { continue; } } else if (tmp < 0) { continue; } if (damageType == 2 && parent.GetGameObjectType() != LogicGameObjectType.CHARACTER) { continue; } int parentX; int parentY; LogicMovementComponent movementComponent = parent.GetMovementComponent(); if (movementComponent != null || parent.IsFlying()) { if (parent.IsFlying()) { if (targetType == 1) { continue; } } else if (targetType == 0) { continue; } parentX = parent.GetMidX(); parentY = parent.GetMidY(); } else { int posX = parent.GetX(); int posY = parent.GetY(); parentX = LogicMath.Clamp(x, posX, posX + (parent.GetWidthInTiles() << 9)); parentY = LogicMath.Clamp(y, posY, posY + (parent.GetHeightInTiles() << 9)); } int distanceX = x - parentX; int distanceY = y - parentY; if (LogicMath.Abs(distanceX) <= radius && LogicMath.Abs(distanceY) <= radius && distanceX * distanceX + distanceY * distanceY < (uint)(radius * radius)) { if (damageType == 1 && parent.GetGameObjectType() == LogicGameObjectType.BUILDING) { LogicBuilding building = (LogicBuilding)parent; if (building.GetResourceStorageComponentComponent() != null && !building.GetBuildingData().IsTownHall() && !building.GetBuildingData().IsTownHallVillage2()) { parent.SetDamageTime(10); continue; } } if (parent.GetGameObjectType() == LogicGameObjectType.BUILDING || parent.GetGameObjectType() == LogicGameObjectType.CHARACTER) { int dataDamagePermil = parent.GetGameObjectType() == LogicGameObjectType.BUILDING ? buildingDamagePermil : troopDamagePermil; if (dataDamagePermil != 0) { int permil = 10 * hitpointComponent.GetMaxHitpoints() * dataDamagePermil / 10000; if (10 * hitpointComponent.GetMaxHitpoints() * dataDamagePermil <= -10000) { if (parent.IsHero()) { permil = LogicDataTables.GetGlobals().GetHeroHealMultiplier() * permil / 100; } } bool isPreferredTarget = LogicCombatComponent.IsPreferredTarget(preferredTarget, parent); int numberOfHits = spellData.GetNumberOfHits(this.m_upgradeLevel); int completePermil = hitpointComponent.GetDamagePermilCount() / spellData.GetNumberOfHits(this.m_upgradeLevel); int calculateDamage = isPreferredTarget ? permil / (completePermil + 1) + preferredTargetDamageMod * hitpointComponent.GetMaxHitpoints() / (100 * numberOfHits) * completePermil * completePermil : permil / (2 * completePermil + 1); int permilMin = isPreferredTarget ? preferredDamagePermilMin : damagePermilMin; int damage = hitpointComponent.GetMaxHitpoints() * permilMin / 10000; if (calculateDamage >= damage) { damage = calculateDamage; } if (executeHealthPermil > 0 && 1000 * (hitpointComponent.GetHitpoints() - damage) <= executeHealthPermil) { damage = hitpointComponent.GetHitpoints(); } hitpointComponent.CauseDamagePermil(damage); if (healing) { // Listener. } if ((distanceX | distanceX) == 0) { distanceX = 1; } pushBackPosition.m_x = -distanceX; pushBackPosition.m_y = -distanceY; pushBackPosition.Normalize(512); if (unk3 > 0 && movementComponent != null) { movementComponent.GetMovementSystem().PushBack(pushBackPosition, damage, unk3, 0, false, true); } } } } } } }