File size: 4,659 Bytes
898c672
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
local combat_technologies =
{
  "follower-robot-count",
  "energy-weapons-damage",
  "laser-shooting-speed",
  "physical-projectile-damage",
  "weapon-shooting-speed",
  "stronger-explosives",
  "refined-flammables",
  "artillery-shell-range",
  "artillery-shell-speed"
}

local make_modifier_list = function()
  local modifier_list =
  {
    character_modifiers =
    {
      character_running_speed_modifier = 0,
      character_health_bonus = 0,
      character_crafting_speed_modifier = 0,
      character_mining_speed_modifier = 0,
      character_build_distance_bonus = 0,
      character_reach_distance_bonus = 0
    },
    force_modifiers =
    {
      worker_robots_speed_modifier = 0,
      worker_robots_storage_bonus = 0,
      worker_robots_battery_modifier = 0,
      mining_drill_productivity_bonus = 0,
      inserter_stack_size_bonus = 0,
      stack_inserter_capacity_bonus = 0,
      laboratory_speed_modifier = 0,
      laboratory_productivity_bonus = 0,
      following_robots_lifetime_modifier = 0,
      maximum_following_robot_count = 0,
      train_braking_force_bonus = 0
    },
    turret_attack_modifier = {},
    ammo_damage_modifier ={},
    gun_speed_modifier = {}
  }
  local entities = game.entity_prototypes
  local turret_types =
  {
    ["ammo-turret"] = true,
    ["electric-turret"] = true,
    ["fluid-turret"] = true,
    ["artillery-turret"] = true,
    ["turret"] = true
  }
  for name, entity in pairs (entities) do
    if turret_types[entity.type] then
      modifier_list.turret_attack_modifier[name] = 0
    end
  end
  for name, ammo in pairs (game.ammo_category_prototypes) do
    modifier_list.ammo_damage_modifier[name] = 0
    modifier_list.gun_speed_modifier[name] = 0
  end
  return modifier_list
end

local balance = {script_data = {}}

balance.disable_combat_technologies = function(force)
  if balance.script_data.config.team_config.unlock_combat_research then return end --If true, then we want them to stay unlocked
  local tech = force.technologies
  for k, name in pairs (combat_technologies) do
    local i = 1
    repeat
      local full_name = name.."-"..i
      if tech[full_name] then
        tech[full_name].researched = false
      end
      i = i + 1
    until not tech[full_name]
  end
end

balance.apply_character_modifiers = function(player)
  local apply = function(player, name, modifier)
    if name == "character_health_bonus" and player.character then
      modifier = modifier * player.character.prototype.max_health
    end
    player[name] = modifier
  end
  --Because some things want greater than 0, others wants greater than -1.
  --Better to just catch the error than making some complicated code.
  local modifier_list = balance.script_data.config.modifier_list or make_modifier_list()
  for name, modifier in pairs (modifier_list.character_modifiers) do
    local status, error = pcall(apply, player, name, modifier)
    if not status then
      log(name)
      log(error)
      modifier_list.character_modifiers[name] = 0
    end
  end
end

balance.init = function()
  balance.script_data.config.modifier_list = make_modifier_list()
end

balance.apply_combat_modifiers = function(force)

  local entities = game.entity_prototypes
  local modifier_list = balance.script_data.config.modifier_list or make_modifier_list()
  --This is the only one which needs to be at least 1...
  modifier_list.force_modifiers.maximum_following_robot_count = math.max(modifier_list.force_modifiers.maximum_following_robot_count, 1)

  for name, modifier in pairs (modifier_list.force_modifiers) do
    force[name] = force[name] + modifier
  end

  for name, modifier in pairs (modifier_list.turret_attack_modifier) do
    if entities[name] then
      force.set_turret_attack_modifier(name, force.get_turret_attack_modifier(name) + modifier)
    else
      log(name.." removed from turret attack modifiers, as it is not a valid turret prototype")
      modifier_list.turret_attack_modifier[name] = nil
    end
  end

  local ammo = game.ammo_category_prototypes

  for name, modifier in pairs (modifier_list.ammo_damage_modifier) do
    if ammo[name] then
      force.set_ammo_damage_modifier(name, force.get_ammo_damage_modifier(name) + modifier)
    else
      log(name.." removed from ammo damage modifiers, as it is not a valid turret prototype")
      modifier_list.ammo_damage_modifier[name] = nil
    end
  end

  for name, modifier in pairs (modifier_list.gun_speed_modifier) do
    if ammo[name] then
      force.set_gun_speed_modifier(name, force.get_gun_speed_modifier(name) + modifier)
    else
      modifier_list.gun_speed_modifier[name] = nil
    end
  end

end

return balance