1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-26 03:52:22 +02:00
MewMew 913d42d6d8 Update
added tooltip for current biter health and damage bonus
moved science gui button, to prevent cut off threat values for spectators
reverted to old biter health boost method
spawners and worms gain health boost too
reduced trees in spawn area 
increased tree generation randomness overall
bigger biter area, less worms
border to biter lands tweaked
biter area starts at ~y512
side area worm turrets start to appear at the same distance as the biter area starts
chunks that are discovered north are mirrored to south as well
biters will try to attack from different angles
removed some console spam
2020-04-13 06:31:39 +02:00

212 lines
9.6 KiB
Lua

local bb_config = require "maps.biter_battles_v2.config"
local Server = require 'utils.server'
local tables = require "maps.biter_battles_v2.tables"
local food_values = tables.food_values
local force_translation = tables.force_translation
local enemy_team_of = tables.enemy_team_of
local minimum_modifier = 125
local maximum_modifier = 250
local player_amount_for_maximum_threat_gain = 20
function get_instant_threat_player_count_modifier()
local current_player_count = #game.forces.north.connected_players + #game.forces.south.connected_players
local gain_per_player = (maximum_modifier - minimum_modifier) / player_amount_for_maximum_threat_gain
local m = minimum_modifier + gain_per_player * current_player_count
if m > maximum_modifier then m = maximum_modifier end
return m
end
local function set_biter_endgame_modifiers(force)
if force.evolution_factor ~= 1 then return end
local damage_mod = math.round((global.bb_evolution[force.name] - 1) * 0.5, 3)
local health_factor = math.round((global.bb_evolution[force.name] - 1) * 3.5, 3) + 1
force.set_ammo_damage_modifier("melee", damage_mod)
force.set_ammo_damage_modifier("biological", damage_mod)
force.set_ammo_damage_modifier("artillery-shell", damage_mod)
force.set_ammo_damage_modifier("flamethrower", damage_mod)
force.set_ammo_damage_modifier("laser-turret", damage_mod)
global.biter_health_boost_forces[force.index] = health_factor
end
local function get_enemy_team_of(team)
if global.training_mode then
return team
else
return enemy_team_of[team]
end
end
local function print_feeding_msg(player, food, flask_amount)
if not get_enemy_team_of(player.force.name) then return end
local n = bb_config.north_side_team_name
local s = bb_config.south_side_team_name
if global.tm_custom_name["north"] then n = global.tm_custom_name["north"] end
if global.tm_custom_name["south"] then s = global.tm_custom_name["south"] end
local team_strings = {
["north"] = table.concat({"[color=120, 120, 255]", n, "'s[/color]"}),
["south"] = table.concat({"[color=255, 65, 65]", s, "'s[/color]"})
}
local colored_player_name = table.concat({"[color=", player.color.r * 0.6 + 0.35, ",", player.color.g * 0.6 + 0.35, ",", player.color.b * 0.6 + 0.35, "]", player.name, "[/color]"})
local formatted_food = table.concat({"[color=", food_values[food].color, "]", food_values[food].name, " juice[/color]", "[img=item/", food, "]"})
local formatted_amount = table.concat({"[font=heading-1][color=255,255,255]" .. flask_amount .. "[/color][/font]"})
if flask_amount >= 20 then
local enemy = get_enemy_team_of(player.force.name)
game.print(table.concat({colored_player_name, " fed ", formatted_amount, " flasks of ", formatted_food, " to team ", team_strings[enemy], " biters!"}), {r = 0.9, g = 0.9, b = 0.9})
Server.to_discord_bold(table.concat({player.name, " fed ", flask_amount, " flasks of ", food_values[food].name, " to team ", enemy, " biters!"}))
else
local target_team_text = "the enemy"
if global.training_mode then
target_team_text = "your own"
end
if flask_amount == 1 then
player.print("You fed one flask of " .. formatted_food .. " to " .. target_team_text .. " team's biters.", {r = 0.98, g = 0.66, b = 0.22})
else
player.print("You fed " .. formatted_amount .. " flasks of " .. formatted_food .. " to " .. target_team_text .. " team's biters.", {r = 0.98, g = 0.66, b = 0.22})
end
end
end
local function add_stats(player, food, flask_amount,biter_force_name,evo_before_science_feed,threat_before_science_feed)
local colored_player_name = table.concat({"[color=", player.color.r * 0.6 + 0.35, ",", player.color.g * 0.6 + 0.35, ",", player.color.b * 0.6 + 0.35, "]", player.name, "[/color]"})
local formatted_food = table.concat({"[color=", food_values[food].color, "][/color]", "[img=item/", food, "]"})
local formatted_amount = table.concat({"[font=heading-1][color=255,255,255]" .. flask_amount .. "[/color][/font]"})
local n = bb_config.north_side_team_name
local s = bb_config.south_side_team_name
if global.tm_custom_name["north"] then n = global.tm_custom_name["north"] end
if global.tm_custom_name["south"] then s = global.tm_custom_name["south"] end
local team_strings = {
["north"] = table.concat({"[color=120, 120, 255]", n, "[/color]"}),
["south"] = table.concat({"[color=255, 65, 65]", s, "[/color]"})
}
if flask_amount > 1 then
local feed_time = math.round(game.tick,0)
local feed_time_mins = math.round(game.tick / (60*60),0)
local minute_unit = ""
if feed_time_mins <= 1 then
minute_unit = "min"
else
minute_unit = "mins"
end
local shown_feed_time_hours = ""
local shown_feed_time_mins = ""
shown_feed_time_mins = feed_time_mins .. minute_unit
local formatted_feed_time = shown_feed_time_hours .. shown_feed_time_mins
evo_before_science_feed = math.round(evo_before_science_feed*100,1)
threat_before_science_feed = math.round(threat_before_science_feed,0)
local formatted_evo_after_feed = math.round(global.bb_evolution[biter_force_name]*100,1)
local formatted_threat_after_feed = math.round(global.bb_threat[biter_force_name],0)
local evo_jump = table.concat({evo_before_science_feed .. " to " .. formatted_evo_after_feed})
local threat_jump = table.concat({threat_before_science_feed .. " to ".. formatted_threat_after_feed})
local evo_jump_difference = math.round(formatted_evo_after_feed - evo_before_science_feed,1)
local threat_jump_difference = math.round(formatted_threat_after_feed - threat_before_science_feed,0)
local line_log_stats_to_add = table.concat({ formatted_amount .. " " .. formatted_food .. " by " .. colored_player_name .. " to " })
local team_name_fed_by_science = get_enemy_team_of(player.force.name)
if global.science_logs_total_north == nil then
global.science_logs_total_north = { 0 }
global.science_logs_total_south = { 0 }
for a = 1, 7 do
table.insert(global.science_logs_total_north, 0)
table.insert(global.science_logs_total_south, 0)
end
end
local total_science_of_player_force = nil
if player.force.name == "north" then
total_science_of_player_force = global.science_logs_total_north
else
total_science_of_player_force = global.science_logs_total_south
end
local indexScience = tables.food_long_to_short[food].indexScience
total_science_of_player_force[indexScience] = total_science_of_player_force[indexScience] + flask_amount
if global.science_logs_text then
table.insert(global.science_logs_date,1, formatted_feed_time)
table.insert(global.science_logs_text,1, line_log_stats_to_add)
table.insert(global.science_logs_evo_jump,1, evo_jump)
table.insert(global.science_logs_evo_jump_difference,1, evo_jump_difference)
table.insert(global.science_logs_threat,1, threat_jump)
table.insert(global.science_logs_threat_jump_difference,1, threat_jump_difference)
table.insert(global.science_logs_fed_team,1, team_name_fed_by_science)
table.insert(global.science_logs_food_name,1, food)
else
global.science_logs_date = { formatted_feed_time }
global.science_logs_text = { line_log_stats_to_add }
global.science_logs_evo_jump = { evo_jump }
global.science_logs_evo_jump_difference = { evo_jump_difference }
global.science_logs_threat = { threat_jump }
global.science_logs_threat_jump_difference = { threat_jump_difference }
global.science_logs_fed_team = { team_name_fed_by_science }
global.science_logs_food_name = { food }
end
end
end
function set_evo_and_threat(flask_amount, food, biter_force_name)
local decimals = 9
local math_round = math.round
local instant_threat_player_count_modifier = get_instant_threat_player_count_modifier()
local food_value = food_values[food].value * global.difficulty_vote_value
for a = 1, flask_amount, 1 do
---SET EVOLUTION
local e2 = (game.forces[biter_force_name].evolution_factor * 100) + 1
local diminishing_modifier = (1 / (10 ^ (e2 * 0.017))) / (e2 * 0.5)
local evo_gain = (food_value * diminishing_modifier)
global.bb_evolution[biter_force_name] = global.bb_evolution[biter_force_name] + evo_gain
global.bb_evolution[biter_force_name] = math_round(global.bb_evolution[biter_force_name], decimals)
if global.bb_evolution[biter_force_name] <= 1 then
game.forces[biter_force_name].evolution_factor = global.bb_evolution[biter_force_name]
else
game.forces[biter_force_name].evolution_factor = 1
end
--ADD INSTANT THREAT
local diminishing_modifier = 1 / (0.2 + (e2 * 0.018))
global.bb_threat[biter_force_name] = global.bb_threat[biter_force_name] + (food_value * instant_threat_player_count_modifier * diminishing_modifier)
global.bb_threat[biter_force_name] = math_round(global.bb_threat[biter_force_name], decimals)
end
--SET THREAT INCOME
global.bb_threat_income[biter_force_name] = global.bb_evolution[biter_force_name] * 20
set_biter_endgame_modifiers(game.forces[biter_force_name])
end
local function feed_biters(player, food)
local enemy_force_name = get_enemy_team_of(player.force.name) ---------------
--enemy_force_name = player.force.name
local biter_force_name = enemy_force_name .. "_biters"
local i = player.get_main_inventory()
local flask_amount = i.get_item_count(food)
if flask_amount == 0 then
player.print("You have no " .. food_values[food].name .. " flask in your inventory.", {r = 0.98, g = 0.66, b = 0.22})
return
end
i.remove({name = food, count = flask_amount})
print_feeding_msg(player, food, flask_amount)
local evolution_before_feed = global.bb_evolution[biter_force_name]
local threat_before_feed = global.bb_threat[biter_force_name]
set_evo_and_threat(flask_amount, food, biter_force_name)
add_stats(player, food, flask_amount ,biter_force_name, evolution_before_feed, threat_before_feed)
end
return feed_biters