|
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 |
|
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 |
|
|
|
|
|
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() |
|
|
|
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 |
|
|