2022-03-19 23:20:55 +02:00
--luacheck: ignore
--luacheck ignores because tickinterval arguments are a code templating choice...
2021-10-13 10:21:53 +02:00
local Memory = require ' maps.pirates.memory '
local Structures = require ' maps.pirates.structures.structures '
local Boats = require ' maps.pirates.structures.boats.boats '
local Surfaces = require ' maps.pirates.surfaces.surfaces '
local Classes = require ' maps.pirates.roles.classes '
local Balance = require ' maps.pirates.balance '
local Common = require ' maps.pirates.common '
local CoreData = require ' maps.pirates.coredata '
local Math = require ' maps.pirates.math '
2022-03-19 23:20:55 +02:00
local _inspect = require ' utils.inspect ' . inspect
2021-10-13 10:21:53 +02:00
local Public = { }
2022-05-29 13:36:27 +02:00
function Public . class_update_auxiliary_data ( tickinterval )
2022-03-04 19:57:58 +02:00
local memory = Memory.get_crew_memory ( )
if not memory.classes_table then return end
2022-05-29 13:36:27 +02:00
local class_auxiliary_data = memory.class_auxiliary_data
2022-03-04 19:57:58 +02:00
local crew = Common.crew_get_crew_members ( )
2022-05-29 13:36:27 +02:00
local processed_players = { }
for _ , player in pairs ( crew ) do
local player_index = player.index
local class = memory.classes_table [ player_index ]
if class and class == Classes.enum . IRON_LEG then
if ( not class_auxiliary_data [ player_index ] ) then class_auxiliary_data [ player_index ] = { } end
local data = class_auxiliary_data [ player_index ]
processed_players [ player_index ] = true
local check
if Common.validate_player_and_character ( player ) then
local inv = player.character . get_inventory ( defines.inventory . character_main )
if inv and inv.valid then
local count = inv.get_item_count ( ' iron-ore ' )
if count and count >= 3000 then
check = true
end
end
end
if check then
data.iron_leg_active = true
else
data.iron_leg_active = false
end
end
end
for k , _ in pairs ( class_auxiliary_data ) do
if not processed_players [ k ] then
class_auxiliary_data [ k ] = nil
end
2022-03-07 11:50:25 +02:00
end
2022-05-29 13:36:27 +02:00
end
2022-03-07 11:50:25 +02:00
2022-05-29 13:36:27 +02:00
function Public . class_renderings ( tickinterval )
local memory = Memory.get_crew_memory ( )
if not memory.classes_table then return end
local class_renderings = memory.class_renderings
local crew = Common.crew_get_crew_members ( )
local processed_players = { }
2022-03-07 11:50:25 +02:00
2022-03-04 19:57:58 +02:00
for _ , player in pairs ( crew ) do
local player_index = player.index
2022-05-29 13:36:27 +02:00
local class = memory.classes_table [ player_index ]
if class then
if not class_renderings [ player_index ] then class_renderings [ player_index ] = { } end
local rendering_data = class_renderings [ player_index ]
local r = rendering_data.rendering
local c = rendering_data.class
processed_players [ player_index ] = true
if Common.validate_player_and_character ( player ) and ( c ~= Classes.enum . IRON_LEG or ( memory.class_auxiliary_data [ player_index ] and memory.class_auxiliary_data [ player_index ] . iron_leg_active ) ) then
if class == c then
if r and rendering.is_valid ( r ) then
rendering.set_target ( r , player.character )
end
2022-03-04 19:57:58 +02:00
else
2022-05-29 13:36:27 +02:00
if r and rendering.is_valid ( r ) then
rendering.destroy ( r )
end
if class == Classes.enum . QUARTERMASTER then
class_renderings [ player_index ] = {
rendering = rendering.draw_circle {
surface = player.surface ,
target = player.character ,
color = CoreData.colors . quartermaster_rendering ,
filled = false ,
radius = Common.quartermaster_range ,
only_in_alt_mode = true ,
draw_on_ground = true ,
}
}
elseif class == Classes.enum . SAMURAI then
class_renderings [ player_index ] = {
rendering = rendering.draw_circle {
surface = player.surface ,
target = player.character ,
color = CoreData.colors . toughness_rendering ,
filled = false ,
radius = Balance.samurai_resistance ^ 2 ,
only_in_alt_mode = false ,
draw_on_ground = true ,
}
}
elseif class == Classes.enum . HATAMOTO then
class_renderings [ player_index ] = {
rendering = rendering.draw_circle {
surface = player.surface ,
target = player.character ,
color = CoreData.colors . toughness_rendering ,
filled = false ,
radius = Balance.hatamoto_resistance ^ 2 ,
only_in_alt_mode = false ,
draw_on_ground = true ,
}
}
elseif class == Classes.enum . IRON_LEG and memory.class_auxiliary_data [ player_index ] and memory.class_auxiliary_data [ player_index ] . iron_leg_active then
class_renderings [ player_index ] = {
rendering = rendering.draw_circle {
surface = player.surface ,
target = player.character ,
color = CoreData.colors . toughness_rendering ,
filled = false ,
radius = Balance.iron_leg_resistance ^ 2 ,
only_in_alt_mode = false ,
draw_on_ground = true ,
}
}
end
2022-03-04 19:57:58 +02:00
end
else
if r then
rendering.destroy ( r )
end
2022-05-29 13:36:27 +02:00
class_renderings [ player_index ] = nil
2022-03-04 19:57:58 +02:00
end
end
end
2022-03-07 11:50:25 +02:00
2022-05-29 13:36:27 +02:00
for k , data in pairs ( class_renderings ) do
if not processed_players [ k ] then
local r = data.rendering
if r and rendering.is_valid ( r ) then
rendering.destroy ( r )
end
class_renderings [ k ] = nil
2022-03-07 11:50:25 +02:00
end
end
2022-03-04 19:57:58 +02:00
end
2022-03-07 22:15:47 +02:00
2021-10-13 10:21:53 +02:00
function Public . update_character_properties ( tickinterval )
local memory = Memory.get_crew_memory ( )
local crew = Common.crew_get_crew_members ( )
for _ , player in pairs ( crew ) do
if Common.validate_player_and_character ( player ) then
local player_index = player.index
local character = player.character
if memory.classes_table and memory.classes_table [ player_index ] then
local max_reach_bonus = 0
-- if memory.classes_table[player_index] == Classes.enum.DECKHAND then
-- max_reach_bonus = Math.max(max_reach_bonus, 6)
-- character.character_build_distance_bonus = 6
-- else
-- character.character_build_distance_bonus = 0
-- end
2022-03-09 01:36:03 +02:00
if memory.classes_table [ player_index ] == Classes.enum . FISHERMAN then
2021-10-13 10:21:53 +02:00
max_reach_bonus = Math.max ( max_reach_bonus , 10 )
character.character_resource_reach_distance_bonus = 10
2022-03-09 01:36:03 +02:00
elseif memory.classes_table [ player_index ] == Classes.enum . MASTER_ANGLER or memory.classes_table [ player_index ] == Classes.enum . DREDGER then
2022-03-06 03:05:26 +02:00
max_reach_bonus = Math.max ( max_reach_bonus , 16 )
character.character_resource_reach_distance_bonus = 16
2021-10-13 10:21:53 +02:00
else
character.character_resource_reach_distance_bonus = 0
end
character.character_reach_distance_bonus = max_reach_bonus
end
2022-03-14 14:44:30 +02:00
local health_boost = 0 -- base health is 250
2022-03-19 23:20:55 +02:00
2022-03-14 14:44:30 +02:00
-- moved to damage resistance:
-- if memory.classes_table and memory.classes_table[player_index] then
-- local class = memory.classes_table[player_index]
-- if class == Classes.enum.SAMURAI then
-- health_boost = health_boost + 800
-- elseif class == Classes.enum.HATAMOTO then
-- health_boost = health_boost + 1300
-- end
-- end
2022-05-05 10:55:48 +02:00
-- Captain health boost:
-- if Common.is_captain(player) then
-- health_boost = health_boost + 50
-- end
2021-10-13 10:21:53 +02:00
character.character_health_bonus = health_boost
local speed_boost = Balance.base_extra_character_speed
if memory.speed_boost_characters and memory.speed_boost_characters [ player_index ] then
2022-05-30 09:44:52 +02:00
speed_boost = speed_boost + 0.85
2021-10-13 10:21:53 +02:00
else
if memory.classes_table and memory.classes_table [ player_index ] then
local class = memory.classes_table [ player_index ]
if class == Classes.enum . SCOUT then
2022-03-03 02:19:20 +02:00
speed_boost = speed_boost + 0.35
2021-10-13 10:21:53 +02:00
elseif class == Classes.enum . DECKHAND or class == Classes.enum . BOATSWAIN or class == Classes.enum . SHORESMAN then
local surfacedata = Surfaces.SurfacesCommon . decode_surface_name ( player.surface . name )
local type = surfacedata.type
local on_ship_bool = type == Surfaces.enum . HOLD or type == Surfaces.enum . CABIN or type == Surfaces.enum . CROWSNEST or ( player.surface . name == memory.boat . surface_name and Boats.on_boat ( memory.boat , player.position ) )
local hold_bool = surfacedata.type == Surfaces.enum . HOLD
if class == Classes.enum . DECKHAND then
if on_ship_bool and ( not hold_bool ) then
speed_boost = speed_boost + 0.25
end
elseif class == Classes.enum . BOATSWAIN then
if hold_bool then
speed_boost = speed_boost + 0.25
end
elseif class == Classes.enum . SHORESMAN then
2022-05-07 22:41:45 +02:00
if not on_ship_bool then
2022-03-05 21:56:41 +02:00
speed_boost = speed_boost + 0.07
2021-10-13 10:21:53 +02:00
end
end
end
end
end
character.character_running_speed_modifier = speed_boost
end
end
end
2021-10-24 16:27:57 +02:00
function Public . class_rewards_tick ( tickinterval )
2022-02-27 20:47:53 +02:00
--assuming tickinterval = 6 seconds for now
2021-10-13 10:21:53 +02:00
local memory = Memory.get_crew_memory ( )
2022-03-07 22:15:47 +02:00
local crew = Common.crew_get_crew_members ( )
for _ , player in pairs ( crew ) do
if Common.validate_player_and_character ( player ) then
local player_index = player.index
if memory.classes_table and memory.classes_table [ player_index ] then
2022-03-11 18:46:02 +02:00
if game.tick % tickinterval == 0 and Common.validate_player_and_character ( player ) then
2022-03-07 22:15:47 +02:00
if memory.classes_table [ player.index ] == Classes.enum . SMOLDERING then
local inv = player.get_inventory ( defines.inventory . character_main )
if not ( inv and inv.valid ) then return end
2022-03-13 03:44:32 +02:00
local max_coal = 50
2022-03-07 22:15:47 +02:00
-- local max_transfer = 1
local wood_count = inv.get_item_count ( ' wood ' )
local coal_count = inv.get_item_count ( ' coal ' )
if wood_count >= 1 and coal_count < max_coal then
-- local count = Math.min(wood_count, max_coal-coal_count, max_transfer)
local count = 1
inv.remove ( { name = ' wood ' , count = count } )
inv.insert ( { name = ' coal ' , count = count } )
Common.flying_text_small ( player.surface , player.position , ' [item=coal] ' )
end
end
end
end
2021-10-13 10:21:53 +02:00
2022-03-07 22:15:47 +02:00
2022-03-11 18:46:02 +02:00
if game.tick % tickinterval == 0 and ( not ( memory.boat and memory.boat . state and memory.boat . state == Structures.Boats . enum_state.ATSEA_LOADING_MAP ) ) then --it is possible to spend extra time here, so don't give out freebies
2022-03-07 14:57:07 +02:00
2022-03-04 19:57:58 +02:00
if memory.classes_table and memory.classes_table [ player_index ] then
local class = memory.classes_table [ player_index ]
2022-03-08 00:00:14 +02:00
if class == Classes.enum . DECKHAND or class == Classes.enum . SHORESMAN or class == Classes.enum . BOATSWAIN or class == Classes.enum . QUARTERMASTER then --watch out for this line!
2022-03-04 19:57:58 +02:00
local surfacedata = Surfaces.SurfacesCommon . decode_surface_name ( player.surface . name )
local type = surfacedata.type
local on_ship_bool = type == Surfaces.enum . HOLD or type == Surfaces.enum . CABIN or type == Surfaces.enum . CROWSNEST or ( player.surface . name == memory.boat . surface_name and Boats.on_boat ( memory.boat , player.position ) )
local hold_bool = surfacedata.type == Surfaces.enum . HOLD
2022-03-19 23:20:55 +02:00
2022-03-04 19:57:58 +02:00
if class == Classes.enum . DECKHAND and on_ship_bool and ( not hold_bool ) then
2022-05-05 10:55:48 +02:00
Classes.class_ore_grant ( player , 2 )
2022-03-04 19:57:58 +02:00
elseif class == Classes.enum . BOATSWAIN and hold_bool then
2022-05-05 10:55:48 +02:00
Classes.class_ore_grant ( player , 4 )
2022-03-04 19:57:58 +02:00
elseif class == Classes.enum . SHORESMAN and ( not on_ship_bool ) then
2022-03-10 23:09:06 +02:00
Classes.class_ore_grant ( player , 2 )
2022-03-08 00:00:14 +02:00
elseif class == Classes.enum . QUARTERMASTER then
local nearby_players = # player.surface . find_entities_filtered { position = player.position , radius = Common.quartermaster_range , name = ' character ' }
2022-03-19 23:20:55 +02:00
2022-03-08 00:00:14 +02:00
if nearby_players > 1 then
2022-03-09 23:39:47 +02:00
Classes.class_ore_grant ( player , nearby_players - 1 , true )
2022-03-07 11:50:25 +02:00
end
2021-10-13 10:21:53 +02:00
end
end
end
end
end
end
end
return Public