public void Execute(GameState state, ConfigRoot config, ICommandBuffer buffer) { foreach (var unit in state.Level.PlayerUnits) { state.AddUnit(unit); if (!config.IsFeatureEnabled(Features.AutoHeal)) { continue; } var unitConfig = config.Units[unit.Descriptor]; if (unit.Health < unitConfig.MaxHealth[unit.Level]) { buffer.Add(new HealUnitCommand(unit.Id)); } } var levelDesc = state.Level.Descriptor; var playerUnits = state.Level.PlayerUnits; state.Level = null; if (!Win) { return; } foreach (var unit in playerUnits) { if (unit.Level >= config.UnitLevels.Length) { continue; } var expAccum = 0; foreach (var enemyDesc in config.Levels[levelDesc].EnemyDescriptors) { var enemyConfig = config.Units[enemyDesc]; expAccum += enemyConfig.Experience; } if (expAccum > 0) { buffer.Add(new AddExperienceCommand(unit.Id, expAccum)); } } var scope = LevelUtils.GetScope(levelDesc); state.Progress[scope] = Math.Min(state.Progress.GetOrDefault(scope) + 1, LevelUtils.GetIndex(levelDesc) + 1); var rewardLevel = config.Levels[levelDesc].RewardLevel; RewardLogic.AppendReward(rewardLevel, state, config, buffer); }
public void Execute(GameState state, ConfigRoot config, ICommandBuffer buffer) { var level = state.Level; if (TryKill(level.PlayerUnits, out var player)) { if (config.IsFeatureEnabled(Features.AutoHeal)) { buffer.Add(new HealUnitCommand(player.Id)); } state.Units.Add(UnitId, player); if (level.PlayerUnits.Count == 0) { buffer.Add(new FinishLevelCommand(false)); } } TryKill(level.EnemyUnits, out _); if (level.EnemyUnits.Count == 0) { buffer.Add(new FinishLevelCommand(true)); } }