2021-10-13 10:21:53 +02:00
local Memory = require ' maps.pirates.memory '
local Gui = require ' maps.pirates.gui.gui '
local Ai = require ' maps.pirates.ai '
local Structures = require ' maps.pirates.structures.structures '
local Islands = require ' maps.pirates.surfaces.islands.islands '
local Boats = require ' maps.pirates.structures.boats.boats '
local Surfaces = require ' maps.pirates.surfaces.surfaces '
local Interface = require ' maps.pirates.interface '
local Roles = require ' maps.pirates.roles.roles '
local Classes = require ' maps.pirates.roles.classes '
local Progression = require ' maps.pirates.progression '
local Crowsnest = require ' maps.pirates.surfaces.crowsnest '
local Hold = require ' maps.pirates.surfaces.hold '
local Cabin = require ' maps.pirates.surfaces.cabin '
local Balance = require ' maps.pirates.balance '
local Common = require ' maps.pirates.common '
local CoreData = require ' maps.pirates.coredata '
local Overworld = require ' maps.pirates.overworld '
local Utils = require ' maps.pirates.utils_local '
local Crew = require ' maps.pirates.crew '
local Overworld = require ' maps.pirates.overworld '
local Math = require ' maps.pirates.math '
local inspect = require ' utils.inspect ' . inspect
local Quest = require ' maps.pirates.quest '
local Public = { }
2022-03-04 19:57:58 +02:00
function Public . class_renderings ( tickinterval )
local memory = Memory.get_crew_memory ( )
if not memory.classes_table then return end
local crew = Common.crew_get_crew_members ( )
for _ , player in pairs ( crew ) do
local player_index = player.index
if memory.classes_table [ player_index ] == Classes.enum . QUARTERMASTER then
if not memory.quartermaster_renderings then
memory.quartermaster_renderings = { }
end
local r = memory.quartermaster_renderings [ player_index ]
if Common.validate_player_and_character ( player ) then
if r then
rendering.set_target ( r , player.character )
else
memory.quartermaster_renderings [ player_index ] = rendering.draw_circle {
surface = player.surface ,
target = player.character ,
color = CoreData.colors . quartermaster_rendering ,
filled = false ,
radius = CoreData.quartermaster_range ,
only_in_alt_mode = true ,
draw_on_ground = true ,
}
end
else
if r then
rendering.destroy ( r )
end
end
end
end
end
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
if memory.classes_table [ player_index ] == Classes.enum . FISHERMAN then
max_reach_bonus = Math.max ( max_reach_bonus , 10 )
character.character_resource_reach_distance_bonus = 10
2022-03-04 19:57:58 +02:00
elseif memory.classes_table [ player_index ] == Classes.enum . MASTER_ANGLER then
max_reach_bonus = Math.max ( max_reach_bonus , 14 )
character.character_resource_reach_distance_bonus = 18
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
local health_boost = 0
2022-02-27 18:42:25 +02:00
-- base health is 250
2021-10-13 10:21:53 +02:00
if memory.classes_table and memory.classes_table [ player_index ] then
local class = memory.classes_table [ player_index ]
if class == Classes.enum . SAMURAI then
2022-02-28 18:36:46 +02:00
health_boost = health_boost + 800
2022-03-04 19:57:58 +02:00
elseif class == Classes.enum . RONIN_SENSEI then
health_boost = health_boost + 1600
2021-10-13 10:21:53 +02:00
end
end
2022-03-01 23:59:48 +02:00
if Common.is_captain ( player ) then
2022-02-27 18:42:25 +02:00
health_boost = health_boost + 50
2021-10-13 10:21:53 +02:00
end
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
speed_boost = speed_boost + 0.75
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
elseif ( not on_ship_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
elseif ( not on_ship_bool ) then
speed_boost = speed_boost - 0.25
end
elseif class == Classes.enum . SHORESMAN then
if on_ship_bool then
speed_boost = speed_boost - 0.25
else
2022-02-27 20:47:53 +02:00
speed_boost = speed_boost + 0.065
2021-10-13 10:21:53 +02:00
end
end
end
end
end
character.character_running_speed_modifier = speed_boost
end
end
end
2022-03-04 19:57:58 +02:00
local function class_ore_grant ( player , how_much )
if Math.random ( 2 ) == 2 then
Common.flying_text_small ( player.surface , player.position , ' [color=0.85,0.58,0.37]+[/color] ' )
Common.give_reward_items { { name = ' copper-ore ' , count = Math.ceil ( how_much * Balance.class_resource_scale ( ) ) } }
else
Common.flying_text_small ( player.surface , player.position , ' [color=0.7,0.8,0.8]+[/color] ' )
Common.give_reward_items { { name = ' iron-ore ' , count = Math.ceil ( how_much * Balance.class_resource_scale ( ) ) } }
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-04 19:57:58 +02:00
if memory.boat 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
2021-10-13 10:21:53 +02:00
2022-03-04 19:57:58 +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
local class = memory.classes_table [ player_index ]
if class == Classes.enum . DECKHAND or class == Classes.enum . SHORESMAN or class == Classes.enum . BOATSWAIN 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 and on_ship_bool and ( not hold_bool ) then
class_ore_grant ( player , 8 )
elseif class == Classes.enum . BOATSWAIN and hold_bool then
class_ore_grant ( player , 15 )
elseif class == Classes.enum . SHORESMAN and ( not on_ship_bool ) then
class_ore_grant ( player , 5 )
end
end
end
if game.tick % ( 360 * 2 ) == 0 then
local nearby_players = player.surface . find_entities_filtered { position = player.position , radius = CoreData.quartermaster_range , type = { ' character ' } }
for _ , p2 in pairs ( nearby_players ) do
local p2_index = p2.player . index
if p2_index ~= player_index and memory.classes_table [ p2_index ] and memory.classes_table [ p2_index ] == Classes.enum . QUARTERMASTER then
class_ore_grant ( p2 , 3 )
2021-10-13 10:21:53 +02:00
end
end
end
end
end
end
end
return Public