public override void Decode(ByteStream stream) { this.ScoreGain = stream.ReadVInt(); this.Attacker = stream.ReadBoolean(); this.PrevLeagueData = (LogicLeagueData)ByteStreamHelper.ReadDataReference(stream, LogicDataType.LEAGUE); this.LeagueData = (LogicLeagueData)ByteStreamHelper.ReadDataReference(stream, LogicDataType.LEAGUE); }
/// <summary> /// Adds the trophies and updates the player's league accordingly. /// </summary> internal static void AddTrophies(this LogicClientAvatar avatar, int value = 30) { if (value > 0) { avatar.Score += value; if (avatar.Score < 2500) { LogicLeagueData league = (LogicLeagueData)CSV.Tables.Get(Gamefile.Leagues).GetDataWithID(avatar.League); if (avatar.Score > league.PromoteLimit - 1) { avatar.League += 1; } } avatar.Save(); } }
/// <summary> /// Removes the trophies and updates the player's league accordingly. /// </summary> internal static void LoseTrophies(this LogicClientAvatar avatar, int value = 10) { if (value > 0 && avatar.Score > 0) { if (value > avatar.Score) { avatar.Score = 0; } else { avatar.Score -= value; } LogicLeagueData league = (LogicLeagueData)CSV.Tables.Get(Gamefile.Leagues).GetDataWithID(avatar.League); if (avatar.Score < league.PlacementLimitLow) { avatar.League -= 1; } avatar.Save(); } }
/// <summary> /// Called when the player wins a battle. /// </summary> internal static void WinBattle(this LogicClientAvatar avatar, int trophies = 30) { LogicLeagueData league = (LogicLeagueData)CSV.Tables.Get(Gamefile.Leagues).GetDataWithID(avatar.League); avatar.AddGold(league.PVPGoldReward); avatar.AddXP(league.PVPXpReward); avatar.AddTrophies(trophies); avatar.Variables.AddItem(LogicVariables.Wins.GlobalID, 1); avatar.Variables.AddItem(LogicVariables.WinStreak.GlobalID, 1); avatar.Variables.AddItem(LogicVariables.Matches.GlobalID, 1); avatar.Variables.AddItem(LogicVariables.ChestProgress.GlobalID, 1); avatar.Variables.AddItem(LogicVariables.ChestProgressUpdated.GlobalID, 1); if (avatar.Variables.Get(LogicVariables.ChestProgress.GlobalID).Count == 5 && avatar.Variables.Get(LogicVariables.ChestProgressUpdated.GlobalID).Count == 5) { avatar.Variables.Set(LogicVariables.ChestProgress.GlobalID, 0); avatar.Variables.Set(LogicVariables.ChestProgressUpdated.GlobalID, 0); LogicChest chest = new LogicChest(avatar); chest.CreateMegaChest(); } }
public override void ScoreChanged(LogicLong allianceId, int scoreGain, int minScoreGain, bool attacker, LogicLeagueData leagueData, LogicLeagueData prevLeagueData, int destructionPercentage) { this.m_avatarChanges.Add(new ScoreAvatarChange { Attacker = attacker, LeagueData = leagueData, PrevLeagueData = prevLeagueData, ScoreGain = scoreGain }); }
/// <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 int Execute(LogicLevel level) { if (this.m_shieldData != null) { int cooldownSecs = level.GetCooldownManager().GetCooldownSeconds(this.m_shieldData.GetGlobalID()); if (cooldownSecs <= 0) { LogicClientAvatar playerAvatar = level.GetPlayerAvatar(); if (this.m_shieldData.GetScoreLimit() > playerAvatar.GetScore() || this.m_shieldData.GetScoreLimit() <= 0) { if (playerAvatar.HasEnoughDiamonds(this.m_shieldData.GetDiamondsCost(), true, level)) { LogicGameMode gameMode = level.GetGameMode(); playerAvatar.UseDiamonds(this.m_shieldData.GetDiamondsCost()); playerAvatar.GetChangeListener().DiamondPurchaseMade(6, this.m_shieldData.GetGlobalID(), this.m_shieldData.GetTimeHours() * 3600, this.m_shieldData.GetDiamondsCost(), level.GetVillageType()); int shieldTime = gameMode.GetShieldRemainingSeconds() + this.m_shieldData.GetTimeHours() * 3600; int guardTime = gameMode.GetGuardRemainingSeconds(); int personalBreak = 0; if (this.m_shieldData.GetTimeHours() <= 0) { if (shieldTime > 0) { return(-2); } guardTime += this.m_shieldData.GetGuardTimeHours() * 3600; } else { LogicLeagueData leagueData = playerAvatar.GetLeagueTypeData(); if (playerAvatar.GetAttackShieldReduceCounter() != 0) { playerAvatar.SetAttackShieldReduceCounter(0); playerAvatar.GetChangeListener().AttackShieldReduceCounterChanged(0); } if (playerAvatar.GetDefenseVillageGuardCounter() != 0) { playerAvatar.SetDefenseVillageGuardCounter(0); playerAvatar.GetChangeListener().DefenseVillageGuardCounterChanged(0); } guardTime += leagueData.GetVillageGuardInMins() * 60; } if (shieldTime <= 0) { personalBreak = LogicMath.Min(LogicDataTables.GetGlobals().GetPersonalBreakLimitSeconds() + this.m_shieldData.GetGuardTimeHours() * 3600, gameMode.GetPersonalBreakCooldownSeconds() + this.m_shieldData.GetGuardTimeHours() * 3600); } else { personalBreak = shieldTime + LogicDataTables.GetGlobals().GetPersonalBreakLimitSeconds(); } gameMode.SetPersonalBreakCooldownSeconds(personalBreak); gameMode.SetShieldRemainingSeconds(shieldTime); gameMode.SetGuardRemainingSeconds(guardTime); level.GetHome().GetChangeListener().ShieldActivated(shieldTime, guardTime); level.GetCooldownManager().AddCooldown(this.m_shieldData.GetGlobalID(), this.m_shieldData.GetCooldownSecs()); return(0); } } } } return(-1); }
/// <summary> /// Executes this command. /// </summary> public override int Execute(LogicLevel level) { if (this._shieldData != null) { int cooldownSecs = level.GetCooldownManager().GetCooldownSeconds(this._shieldData.GetGlobalID()); if (cooldownSecs <= 0) { LogicClientAvatar playerAvatar = level.GetPlayerAvatar(); if (this._shieldData.GetScoreLimit() > playerAvatar.GetScore() || this._shieldData.GetScoreLimit() <= 0) { if (playerAvatar.HasEnoughDiamonds(this._shieldData.GetDiamondsCost(), true, level)) { LogicGameMode gameMode = level.GetGameMode(); playerAvatar.UseDiamonds(this._shieldData.GetDiamondsCost()); int shieldTime = gameMode.GetShieldRemainingSeconds() + this._shieldData.TimeH * 3600; int guardTime = gameMode.GetGuardRemainingSeconds(); int maintenanceTime = 0; if (this._shieldData.TimeH <= 0) { if (shieldTime > 0) { return(-2); } guardTime += this._shieldData.GuardTimeH * 3600; } else { LogicLeagueData leagueData = playerAvatar.GetLeagueTypeData(); if (playerAvatar.GetShieldCostAmount() != 0) { playerAvatar.SetShieldCostAmount(0); } guardTime += leagueData.VillageGuardInMins * 60; } if (shieldTime <= 0) { maintenanceTime = LogicMath.Min(LogicDataTables.GetGlobals().GetPersonalBreakLimitSeconds() + this._shieldData.GuardTimeH * 3600, gameMode.GetMaintenanceRemainingSeconds() + this._shieldData.GuardTimeH * 3600); } else { maintenanceTime = shieldTime + LogicDataTables.GetGlobals().GetPersonalBreakLimitSeconds(); } gameMode.SetMaintenanceRemainingSeconds(maintenanceTime); gameMode.SetShieldRemainingSeconds(shieldTime); gameMode.SetGuardRemainingSeconds(guardTime); level.GetCooldownManager().AddCooldown(this._shieldData.GetGlobalID(), this._shieldData.GetCooldownSecs()); return(0); } } } } return(-1); }
public virtual void ScoreChanged(LogicLong allianceId, int scoreGain, int minScoreGain, bool attacker, LogicLeagueData leagueData, LogicLeagueData prevLeagueData, int destructionPercentage) { }
public static void CalculateCombatScore(LogicClientAvatar attacker, LogicClientAvatar defender, int stars, bool ignoreLeague, bool revenge, int destructionPercentage, int starBonusMultiplier, bool duelMatch) { int multiplier = stars; if (stars <= 0) { multiplier = LogicDataTables.GetGlobals().GetScoreMultiplierOnAttackLose(); } int attackerScore = attacker.GetScore(); int defenderScore = defender.GetScore(); LogicLeagueData attackerLeagueData = attacker.GetLeagueTypeData(); LogicLeagueData defenderLeagueData = defender.GetLeagueTypeData(); int newAttackerScore; int newDefenderScore; if (LogicDataTables.GetGlobals().EloOffsetDampeningEnabled()) { newAttackerScore = LogicELOMath.CalculateNewRating(stars > 0, attackerScore, defenderScore, 20 * multiplier, LogicDataTables.GetGlobals().GetEloDampeningFactor(), LogicDataTables.GetGlobals().GetEloDampeningLimit(), LogicDataTables.GetGlobals().GetEloDampeningScoreLimit()); newDefenderScore = LogicELOMath.CalculateNewRating(stars <= 0, defenderScore, attackerScore, 20 * multiplier, LogicDataTables.GetGlobals().GetEloDampeningFactor(), LogicDataTables.GetGlobals().GetEloDampeningLimit(), LogicDataTables.GetGlobals().GetEloDampeningScoreLimit()); } else { newAttackerScore = LogicELOMath.CalculateNewRating(stars > 0, attackerScore, defenderScore, 20 * multiplier); newDefenderScore = LogicELOMath.CalculateNewRating(stars <= 0, defenderScore, attackerScore, 20 * multiplier); } int attackerGainCount = newAttackerScore - attackerScore; int defenderGainCount = newDefenderScore - defenderScore; if (attackerScore < 1000 && attackerGainCount < 0) { attackerGainCount = attackerScore * attackerGainCount / 1000; } if (defenderScore < 1000 && defenderGainCount < 0) { defenderGainCount = defenderScore * defenderGainCount / 1000; } if (LogicELOMath.CalculateNewRating(true, attackerScore, defenderScore, 60) > attackerScore) { if (stars <= 0) { if (attackerGainCount >= 0) { attackerGainCount = -1; } } else { if (attackerGainCount <= 0) { attackerGainCount = 1; } if (defenderGainCount >= 0) { defenderGainCount = -1; } } } newAttackerScore = LogicMath.Max(attackerScore + attackerGainCount, 0); newDefenderScore = LogicMath.Max(defenderScore + defenderGainCount, 0); if (!ignoreLeague) { attacker.SetScore(newAttackerScore); defender.SetScore(newDefenderScore); if (LogicDataTables.GetGlobals().EnableLeagues()) { if (!duelMatch) { if (attackerLeagueData != null) { if (stars <= 0) { attacker.SetAttackLoseCount(attacker.GetAttackLoseCount() + 1); } else { attacker.SetAttackWinCount(attacker.GetAttackWinCount() + 1); } } if (defenderLeagueData != null) { if (stars > 0) { defender.SetDefenseLoseCount(defender.GetDefenseLoseCount() + 1); } else { defender.SetDefenseWinCount(defender.GetDefenseLoseCount() + 1); } } if (stars > 0) { if (!revenge || LogicDataTables.GetGlobals().RevengeGiveLeagueBonus()) { int leagueBonusPercentage = LogicDataTables.GetGlobals().GetLeagueBonusPercentage(destructionPercentage); attacker.CommodityCountChangeHelper(0, LogicDataTables.GetGoldData(), attackerLeagueData.GetGoldReward() * leagueBonusPercentage / 100); attacker.CommodityCountChangeHelper(0, LogicDataTables.GetElixirData(), attackerLeagueData.GetElixirReward() * leagueBonusPercentage / 100); if (attacker.IsDarkElixirUnlocked()) { attacker.CommodityCountChangeHelper(0, LogicDataTables.GetDarkElixirData(), attackerLeagueData.GetDarkElixirReward() * leagueBonusPercentage / 100); } } } LogicGamePlayUtil.UpdateLeagueRank(attacker, newAttackerScore, false); LogicGamePlayUtil.UpdateLeagueRank(defender, newDefenderScore, true); } } } attacker.GetChangeListener().ScoreChanged(attacker.GetCurrentHomeId(), attackerGainCount, stars > 0 ? 1 : -1, true, attacker.GetLeagueTypeData(), attackerLeagueData, destructionPercentage); defender.GetChangeListener().ScoreChanged(defender.GetCurrentHomeId(), defenderGainCount, stars > 0 ? -1 : 1, false, defender.GetLeagueTypeData(), defenderLeagueData, destructionPercentage); if (stars > 0 && !ignoreLeague && !duelMatch && (!revenge || LogicDataTables.GetGlobals().RevengeGiveStarBonus()) && !attacker.GetStarBonusCooldown()) { int totalStars = stars + attacker.GetStarBonusCounter(); if (totalStars >= LogicDataTables.GetGlobals().GetStarBonusStarCount()) { LogicLeagueData leagueData = attacker.GetLeagueTypeData(); attacker.AddStarBonusReward(leagueData.GetGoldRewardStarBonus() * starBonusMultiplier, leagueData.GetElixirRewardStarBonus() * starBonusMultiplier, leagueData.GetDarkElixirRewardStarBonus() * starBonusMultiplier); attacker.StarBonusCollected(); if (LogicDataTables.GetGlobals().AllowStarsOverflowInStarBonus() && !attacker.GetStarBonusCooldown()) { totalStars %= LogicDataTables.GetGlobals().GetStarBonusStarCount(); } else { totalStars = 0; } } attacker.SetStarBonusCounter(totalStars); } }
public static void UpdateLeagueRank(LogicClientAvatar clientAvatar, int score, bool defender) { if (LogicDataTables.GetGlobals().EnableLeagues()) { LogicDataTable leagueTable = LogicDataTables.GetTable(LogicDataType.LEAGUE); LogicLeagueData data = clientAvatar.GetLeagueTypeData(); int leagueType = clientAvatar.GetLeagueType(); if (leagueType != 0) { int leagueItemCount = leagueTable.GetItemCount(); if (data.GetPromoteLimit() <= score) { if (data.IsPromoteEnabled()) { while (leagueType + 1 < leagueItemCount) { LogicLeagueData leagueData = (LogicLeagueData)leagueTable.GetItemAt(++leagueType); if (leagueData.GetPromoteLimit() > score || !leagueData.IsPromoteEnabled()) { break; } } if (leagueType != clientAvatar.GetLeagueType()) { clientAvatar.SetLeagueType(leagueType); } } } else if (data.GetDemoteLimit() >= score) { if (data.IsDemoteEnabled()) { while (leagueType > 0) { LogicLeagueData leagueData = (LogicLeagueData)leagueTable.GetItemAt(--leagueType); if (leagueData.GetDemoteLimit() < score || !leagueData.IsDemoteEnabled()) { break; } } if (leagueType != clientAvatar.GetLeagueType()) { clientAvatar.SetLeagueType(leagueType); } } } } else if (!defender) { for (int i = 0; i < leagueTable.GetItemCount(); i++) { LogicLeagueData leagueData = (LogicLeagueData)leagueTable.GetItemAt(i); if (leagueData.GetPlacementLimitLow() <= score && leagueData.GetPlacementLimitHigh() >= score) { if (i != 0) { clientAvatar.SetLeagueType(i); } break; } } } } }