From bedffcbdc41fb0dcd888989acd958e2aaebf15aa Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:01:25 +0300 Subject: [PATCH 01/62] [MIRROR] Make apcs actually play the tool sound when exposing their wires. (#1633) * Make apcs actually play the tool sound when exposing their wires. (#81031) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> --- code/modules/power/apc/apc_tool_act.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index b35f4de3fba..e712f474464 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -77,6 +77,7 @@ return toggle_panel_open() balloon_alert(user, "wires [panel_open ? "exposed" : "unexposed"]") + W.play_tool_sound(src) update_appearance() return From cec48fbf27f35f1c0e69d25968b9cac33cb5eb91 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:01:49 +0300 Subject: [PATCH 02/62] Automatic changelog for PR #1633 [ci skip] --- html/changelogs/AutoChangeLog-pr-1633.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1633.yml diff --git a/html/changelogs/AutoChangeLog-pr-1633.yml b/html/changelogs/AutoChangeLog-pr-1633.yml new file mode 100644 index 00000000000..45a47296ef7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1633.yml @@ -0,0 +1,4 @@ +author: "00-Steven" +delete-after: True +changes: + - sound: "APCs actually play the tool sound when exposing their wires." \ No newline at end of file From 48818d2c375888091c78d598f68cf40e146917d1 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:02:09 +0300 Subject: [PATCH 03/62] Good Hair Day: Enables hair & facial hair for moths (#1634) enables hair for moths Co-authored-by: Lutowski <136726218+Lutowski@users.noreply.github.com> --- modular_nova/modules/bodyparts/code/moth_bodyparts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_nova/modules/bodyparts/code/moth_bodyparts.dm b/modular_nova/modules/bodyparts/code/moth_bodyparts.dm index 3f55ec93393..aab60d23281 100644 --- a/modular_nova/modules/bodyparts/code/moth_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/moth_bodyparts.dm @@ -4,7 +4,7 @@ icon_state = "moth_head_m" limb_id = SPECIES_MOTH is_dimorphic = TRUE - head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips? + head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips? /obj/item/bodypart/chest/moth icon = BODYPART_ICON_MOTH From 3f253802ae0d01ef4794d5c80f9755ad7747abae Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:02:40 +0300 Subject: [PATCH 04/62] Automatic changelog for PR #1634 [ci skip] --- html/changelogs/AutoChangeLog-pr-1634.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1634.yml diff --git a/html/changelogs/AutoChangeLog-pr-1634.yml b/html/changelogs/AutoChangeLog-pr-1634.yml new file mode 100644 index 00000000000..f07bd520614 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1634.yml @@ -0,0 +1,4 @@ +author: "Lutowski" +delete-after: True +changes: + - rscadd: "Fluffier than ever before, moths can now have hair & facial hair." \ No newline at end of file From 9d2c480e620f8c4a029447ffb66cdaeac2ee05a1 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:03:08 +0300 Subject: [PATCH 05/62] [MIRROR] Sign up for Cargorilla from the lobby (#1635) * Sign up for Cargorilla from the lobby (#79776) * Modular --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Jacquerel --- code/__DEFINES/dcs/signals/signals_global.dm | 3 + code/__DEFINES/jobs.dm | 52 +++++----- code/_globalvars/lists/mapping.dm | 1 + code/_globalvars/lists/names.dm | 1 + code/_onclick/hud/new_player.dm | 77 +++++++++----- code/_onclick/hud/screen_objects.dm | 4 + code/controllers/subsystem/job.dm | 12 +++ .../subsystem/processing/station.dm | 10 ++ code/controllers/subsystem/ticker.dm | 1 + .../datums/components/ghost_direct_control.dm | 10 +- code/datums/station_traits/_station_trait.dm | 66 ++++++++++-- code/datums/station_traits/job_traits.dm | 95 ++++++++++++++++++ code/datums/station_traits/negative_traits.dm | 2 +- code/datums/station_traits/neutral_traits.dm | 54 ---------- .../client/preferences/middleware/jobs.dm | 4 + code/modules/events/bureaucratic_error.dm | 18 ++-- code/modules/jobs/job_types/cargo_gorilla.dm | 50 +++++++++ .../mob/dead/new_player/latejoin_menu.dm | 5 + .../basic/farm_animals/gorilla/gorilla.dm | 27 ----- code/modules/mob/living/basic/pets/sloth.dm | 3 +- code/modules/tooltip/tooltip.dm | 24 ++--- icons/hud/lobby/signup_button.dmi | Bin 0 -> 676 bytes strings/names/cargorilla.txt | 7 ++ tgstation.dme | 2 + .../tgui/interfaces/common/JobToIcon.ts | 1 + 25 files changed, 364 insertions(+), 165 deletions(-) create mode 100644 code/datums/station_traits/job_traits.dm create mode 100644 code/modules/jobs/job_types/cargo_gorilla.dm create mode 100644 icons/hud/lobby/signup_button.dmi create mode 100644 strings/names/cargorilla.txt diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 3c7399d98fa..41c2b4b7459 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -84,6 +84,9 @@ /// (new_name, old_name) #define COMSIG_GLOB_STATION_NAME_CHANGED "!station_name_changed" +/// Global signal sent before we decide what job everyone has +#define COMSIG_GLOB_PRE_JOBS_ASSIGNED "!pre_roles_assigned" + /// global signal when a global nullrod type is picked #define COMSIG_GLOB_NULLROD_PICKED "!nullrod_picked" diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 4b625097d23..8fefe464d59 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -80,6 +80,7 @@ //Supply #define JOB_QUARTERMASTER "Quartermaster" #define JOB_CARGO_TECHNICIAN "Cargo Technician" +#define JOB_CARGO_GORILLA "Cargo Gorilla" #define JOB_SHAFT_MINER "Shaft Miner" #define JOB_BITRUNNER "Bitrunner" #define JOB_CUSTOMS_AGENT "Customs Agent" // NOVA EDIT ADDITION @@ -164,31 +165,32 @@ #define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 20 #define JOB_DISPLAY_ORDER_SHAFT_MINER 21 #define JOB_DISPLAY_ORDER_BITRUNNER 22 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 23 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 24 -#define JOB_DISPLAY_ORDER_PARAMEDIC 25 -#define JOB_DISPLAY_ORDER_CHEMIST 26 -#define JOB_DISPLAY_ORDER_VIROLOGIST 27 -#define JOB_DISPLAY_ORDER_CORONER 28 -#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 29 -#define JOB_DISPLAY_ORDER_SCIENTIST 30 -#define JOB_DISPLAY_ORDER_ROBOTICIST 31 -#define JOB_DISPLAY_ORDER_GENETICIST 32 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 33 -#define JOB_DISPLAY_ORDER_WARDEN 34 -#define JOB_DISPLAY_ORDER_DETECTIVE 35 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 36 -#define JOB_DISPLAY_ORDER_PRISONER 37 -#define JOB_DISPLAY_ORDER_SECURITY_MEDIC 38 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 39 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 40 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_BLUESHIELD 41 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_ORDERLY 42 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 43 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_BOUNCER 44 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 45 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 46 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_EXP_CORPS 47 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_CARGO_GORILLA 23 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 24 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 25 +#define JOB_DISPLAY_ORDER_PARAMEDIC 26 +#define JOB_DISPLAY_ORDER_CHEMIST 27 +#define JOB_DISPLAY_ORDER_VIROLOGIST 28 +#define JOB_DISPLAY_ORDER_CORONER 29 +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 30 +#define JOB_DISPLAY_ORDER_SCIENTIST 31 +#define JOB_DISPLAY_ORDER_ROBOTICIST 32 +#define JOB_DISPLAY_ORDER_GENETICIST 33 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 34 +#define JOB_DISPLAY_ORDER_WARDEN 35 +#define JOB_DISPLAY_ORDER_DETECTIVE 36 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 37 +#define JOB_DISPLAY_ORDER_PRISONER 38 +#define JOB_DISPLAY_ORDER_SECURITY_MEDIC 39 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 40 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 41 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_BLUESHIELD 42 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_ORDERLY 43 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 44 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_BOUNCER 45 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 46 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 47 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_EXP_CORPS 48 //NOVA EDIT ADDITON #define DEPARTMENT_UNASSIGNED "No Department" diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 8ac2f0d3ddf..b77942bad87 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -107,6 +107,7 @@ GLOBAL_LIST_EMPTY(generic_event_spawns) /// essentially allowing a user to override generic job spawnpoints with a specific one GLOBAL_LIST_EMPTY(jobspawn_overrides) +GLOBAL_LIST_EMPTY(gorilla_start) GLOBAL_LIST_EMPTY(wizardstart) GLOBAL_LIST_EMPTY(nukeop_start) GLOBAL_LIST_EMPTY(nukeop_leader_start) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index bc195bcf5f4..c51fbaa9eb7 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1. GLOBAL_LIST_INIT(megacarp_last_names, world.file2list("strings/names/megacarp2.txt")) GLOBAL_LIST_INIT(cyberauth_names, world.file2list("strings/names/cyberauth.txt")) GLOBAL_LIST_INIT(syndicate_monkey_names, world.file2list("strings/names/syndicate_monkey.txt")) +GLOBAL_LIST_INIT(cargorilla_names, world.file2list("strings/names/cargorilla.txt")) GLOBAL_LIST_INIT(guardian_first_names, world.file2list("strings/names/guardian_descriptions.txt")) GLOBAL_LIST_INIT(guardian_tech_surnames, world.file2list("strings/names/guardian_gamepieces.txt")) GLOBAL_LIST_INIT(guardian_fantasy_surnames, world.file2list("strings/names/guardian_tarot.txt")) diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 86735de1127..406dbc1c73a 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -1,38 +1,65 @@ -/* NOVA EDIT REMOVAL - Custom HTML Lobby Screen #define SHUTTER_MOVEMENT_DURATION 0.4 SECONDS #define SHUTTER_WAIT_DURATION 0.2 SECONDS +/// Maximum number of station trait buttons we will display, please think hard before creating scenarios where there are more than this +#define MAX_STATION_TRAIT_BUTTONS_VERTICAL 3 /datum/hud/new_player ///Whether the menu is currently on the client's screen or not var/menu_hud_status = TRUE /datum/hud/new_player/New(mob/owner) - ..() + . = ..() - if(!owner || !owner.client) + if (!owner || !owner.client) return - if(owner.client.interviewee) + if (owner.client.interviewee) return var/list/buttons = subtypesof(/atom/movable/screen/lobby) - for(var/button_type in buttons) - var/atom/movable/screen/lobby/lobbyscreen = new button_type(our_hud = src) + for (var/atom/movable/screen/lobby/lobbyscreen as anything in buttons) + if (!initial(lobbyscreen.always_available)) + continue + lobbyscreen = new lobbyscreen(our_hud = src) lobbyscreen.SlowInit() static_inventory += lobbyscreen - if(!lobbyscreen.always_shown) + if (!lobbyscreen.always_shown) lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button)) lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button)) - if(istype(lobbyscreen, /atom/movable/screen/lobby/button)) + if (istype(lobbyscreen, /atom/movable/screen/lobby/button)) var/atom/movable/screen/lobby/button/lobby_button = lobbyscreen lobby_button.owner = REF(owner) + add_station_trait_buttons() + +/// Display buttons for relevant station traits +/datum/hud/new_player/proc/add_station_trait_buttons() + if (!mymob?.client || mymob.client.interviewee || !length(GLOB.lobby_station_traits)) + return + var/buttons_created = 0 + var/y_offset = 397 + var/y_button_offset = 27 + for (var/datum/station_trait/trait as anything in GLOB.lobby_station_traits) + if (!trait.can_display_lobby_button()) + continue + var/atom/movable/screen/lobby/button/sign_up/sign_up_button = new(our_hud = src) + sign_up_button.SlowInit() + sign_up_button.owner = REF(mymob) + sign_up_button.screen_loc = offset_to_screen_loc(233, y_offset, mymob.client.view) + y_offset += y_button_offset + static_inventory += sign_up_button + trait.setup_lobby_button(sign_up_button) + buttons_created++ + if (buttons_created >= MAX_STATION_TRAIT_BUTTONS_VERTICAL) + return /atom/movable/screen/lobby plane = SPLASHSCREEN_PLANE layer = LOBBY_MENU_LAYER screen_loc = "TOP,CENTER" - ///Whether this HUD element can be hidden from the client's "screen" (moved off-screen) or not + /// Whether this HUD element can be hidden from the client's "screen" (moved off-screen) or not var/always_shown = FALSE + /// If true we will create this button every time the HUD is generated + var/always_available = TRUE ///Set the HUD in New, as lobby screens are made before Atoms are Initialized. /atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...) @@ -184,12 +211,6 @@ return var/mob/dead/new_player/new_player = hud.mymob - // NOVA EDIT BEGIN - if(!is_admin(new_player.client) && length_char(new_player.client?.prefs?.read_preference(/datum/preference/text/flavor_text)) < FLAVOR_TEXT_CHAR_REQUIREMENT) - to_chat(new_player, span_notice("You need at least [FLAVOR_TEXT_CHAR_REQUIREMENT] characters of flavor text to ready up for the round. You have [length_char(new_player.client.prefs.read_preference(/datum/preference/text/flavor_text))] characters.")) - return - // NOVA EDIT END - ready = !ready if(ready) new_player.ready = PLAYER_READY_TO_PLAY @@ -253,12 +274,6 @@ to_chat(new_player, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].")) return - // NOVA EDIT BEGIN - if(length_char(new_player.client.prefs.read_preference(/datum/preference/text/flavor_text)) <= FLAVOR_TEXT_CHAR_REQUIREMENT) - to_chat(new_player, span_notice("You need at least [FLAVOR_TEXT_CHAR_REQUIREMENT] characters of flavor text to join the round. You have [length_char(new_player.client.prefs.read_preference(/datum/preference/text/flavor_text))] characters.")) - return - // NOVA EDIT END - if(!LAZYACCESS(params2list(params), CTRL_CLICK)) GLOB.latejoin_menu.ui_interact(new_player) else @@ -413,6 +428,23 @@ var/mob/dead/new_player/new_player = hud.mymob new_player.handle_player_polling() +/// A generic "sign up" button used by station traits +/atom/movable/screen/lobby/button/sign_up + icon = 'icons/hud/lobby/signup_button.dmi' + icon_state = "signup" + base_icon_state = "signup" + always_available = FALSE + +/atom/movable/screen/lobby/button/sign_up/MouseEntered(location, control, params) + . = ..() + if(QDELETED(src) || !desc) + return + openToolTip(usr, tip_src = src, params = params, title = name, content = desc,) + +/atom/movable/screen/lobby/button/sign_up/MouseExited() + . = ..() + closeToolTip(usr) + /atom/movable/screen/lobby/button/collapse name = "Collapse Lobby Menu" icon = 'icons/hud/lobby/collapse_expand.dmi' @@ -540,5 +572,4 @@ #undef SHUTTER_MOVEMENT_DURATION #undef SHUTTER_WAIT_DURATION - -*/ // NOVA EDIT END +#undef MAX_STATION_TRAIT_BUTTONS_VERTICAL diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 372a32b3c68..ce5c97a63c7 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -55,6 +55,10 @@ /atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params) return +/// Returns the mob this is being displayed to, if any +/atom/movable/screen/proc/get_mob() + return hud?.mymob + /atom/movable/screen/text icon = null icon_state = null diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 4a8345728e5..d2a374f39cd 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -94,6 +94,18 @@ SUBSYSTEM_DEF(job) set_overflow_role(CONFIG_GET(string/overflow_job)) // this must always go after load_jobs_from_config() due to how the legacy systems operate, this always takes precedent. return SS_INIT_SUCCESS +/// Returns a list of jobs that we are allowed to fuck with during random events +/datum/controller/subsystem/job/proc/get_valid_overflow_jobs() + var/static/list/overflow_jobs + if (!isnull(overflow_jobs)) + return overflow_jobs + + overflow_jobs = list() + for (var/datum/job/check_job in joinable_occupations) + if (!check_job.allow_bureaucratic_error) + continue + overflow_jobs += check_job + return overflow_jobs /datum/controller/subsystem/job/proc/set_overflow_role(new_overflow_role) var/datum/job/new_overflow = ispath(new_overflow_role) ? GetJobType(new_overflow_role) : GetJob(new_overflow_role) diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index b30a276fc36..224d790faca 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -18,6 +18,7 @@ PROCESSING_SUBSYSTEM_DEF(station) // Autowiki also wants consistent outputs, for example making sure the vending machine page always reports the normal products #if !defined(UNIT_TESTS) && !defined(AUTOWIKI) SetupTraits() + display_lobby_traits() #endif announcer = new announcer() //Initialize the station's announcer datum @@ -96,3 +97,12 @@ PROCESSING_SUBSYSTEM_DEF(station) for(var/i in trait_instance.blacklist) var/datum/station_trait/trait_to_remove = i selectable_traits_by_types[initial(trait_to_remove.trait_type)] -= trait_to_remove + +/// Update station trait lobby buttons for clients who joined before we initialised this subsystem +/datum/controller/subsystem/processing/station/proc/display_lobby_traits() + for (var/mob/dead/new_player/player as anything in GLOB.new_player_list) + var/datum/hud/new_player/observer_hud = player.hud_used + if (!istype(observer_hud)) + continue + observer_hud.add_station_trait_buttons() + observer_hud.show_hud(observer_hud.hud_version) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 75b51b2babc..add23ac91b2 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -249,6 +249,7 @@ SUBSYSTEM_DEF(ticker) var/can_continue = FALSE can_continue = SSdynamic.pre_setup() //Choose antagonists CHECK_TICK + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_PRE_JOBS_ASSIGNED, src) can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs CHECK_TICK diff --git a/code/datums/components/ghost_direct_control.dm b/code/datums/components/ghost_direct_control.dm index 83c893b6dca..a131a2d3ca7 100644 --- a/code/datums/components/ghost_direct_control.dm +++ b/code/datums/components/ghost_direct_control.dm @@ -30,7 +30,7 @@ src.ban_type = ban_type src.assumed_control_message = assumed_control_message || "You are [parent]!" src.extra_control_checks = extra_control_checks - src.after_assumed_control= after_assumed_control + src.after_assumed_control = after_assumed_control var/mob/mob_parent = parent LAZYADD(GLOB.joinable_mobs[format_text("[initial(mob_parent.name)]")], mob_parent) @@ -42,9 +42,10 @@ . = ..() RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, PROC_REF(on_ghost_clicked)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) + RegisterSignal(parent, COMSIG_MOB_LOGIN, PROC_REF(on_login)) /datum/component/ghost_direct_control/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_EXAMINE)) + UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_EXAMINE, COMSIG_MOB_LOGIN)) return ..() /datum/component/ghost_direct_control/Destroy(force) @@ -140,3 +141,8 @@ to_chat(new_body, span_boldnotice(assumed_control_message)) after_assumed_control?.Invoke(harbinger) qdel(src) + +/// When someone else assumes control via some other means, get rid of our component +/datum/component/ghost_direct_control/proc/on_login() + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index 8e8303c0366..8e5b6310c71 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -1,3 +1,6 @@ +/// Station traits displayed in the lobby +GLOBAL_LIST_EMPTY(lobby_station_traits) + ///Base class of station traits. These are used to influence rounds in one way or the other by influencing the levers of the station. /datum/station_trait ///Name of the trait @@ -22,6 +25,10 @@ var/trait_flags = STATION_TRAIT_MAP_UNRESTRICTED /// Whether or not this trait can be reverted by an admin var/can_revert = TRUE + /// If set to true we'll show a button on the lobby to notify people about this trait + var/sign_up_button = FALSE + /// Lobby buttons controlled by this trait + var/list/lobby_buttons = list() /// The ID that we look for in dynamic.json. Not synced with 'name' because I can already see this go wrong var/dynamic_threat_id /// If ran during dynamic, do we reduce the total threat? Will be overriden by config if set @@ -34,7 +41,8 @@ if(threat_reduction) GLOB.dynamic_station_traits[src] = threat_reduction - + if(sign_up_button) + GLOB.lobby_station_traits += src if(trait_processes) START_PROCESSING(SSstation, src) if(trait_to_give) @@ -43,14 +51,10 @@ /datum/station_trait/Destroy() SSstation.station_traits -= src GLOB.dynamic_station_traits.Remove(src) + destroy_lobby_buttons() return ..() -/// Proc ran when round starts. Use this for roundstart effects. -/datum/station_trait/proc/on_round_start() - SIGNAL_HANDLER - return - -///type of info the centcom report has on this trait, if any. +/// Returns the type of info the centcom report has on this trait, if any. /datum/station_trait/proc/get_report() return "[name] - [report_message]" @@ -64,7 +68,7 @@ qdel(src) -///Called by decals if they can be colored, to see if we got some cool colors for them. Only takes the first station trait +/// Called by decals if they can be colored, to see if we got some cool colors for them. Only takes the first station trait /proc/request_station_colors(atom/thing_to_color, pattern) for(var/datum/station_trait/trait in SSstation.station_traits) var/decal_color = trait.get_decal_color(thing_to_color, pattern || PATTERN_DEFAULT) @@ -72,6 +76,50 @@ return decal_color return null -///Return a color for the decals, if any +/// Return a color for the decals, if any /datum/station_trait/proc/get_decal_color(thing_to_color, pattern) return + +/// Return TRUE if we want to show a lobby button, by default we assume we don't want it after the round begins +/datum/station_trait/proc/can_display_lobby_button() + return sign_up_button && !SSticker.HasRoundStarted() + +/// Apply any additional handling we need to our lobby button +/datum/station_trait/proc/setup_lobby_button(atom/movable/screen/lobby/button/sign_up/lobby_button) + SHOULD_CALL_PARENT(TRUE) + lobby_buttons |= lobby_button + RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_lobby_button_update_icon)) + RegisterSignal(lobby_button, COMSIG_CLICK, PROC_REF(on_lobby_button_click)) + RegisterSignal(lobby_button, COMSIG_QDELETING, PROC_REF(on_lobby_button_destroyed)) + lobby_button.update_appearance(UPDATE_ICON) + +/// Called when our lobby button is clicked on +/datum/station_trait/proc/on_lobby_button_click(atom/movable/screen/lobby/button/sign_up/lobby_button, location, control, params, mob/dead/new_player/user) + SIGNAL_HANDLER + return + +/// Called when our lobby button tries to update its appearance +/datum/station_trait/proc/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, updates) + SIGNAL_HANDLER + return + +/// Don't hold references to deleted buttons +/datum/station_trait/proc/on_lobby_button_destroyed(atom/movable/screen/lobby/button/sign_up/lobby_button) + SIGNAL_HANDLER + lobby_buttons -= lobby_button + +/// Proc ran when round starts. Use this for roundstart effects. By default we clean up our buttons here. +/datum/station_trait/proc/on_round_start() + SIGNAL_HANDLER + destroy_lobby_buttons() + +/// Remove all of our active lobby buttons +/datum/station_trait/proc/destroy_lobby_buttons() + for (var/atom/movable/screen/button as anything in lobby_buttons) + var/mob/hud_owner = button.get_mob() + qdel(button) + if (QDELETED(hud_owner)) + continue + var/datum/hud/using_hud = hud_owner.hud_used + using_hud?.show_hud(using_hud?.hud_version) + lobby_buttons = list() diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm new file mode 100644 index 00000000000..12aa42332a9 --- /dev/null +++ b/code/datums/station_traits/job_traits.dm @@ -0,0 +1,95 @@ +/** + * A station trait which enables a temporary job + * Generally speaking these should always all be mutually exclusive, don't have too many at once + */ +/datum/station_trait/job + sign_up_button = TRUE + trait_flags = STATION_TRAIT_ABSTRACT + /// What tooltip to show on the button + var/button_desc = "Sign up to gain some kind of unusual job, not available in most rounds." + /// Type of job to enable + var/job_to_add = /datum/job/clown + /// Who signed up to this in the lobby + var/list/lobby_candidates + +/datum/station_trait/job/New() + . = ..() + blacklist += subtypesof(/datum/station_trait/job) - type // All but ourselves + RegisterSignal(SSdcs, COMSIG_GLOB_PRE_JOBS_ASSIGNED, PROC_REF(pre_jobs_assigned)) + +/datum/station_trait/job/setup_lobby_button(atom/movable/screen/lobby/button/sign_up/lobby_button) + RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_lobby_button_update_overlays)) + lobby_button.desc = button_desc + return ..() + +/datum/station_trait/job/on_lobby_button_click(atom/movable/screen/lobby/button/sign_up/lobby_button, location, control, params, mob/dead/new_player/user) + if (LAZYFIND(lobby_candidates, user)) + LAZYREMOVE(lobby_candidates, user) + else + LAZYADD(lobby_candidates, user) + +/datum/station_trait/job/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, updates) + if (LAZYFIND(lobby_candidates, lobby_button.get_mob())) + lobby_button.base_icon_state = "signup_on" + else + lobby_button.base_icon_state = "signup" + +/// Add an overlay based on whether you are actively signed up for this role +/datum/station_trait/job/proc/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + SIGNAL_HANDLER + overlays += LAZYFIND(lobby_candidates, lobby_button.get_mob()) ? "tick" : "cross" + +/// Called before we start assigning roles, assign ours first +/datum/station_trait/job/proc/pre_jobs_assigned() + SIGNAL_HANDLER + sign_up_button = FALSE + destroy_lobby_buttons() + for (var/mob/dead/new_player/signee as anything in lobby_candidates) + if (isnull(signee) || !signee.client || !signee.mind || signee.ready != PLAYER_READY_TO_PLAY) + LAZYREMOVE(lobby_candidates, signee) + if (!LAZYLEN(lobby_candidates)) + on_failed_assignment() + return // Nobody signed up :( + var/mob/dead/new_player/picked_player = pick(lobby_candidates) + picked_player.mind.assigned_role = new job_to_add() + lobby_candidates = null + +/// Called if we didn't assign a role before the round began, we add it to the latejoin menu instead +/datum/station_trait/job/proc/on_failed_assignment() + var/datum/job/our_job = job_to_add + our_job = SSjob.GetJob(our_job::title) + our_job.total_positions++ + + +/// Adds a gorilla to the cargo department, replacing the sloth and the mech +/datum/station_trait/job/cargorilla + name = "Cargo Gorilla" + button_desc = "Sign up to become the Cargo Gorilla, a peaceful shepherd of boxes." + weight = 1 + show_in_report = FALSE // Selective attention test. Did you spot the gorilla? + job_to_add = /datum/job/cargo_gorilla + trait_flags = STATION_TRAIT_MAP_UNRESTRICTED + +/datum/station_trait/job/cargorilla/New() + . = ..() + RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(replace_cargo)) + +/datum/station_trait/job/cargorilla/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += LAZYFIND(lobby_candidates, lobby_button.get_mob()) ? "gorilla_on" : "gorilla_off" + +/// Remove the cargo equipment and personnel that are being replaced by a gorilla. +/datum/station_trait/job/cargorilla/proc/replace_cargo(datum/source) + SIGNAL_HANDLER + var/mob/living/basic/sloth/cargo_sloth = GLOB.cargo_sloth + if(isnull(cargo_sloth)) + lobby_candidates = list() + destroy_lobby_buttons() // Sorry folks + sign_up_button = FALSE + return + + // hmm our sloth looks funny today + qdel(cargo_sloth) + // monkey carries the crates, the age of robot is over + if(GLOB.cargo_ripley) + qdel(GLOB.cargo_ripley) diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 87e521b9533..12f1c449e6e 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -147,7 +147,7 @@ /datum/station_trait/overflow_job_bureaucracy/proc/set_overflow_job_override(datum/source) SIGNAL_HANDLER - var/datum/job/picked_job = pick(SSjob.joinable_occupations) + var/datum/job/picked_job = pick(SSjob.get_valid_overflow_jobs()) chosen_job_name = lowertext(picked_job.title) // like Chief Engineers vs like chief engineers SSjob.set_overflow_role(picked_job.type) diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 96c33259152..adb5edde449 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -142,60 +142,6 @@ var/new_colored_assistant_type = pick(subtypesof(/datum/colored_assistant) - get_configured_colored_assistant_type()) GLOB.colored_assistant = new new_colored_assistant_type -/datum/station_trait/cargorilla - name = "Cargo Gorilla" - trait_type = STATION_TRAIT_NEUTRAL - weight = 1 - show_in_report = FALSE // Selective attention test. Did you spot the gorilla? - - /// The gorilla we created, we only hold this ref until the round starts. - var/mob/living/basic/gorilla/cargorilla/cargorilla - -/datum/station_trait/cargorilla/New() - . = ..() - RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(replace_cargo)) - -/// Replace some cargo equipment and 'personnel' with a gorilla. -/datum/station_trait/cargorilla/proc/replace_cargo(datum/source) - SIGNAL_HANDLER - - var/mob/living/basic/sloth/cargo_sloth = GLOB.cargo_sloth - if(isnull(cargo_sloth)) - return - - cargorilla = new(cargo_sloth.loc) - cargorilla.name = cargo_sloth.name - // We do a poll on roundstart, don't let ghosts in early - INVOKE_ASYNC(src, PROC_REF(make_id_for_gorilla)) - // hm our sloth looks funny today - qdel(cargo_sloth) - - // monkey carries the crates, the age of robot is over - if(GLOB.cargo_ripley) - qdel(GLOB.cargo_ripley) - -/// Makes an ID card for the gorilla -/datum/station_trait/cargorilla/proc/make_id_for_gorilla() - var/obj/item/card/id/advanced/cargo_gorilla/gorilla_id = new(cargorilla.loc) - gorilla_id.registered_name = cargorilla.name - gorilla_id.update_label() - - cargorilla.put_in_hands(gorilla_id, del_on_fail = TRUE) - -/datum/station_trait/cargorilla/on_round_start() - if(!cargorilla) - return - - addtimer(CALLBACK(src, PROC_REF(get_ghost_for_gorilla), cargorilla), 12 SECONDS) // give ghosts a bit of time to funnel in - cargorilla = null - -/// Get us a ghost for the gorilla. -/datum/station_trait/cargorilla/proc/get_ghost_for_gorilla(mob/living/basic/gorilla/cargorilla/gorilla) - if(QDELETED(gorilla)) - return - - gorilla.poll_for_gorilla() - /datum/station_trait/birthday name = "Employee Birthday" trait_type = STATION_TRAIT_NEUTRAL diff --git a/code/modules/client/preferences/middleware/jobs.dm b/code/modules/client/preferences/middleware/jobs.dm index a7261bbaf17..27c6b033f38 100644 --- a/code/modules/client/preferences/middleware/jobs.dm +++ b/code/modules/client/preferences/middleware/jobs.dm @@ -53,6 +53,8 @@ var/list/jobs = list() for (var/datum/job/job as anything in SSjob.joinable_occupations) + if (job.job_flags & JOB_LATEJOIN_ONLY) + continue var/datum/job_department/department_type = job.department_for_prefs || job.departments_list?[1] if (isnull(department_type)) stack_trace("[job] does not have a department set, yet is a joinable occupation!") @@ -118,6 +120,8 @@ var/list/job_required_experience = list() for (var/datum/job/job as anything in SSjob.all_occupations) + if (job.job_flags & JOB_LATEJOIN_ONLY) + continue var/required_playtime_remaining = job.required_playtime_remaining(user.client) if (required_playtime_remaining) job_required_experience[job.title] = list( diff --git a/code/modules/events/bureaucratic_error.dm b/code/modules/events/bureaucratic_error.dm index 578adc9be30..db6371d6498 100644 --- a/code/modules/events/bureaucratic_error.dm +++ b/code/modules/events/bureaucratic_error.dm @@ -13,21 +13,17 @@ priority_announce("A recent bureaucratic error in the Organic Resources Department may result in personnel shortages in some departments and redundant staffing in others.", "Paperwork Mishap Alert") /datum/round_event/bureaucratic_error/start() - var/list/jobs = SSjob.joinable_occupations.Copy() - /* - if(prob(33)) // Only allows latejoining as a single role. Add latejoin AI bluespace pods for fun later. + var/list/jobs = SSjob.get_valid_overflow_jobs() + /* NOVA EDIT REMOVAL START - No more locking off jobs + if(prob(33)) // Only allows latejoining as a single role. var/datum/job/overflow = pick_n_take(jobs) overflow.spawn_positions = -1 overflow.total_positions = -1 // Ensures infinite slots as this role. Assistant will still be open for those that cant play it. for(var/job in jobs) var/datum/job/current = job - if(!current.allow_bureaucratic_error) - continue current.total_positions = 0 - else // Adds/removes a random amount of job slots from all jobs. - */ // NOVA EDIT REMOVAL - no more locking off jobs + return + */ // NOVA EDIT REMOVAL END + // Adds/removes a random amount of job slots from all jobs. for(var/datum/job/current as anything in jobs) - if(!current.allow_bureaucratic_error) - continue - var/ran = rand(1,4) // NOVA EDIT - no more locking off jobs - current.total_positions = max(current.total_positions + ran, 0) + current.total_positions = max(current.total_positions + rand(1,4), 0) // NOVA EDIT - no more locking off jobs - ORIGINAL: current.total_positions = max(current.total_positions + rand(-2,4), 0) diff --git a/code/modules/jobs/job_types/cargo_gorilla.dm b/code/modules/jobs/job_types/cargo_gorilla.dm new file mode 100644 index 00000000000..96a79e3a4d3 --- /dev/null +++ b/code/modules/jobs/job_types/cargo_gorilla.dm @@ -0,0 +1,50 @@ +/datum/job/cargo_gorilla + title = JOB_CARGO_GORILLA + description = "Assist the supply department by moving freight and disposing of unwanted fruits." + department_head = list(JOB_QUARTERMASTER) + faction = FACTION_STATION + total_positions = 0 + spawn_positions = 0 + supervisors = SUPERVISOR_QM + spawn_type = /mob/living/basic/gorilla/cargorilla + config_tag = "CARGO_GORILLA" + random_spawns_possible = FALSE + display_order = JOB_DISPLAY_ORDER_CARGO_GORILLA + departments_list = list(/datum/job_department/cargo) + mail_goodies = list( + /obj/item/food/grown/banana = 1, + ) + rpg_title = "Beast of Burden" + allow_bureaucratic_error = FALSE + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS | JOB_HIDE_WHEN_EMPTY | JOB_LATEJOIN_ONLY + +/datum/job/cargo_gorilla/get_roundstart_spawn_point() + if (length(GLOB.gorilla_start)) + return pick(GLOB.gorilla_start) + return ..() + +/datum/job/cargo_gorilla/get_spawn_mob(client/player_client, atom/spawn_point) + if (!player_client) + return + var/mob/living/the_big_man = new spawn_type(get_turf(spawn_point)) + the_big_man.fully_replace_character_name(the_big_man.real_name, pick(GLOB.cargorilla_names)) + return the_big_man + +/datum/job/cargo_gorilla/after_spawn(mob/living/spawned, client/player_client) + . = ..() + // Gorilla with a wage, what's he buyin? + var/datum/bank_account/bank_account = new(spawned.real_name, src) + bank_account.payday(STARTING_PAYCHECKS, TRUE) + bank_account.replaceable = FALSE + spawned.add_mob_memory(/datum/memory/key/account, remembered_id = bank_account.account_id) + + var/obj/item/card/id/advanced/cargo_gorilla/gorilla_id = new(spawned.loc) + gorilla_id.registered_name = spawned.name + gorilla_id.update_label() + gorilla_id.registered_account = bank_account + bank_account.bank_cards += gorilla_id + spawned.put_in_hands(gorilla_id, del_on_fail = TRUE) + + to_chat(spawned, span_boldnotice("You are Cargorilla, a pacifist friend of the station and carrier of freight.")) + to_chat(spawned, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground.")) + spawned.mind.special_role = "Cargorilla" diff --git a/code/modules/mob/dead/new_player/latejoin_menu.dm b/code/modules/mob/dead/new_player/latejoin_menu.dm index 992f0513423..a2d68536974 100644 --- a/code/modules/mob/dead/new_player/latejoin_menu.dm +++ b/code/modules/mob/dead/new_player/latejoin_menu.dm @@ -80,6 +80,8 @@ GLOBAL_DATUM_INIT(latejoin_menu, /datum/latejoin_menu, new) ) if(job_availability != JOB_AVAILABLE) + if (job_datum.job_flags & JOB_HIDE_WHEN_EMPTY) + continue job_data["unavailable_reason"] = get_job_unavailable_error_message(job_availability, job_datum.title) if(job_datum.total_positions < 0) @@ -95,6 +97,7 @@ GLOBAL_DATUM_INIT(latejoin_menu, /datum/latejoin_menu, new) /datum/latejoin_menu/ui_static_data(mob/user) var/list/departments = list() + var/mob/dead/new_player/owner = user for(var/datum/job_department/department as anything in SSjob.joinable_departments) var/list/department_jobs = list() @@ -108,6 +111,8 @@ GLOBAL_DATUM_INIT(latejoin_menu, /datum/latejoin_menu, new) //Jobs under multiple departments should only be displayed if this is their first department or the command department if(LAZYLEN(job_datum.departments_list) > 1 && job_datum.departments_list[1] != department.type && !(job_datum.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)) continue + if((job_datum.job_flags & JOB_HIDE_WHEN_EMPTY) && owner.IsJobUnavailable(job_datum.title, latejoin = TRUE) != JOB_AVAILABLE) + continue var/list/job_data = list( "command" = !!(job_datum.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND), diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm index 1e17938c5fd..64cff6780df 100644 --- a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm @@ -158,31 +158,4 @@ ADD_TRAIT(src, TRAIT_PACIFISM, INNATE_TRAIT) AddComponent(/datum/component/crate_carrier) -/mob/living/basic/gorilla/cargorilla/death(gibbed) - var/datum/component/potential_component = GetComponent(/datum/component/ghost_direct_control) - if(!QDELETED(potential_component)) - qdel(potential_component) - return ..() - -/** - * Poll ghosts for control of the gorilla. Not added in init because we only want to poll when the round starts. - * Preferably in future we can replace this with a popup on the lobby to queue to become a gorilla. - */ -/mob/living/basic/gorilla/cargorilla/proc/poll_for_gorilla() - AddComponent(\ - /datum/component/ghost_direct_control,\ - poll_candidates = TRUE,\ - poll_length = 30 SECONDS,\ - role_name = "Cargorilla",\ - assumed_control_message = "You are Cargorilla, a pacifist friend of the station and carrier of freight.",\ - poll_ignore_key = POLL_IGNORE_CARGORILLA,\ - after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ - ) - -/// Called once a ghost assumes control -/mob/living/basic/gorilla/cargorilla/proc/became_player_controlled() - mind.set_assigned_role(SSjob.GetJobType(/datum/job/cargo_technician)) - mind.special_role = "Cargorilla" - to_chat(src, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground.")) - #undef GORILLA_HANDS_LAYER diff --git a/code/modules/mob/living/basic/pets/sloth.dm b/code/modules/mob/living/basic/pets/sloth.dm index 0b1546ccf93..125a3a7b97d 100644 --- a/code/modules/mob/living/basic/pets/sloth.dm +++ b/code/modules/mob/living/basic/pets/sloth.dm @@ -44,11 +44,12 @@ GLOBAL_DATUM(cargo_sloth, /mob/living/basic/sloth) AddElement(/datum/element/ai_retaliate) AddComponent(/datum/component/tree_climber) - if(!mapload || isnull(GLOB.cargo_sloth) || !is_station_level(z)) + if(!mapload || !isnull(GLOB.cargo_sloth) || !is_station_level(z)) return // If someone adds non-cargo sloths to maps we'll have a problem but we're fine for now GLOB.cargo_sloth = src + GLOB.gorilla_start += get_turf(src) /mob/living/basic/sloth/Destroy() if(GLOB.cargo_sloth == src) diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 757fe67d81e..22027a3cf8e 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -107,22 +107,22 @@ Notes: //Open a tooltip for user, at a location based on params //Theme is a CSS class in tooltip.html, by default this wrapper chooses a CSS class based on the user's UI_style (Midnight, Plasmafire, Retro, etc) //Includes sanity.checks -/proc/openToolTip(mob/user = null, atom/movable/tip_src = null, params = null,title = "",content = "",theme = "") - if(istype(user)) - if(user.client && user.client.tooltips) - var/ui_style = user.client?.prefs?.read_preference(/datum/preference/choiced/ui_style) - if(!theme && ui_style) - theme = lowertext(ui_style) - if(!theme) - theme = "default" - user.client.tooltips.show(tip_src, params,title,content,theme) +/proc/openToolTip(mob/user = null, atom/movable/tip_src = null, params = null, title = "", content = "", theme = "") + if(!istype(user) || !user.client?.tooltips) + return + var/ui_style = user.client?.prefs?.read_preference(/datum/preference/choiced/ui_style) + if(!theme && ui_style) + theme = lowertext(ui_style) + if(!theme) + theme = "default" + user.client.tooltips.show(tip_src, params, title, content, theme) //Arbitrarily close a user's tooltip //Includes sanity checks. /proc/closeToolTip(mob/user) - if(istype(user)) - if(user.client && user.client.tooltips) - user.client.tooltips.hide() + if(!istype(user) || !user.client?.tooltips) + return + user.client.tooltips.hide() diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4ff31a316c2ac3b3cb47c4130f1b79b1cb872547 GIT binary patch literal 676 zcmV;V0$crwP)so2LjlKQqylsf$?N9jrI%F|?iX6)8eQjN$U6DW&sE<`OdCSja5t#F$$z6j#Q3MF&dP~d8)hN59B z+-8ghh?grA%(S}_T_R%=#>o#S%OYbE#wmpT{Uht)F0ihjUs*3tAz%{5>85+{4*KZc z<}kNp`D#30b`FycA~%Pr&ZTOo1~6=e&v-7~e*Lh%KhJkAts=eH;Lw9pGM|{_;tI5; zz*m%qb@_aaTJCI3k5urIfQ%I!7BJSBDb9@4FTzRHq4LQMIT}>_{N-HzHpTvoHkM)^ z$Rk5qgX2Gvv;oK`8uPMa$P-nLH_u;|ib-BKR!tcWxv{5)f>UP9MT6!9OJg1xbSmv> z=mI%Y;A51YaNon5n#lsxpSqP!Qq@1u(sAaN{x}xT%c`oX74!@9tNM9}yjuhS0000< KMNUMnLSTaKX*)^) literal 0 HcmV?d00001 diff --git a/strings/names/cargorilla.txt b/strings/names/cargorilla.txt new file mode 100644 index 00000000000..ec135f5ca4d --- /dev/null +++ b/strings/names/cargorilla.txt @@ -0,0 +1,7 @@ +Cala +Cerchak +Citrus +Coco +Grodd +Paperwork +Winston diff --git a/tgstation.dme b/tgstation.dme index 8d3c963e83a..0cee7db9af6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1843,6 +1843,7 @@ #include "code\datums\skills\mining.dm" #include "code\datums\station_traits\_station_trait.dm" #include "code\datums\station_traits\admin_panel.dm" +#include "code\datums\station_traits\job_traits.dm" #include "code\datums\station_traits\negative_traits.dm" #include "code\datums\station_traits\neutral_traits.dm" #include "code\datums\station_traits\positive_traits.dm" @@ -4243,6 +4244,7 @@ #include "code\modules\jobs\job_types\bartender.dm" #include "code\modules\jobs\job_types\botanist.dm" #include "code\modules\jobs\job_types\captain.dm" +#include "code\modules\jobs\job_types\cargo_gorilla.dm" #include "code\modules\jobs\job_types\cargo_technician.dm" #include "code\modules\jobs\job_types\chemist.dm" #include "code\modules\jobs\job_types\chief_engineer.dm" diff --git a/tgui/packages/tgui/interfaces/common/JobToIcon.ts b/tgui/packages/tgui/interfaces/common/JobToIcon.ts index ec22869c9e5..527bcde4bbb 100644 --- a/tgui/packages/tgui/interfaces/common/JobToIcon.ts +++ b/tgui/packages/tgui/interfaces/common/JobToIcon.ts @@ -12,6 +12,7 @@ const BASEICONS = { Bitrunner: 'gamepad', Botanist: 'seedling', Captain: 'crown', + 'Cargo Gorilla': 'paw', 'Cargo Technician': 'box', 'CentCom Commander': 'star', 'CentCom Head Intern': 'pen-fancy', From 4ad3423baf123200de753e953723cceae96ba499 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 12:50:58 +0300 Subject: [PATCH 06/62] [MIRROR] Change how a station trait is declared abstract (#1636) Change how a station trait is declared abstract (#80268) Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Jacquerel Co-authored-by: Iajret --- code/__DEFINES/station.dm | 6 ++---- code/controllers/subsystem/processing/station.dm | 2 +- code/datums/station_traits/_station_trait.dm | 2 ++ code/datums/station_traits/job_traits.dm | 3 +-- code/datums/station_traits/negative_traits.dm | 11 ++++------- code/datums/station_traits/positive_traits.dm | 9 +-------- 6 files changed, 11 insertions(+), 22 deletions(-) diff --git a/code/__DEFINES/station.dm b/code/__DEFINES/station.dm index ddaa82daffc..63430b52c37 100644 --- a/code/__DEFINES/station.dm +++ b/code/__DEFINES/station.dm @@ -2,12 +2,10 @@ #define STATION_TRAIT_NEUTRAL 2 #define STATION_TRAIT_NEGATIVE 3 -/// For traits that shouldn't be selected, like abstract types (wow) -#define STATION_TRAIT_ABSTRACT (1<<0) /// Only run on planet stations -#define STATION_TRAIT_PLANETARY (1<<1) +#define STATION_TRAIT_PLANETARY (1<<0) /// Only run on space stations -#define STATION_TRAIT_SPACE_BOUND (1<<2) +#define STATION_TRAIT_SPACE_BOUND (1<<1) /// Not restricted by space or planet, can always just happen #define STATION_TRAIT_MAP_UNRESTRICTED STATION_TRAIT_PLANETARY | STATION_TRAIT_SPACE_BOUND diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 224d790faca..95a47a8de5c 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -58,7 +58,7 @@ PROCESSING_SUBSYSTEM_DEF(station) setup_trait(trait_typepath) continue - if(initial(trait_typepath.trait_flags) & STATION_TRAIT_ABSTRACT) + if(initial(trait_typepath.abstract_type) == trait_typepath) continue //Dont add abstract ones to it if(!(initial(trait_typepath.trait_flags) & STATION_TRAIT_PLANETARY) && SSmapping.is_planetary()) // we're on a planet but we can't do planet ;_; diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index 8e5b6310c71..8b2f7158b2e 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -33,6 +33,8 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) var/dynamic_threat_id /// If ran during dynamic, do we reduce the total threat? Will be overriden by config if set var/threat_reduction = 0 + /// Trait should not be instantiated in a round if its type matches this type + var/abstract_type = /datum/station_trait /datum/station_trait/New() . = ..() diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 12aa42332a9..300d6da8fa2 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -4,7 +4,7 @@ */ /datum/station_trait/job sign_up_button = TRUE - trait_flags = STATION_TRAIT_ABSTRACT + abstract_type = /datum/station_trait/job /// What tooltip to show on the button var/button_desc = "Sign up to gain some kind of unusual job, not available in most rounds." /// Type of job to enable @@ -68,7 +68,6 @@ weight = 1 show_in_report = FALSE // Selective attention test. Did you spot the gorilla? job_to_add = /datum/job/cargo_gorilla - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED /datum/station_trait/job/cargorilla/New() . = ..() diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 12f1c449e6e..5858f34aeab 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -278,7 +278,7 @@ name = "Random Event Modifier" report_message = "A random event has been modified this shift! Someone forgot to set this!" show_in_report = TRUE - trait_flags = STATION_TRAIT_ABSTRACT + abstract_type = /datum/station_trait/random_event_weight_modifier weight = 0 /// The path to the round_event_control that we modify. @@ -301,7 +301,6 @@ name = "Ionic Stormfront" report_message = "An ionic stormfront is passing over your station's system. Expect an increased likelihood of ion storms afflicting your station's silicon units." trait_type = STATION_TRAIT_NEGATIVE - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 3 event_control_path = /datum/round_event_control/ion_storm weight_multiplier = 2 @@ -310,7 +309,6 @@ name = "Radiation Stormfront" report_message = "A radioactive stormfront is passing through your station's system. Expect an increased likelihood of radiation storms passing over your station, as well the potential for multiple radiation storms to occur during your shift." trait_type = STATION_TRAIT_NEGATIVE - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 2 event_control_path = /datum/round_event_control/radiation_storm weight_multiplier = 1.5 @@ -320,7 +318,6 @@ name = "Dust Stormfront" report_message = "The space around your station is clouded by heavy pockets of space dust. Expect an increased likelyhood of space dust storms damaging the station hull." trait_type = STATION_TRAIT_NEGATIVE - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 2 event_control_path = /datum/round_event_control/meteor_wave/dust_storm weight_multiplier = 2 @@ -448,7 +445,7 @@ ///Station traits that influence the space background and apply some unique effects! /datum/station_trait/nebula name = "Nebula" - trait_flags = STATION_TRAIT_ABSTRACT + abstract_type = /datum/station_trait/nebula weight = 0 show_in_report = TRUE @@ -469,7 +466,7 @@ ///Station nebula that incur some sort of effect if no shielding is created /datum/station_trait/nebula/hostile - trait_flags = STATION_TRAIT_ABSTRACT + abstract_type = /datum/station_trait/nebula/hostile trait_processes = TRUE ///Intensity of the nebula @@ -699,7 +696,7 @@ ///Starts a storm on roundstart /datum/station_trait/storm - trait_flags = STATION_TRAIT_ABSTRACT + abstract_type = /datum/station_trait/storm var/datum/weather/storm_type /datum/station_trait/storm/on_round_start() diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index fb740dbaf0b..0f470dd893b 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -100,7 +100,7 @@ name = "deathrattled department" trait_type = STATION_TRAIT_POSITIVE show_in_report = TRUE - trait_flags = STATION_TRAIT_ABSTRACT + abstract_type = /datum/station_trait/deathrattle_department blacklist = list(/datum/station_trait/deathrattle_all) var/department_to_apply_to @@ -128,49 +128,42 @@ /datum/station_trait/deathrattle_department/service name = "Deathrattled Service" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_SERVICE department_name = "Service" /datum/station_trait/deathrattle_department/cargo name = "Deathrattled Cargo" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_CARGO department_name = "Cargo" /datum/station_trait/deathrattle_department/engineering name = "Deathrattled Engineering" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_ENGINEERING department_name = "Engineering" /datum/station_trait/deathrattle_department/command name = "Deathrattled Command" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_COMMAND department_name = "Command" /datum/station_trait/deathrattle_department/science name = "Deathrattled Science" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_SCIENCE department_name = "Science" /datum/station_trait/deathrattle_department/security name = "Deathrattled Security" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_SECURITY department_name = "Security" /datum/station_trait/deathrattle_department/medical name = "Deathrattled Medical" - trait_flags = STATION_TRAIT_MAP_UNRESTRICTED weight = 1 department_to_apply_to = DEPARTMENT_BITFLAG_MEDICAL department_name = "Medical" From 7a4320146030bac10a3db2b0b5e294cdb5895456 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:40:42 +0300 Subject: [PATCH 07/62] Fixes wylom bullets and hunter slugs, makes hunter slugs mine rocks as well (#1639) * whatever, that's fine * also lets you mine with hunter slugs because funny * limits hunter slug range * fixes compile * burning puddle of gasoline * Update modular_nova/modules/shotgunrebalance/code/shotgun.dm --------- Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../szot_dynamica/ammo/rifle.dm | 15 ++++++++++----- .../modules/shotgunrebalance/code/shotgun.dm | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/rifle.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/rifle.dm index e53c55c62e9..a96faa34fcd 100644 --- a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/rifle.dm +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/rifle.dm @@ -61,8 +61,13 @@ demolition_mod = 1.8 /// How much damage we add to things that are weak to this bullet var/anti_materiel_damage_addition = 30 - -/obj/projectile/bullet/p60strela/Initialize(mapload) - . = ..() - // We do 80 total damage to anything robotic, namely borgs, and robotic simplemobs - AddElement(/datum/element/bane, target_type = /mob/living, mob_biotypes = MOB_ROBOTIC, damage_multiplier = 0, added_damage = anti_materiel_damage_addition) + /// What biotype we look for + var/biotype_we_look_for = MOB_ROBOTIC + +/obj/projectile/bullet/p60strela/on_hit(atom/target, blocked, pierce_hit) + if(!isliving(target) || (damage > initial(damage))) + return ..() + var/mob/living/target_mob = target + if(target_mob.mob_biotypes & biotype_we_look_for) + damage += anti_materiel_damage_addition + return ..() diff --git a/modular_nova/modules/shotgunrebalance/code/shotgun.dm b/modular_nova/modules/shotgunrebalance/code/shotgun.dm index 1c96b0ebeb2..c66154f6ae5 100644 --- a/modular_nova/modules/shotgunrebalance/code/shotgun.dm +++ b/modular_nova/modules/shotgunrebalance/code/shotgun.dm @@ -247,6 +247,25 @@ /obj/projectile/bullet/shotgun_slug/hunter name = "12g hunter slug" damage = 20 + range = 12 + /// How much the damage is multiplied by when we hit a mob with the correct biotype + var/biotype_damage_multiplier = 5 + /// What biotype we look for + var/biotype_we_look_for = MOB_BEAST + +/obj/projectile/bullet/shotgun_slug/hunter/on_hit(atom/target, blocked, pierce_hit) + if(ismineralturf(target)) + var/turf/closed/mineral/mineral_turf = target + mineral_turf.gets_drilled(firer, FALSE) + if(range > 0) + return BULLET_ACT_FORCE_PIERCE + return ..() + if(!isliving(target) || (damage > initial(damage))) + return ..() + var/mob/living/target_mob = target + if(target_mob.mob_biotypes & biotype_we_look_for || istype(target_mob, /mob/living/simple_animal/hostile/megafauna)) + damage *= biotype_damage_multiplier + return ..() /obj/projectile/bullet/shotgun_slug/hunter/Initialize(mapload) . = ..() From df16e0e05febafbd48e2b524c33ccd9693a8d042 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:41:03 +0300 Subject: [PATCH 08/62] Fix ammo counter HUD not updating properly, and some hard dels (#1640) * Fix for flavortext * changelog fix * Revert "changelog fix" This reverts commit 16fc8a3501f041d592fd94575c406312ec4f7715. * Testing ammo counter harddel * Update gun_hud_component.dm * Update gun_hud_component.dm * Update gun_hud_component.dm * Update gun_hud_component.dm * Update gun_hud_component.dm * Can't rely on that. * Fixes ammo hud not updating for self-reloading energy weapons * Revert "Fix for flavortext" This reverts commit fcbe257ebacbaaf750b3d78037afb30b6217bcfc. * Whoops * Update gun_hud_component.dm * Update gun_hud_component.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/_onclick/hud/hud.dm | 1 + .../projectiles/guns/energy/recharge.dm | 4 ++++ modular_nova/modules/gunhud/code/gun_hud.dm | 4 ++++ .../modules/gunhud/code/gun_hud_component.dm | 19 ++++++++++++++++--- tgstation.dme | 1 + 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 modular_nova/master_files/code/modules/projectiles/guns/energy/recharge.dm diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index aceb360c953..f18f44c2ecb 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -270,6 +270,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( combo_display = null //NOVA EDIT START - SKYRAT HUD + ammo_counter = null wanted_lvl = null // NOVA EDIT END - SKYRAT HUD diff --git a/modular_nova/master_files/code/modules/projectiles/guns/energy/recharge.dm b/modular_nova/master_files/code/modules/projectiles/guns/energy/recharge.dm new file mode 100644 index 00000000000..26fdfce3037 --- /dev/null +++ b/modular_nova/master_files/code/modules/projectiles/guns/energy/recharge.dm @@ -0,0 +1,4 @@ +// self-reloading weapons need their ammo hud updated whenever reload() is called +/obj/item/gun/energy/recharge/reload() + . = ..() + SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) diff --git a/modular_nova/modules/gunhud/code/gun_hud.dm b/modular_nova/modules/gunhud/code/gun_hud.dm index e323026cb0b..b9f8886b572 100644 --- a/modular_nova/modules/gunhud/code/gun_hud.dm +++ b/modular_nova/modules/gunhud/code/gun_hud.dm @@ -33,6 +33,8 @@ var/oth_h ///This is the custom indicator sprite that will appear in the box at the bottom of the ammo hud, use this for something like semi/auto toggle on a gun. var/indicator + // is the ui on or off? + var/on ///This proc simply resets the hud to standard and removes it from the players visible hud. /atom/movable/screen/ammo_counter/proc/turn_off() @@ -45,10 +47,12 @@ oth_h = "" indicator = "" update_appearance() + on = FALSE ///This proc turns the hud on, but does not set it to anything other than the currently set values /atom/movable/screen/ammo_counter/proc/turn_on() invisibility = 0 + on = TRUE ///This is the main proc for altering the hud's appeareance, it controls the setting of the overlays. Use the OTH and below variables to set it accordingly. /atom/movable/screen/ammo_counter/proc/set_hud(_backing_color, _oth_o, _oth_t, _oth_h, _indicator, _oth_backing = "oth_light") diff --git a/modular_nova/modules/gunhud/code/gun_hud_component.dm b/modular_nova/modules/gunhud/code/gun_hud_component.dm index 54b8122fb10..33a2a686aab 100644 --- a/modular_nova/modules/gunhud/code/gun_hud_component.dm +++ b/modular_nova/modules/gunhud/code/gun_hud_component.dm @@ -1,5 +1,8 @@ /datum/component/ammo_hud + /// The ammo counter screen object itself var/atom/movable/screen/ammo_counter/hud + /// A weakref to the mob who currently owns the hud + var/datum/weakref/current_hud_owner /datum/component/ammo_hud/Initialize() . = ..() @@ -19,15 +22,17 @@ if(H.is_holding(parent)) if(H.hud_used) hud = H.hud_used.ammo_counter - RegisterSignal(user, COMSIG_QDELETING, PROC_REF(turn_off)) - turn_on() + if(!hud.on) // make sure we're not already turned on + current_hud_owner = WEAKREF(user) + RegisterSignal(user, COMSIG_QDELETING, PROC_REF(turn_off)) + turn_on() else - UnregisterSignal(user, COMSIG_QDELETING) turn_off() /datum/component/ammo_hud/proc/turn_on() SIGNAL_HANDLER + RegisterSignal(hud, COMSIG_QDELETING, PROC_REF(turn_off)) RegisterSignals(parent, list(COMSIG_PREQDELETED, COMSIG_ITEM_DROPPED), PROC_REF(turn_off)) RegisterSignals(parent, list(COMSIG_UPDATE_AMMO_HUD, COMSIG_GUN_CHAMBER_PROCESSED), PROC_REF(update_hud)) @@ -38,11 +43,19 @@ SIGNAL_HANDLER UnregisterSignal(parent, list(COMSIG_PREQDELETED, COMSIG_ITEM_DROPPED, COMSIG_UPDATE_AMMO_HUD, COMSIG_GUN_CHAMBER_PROCESSED)) + var/mob/living/carbon/human/current_owner = current_hud_owner?.resolve() + if(isnull(current_owner)) + current_hud_owner = null + else + UnregisterSignal(current_owner, COMSIG_QDELETING) if(hud) hud.turn_off() + UnregisterSignal(hud, COMSIG_QDELETING) hud = null + current_hud_owner = null + /// Returns get_ammo() with the appropriate args passed to it - some guns like the revolver and bow are special cases /datum/component/ammo_hud/proc/get_accurate_ammo_count(obj/item/gun/ballistic/the_gun) // fucking revolvers indeed - do not count empty or chambered rounds for the display HUD diff --git a/tgstation.dme b/tgstation.dme index 0cee7db9af6..a7477a8d0aa 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6495,6 +6495,7 @@ #include "modular_nova\master_files\code\modules\projectiles\guns\ballistic\bows\bow_quivers.dm" #include "modular_nova\master_files\code\modules\projectiles\guns\ballistic\bows\bow_types.dm" #include "modular_nova\master_files\code\modules\projectiles\guns\energy\kinetic_accelerator.dm" +#include "modular_nova\master_files\code\modules\projectiles\guns\energy\recharge.dm" #include "modular_nova\master_files\code\modules\reagents\bottle.dm" #include "modular_nova\master_files\code\modules\reagents\reagent_containers.dm" #include "modular_nova\master_files\code\modules\reagents\reagent_dispenser.dm" From bfd17dab929a6e30bab565e52c3b40bbc973cb5c Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:41:03 +0300 Subject: [PATCH 09/62] Automatic changelog for PR #1639 [ci skip] --- html/changelogs/AutoChangeLog-pr-1639.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1639.yml diff --git a/html/changelogs/AutoChangeLog-pr-1639.yml b/html/changelogs/AutoChangeLog-pr-1639.yml new file mode 100644 index 00000000000..a2f698d73ef --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1639.yml @@ -0,0 +1,5 @@ +author: "Paxilmaniac" +delete-after: True +changes: + - rscadd: "Hunter shotgun slugs can now mine mineral walls, shotgun mining time baby." + - bugfix: "Hunter slugs and .60 AMR ammo will now properly do extra damage to the biotypes they are strong against." \ No newline at end of file From 2e56f6d51ee418ceddd44903dd247dd08e55d1cd Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:41:20 +0300 Subject: [PATCH 10/62] Add: Forked Cybernetic Tongue & Lizard Voicebox (#1642) * Port cybernetic lizard tongue and lizard voicebox * Add food prefs to cybertongues * Change contraband var to contraband_nova * Add new sprite for lizard cybertongue Co-authored-by: Dani Glore --- .../research/designs/medical_designs.dm | 6 +++ .../modules/research/techweb/all_nodes.dm | 1 + .../modules/client/augment/organs.dm | 8 ++++ .../modules/modular_vending/code/wardrobes.dm | 4 ++ modular_nova/modules/organs/code/tongue.dm | 35 ++++++++++++++++++ .../modules/organs/icons/cyber_tongue.dmi | Bin 354 -> 956 bytes 6 files changed, 54 insertions(+) diff --git a/modular_nova/master_files/code/modules/research/designs/medical_designs.dm b/modular_nova/master_files/code/modules/research/designs/medical_designs.dm index 7798c4cd43a..c2beb545386 100644 --- a/modular_nova/master_files/code/modules/research/designs/medical_designs.dm +++ b/modular_nova/master_files/code/modules/research/designs/medical_designs.dm @@ -14,3 +14,9 @@ RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_1, ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/design/cybernetic_tongue/lizard + name = "Forked Cybernetic Tongue" + desc = "A forked cybernetic tongue." + id = "cybernetic_tongue_lizard" + build_path = /obj/item/organ/internal/tongue/lizard/cybernetic diff --git a/modular_nova/master_files/code/modules/research/techweb/all_nodes.dm b/modular_nova/master_files/code/modules/research/techweb/all_nodes.dm index 5ee944941e9..725f55c64ad 100644 --- a/modular_nova/master_files/code/modules/research/techweb/all_nodes.dm +++ b/modular_nova/master_files/code/modules/research/techweb/all_nodes.dm @@ -140,6 +140,7 @@ /datum/techweb_node/cyber_organs/New() design_ids += list( "cybernetic_tongue", + "cybernetic_tongue_lizard", ) return ..() diff --git a/modular_nova/modules/customization/modules/client/augment/organs.dm b/modular_nova/modules/customization/modules/client/augment/organs.dm index 0384c3668d9..3d5fac41c5a 100644 --- a/modular_nova/modules/customization/modules/client/augment/organs.dm +++ b/modular_nova/modules/customization/modules/client/augment/organs.dm @@ -99,10 +99,18 @@ name = "Robotic voicebox" path = /obj/item/organ/internal/tongue/robot +/datum/augment_item/organ/tongue/robo/forked + name = "Robotic lizard voicebox" + path = /obj/item/organ/internal/tongue/lizard/robot + /datum/augment_item/organ/tongue/cybernetic name = "Cybernetic tongue" path = /obj/item/organ/internal/tongue/cybernetic +/datum/augment_item/organ/tongue/cybernetic/forked + name = "Forked cybernetic tongue" + path = /obj/item/organ/internal/tongue/lizard/cybernetic + /datum/augment_item/organ/tongue/forked name = "Forked tongue" path = /obj/item/organ/internal/tongue/lizard diff --git a/modular_nova/modules/modular_vending/code/wardrobes.dm b/modular_nova/modules/modular_vending/code/wardrobes.dm index f9bda75749a..29275ff6044 100644 --- a/modular_nova/modules/modular_vending/code/wardrobes.dm +++ b/modular_nova/modules/modular_vending/code/wardrobes.dm @@ -74,6 +74,10 @@ /obj/item/storage/backpack/messenger/science/robo = 2, ) + contraband_nova = list( + /obj/item/organ/internal/tongue/lizard/robot = 2, + ) + /obj/machinery/vending/wardrobe/science_wardrobe products_nova = list( /obj/item/clothing/under/rank/rnd/scientist/nova/hlscience = 3, diff --git a/modular_nova/modules/organs/code/tongue.dm b/modular_nova/modules/organs/code/tongue.dm index c803bfc90c9..593211a652c 100644 --- a/modular_nova/modules/organs/code/tongue.dm +++ b/modular_nova/modules/organs/code/tongue.dm @@ -54,6 +54,39 @@ /obj/item/organ/internal/tongue/human say_mod = "says" +/obj/item/organ/internal/tongue/lizard/robot + name = "robotic lizard voicebox" + desc = "A lizard-like voice synthesizer that can interface with organic lifeforms." + organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES + icon_state = "tonguerobot" + say_mod = "hizzes" + attack_verb_continuous = list("beeps", "boops") + attack_verb_simple = list("beep", "boop") + modifies_speech = TRUE + taste_sensitivity = 25 // not as good as an organic tongue + liked_foodtypes = NONE + disliked_foodtypes = NONE + voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" + +/obj/item/organ/internal/tongue/lizard/robot/can_speak_language(language) + return TRUE // THE MAGIC OF ELECTRONICS + +/obj/item/organ/internal/tongue/lizard/robot/modify_speech(datum/source, list/speech_args) + . = ..() + speech_args[SPEECH_SPANS] |= SPAN_ROBOT + +/obj/item/organ/internal/tongue/lizard/cybernetic + name = "forked cybernetic tongue" + icon = 'modular_nova/modules/organs/icons/cyber_tongue.dmi' + icon_state = "cybertongue-lizard" + desc = "A fully-functional forked synthetic tongue, encased in soft silicone. Features include high-resolution vocals and taste receptors." + organ_flags = ORGAN_ROBOTIC | ORGAN_SYNTHETIC_FROM_SPECIES + // Not as good as organic tongues, not as bad as the robotic voicebox. + taste_sensitivity = 20 + liked_foodtypes = NONE + disliked_foodtypes = NONE + modifies_speech = TRUE + /obj/item/organ/internal/tongue/cybernetic name = "cybernetic tongue" icon = 'modular_nova/modules/organs/icons/cyber_tongue.dmi' @@ -63,6 +96,8 @@ say_mod = "says" // Not as good as organic tongues, not as bad as the robotic voicebox. taste_sensitivity = 20 + liked_foodtypes = NONE + disliked_foodtypes = NONE /obj/item/organ/internal/tongue/vox name = "vox tongue" diff --git a/modular_nova/modules/organs/icons/cyber_tongue.dmi b/modular_nova/modules/organs/icons/cyber_tongue.dmi index 961aeb14f265383a8a7816e0cb1dbd17c5490000..f2442fda53343f8edf47846c8ce8df25ce8cfb1c 100644 GIT binary patch delta 869 zcmV-r1DgEe0=x$$iBL{Q4GJ0x0000DNk~Le0000$0000W2nGNE0HU3Kga7~ldXZ~p ze`8ato0D0USd@ZGi?V{Np9|PM0JPaGs^Y*{?EnA*{YgYYRCt{2S3zhKK@|Nf6)Cn= zuoYX>*z}+nXi-5c6-*ICgrZOpdI$k4V)bAzie40N>P-;TLqx#_DGKot1g(vSp!Q${ zEvVQ;D_CiwXw`~yH8?FGd3CM;kfNTP?Q6-yz6VxwVrY>I6KoNf*)iu`6y4P~{rN3T zJPW55wlV^Mkp$gKs!m0)f;!r%D!yTDoDlmB2N>@o`^n)ETD#RpuOE+USH|;Ba3X@O z12&HBx6H!&O>KI>8mgOD6l6kFe*}@;AWFa}ejr^l>;8`JE+ztZ1%we5p{M}c8_uea z(r5Am!Tx3&auEPC2@w(O1VHcz8bAUv%|D3R7ZLUCA-a5*=t+(etrwURAUxnigrZH* z7`zo=Lp~`061bL4ePSe5Y2{!?pcr`YgW-^ZBlGpMQlF|JPqay^%R&8|f5<5tZX8p< z!hY0fth@c%r@9}w+zm9BAUwPnIaG|#Vf;ZaG zSc?z=FqZ@Rf=C(Iy#?xeCxsgt8Xyt^E}}ia)&V^DBZmTPK<&(W!P9u0=r>M4@F;_F zQQHnTP1-(}2wqfYoagLqe_-nXvj7}?Jz(Voj=5-pB0#VR8ci7efd3X*7uY)B#py5f ztR+w|$nD4-1tP>_FDdQ|Q1#B;l)WA$x_^}h!sp9g2Z#dM=fNU)r~kKI3hOqs21LkB zzon`-mneI@hn@dq@Bnw5G1GIp5Snk4TLN%^Rnrsg0e{tQ&Is vO6_y}69SY2R{+@rWWyCeHUZiA?*;e;H|boMOF~3i00000NkvXXu0mjfbK8S- delta 282 zcmdnP{)nl*Gr-TCmrII^fq{Y7)59eQNGpIa3p0>x3`su@q;vy(LR=3VI3OY*EHAHd zw_;vcRPy=wiT`(A`8H$Er@3O~)yb13Z{My;T%g(@BC9~ Date: Wed, 24 Jan 2024 14:41:26 +0300 Subject: [PATCH 11/62] Automatic changelog for PR #1640 [ci skip] --- html/changelogs/AutoChangeLog-pr-1640.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1640.yml diff --git a/html/changelogs/AutoChangeLog-pr-1640.yml b/html/changelogs/AutoChangeLog-pr-1640.yml new file mode 100644 index 00000000000..61b116b22e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1640.yml @@ -0,0 +1,4 @@ +author: "vinylspiders" +delete-after: True +changes: + - bugfix: "fixed ammo counter hud not updating for self-recharging energy weapons" \ No newline at end of file From 85cfbb79cbd45e1a5b25b65ae9af83db77b42f6f Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:42:02 +0300 Subject: [PATCH 12/62] Adds an Armored Jacket to Security (#1643) * wowza * Update modular_nova/modules/sec_haul/code/peacekeeper/peacekeeper_clothing.dm * yippee --------- Co-authored-by: Nerevar <12636964+Nerev4r@users.noreply.github.com> Co-authored-by: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com> --- .../icons/mob/clothing/suits/armor.dmi | Bin 28238 -> 12579 bytes .../icons/obj/clothing/suits/armor.dmi | Bin 5176 -> 5418 bytes .../loadout_items/loadout_datum_suit.dm | 9 ++++++++ .../modules/sec_haul/code/misc/vending.dm | 2 ++ .../code/peacekeeper/peacekeeper_clothing.dm | 20 ++++++++++++++++++ 5 files changed, 31 insertions(+) diff --git a/modular_nova/master_files/icons/mob/clothing/suits/armor.dmi b/modular_nova/master_files/icons/mob/clothing/suits/armor.dmi index 9d6de8b7cfc36def719b86466232e3c5dfa5187a..fc894643f6d881090ebfa851db4c4297f0133ba9 100644 GIT binary patch literal 12579 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 AfdBvi diff --git a/modular_nova/master_files/icons/obj/clothing/suits/armor.dmi b/modular_nova/master_files/icons/obj/clothing/suits/armor.dmi index 948d2d783ede78390eb56e8187b71028d750c3fc..bbc57992f1ebe078f536a375a79d05cdfbf95106 100644 GIT binary patch delta 4803 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 d!o|6V{{VYiEqD+#^fFDZ*Bkpc$}4# zO;5ux42I9`uZXrgV!)Nd&?=Y^6WVs+6q(d*vbIT-q#gWwQi@cNKry#}SbAQ6ytcAr zcg6j7$2L#fd_d=w(d?GpTwLbaS(QP?;QA`hB&u45DewUT#^+*@XQgs}nFChc+pY##hF5 z(9&A@iSv*Y1czEk(HbCsI&ubAqE50FL12Su(ebGURXJhYzw1&_2Da0{bdunTQzmdI z|1~A;0KO||cQ`K6OI4-2uKQ>m2iF;wKE&P!(|Iloq!V{oDiMt%!KiDc5uMUCP4G1! zwrRg-l(57Zrdfh-Ha6_6Pm&sj(G755<2I9c)k1S3t=jVrqH%wJrd+aOxB2`^KLB>b zmvE|NQL+F45BNz$K~#90?Olyu8}%8#P5Ppox+c@=w8dJ)m(X?5xvX2l985Bz`e-? zq~CX!@!3Fs_kM)7`2fJkA1ts~EH(>m09ZROUEA@UONcy8Nx%Jik^gCFX_?GG76Miz z5itLjn|_#3z{-^?e*{>$($L9bfgxZ|wU7>o7hkBoMoLE7(g)+>=@@@#`I4o$&IHip ze*EyI4C0?q0t7Sx8VsGRm_ZIJZGqVFPjvxlX&I}3;^OyVe6g1QC?Jgzkbd7iE0PG9 zkI(Dc9NIyNl;AFO=95SL})fXoYc zSX;3K7iDB76foWJxCNWVbW9U4RfT>|^pIuQ$+KCP9h*9i2$6SQXWbC8Y#b!q+c=uw8>z4BBLxwh-{BOl1cE5IiN;>n?X*kb`5kSS033&9$-#wT_!0*Lu z9{<~KOTcYYL}%#0;}0!gl|;ZDq=4A>!IvXo(FFmLvDhUS@Z=MJSd>J-a`O4#j(}B* zVg_-Fv07#(8^jWMbmO`#%3#a12@@tvm@r|&go)V<#RZK^Nzg%GXt=d2T2?pL!R8cy zE2oW#XJw03b`}%&c)T95&|zPW*XNR4K5veXjKl9$MN(AgN5*CCnw*urvSqV79d^6j z;k45VvQ}s3u3o)5H+wa$z>}Bn&CAR4=I7B0RDXezs43T5Ty=4R0;w8op0q{ zf7M@9Q~>;o6iR_wRP6FY_COxFR6>DUcCWQO4FaCFtaWn=95w`J09cTfm1WC+q75i5 zD_OTr2w1nSq^y(>pg@k~dw`rvAp|I@0v0GPeTffa=HnvE`WD5(X0sz~tOHpv1njG` zNC!$wO3HKrWw2@Fue$t7zQhh^Gyrz8S5n0#zK$cbNQ44mt?G@UU<&51F*07BY*;AU4YCAa0&;U ztblCcKsGHvlBQFLh$)a0&lEiST+VaP7CZwPL)9Ud3(`v|a>cu&3wTO@kl_Hsomm;!y&cGet51N>P#5 z zlFH6ymxUw(zyOgVv<13<0Sava2v{4FLY6BdKq?ag*bGutn8RGq5&~RMK)uKx6nJ4f z&Lolc7Y4EQ3JH+bl$MsR;esGQ8>FNFmu7%Vvmm|_X{T^g^8h=OU0Jvkafn@Bx(vCr zsOVwr;Eoe;4fx|h)(O%AL`Y&fxZ}#`wGeh8*>Zg6%~~MSO+RAD(0es^7ZS>0~@L;t2P91lkOz0NF=x{ zQC$N~O*I>@Ri1zTd8L+(2SdRiEIi9#D8z*;%gZaPsy5VZsH(zEstcU4+8mO@#-6K& zU#PFHsjhz^OoumrTCA$_M@6+-Hj;6Faf3e;4EY<1{bU?|-w5&=p&un6Qd-&6^e6af zsw|C=0%UlvZ+F)Q8(Qg~Q=Z?csVt zfzqN*UHO*P7NY_n=5K8+0RF8(NQE zOWXeZGAY1rw>fQgJ0}2!F@hYz2(_g}Rj^^=!PeG>P(v#@3qTYOJ`53<2w;m<@bX`H z0XA`)9&gq&w<+suYG5XYhUMR))G95Uf)G@HP%M+JWRXPPejLSU0izMH4fso-U>gy0 z!2AUQu;uvIRJT>va0=kytF;}q(9$^s28a})Ezk{UOkzPI2OPF7TcLh#-NFcfgJ0iP z-3Be4LyEf5uPBOtBPXD-5$3QEv;@5n6wrncc7bUEwz*1`NWkVTXaHD1)=*6VIKT>j zXz;6$LA8qNr_LsY0Bw+x0z#SrjhY2?C6W@S5Ri8Y1d6z-Nsc>3GbBF68A`_7+wG!#x{6ia|Xbh z#EEYdn=oO*gb5QSOqein<={bFs~1;)lviGT_0?Cn6Y|$ye`EWbZ@#(xjn`k}_E6|4 zM0ltVp98|-*wwcVWrz9-Lft_t=+QGSeyh8yli5SzJ9((UllKm-Alwn2ZYlKi z?1XmbUwha%{vmEA6IXWZdRKYxz4w%NcaaJ@yLRvH0tax#C@2K}kU^k;5zrog?&#=% zmVSC~Ur+zeojdz``e=p_-u3+V3biqZl+-~s&bIn>eI zT=O^9fIYoE{r&wty?bba7zcrDyjI<%mY0`9OI(|bc6Ud+x;x*0|NYMHE_^`kK^%XN z@PHRkU(IJwPcH)2Gm0yP0sPw;0zG{ne%J@-VdEOO z_(!`w0s+t(Lr{S_B}g6+pl?y*_;MZS>Fw*of2@Ecadnq)fEvTmC>-*CuHBt5h&y+8 zfgw@Cfx;LESOpzCe+ja?w+EXU#$ov4G(Z+1M3+{D*mmt7@SH7;)R9GsYG&!iR?1siO|^%GZ+W}A>HiB zP+{z9mI0i2M%O^M(P4&{NN|ZZQmyc z83xJXk~O9^@;`LwusHr=!w~lRhKBY7cUXpo4Bwlf@sAui5&;KrMJX8GcM!P2vTvAV zkSs1q`WGA}=RZJL;N3qoI5;$f&3=;q(MX`~NaWK`KaCuz3q+0@;v>h7?K>!bjvX5z zo{#ZS5HQNb1$V1|#C$Q0G;sK^5P<7}y#rJip#b@lJ2+ZbcNB651VAR?10z2mHo9+A z+o1SkT;k#gS$wvd`DpdPz+oH!KpzJK)dLdzw8fM~>_T}&5?+Zu*hYuYB35T>yq67?o4*g5R5T#)3#PKod_~$2J z44nAu*qL!S|UT>vvgF+QR-G!mzf$R1q8Oh5@3(gwjGnL+|}dKs-FqnH^ZVj1P*5+4`e zQ6sb8OCyHw;lu1iCW#qfNX!Pz{twjY4%8i>2@Z=fFw6=V7Gr>mOXB|zVE;e`$?v^9 z0d>;?7z=(z935IT)`KJYfZw02@@tv zm@r|&gb5SZ1mol5eDLHcu{w2?xXb_(&_sel6aoj%KpCC24oG4am|*!!I15kC-f2t{ tXF}r%&xXK++05UB2@@tvm@sj*@n6@KuS7 Date: Wed, 24 Jan 2024 14:42:30 +0300 Subject: [PATCH 13/62] Changes some equipment and items in the milsim bitrunner domain (#1644) * item changes * oops Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> --- _maps/safehouses/ancientmilsim_nova.dmm | 78 +++++++++---------- _maps/virtual_domains/ancientmilsim_nova.dmm | 8 +- .../virtual_domains/ancient_milsim/outfit.dm | 10 +-- 3 files changed, 45 insertions(+), 51 deletions(-) diff --git a/_maps/safehouses/ancientmilsim_nova.dmm b/_maps/safehouses/ancientmilsim_nova.dmm index 4b00bcb4370..015646aa8fb 100644 --- a/_maps/safehouses/ancientmilsim_nova.dmm +++ b/_maps/safehouses/ancientmilsim_nova.dmm @@ -4,33 +4,32 @@ /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/virtual_domain/safehouse) "b" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/structure/closet/crate/secure/weapon, -/obj/item/storage/pouch/medical/firstaid/stabilizer, -/obj/item/storage/pouch/ammo, -/obj/item/clothing/head/helmet/hecu, -/obj/item/clothing/suit/armor/vest/hecu, +/obj/item/storage/medkit/combat_surgeon/stocked, +/obj/item/storage/medkit/civil_defense/stocked, +/obj/item/clothing/glasses/hud/health/night, +/obj/item/storage/belt/military/assault, /obj/item/storage/box/survival/syndie, -/obj/item/gun/ballistic/automatic/sol_smg, +/obj/item/clothing/head/helmet/sf_peacekeeper, +/obj/item/clothing/suit/armor/sf_peacekeeper, /obj/item/knife/combat, -/obj/item/gun/ballistic/automatic/pistol/sol, /obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/storage/belt/military/assault/hecu, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, -/obj/item/stack/medical/mesh/bloody, -/obj/item/stack/medical/suture/bloody, -/obj/item/clothing/gloves/military, -/obj/item/clothing/glasses/hud/health/night, +/obj/item/gun/ballistic/automatic/sol_smg, +/obj/item/gun/ballistic/automatic/pistol/sol, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/sand/volcanic, /turf/open/floor/iron, /area/virtual_domain/safehouse) "e" = ( @@ -131,29 +130,27 @@ /turf/open/floor/iron, /area/virtual_domain/safehouse) "G" = ( -/obj/effect/turf_decal/stripes/end, -/obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/secure/weapon, -/obj/item/storage/pouch/medical/firstaid/stabilizer, -/obj/item/storage/pouch/ammo, -/obj/item/clothing/head/helmet/hecu, -/obj/item/clothing/suit/armor/vest/hecu, +/obj/item/storage/medkit/combat_surgeon/stocked, +/obj/item/storage/medkit/civil_defense/stocked, +/obj/item/clothing/glasses/hud/health/night, +/obj/item/storage/belt/military/assault, /obj/item/storage/box/survival/syndie, -/obj/item/gun/ballistic/automatic/sol_smg, +/obj/item/clothing/head/helmet/sf_peacekeeper, +/obj/item/clothing/suit/armor/sf_peacekeeper, /obj/item/knife/combat, -/obj/item/gun/ballistic/automatic/pistol/sol, /obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/storage/belt/military/assault/hecu, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, -/obj/item/stack/medical/mesh/bloody, -/obj/item/stack/medical/suture/bloody, -/obj/item/clothing/gloves/military, -/obj/item/clothing/glasses/hud/health/night, +/obj/item/gun/ballistic/automatic/sol_smg, +/obj/item/gun/ballistic/automatic/pistol/sol, +/obj/effect/turf_decal/stripes/end, +/obj/effect/turf_decal/sand/volcanic, /turf/open/floor/iron, /area/virtual_domain/safehouse) "H" = ( @@ -170,7 +167,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer{ - dir = 2; name = "hovercraft console"; icon_screen = "shuttle"; desc = "An armored hovercraft control computer. Doesn't work anymore... who would've thought." @@ -223,26 +219,24 @@ }, /obj/effect/turf_decal/sand/volcanic, /obj/structure/closet/crate/secure/weapon, -/obj/item/storage/pouch/medical/firstaid/loaded, -/obj/item/storage/pouch/medical/loaded, -/obj/item/clothing/head/helmet/hecu, -/obj/item/clothing/suit/armor/vest/hecu, +/obj/item/storage/medkit/combat_surgeon/stocked, +/obj/item/storage/medkit/civil_defense/stocked, +/obj/item/clothing/glasses/hud/health/night, +/obj/item/storage/belt/military/assault, /obj/item/storage/box/survival/syndie, -/obj/item/gun/ballistic/automatic/sol_smg, +/obj/item/clothing/head/helmet/sf_peacekeeper, +/obj/item/clothing/suit/armor/sf_peacekeeper, /obj/item/knife/combat, -/obj/item/gun/ballistic/automatic/pistol/sol, /obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol, -/obj/item/storage/belt/military/assault/hecu, +/obj/item/ammo_box/magazine/c35sol_pistol, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, /obj/item/ammo_box/magazine/c35sol_pistol/stendo, -/obj/item/stack/medical/mesh/bloody, -/obj/item/stack/medical/suture/bloody, -/obj/item/clothing/gloves/military, -/obj/item/clothing/glasses/hud/health/night, +/obj/item/gun/ballistic/automatic/sol_smg, +/obj/item/gun/ballistic/automatic/pistol/sol, /turf/open/floor/iron, /area/virtual_domain/safehouse) diff --git a/_maps/virtual_domains/ancientmilsim_nova.dmm b/_maps/virtual_domains/ancientmilsim_nova.dmm index 15a7366f67a..d380fd85b4c 100644 --- a/_maps/virtual_domains/ancientmilsim_nova.dmm +++ b/_maps/virtual_domains/ancientmilsim_nova.dmm @@ -195,7 +195,7 @@ /area/virtual_domain/ancient_milsim/snpc_garage) "gL" = ( /obj/structure/table, -/obj/item/grenade/chem_grenade/clf3, +/obj/item/grenade/stingbang, /turf/open/floor/plating, /area/virtual_domain/ancient_milsim/janitor) "gP" = ( @@ -1709,7 +1709,7 @@ /turf/open/floor/iron, /area/virtual_domain/ancient_milsim/snpc_cafe) "Vr" = ( -/obj/item/ammo_box/magazine/lanca, +/obj/item/ammo_box/magazine/wylom, /turf/open/misc/grass/planet/ancient_milsim, /area/virtual_domain/ancient_milsim/loot_camp) "VA" = ( @@ -4625,7 +4625,7 @@ Uz (49,1,1) = {" Uz Vl -Vr +Vl Vl Vl Vl @@ -4682,7 +4682,7 @@ Uz "} (50,1,1) = {" Uz -Vl +Vr wz Vl Vl diff --git a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/outfit.dm b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/outfit.dm index 1811071c5b0..e722c857862 100644 --- a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/outfit.dm +++ b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/outfit.dm @@ -1,13 +1,13 @@ /datum/outfit/solfed_bitrun name = "Bitrunning SolFed Marine" - uniform = /obj/item/clothing/under/rank/security/officer/hecu + uniform = /obj/item/clothing/under/sol_peacekeeper head = null - mask = /obj/item/clothing/mask/gas/hecu2 - gloves = /obj/item/clothing/gloves/combat + mask = /obj/item/clothing/mask/gas/sechailer/syndicate + gloves = /obj/item/clothing/gloves/frontier_colonist suit = null - shoes = /obj/item/clothing/shoes/combat - back = /obj/item/storage/backpack/ert/odst/hecu + shoes = /obj/item/clothing/shoes/jackboots/frontier_colonist + back = /obj/item/storage/backpack/industrial/frontier_colonist glasses = null ears = /obj/item/radio/headset/headset_faction/bowman id = /obj/item/card/id/advanced/solfed From 4e2def9021701629b53f452c4f51e6951db533e4 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:43:05 +0300 Subject: [PATCH 14/62] [MIRROR] spellcheck: iron sheets's what? (#1645) * spellcheck: iron sheets's what? (#81045) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: scriptis --- code/datums/components/material/material_container.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index f2b4ce9e923..fc7e42c6c43 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -459,15 +459,15 @@ if(MATERIAL_INSERT_ITEM_SUCCESS) //no problems full item was consumed if(chat_data["stack"]) var/sheets = min(count, amount) //minimum between sheets inserted vs sheets consumed(values differ for alloys) - to_chat(user, span_notice("[sheets > 1 ? sheets : ""] [item_name][sheets > 1 ? "'s" : ""] was consumed by [parent]")) + to_chat(user, span_notice("[sheets > 1 ? sheets : ""] [item_name][sheets > 1 ? "s were" : " was"] added to [parent].")) else - to_chat(user, span_notice("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] worth [amount] sheets of material was consumed by [parent]")) + to_chat(user, span_notice("[count > 1 ? count : ""] [item_name][count > 1 ? "s" : ""], worth [amount] sheets, [count > 1 ? "were" : "was"] added to [parent].")) if(MATERIAL_INSERT_ITEM_NO_SPACE) //no space - to_chat(user, span_warning("[parent] has no space to accept [item_name]")) + to_chat(user, span_warning("[parent] has no space to accept [item_name]!")) if(MATERIAL_INSERT_ITEM_NO_MATS) //no materials inside these items - to_chat(user, span_warning("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] has no materials to be accepted by [parent]")) + to_chat(user, span_warning("[item_name][count > 1 ? "s have" : " has"] no materials that can be accepted by [parent]!")) if(MATERIAL_INSERT_ITEM_FAILURE) //could be because the material type was not accepted or other stuff - to_chat(user, span_warning("[count > 1 ? count : ""] [item_name][count > 1 ? "'s" : ""] was rejected by [parent]")) + to_chat(user, span_warning("[item_name][count > 1 ? "s were" : " was"] rejected by [parent]!")) /// Proc that allows players to fill the parent with mats /datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user) From 91db588c6ed03369fe13422c771f4aef0eeb52a0 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:43:29 +0300 Subject: [PATCH 15/62] [MIRROR] check that the not-teleported atom is a mob before sending balloon alerts (#1646) * check that the not-teleported atom is a mob before sending balloon alerts (#81040) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/datums/helper_datums/teleport.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 6ea1a8121f0..0938ab66d1f 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -66,7 +66,8 @@ if(!forced) if(!check_teleport_valid(teleatom, destination, channel)) - teleatom.balloon_alert(teleatom, "something holds you back!") + if(ismob(teleatom)) + teleatom.balloon_alert(teleatom, "something holds you back!") return FALSE if(isobserver(teleatom)) From 63d2811a2a1ce3e9ead4f211c4dd7e38558aed33 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:43:57 +0300 Subject: [PATCH 16/62] [MIRROR] Fixing goldgrubs barfing what they shouldn't. (#1647) * Fixing goldgrubs barfing what they shouldn't. (#81042) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm | 2 +- modular_nova/modules/chat_colors/code/chat_color.dm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index d0355e906a7..f35f78ba80f 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -84,7 +84,7 @@ /mob/living/basic/mining/goldgrub/proc/barf_contents(gibbed) playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - for(var/obj/item/ore as anything in src) + for(var/obj/item/stack/ore/ore in src) ore.forceMove(loc) if(!gibbed) visible_message(span_danger("[src] spits out its consumed ores!")) diff --git a/modular_nova/modules/chat_colors/code/chat_color.dm b/modular_nova/modules/chat_colors/code/chat_color.dm index afbd6c61e6c..fc6f0347d8a 100644 --- a/modular_nova/modules/chat_colors/code/chat_color.dm +++ b/modular_nova/modules/chat_colors/code/chat_color.dm @@ -85,11 +85,11 @@ // There are special cases for greyscale and the red/blue/violet range if(hue == CM_COLOR_HUE_GREY) - processed_luminance = max(luminance, CM_COLOR_LUM_MIN_GREY) // greys have a higher floor on the allowed luminance value + processed_luminance = max(luminance, CM_COLOR_LUM_MIN_GREY) // greys have a lower floor on the allowed luminance value than the default else if(CM_COLOR_HUE_RANGE_UPPER > hue > CM_COLOR_HUE_RANGE_LOWER) - processed_luminance = min(luminance, CM_COLOR_LUM_MAX_DARK_RANGE) // colors in the deep reds/blues/violets range will have a slightly higher luminance floor than the rest + processed_luminance = min(luminance, CM_COLOR_LUM_MAX_DARK_RANGE) // colors in the deep reds/blues/violets range will have a slightly higher luminance floor than the default else - processed_luminance = max(luminance, CM_COLOR_LUM_MIN) // everything else gets the default + processed_luminance = max(luminance, CM_COLOR_LUM_MIN) // everything else gets the default floor // Convert it back to a hex return rgb(hue, saturation*sat_shift, processed_luminance*lum_shift, space = COLORSPACE_HSL) From e474ee02cadbace2e066fddbac6a25dd2ff3d3b8 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:44:40 +0300 Subject: [PATCH 17/62] Loadout additions: basic DeForest medkits, Kahraman frontier drip, heelys and more! (#1648) * Add two DeForest medkits, a bunch of frontier drip, wheelys and accessory holobadges to loadout * Add MODlink scryer to the pocket loadout slot list * Add gun cases to inhand loadout * Add the yellow gun case to the roster --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../loadout_items/loadout_datum_accessory.dm | 10 ++++++++++ .../loadouts/loadout_items/loadout_datum_heads.dm | 8 ++++++++ .../loadouts/loadout_items/loadout_datum_inhands.dm | 12 ++++++++++++ .../loadouts/loadout_items/loadout_datum_pocket.dm | 12 ++++++++++++ .../loadouts/loadout_items/loadout_datum_shoes.dm | 8 ++++++++ .../loadouts/loadout_items/loadout_datum_suit.dm | 12 ++++++++++++ .../loadout_items/under/loadout_datum_under.dm | 4 ++++ 7 files changed, 66 insertions(+) diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_accessory.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_accessory.dm index addd37faf58..05a1051ec6f 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_accessory.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_accessory.dm @@ -75,6 +75,16 @@ GLOBAL_LIST_INIT(loadout_accessory, generate_loadout_items(/datum/loadout_item/a item_path = /obj/item/clothing/accessory/armband/deputy/lopland restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) +/datum/loadout_item/accessory/holobadge + name = "Holobadge" + item_path = /obj/item/clothing/accessory/badge/holo + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_DETECTIVE, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + +/datum/loadout_item/accessory/holobadge/lanyard + name = "Holobadge with Lanyard" + item_path = /obj/item/clothing/accessory/badge/holo/cord + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_DETECTIVE, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + /datum/loadout_item/accessory/armband_security_deputy name = "Security Deputy Armband" item_path = /obj/item/clothing/accessory/armband/deputy diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_heads.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_heads.dm index 40ab19257ea..472325aa505 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_heads.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_heads.dm @@ -129,6 +129,14 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea name = "Mothic Softcap" item_path = /obj/item/clothing/head/mothcap +/datum/loadout_item/head/frontiercap + name = "Frontier Cap" + item_path = /obj/item/clothing/head/soft/frontier_colonist + +/datum/loadout_item/head/frontiercap/medic + name = "Frontier Medical Cap" + item_path = /obj/item/clothing/head/soft/frontier_colonist/medic + /* * FEDORAS */ diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_inhands.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_inhands.dm index 7d3cb8ff756..51ad30f2881 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_inhands.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_inhands.dm @@ -43,6 +43,18 @@ GLOBAL_LIST_INIT(loadout_inhand_items, generate_loadout_items(/datum/loadout_ite name = "Secure Briefcase" item_path = /obj/item/storage/briefcase/secure +/datum/loadout_item/inhand/guncase_large + name = "Black Empty Gun Case (Large)" + item_path = /obj/item/storage/toolbox/guncase/nova/empty + +/datum/loadout_item/inhand/guncase_large/yellow + name = "Yellow Empty Gun Case (Large)" + item_path = /obj/item/storage/toolbox/guncase/nova/carwo_large_case/empty + +/datum/loadout_item/inhand/guncase_small + name = "Black Empty Gun Case (Small)" + item_path = /obj/item/storage/toolbox/guncase/nova/pistol/empty + /datum/loadout_item/inhand/skub name = "Skub" item_path = /obj/item/skub diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm index da283f05b73..13cc3d67dd1 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm @@ -117,6 +117,10 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite name = "Personal AI Device" item_path = /obj/item/pai_card +/datum/loadout_item/pocket_items/link_scryer + name = "MODlink Scryer" + item_path = /obj/item/clothing/neck/link_scryer/loaded + /datum/loadout_item/pocket_items/cigarettes name = "Cigarette Pack" item_path = /obj/item/storage/fancy/cigarettes @@ -201,6 +205,14 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite name = "First-Aid Kit" item_path = /obj/item/storage/medkit/regular +/datum/loadout_item/pocket_items/deforest_cheesekit + name = "Civil Defense Medical Kit" + item_path = /obj/item/storage/medkit/civil_defense/stocked + +/datum/loadout_item/pocket_items/deforest_frontiermedkit + name = "Frontier Medical Kit" + item_path = /obj/item/storage/medkit/frontier/stocked + /datum/loadout_item/pocket_items/ingredients name = "Wildcard Ingredient Box" item_path = /obj/item/storage/box/ingredients/wildcard diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_shoes.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_shoes.dm index 71d665a904e..8f630213683 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_shoes.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_shoes.dm @@ -42,6 +42,10 @@ GLOBAL_LIST_INIT(loadout_shoes, generate_loadout_items(/datum/loadout_item/shoes name = "Recolorable Jackboots" item_path = /obj/item/clothing/shoes/jackboots/recolorable +/datum/loadout_item/shoes/jackboots/frontier + name = "Heavy Frontier Boots" + item_path = /obj/item/clothing/shoes/jackboots/frontier_colonist + /* * MISC BOOTS */ @@ -219,6 +223,10 @@ GLOBAL_LIST_INIT(loadout_shoes, generate_loadout_items(/datum/loadout_item/shoes name = "Roller Skates" item_path = /obj/item/clothing/shoes/wheelys/rollerskates +/datum/loadout_item/shoes/wheelys + name = "Wheely-Heels" + item_path = /obj/item/clothing/shoes/wheelys + /datum/loadout_item/shoes/jingleshoes name = "Jester Shoes" item_path = /obj/item/clothing/shoes/jester_shoes diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_suit.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_suit.dm index 928be30d9bd..f946036f48a 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_suit.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_suit.dm @@ -390,6 +390,10 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su name = "Blue Trenchcoat" item_path = /obj/item/clothing/suit/frenchtrench +/datum/loadout_item/suit/frontiertrench + name = "Frontier Trenchcoat" + item_path = /obj/item/clothing/suit/jacket/frontier_colonist + /datum/loadout_item/suit/cossak name = "Ukrainian Coat" item_path = /obj/item/clothing/suit/cossack @@ -430,6 +434,14 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su name = "Colourable Leather Jacket" item_path = /obj/item/clothing/suit/jacket/leather/colourable +/datum/loadout_item/suit/frontierjacket/short + name = "Frontier Jacket (Short)" + item_path = /obj/item/clothing/suit/jacket/frontier_colonist/short + +/datum/loadout_item/suit/frontierjacket/short/medical + name = "Frontier Medical Jacket (Short)" + item_path = /obj/item/clothing/suit/jacket/frontier_colonist/medical + /datum/loadout_item/suit/woolcoat name = "Leather Overcoat" item_path = /obj/item/clothing/suit/woolcoat diff --git a/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm b/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm index 1142a669374..f25ac98a40c 100644 --- a/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm +++ b/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm @@ -51,6 +51,10 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ item_path = /obj/item/clothing/under/color/jumpskirt/random additional_tooltip_contents = list(TOOLTIP_RANDOM_COLOR) +/datum/loadout_item/under/jumpsuit/frontier + name = "Frontier Jumpsuit" + item_path = /obj/item/clothing/under/frontier_colonist + /datum/loadout_item/under/jumpsuit/rainbow name = "Rainbow Jumpsuit" item_path = /obj/item/clothing/under/color/rainbow From 2f2a46663ab9ff4945a2bf256d153a3fb400a359 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:45:12 +0300 Subject: [PATCH 18/62] Fixes single missing frame from prefab shutter closing animation (#1649) this didnt need to be that hard thanks vsc Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> --- .../colony_fabricator/icons/doors/shutter.dmi | Bin 1058 -> 565 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_nova/modules/colony_fabricator/icons/doors/shutter.dmi b/modular_nova/modules/colony_fabricator/icons/doors/shutter.dmi index f29dc99899994317e3f5e738edbbd83aa4c69c7f..f3ab4f661bdbdfbc979ac9aec94d7d224547da3a 100644 GIT binary patch delta 393 zcmV;40e1eP2(<)|7&-(40000dRA+hs000q$pk z9v(8pV-@xQ0004WQchCr<&_5=VNkdT5SwR1SNniWv)P}>TW_rvcwYKAFR69N9ky_g@y_&IT=aE`l zF+#XJ7rJ-hwyYoB>zwK8YfB+6)b-vl#Z0}g%{zwN5N70SH1HpIL|2;^eBft)d>dmpxu9T@D&L(e>(#v%e5hzMw~HUj;983O%% z83H%hJb88yo;yU4lZPG{DuQlAQ1gC;yjMlTlZoa(odL`L)e(wY+4n(;nRs8++xQoQ nick@(B76)g!X6O*@4oN`w3{s;k<_ZZ00000NkvXXu0mjfpMt0{ delta 890 zcmdnWvWR1X1Sba@0|Ud=sw&TkK@01dy*ynULn`LHookpU>?qP!eo>}DE4Aarq!N)v zF^xqccNBb8yuNpM7qof=<~cNKG>GvrlxS>OxufyqW}|7G)AoqHsP+H#-`{J`repuE z@6NyXe&*dux$<)Pv*l&)_=9)s`)8VyWxe!l)@_HFdX=xyCiiYv8@yyaIAz=IJ@>c0 ztzY}U{%iDm*4c3-rC*D0Tq*OKU7EZ0{LAfE)t4D9eQWkUz1DC4*|g0MPd+~U@bmQb zhi~5OK56|?f6n~zW#7o#_+0$|@9ptNhF|P!e^}Vm{?l>&uD4Kj!Y|!_UxhF5 z`#j_O!Y{9`tj*xGy8c;0sr6(zh9&6ct{x&9R2frPE!Q_~mhww-?=U;5TE z!MzHv8P+tPaadAU{rz9jo}b==amRf{&i(eAsIH)3B(OGKjhW>M=K^DarSWPEFN7V^ z70xgPiKsiwZ#W>v5RfY2m9CJIRl&BRMb|+h zy1`-_LvlTLz%em}K3#_?TEQ1v>J;P|99vgrfaN-vf-j!Vjczd5#!#5Uxah*-35KB; z{~SH}QFE8k2{DCpFMcuH`n8T zulW7xWo5&%eRg$sKi`}Xu6+BIaF=$n)fZVuk@|WcR_%Mj*B3HP*eA7_VSIEV zy1@$U%11Ytj%;M@XpV096{6$I$sI7SYpG^3V;kdkhOa9lW(kQUSOAqj*e{(CacuJA z%a%LqjnwxsD?CbTe9hdU954Ui(WBlHwxU{w!Wel6nd|HV%g?46m(>2c+jMefg+x?} z+ybXshEOpvhq&I=A@dz38hvJ%*Oiv>~J#8!cnd!1MsXDRqA6$Js{fD6f$fpm@_vk-%y=7SO44BCnJYD@<);T3K0RSht Bi--UK From 8f42cd0935df977988053b9a97ddc73ce1d51847 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:45:30 +0300 Subject: [PATCH 19/62] Fixes stacks of sheets and tiles in the rapid construction fabricator (#1650) silly of you Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> --- .../code/construction/turfs.dm | 6 ------ .../code/design_datums/construction.dm | 18 +++++++++--------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/modular_nova/modules/colony_fabricator/code/construction/turfs.dm b/modular_nova/modules/colony_fabricator/code/construction/turfs.dm index c4865faa9ce..2257b6080a5 100644 --- a/modular_nova/modules/colony_fabricator/code/construction/turfs.dm +++ b/modular_nova/modules/colony_fabricator/code/construction/turfs.dm @@ -87,9 +87,6 @@ GLOBAL_LIST_INIT(plastic_wall_panel_recipes, list( merge_type = /obj/item/stack/tile/catwalk_tile/colony_lathe tile_reskin_types = null -/obj/item/stack/tile/catwalk_tile/colony_lathe/lathe_spawn - amount = 4 - /obj/item/stack/tile/iron/colony name = "prefab floor tiles" singular_name = "prefab floor tile" @@ -107,9 +104,6 @@ GLOBAL_LIST_INIT(plastic_wall_panel_recipes, list( /obj/item/stack/tile/iron/colony/white/bolts, ) -/obj/item/stack/tile/iron/colony/lathe_spawn - amount = 4 - // Grated floor tile, for seeing wires under /turf/open/floor/catwalk_floor/colony_fabricator diff --git a/modular_nova/modules/colony_fabricator/code/design_datums/construction.dm b/modular_nova/modules/colony_fabricator/code/design_datums/construction.dm index 7e5e608aca3..2359bd2b2e0 100644 --- a/modular_nova/modules/colony_fabricator/code/design_datums/construction.dm +++ b/modular_nova/modules/colony_fabricator/code/design_datums/construction.dm @@ -75,13 +75,13 @@ // Fancy floor tiles /datum/design/prefab_floor_tile - name = "Prefab Floor Tile x4" + name = "Prefab Floor Tile" id = "prefab_floor_tile" build_type = COLONY_FABRICATOR materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/iron = SHEET_MATERIAL_AMOUNT / 4, ) - build_path = /obj/item/stack/tile/iron/colony/lathe_spawn + build_path = /obj/item/stack/tile/iron/colony category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + FABRICATOR_SUBCATEGORY_STRUCTURES, @@ -91,13 +91,13 @@ // Fancy catwalk floor tiles /datum/design/prefab_cat_floor_tile - name = "Prefab Catwalk Plating x4" + name = "Prefab Catwalk Plating" id = "prefab_cat_floor_tile" build_type = COLONY_FABRICATOR materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT, + /datum/material/iron = SHEET_MATERIAL_AMOUNT / 4, ) - build_path = /obj/item/stack/tile/catwalk_tile/colony_lathe/lathe_spawn + build_path = /obj/item/stack/tile/catwalk_tile/colony_lathe category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_CONSTRUCTION + FABRICATOR_SUBCATEGORY_STRUCTURES, @@ -107,12 +107,12 @@ // Plastic wall panels, twice the wall for the same price in plastic, efficient! /datum/design/colony_fab_plastic_wall_panel - name = "Plastic Paneling x10" + name = "Plastic Paneling" id = "colony_fab_plastic_wall_panel" build_type = COLONY_FABRICATOR materials = list( - /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, - /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, ) build_path = /obj/item/stack/sheet/plastic_wall_panel/ten category = list( From 9b7d19e691c65bd53ce7502e121f3d687b696fe9 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:46:16 +0300 Subject: [PATCH 20/62] Various nerfs and tweaks and fixes to synth wounds (#1651) * awaaga * rebiew Co-authored-by: nikothedude <59709059+nikothedude@users.noreply.github.com> --- .../code/wounds/synth/blunt/robotic_blunt.dm | 7 ++++-- .../wounds/synth/blunt/robotic_blunt_T1.dm | 4 ++-- .../wounds/synth/blunt/robotic_blunt_T2.dm | 2 +- .../wounds/synth/blunt/robotic_blunt_T3.dm | 14 ++++++------ .../wounds/synth/blunt/secures_internals.dm | 4 ++-- .../code/wounds/synth/robotic_pierce.dm | 6 ++--- .../code/wounds/synth/robotic_slash.dm | 22 +++++++++---------- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt.dm b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt.dm index 66cbbb510b2..92f74d8b508 100644 --- a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt.dm +++ b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt.dm @@ -89,6 +89,8 @@ var/last_time_victim_moved = 0 processes = TRUE + /// Whenever an oscillation is triggered by movement, we wait 4 seconds before trying to do another. + COOLDOWN_DECLARE(movement_stagger_cooldown) /datum/wound_pregen_data/blunt_metal abstract = TRUE @@ -249,7 +251,7 @@ message += "!" self_message += "! You might be able to avoid an aftershock by stopping and waiting..." - if (isnull(attack_direction)) + if (isnull(attack_direction) && !isnull(attacking_item)) attack_direction = get_dir(victim, attacking_item) if (!isnull(attack_direction) && prob(stagger_score * stagger_movement_chance_ratio)) @@ -359,9 +361,10 @@ overall_mult *= get_buckled_movement_consequence_mult(victim.buckled) - if (limb.body_zone == BODY_ZONE_CHEST) + if (limb.body_zone == BODY_ZONE_CHEST && COOLDOWN_FINISHED(src, movement_stagger_cooldown)) var/stagger_chance = chest_movement_stagger_chance * overall_mult if (prob(stagger_chance)) + COOLDOWN_START(src, movement_stagger_cooldown, 4 SECONDS) stagger(base_movement_stagger_score, shake_duration = base_stagger_movement_shake_duration, from_movement = TRUE, shift = movement_stagger_shift, knockdown_ratio = stagger_aftershock_knockdown_movement_ratio) last_time_victim_moved = world.time diff --git a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T1.dm b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T1.dm index 9cd2ae0adbb..19541a4dc8e 100644 --- a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T1.dm +++ b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T1.dm @@ -43,7 +43,7 @@ var/delay_mult = 1 if (user == victim) - delay_mult *= 3 + delay_mult *= 2 if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) delay_mult *= 0.5 @@ -56,7 +56,7 @@ victim.visible_message(span_notice("[user] begins fastening the screws of [their_or_other] [limb.plaintext_zone]..."), \ span_notice("You begin fastening the screws of [your_or_other] [limb.plaintext_zone]...")) - if (!screwdriver_tool.use_tool(target = victim, user = user, delay = (10 SECONDS * delay_mult), volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + if (!screwdriver_tool.use_tool(target = victim, user = user, delay = (6 SECONDS * delay_mult), volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return victim.visible_message(span_green("[user] finishes fastening [their_or_other] [limb.plaintext_zone]!"), \ diff --git a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T2.dm b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T2.dm index 68bac1fe12b..1dd35f14bed 100644 --- a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T2.dm +++ b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T2.dm @@ -32,7 +32,7 @@ chest_attacked_stagger_chance_ratio = 5 chest_attacked_stagger_mult = 3 - chest_movement_stagger_chance = 3 + chest_movement_stagger_chance = 2 stagger_aftershock_knockdown_ratio = 0.3 stagger_aftershock_knockdown_movement_ratio = 0.2 diff --git a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm index 14f6f30a2af..e30c4aeed1c 100644 --- a/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm +++ b/modular_nova/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm @@ -38,7 +38,7 @@ status_effect_type = /datum/status_effect/wound/blunt/robotic/critical treatable_tools = list(TOOL_WELDER, TOOL_CROWBAR) - base_movement_stagger_score = 55 + base_movement_stagger_score = 50 base_aftershock_camera_shake_duration = 1.75 SECONDS base_aftershock_camera_shake_strength = 1 @@ -46,7 +46,7 @@ chest_attacked_stagger_chance_ratio = 6.5 chest_attacked_stagger_mult = 4 - chest_movement_stagger_chance = 14 + chest_movement_stagger_chance = 8 aftershock_stopped_moving_score_mult = 0.3 @@ -117,7 +117,7 @@ if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) delay_mult *= 0.75 - if(!do_after(user, 8 SECONDS, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + if(!do_after(user, 4 SECONDS, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return mold_metal(user) return TRUE @@ -213,7 +213,7 @@ if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) delay_mult *= 0.75 - if (!welder.use_tool(target = victim, user = user, delay = 10 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + if (!welder.use_tool(target = victim, user = user, delay = 7 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return TRUE var/wound_path = /datum/wound/burn/robotic/overheat/severe @@ -249,11 +249,11 @@ var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") var/your_or_other = (user == victim ? "your" : "[victim]'s") - var/base_time = 10 SECONDS + var/base_time = 7 SECONDS var/delay_mult = 1 var/knows_wires = FALSE if (victim == user) - delay_mult *= 3 // real slow + delay_mult *= 2 if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) delay_mult *= 0.75 if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) @@ -335,7 +335,7 @@ delay_mult /= treating_plunger.plunge_mod - if (!treating_plunger.use_tool(target = victim, user = user, delay = 8 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + if (!treating_plunger.use_tool(target = victim, user = user, delay = 6 SECONDS * delay_mult, volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return TRUE var/success_chance = 80 diff --git a/modular_nova/modules/medical/code/wounds/synth/blunt/secures_internals.dm b/modular_nova/modules/medical/code/wounds/synth/blunt/secures_internals.dm index d4483dafb0b..e15dd40ba1d 100644 --- a/modular_nova/modules/medical/code/wounds/synth/blunt/secures_internals.dm +++ b/modular_nova/modules/medical/code/wounds/synth/blunt/secures_internals.dm @@ -340,14 +340,14 @@ var/delay_mult = 1 if (victim == user) - delay_mult *= 0.5 + delay_mult *= 1.5 if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) delay_mult *= 0.75 user.visible_message(span_danger("[user] begins hastily applying [gel] to [victim]'s [limb.plaintext_zone]..."), span_warning("You begin hastily applying [gel] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone], disregarding the acidic effect it seems to have on the metal...")) - if (!do_after(user, (8 SECONDS * delay_mult), target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + if (!do_after(user, (6 SECONDS * delay_mult), target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return TRUE gel.use(1) diff --git a/modular_nova/modules/medical/code/wounds/synth/robotic_pierce.dm b/modular_nova/modules/medical/code/wounds/synth/robotic_pierce.dm index 09cc878afd4..501c0391063 100644 --- a/modular_nova/modules/medical/code/wounds/synth/robotic_pierce.dm +++ b/modular_nova/modules/medical/code/wounds/synth/robotic_pierce.dm @@ -41,7 +41,7 @@ process_shock_spark_count_max = 1 process_shock_spark_count_min = 1 - wirecut_repair_percent = 0.065 // not even faster at this point + wirecut_repair_percent = 0.104 wire_repair_percent = 0.026 initial_sparks_amount = 1 @@ -84,7 +84,7 @@ process_shock_spark_count_max = 2 process_shock_spark_count_min = 1 - wirecut_repair_percent = 0.068 + wirecut_repair_percent = 0.08 wire_repair_percent = 0.02 initial_sparks_amount = 3 @@ -129,7 +129,7 @@ process_shock_spark_count_max = 3 process_shock_spark_count_min = 2 - wirecut_repair_percent = 0.067 + wirecut_repair_percent = 0.072 wire_repair_percent = 0.018 initial_sparks_amount = 8 diff --git a/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm b/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm index f01e90a8b47..43e02113422 100644 --- a/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm +++ b/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm @@ -326,12 +326,12 @@ var/change = (processing_full_shock_threshold * wire_repair_percent) * ELECTRICAL_DAMAGE_SUTURE_WIRE_HEALING_AMOUNT_MULT var/delay_mult = 1 if (user == victim) - delay_mult *= 1.5 + delay_mult *= 1.4 if (is_suture) - delay_mult *= 2 + delay_mult *= 1.5 var/obj/item/stack/medical/suture/suture_item = suturing_item var/obj/item/stack/medical/suture/base_suture = /obj/item/stack/medical/suture - change += (suture_item.heal_brute - initial(base_suture.heal_brute)) + change = max(change - (suture_item.heal_brute - initial(base_suture.heal_brute)), 0.00001) // as this is the trauma treatment, there are less bonuses // if youre doing this, youre probably doing this on-the-spot @@ -342,7 +342,7 @@ if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) delay_mult *= 0.8 if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) - change *= 1.2 + change *= 1.5 var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") var/your_or_other = (user == victim ? "your" : "[victim]'s") @@ -385,17 +385,15 @@ var/change = (processing_full_shock_threshold * wirecut_repair_percent) var/delay_mult = 1 if (user == victim) - delay_mult *= 2.5 + delay_mult *= 2 if (is_retractor) delay_mult *= 2 - change *= 0.8 var/knows_wires = FALSE if (HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) - delay_mult *= 0.9 - change *= 1.7 + delay_mult *= 0.3 knows_wires = TRUE else if (HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) - change *= 1.35 + delay_mult *= 0.6 knows_wires = TRUE if (HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) if (knows_wires) @@ -403,7 +401,7 @@ else delay_mult *= 0.75 if (HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) - delay_mult *= 0.8 + change *= 1.5 var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") var/your_or_other = (user == victim ? "your" : "[victim]'s") @@ -518,7 +516,7 @@ process_shock_spark_count_max = 1 process_shock_spark_count_min = 1 - wirecut_repair_percent = 0.085 // not even faster at this point + wirecut_repair_percent = 0.14 wire_repair_percent = 0.035 initial_sparks_amount = 1 @@ -561,7 +559,7 @@ process_shock_spark_count_max = 2 process_shock_spark_count_min = 1 - wirecut_repair_percent = 0.1 + wirecut_repair_percent = 0.128 wire_repair_percent = 0.032 initial_sparks_amount = 3 From e14fa70f2d9e1e242b6c3c818965debfb4dcaa85 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:46:36 +0300 Subject: [PATCH 21/62] [MIRROR] Fixes features not updating when changing character slots (#1652) * Fixes features not updating when changing character slots (#81018) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../PreferencesMenu/preferences/features/base.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx index 9954fd2e925..0220607e65a 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx @@ -1,6 +1,12 @@ import { sortBy, sortStrings } from 'common/collections'; import { BooleanLike, classes } from 'common/react'; -import { ComponentType, createElement, ReactNode, useState } from 'react'; +import { + ComponentType, + createElement, + ReactNode, + useEffect, + useState, +} from 'react'; import { sendAct, useBackend } from '../../../../backend'; import { @@ -349,6 +355,10 @@ export const FeatureValueInput = (props: { createSetPreference(props.act, props.featureId)(newValue); }; + useEffect(() => { + setPredictedValue(props.value); + }, [data.active_slot]); + return ( { From f90c2f0e62ad5f06df7f0e3f875910a713ed29f4 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:47:18 +0300 Subject: [PATCH 22/62] [MODULAR] Remove implants from prisoner role on join (#1662) * Remove roundstart implants from prisoners on join * Don't remove NIFs * Apply suggestions from code review * Refactor to fully modular & include power cord as non-confiscatable * Rename master file override properly * Reorder dme include --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../master_files/code/modules/jobs/prisoner.dm | 15 +++++++++++++++ .../organs/internal/cyberimp/augments_internal.dm | 3 +++ .../modules/modular_implants/code/nifs.dm | 1 + .../modules/synths/code/bodyparts/power_cord.dm | 1 + tgstation.dme | 2 ++ 5 files changed, 22 insertions(+) create mode 100644 modular_nova/master_files/code/modules/jobs/prisoner.dm create mode 100644 modular_nova/master_files/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm diff --git a/modular_nova/master_files/code/modules/jobs/prisoner.dm b/modular_nova/master_files/code/modules/jobs/prisoner.dm new file mode 100644 index 00000000000..0b9a4c40bd2 --- /dev/null +++ b/modular_nova/master_files/code/modules/jobs/prisoner.dm @@ -0,0 +1,15 @@ +/datum/outfit/job/prisoner/post_equip(mob/living/carbon/human/new_prisoner, visualsOnly) + . = ..() + + var/implants_removed = 0 + var/implants_total = 0 + + for(var/obj/item/organ/internal/cyberimp/cybernetic in new_prisoner.organs) + implants_total += 1 + if (cybernetic.cannot_confiscate) + continue + QDEL_NULL(cybernetic) + implants_removed += 1 + + if (implants_removed >= 1) + to_chat(new_prisoner, span_warning("[(implants_total > implants_removed) ? "Some of your" : "Your"] implants have been confiscated as part of your sentence.")) diff --git a/modular_nova/master_files/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/modular_nova/master_files/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm new file mode 100644 index 00000000000..c17bd25da42 --- /dev/null +++ b/modular_nova/master_files/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -0,0 +1,3 @@ +/obj/item/organ/internal/cyberimp + /// If TRUE, this augment cannot be confiscated at roundstart for roles like prisoner, etc. + var/cannot_confiscate diff --git a/modular_nova/modules/modular_implants/code/nifs.dm b/modular_nova/modules/modular_implants/code/nifs.dm index 35177c8c0cf..8f8a0fcb99f 100644 --- a/modular_nova/modules/modular_implants/code/nifs.dm +++ b/modular_nova/modules/modular_implants/code/nifs.dm @@ -20,6 +20,7 @@ w_class = WEIGHT_CLASS_NORMAL slot = ORGAN_SLOT_BRAIN_NIF actions_types = list(/datum/action/item_action/nif/open_menu) + cannot_confiscate = TRUE //User Variables ///What user is currently linked with the NIF? diff --git a/modular_nova/modules/synths/code/bodyparts/power_cord.dm b/modular_nova/modules/synths/code/bodyparts/power_cord.dm index c8ff5bb58f6..cbe59f6b231 100644 --- a/modular_nova/modules/synths/code/bodyparts/power_cord.dm +++ b/modular_nova/modules/synths/code/bodyparts/power_cord.dm @@ -10,6 +10,7 @@ desc = "An internal power cord. Useful if you run on elecricity. Not so much otherwise." contents = newlist(/obj/item/apc_powercord) zone = "l_arm" + cannot_confiscate = TRUE /obj/item/apc_powercord name = "power cord" diff --git a/tgstation.dme b/tgstation.dme index a7477a8d0aa..3644a15554c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6395,6 +6395,7 @@ #include "modular_nova\master_files\code\modules\experisci\experiment.dm" #include "modular_nova\master_files\code\modules\food_and_drinks\recipes\food_mixtures.dm" #include "modular_nova\master_files\code\modules\jobs\off_duty_check.dm" +#include "modular_nova\master_files\code\modules\jobs\prisoner.dm" #include "modular_nova\master_files\code\modules\jobs\departments\departments.dm" #include "modular_nova\master_files\code\modules\jobs\job_types\_job.dm" #include "modular_nova\master_files\code\modules\jobs\job_types\_job_attire.dm" @@ -6522,6 +6523,7 @@ #include "modular_nova\master_files\code\modules\surgery\organs\external\wings\functional_wings.dm" #include "modular_nova\master_files\code\modules\surgery\organs\external\wings\wings.dm" #include "modular_nova\master_files\code\modules\surgery\organs\internal\appendix\_appendix.dm" +#include "modular_nova\master_files\code\modules\surgery\organs\internal\cyberimp\augments_internal.dm" #include "modular_nova\master_files\code\modules\vehicles\sealed.dm" #include "modular_nova\master_files\code\modules\vehicles\snowmobile.dm" #include "modular_nova\modules\access_helpers\accesshelpers.dm" From 41f8b1365a7186a1758f0711246d7cddef6c199b Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:52:30 +0300 Subject: [PATCH 23/62] Automatic changelog for PR #1642 [ci skip] --- html/changelogs/AutoChangeLog-pr-1642.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1642.yml diff --git a/html/changelogs/AutoChangeLog-pr-1642.yml b/html/changelogs/AutoChangeLog-pr-1642.yml new file mode 100644 index 00000000000..1dc35bf0057 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1642.yml @@ -0,0 +1,5 @@ +author: "A.C.M.O." +delete-after: True +changes: + - rscadd: "Added the forked cybernetic tongue to Augments+." + - rscadd: "Added the robotic lizard voicebox to Augments+ and the RoboDrobe vendor." \ No newline at end of file From 21a59411d99aca3b98a81b11fa079c2403857148 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 14:56:44 +0300 Subject: [PATCH 24/62] Automatic changelog for PR #1643 [ci skip] --- html/changelogs/AutoChangeLog-pr-1643.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1643.yml diff --git a/html/changelogs/AutoChangeLog-pr-1643.yml b/html/changelogs/AutoChangeLog-pr-1643.yml new file mode 100644 index 00000000000..f1e35b2a39c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1643.yml @@ -0,0 +1,4 @@ +author: "Nerev4r, Vol" +delete-after: True +changes: + - rscadd: "A new jacket option for Security has appeared in the loadout and their vendors." \ No newline at end of file From 62fd4c63050d1ac52040617fe42d9eecd8d77935 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:00:10 +0300 Subject: [PATCH 25/62] Automatic changelog for PR #1644 [ci skip] --- html/changelogs/AutoChangeLog-pr-1644.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1644.yml diff --git a/html/changelogs/AutoChangeLog-pr-1644.yml b/html/changelogs/AutoChangeLog-pr-1644.yml new file mode 100644 index 00000000000..858129f2b4c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1644.yml @@ -0,0 +1,6 @@ +author: "Paxilmaniac" +delete-after: True +changes: + - rscdel: "The milsim domain's one clf3 grenade is gone" + - balance: "The equipment that the bitrunners get in the milsim domain has been changed, mostly to use the new-ish solfed gear rather than HECU stuff" + - bugfix: "The wylom in the milsim domain on the bitrunner side has been given its actual magazines around it, rather than lanca magazines" \ No newline at end of file From de24eff7caf79e4aad3964299d341ae54be1ec62 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:02:18 +0300 Subject: [PATCH 26/62] Automatic changelog for PR #1645 [ci skip] --- html/changelogs/AutoChangeLog-pr-1645.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1645.yml diff --git a/html/changelogs/AutoChangeLog-pr-1645.yml b/html/changelogs/AutoChangeLog-pr-1645.yml new file mode 100644 index 00000000000..655e97c9414 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1645.yml @@ -0,0 +1,4 @@ +author: "scriptis" +delete-after: True +changes: + - spellcheck: "iron sheets's what?" \ No newline at end of file From eee5b092cb36618b280520b9a209d47719cf998b Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:03:53 +0300 Subject: [PATCH 27/62] Automatic changelog for PR #1647 [ci skip] --- html/changelogs/AutoChangeLog-pr-1647.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1647.yml diff --git a/html/changelogs/AutoChangeLog-pr-1647.yml b/html/changelogs/AutoChangeLog-pr-1647.yml new file mode 100644 index 00000000000..a2cda541775 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1647.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Goldgrubs should no longer spit out things that aren't ore (e.g. stasised mobs from the polymorph belt)." \ No newline at end of file From d8980619c1e3dce50472582b4e3fdde6f71203bd Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:03:54 +0300 Subject: [PATCH 28/62] Automatic changelog for PR #1648 [ci skip] --- html/changelogs/AutoChangeLog-pr-1648.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1648.yml diff --git a/html/changelogs/AutoChangeLog-pr-1648.yml b/html/changelogs/AutoChangeLog-pr-1648.yml new file mode 100644 index 00000000000..71dec84d9e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1648.yml @@ -0,0 +1,5 @@ +author: "yooriss" +delete-after: True +changes: + - rscadd: "A bunch of new stuff has been added to the loadout tab, such as civil defense & frontier medkits, a ton of Kahraman frontier clothing, wheely-heels and in-hand empty gun cases! MODlink scryers are also now available as a pocket slot option too, so you can video-call your friends with a scarf." + - bugfix: "Holobadges are now accessible from both the neck and accessory loadout slots (since they fit in both)." \ No newline at end of file From 72dc75c5311d1cb77cbbce62105f2b6a2ca790df Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:04:16 +0300 Subject: [PATCH 29/62] Automatic changelog for PR #1649 [ci skip] --- html/changelogs/AutoChangeLog-pr-1649.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1649.yml diff --git a/html/changelogs/AutoChangeLog-pr-1649.yml b/html/changelogs/AutoChangeLog-pr-1649.yml new file mode 100644 index 00000000000..2680c689757 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1649.yml @@ -0,0 +1,4 @@ +author: "Paxilmaniac" +delete-after: True +changes: + - image: "A single missing frame from the prefab shutter closing animation has been re-placed, meaning they wont vanish for 1/10 of a second whenever closing" \ No newline at end of file From 102809e8b46f1bde9c5da3eb84fc6fc2108cc39d Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:04:38 +0300 Subject: [PATCH 30/62] Automatic changelog for PR #1650 [ci skip] --- html/changelogs/AutoChangeLog-pr-1650.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1650.yml diff --git a/html/changelogs/AutoChangeLog-pr-1650.yml b/html/changelogs/AutoChangeLog-pr-1650.yml new file mode 100644 index 00000000000..286c758c0b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1650.yml @@ -0,0 +1,4 @@ +author: "Paxilmaniac" +delete-after: True +changes: + - bugfix: "Plastic wall panels, as well as prefab floor tiles have been fixed to not eat way more materials than they should be" \ No newline at end of file From 123ed6386223db29d2849baebe27faac84741b81 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:04:59 +0300 Subject: [PATCH 31/62] Automatic changelog for PR #1651 [ci skip] --- html/changelogs/AutoChangeLog-pr-1651.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1651.yml diff --git a/html/changelogs/AutoChangeLog-pr-1651.yml b/html/changelogs/AutoChangeLog-pr-1651.yml new file mode 100644 index 00000000000..843eb1bcfda --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1651.yml @@ -0,0 +1,7 @@ +author: "nikothedude" +delete-after: True +changes: + - bugfix: "Synth wound oscillations will no longer cause you to reel from impacts if there were no impacts" + - balance: "Synth blunt wounds are now faster to treat" + - balance: "Wirecutters on electrical damage have been streamlined and are always fix 4x more than suturing" + - balance: "Synth wound oscillations now have a minimum of 3 seconds between each oscillation" \ No newline at end of file From 858c528f024863df409429d56528fd1a26ec4864 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:05:17 +0300 Subject: [PATCH 32/62] Automatic changelog for PR #1652 [ci skip] --- html/changelogs/AutoChangeLog-pr-1652.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1652.yml diff --git a/html/changelogs/AutoChangeLog-pr-1652.yml b/html/changelogs/AutoChangeLog-pr-1652.yml new file mode 100644 index 00000000000..d5b014eb561 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1652.yml @@ -0,0 +1,4 @@ +author: "vinylspiders" +delete-after: True +changes: + - bugfix: "fixes features not updating when changing character slots" \ No newline at end of file From 81c335f7e9a4054b294765964ab3c1c54163704f Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 15:05:30 +0300 Subject: [PATCH 33/62] Automatic changelog for PR #1662 [ci skip] --- html/changelogs/AutoChangeLog-pr-1662.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1662.yml diff --git a/html/changelogs/AutoChangeLog-pr-1662.yml b/html/changelogs/AutoChangeLog-pr-1662.yml new file mode 100644 index 00000000000..e65c3c3972d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1662.yml @@ -0,0 +1,4 @@ +author: "yooriss" +delete-after: True +changes: + - bugfix: "Prisoners joining a round now properly have their implants removed as intended." \ No newline at end of file From b51115cf53f78205d59e43de956187ab4022088b Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 24 Jan 2024 13:44:30 +0000 Subject: [PATCH 34/62] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-1633.yml | 4 -- html/changelogs/AutoChangeLog-pr-1634.yml | 4 -- html/changelogs/AutoChangeLog-pr-1639.yml | 5 --- html/changelogs/AutoChangeLog-pr-1640.yml | 4 -- html/changelogs/AutoChangeLog-pr-1642.yml | 5 --- html/changelogs/AutoChangeLog-pr-1643.yml | 4 -- html/changelogs/AutoChangeLog-pr-1644.yml | 6 --- html/changelogs/AutoChangeLog-pr-1645.yml | 4 -- html/changelogs/AutoChangeLog-pr-1647.yml | 4 -- html/changelogs/AutoChangeLog-pr-1648.yml | 5 --- html/changelogs/AutoChangeLog-pr-1649.yml | 4 -- html/changelogs/AutoChangeLog-pr-1650.yml | 4 -- html/changelogs/AutoChangeLog-pr-1651.yml | 7 ---- html/changelogs/AutoChangeLog-pr-1652.yml | 4 -- html/changelogs/AutoChangeLog-pr-1662.yml | 4 -- html/changelogs/archive/2024-01.yml | 49 +++++++++++++++++++++++ 16 files changed, 49 insertions(+), 68 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-1633.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1634.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1639.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1640.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1642.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1643.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1644.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1645.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1647.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1648.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1649.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1650.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1651.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1652.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1662.yml diff --git a/html/changelogs/AutoChangeLog-pr-1633.yml b/html/changelogs/AutoChangeLog-pr-1633.yml deleted file mode 100644 index 45a47296ef7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1633.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - sound: "APCs actually play the tool sound when exposing their wires." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1634.yml b/html/changelogs/AutoChangeLog-pr-1634.yml deleted file mode 100644 index f07bd520614..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1634.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Lutowski" -delete-after: True -changes: - - rscadd: "Fluffier than ever before, moths can now have hair & facial hair." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1639.yml b/html/changelogs/AutoChangeLog-pr-1639.yml deleted file mode 100644 index a2f698d73ef..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1639.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Paxilmaniac" -delete-after: True -changes: - - rscadd: "Hunter shotgun slugs can now mine mineral walls, shotgun mining time baby." - - bugfix: "Hunter slugs and .60 AMR ammo will now properly do extra damage to the biotypes they are strong against." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1640.yml b/html/changelogs/AutoChangeLog-pr-1640.yml deleted file mode 100644 index 61b116b22e6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1640.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vinylspiders" -delete-after: True -changes: - - bugfix: "fixed ammo counter hud not updating for self-recharging energy weapons" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1642.yml b/html/changelogs/AutoChangeLog-pr-1642.yml deleted file mode 100644 index 1dc35bf0057..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1642.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "A.C.M.O." -delete-after: True -changes: - - rscadd: "Added the forked cybernetic tongue to Augments+." - - rscadd: "Added the robotic lizard voicebox to Augments+ and the RoboDrobe vendor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1643.yml b/html/changelogs/AutoChangeLog-pr-1643.yml deleted file mode 100644 index f1e35b2a39c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1643.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Nerev4r, Vol" -delete-after: True -changes: - - rscadd: "A new jacket option for Security has appeared in the loadout and their vendors." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1644.yml b/html/changelogs/AutoChangeLog-pr-1644.yml deleted file mode 100644 index 858129f2b4c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1644.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Paxilmaniac" -delete-after: True -changes: - - rscdel: "The milsim domain's one clf3 grenade is gone" - - balance: "The equipment that the bitrunners get in the milsim domain has been changed, mostly to use the new-ish solfed gear rather than HECU stuff" - - bugfix: "The wylom in the milsim domain on the bitrunner side has been given its actual magazines around it, rather than lanca magazines" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1645.yml b/html/changelogs/AutoChangeLog-pr-1645.yml deleted file mode 100644 index 655e97c9414..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1645.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "scriptis" -delete-after: True -changes: - - spellcheck: "iron sheets's what?" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1647.yml b/html/changelogs/AutoChangeLog-pr-1647.yml deleted file mode 100644 index a2cda541775..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1647.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Goldgrubs should no longer spit out things that aren't ore (e.g. stasised mobs from the polymorph belt)." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1648.yml b/html/changelogs/AutoChangeLog-pr-1648.yml deleted file mode 100644 index 71dec84d9e2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1648.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "yooriss" -delete-after: True -changes: - - rscadd: "A bunch of new stuff has been added to the loadout tab, such as civil defense & frontier medkits, a ton of Kahraman frontier clothing, wheely-heels and in-hand empty gun cases! MODlink scryers are also now available as a pocket slot option too, so you can video-call your friends with a scarf." - - bugfix: "Holobadges are now accessible from both the neck and accessory loadout slots (since they fit in both)." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1649.yml b/html/changelogs/AutoChangeLog-pr-1649.yml deleted file mode 100644 index 2680c689757..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1649.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Paxilmaniac" -delete-after: True -changes: - - image: "A single missing frame from the prefab shutter closing animation has been re-placed, meaning they wont vanish for 1/10 of a second whenever closing" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1650.yml b/html/changelogs/AutoChangeLog-pr-1650.yml deleted file mode 100644 index 286c758c0b8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1650.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Paxilmaniac" -delete-after: True -changes: - - bugfix: "Plastic wall panels, as well as prefab floor tiles have been fixed to not eat way more materials than they should be" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1651.yml b/html/changelogs/AutoChangeLog-pr-1651.yml deleted file mode 100644 index 843eb1bcfda..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1651.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - bugfix: "Synth wound oscillations will no longer cause you to reel from impacts if there were no impacts" - - balance: "Synth blunt wounds are now faster to treat" - - balance: "Wirecutters on electrical damage have been streamlined and are always fix 4x more than suturing" - - balance: "Synth wound oscillations now have a minimum of 3 seconds between each oscillation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1652.yml b/html/changelogs/AutoChangeLog-pr-1652.yml deleted file mode 100644 index d5b014eb561..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1652.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vinylspiders" -delete-after: True -changes: - - bugfix: "fixes features not updating when changing character slots" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1662.yml b/html/changelogs/AutoChangeLog-pr-1662.yml deleted file mode 100644 index e65c3c3972d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1662.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "yooriss" -delete-after: True -changes: - - bugfix: "Prisoners joining a round now properly have their implants removed as intended." \ No newline at end of file diff --git a/html/changelogs/archive/2024-01.yml b/html/changelogs/archive/2024-01.yml index b019e1f06d6..ba77039d595 100644 --- a/html/changelogs/archive/2024-01.yml +++ b/html/changelogs/archive/2024-01.yml @@ -820,3 +820,52 @@ been reduced to 15% from 50%. - rscadd: The messaging for both the hemophage and the victim during blood draining is now much more informative. +2024-01-24: + 00-Steven: + - sound: APCs actually play the tool sound when exposing their wires. + A.C.M.O.: + - rscadd: Added the forked cybernetic tongue to Augments+. + - rscadd: Added the robotic lizard voicebox to Augments+ and the RoboDrobe vendor. + Ghommie: + - bugfix: Goldgrubs should no longer spit out things that aren't ore (e.g. stasised + mobs from the polymorph belt). + Lutowski: + - rscadd: Fluffier than ever before, moths can now have hair & facial hair. + Nerev4r, Vol: + - rscadd: A new jacket option for Security has appeared in the loadout and their + vendors. + Paxilmaniac: + - image: A single missing frame from the prefab shutter closing animation has been + re-placed, meaning they wont vanish for 1/10 of a second whenever closing + - bugfix: Plastic wall panels, as well as prefab floor tiles have been fixed to + not eat way more materials than they should be + - rscdel: The milsim domain's one clf3 grenade is gone + - balance: The equipment that the bitrunners get in the milsim domain has been changed, + mostly to use the new-ish solfed gear rather than HECU stuff + - bugfix: The wylom in the milsim domain on the bitrunner side has been given its + actual magazines around it, rather than lanca magazines + - rscadd: Hunter shotgun slugs can now mine mineral walls, shotgun mining time baby. + - bugfix: Hunter slugs and .60 AMR ammo will now properly do extra damage to the + biotypes they are strong against. + nikothedude: + - bugfix: Synth wound oscillations will no longer cause you to reel from impacts + if there were no impacts + - balance: Synth blunt wounds are now faster to treat + - balance: Wirecutters on electrical damage have been streamlined and are always + fix 4x more than suturing + - balance: Synth wound oscillations now have a minimum of 3 seconds between each + oscillation + scriptis: + - spellcheck: iron sheets's what? + vinylspiders: + - bugfix: fixed ammo counter hud not updating for self-recharging energy weapons + - bugfix: fixes features not updating when changing character slots + yooriss: + - rscadd: A bunch of new stuff has been added to the loadout tab, such as civil + defense & frontier medkits, a ton of Kahraman frontier clothing, wheely-heels + and in-hand empty gun cases! MODlink scryers are also now available as a pocket + slot option too, so you can video-call your friends with a scarf. + - bugfix: Holobadges are now accessible from both the neck and accessory loadout + slots (since they fit in both). + - bugfix: Prisoners joining a round now properly have their implants removed as + intended. From c193556a4d22fd5e410271e7d5422f08e81947fe Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:35:41 +0300 Subject: [PATCH 35/62] [MIRROR] Bridge Assistant Station Trait (#1637) * [MIRROR] Bridge Assistant Station Trait (#80279) (#388) --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com> Co-authored-by: san7890 Co-authored-by: Iajret --- code/__DEFINES/atom_hud.dm | 1 + code/__DEFINES/jobs.dm | 94 +++++++++--------- code/__DEFINES/station.dm | 7 ++ code/__DEFINES/traits/declarations.dm | 7 +- code/_globalvars/traits/_traits.dm | 3 + code/_onclick/hud/new_player.dm | 5 +- code/controllers/subsystem/dynamic/dynamic.dm | 3 + .../subsystem/processing/station.dm | 4 + code/datums/components/twohanded.dm | 16 ++- code/datums/components/wall_mounted.dm | 2 + code/datums/id_trim/jobs.dm | 22 ++++ code/datums/records/manifest.dm | 33 ++++++ code/datums/station_traits/_station_trait.dm | 4 +- code/datums/station_traits/job_traits.dm | 87 ++++++++++++++-- code/datums/station_traits/neutral_traits.dm | 6 +- code/game/objects/items/storage/belt.dm | 20 ++++ code/modules/admin/verbs/list_exposer.dm | 7 +- code/modules/bitrunning/job.dm | 2 +- code/modules/clothing/outfits/plasmaman.dm | 7 ++ code/modules/jobs/job_types/prisoner.dm | 2 +- .../station_trait/bridge_assistant.dm | 80 +++++++++++++++ .../job_types/station_trait/cargo_gorilla.dm | 50 ++++++++++ code/modules/mob/dead/crew_manifest.dm | 38 ------- .../modules/mob/dead/new_player/new_player.dm | 6 +- code/modules/mob/dead/observer/observer.dm | 5 +- code/modules/mob/living/silicon/silicon.dm | 5 +- .../computers/item/role_tablet_presets.dm | 12 ++- .../modules/unit_tests/station_trait_tests.dm | 2 + icons/hud/lobby/signup_button.dmi | Bin 676 -> 668 bytes icons/mob/huds/hud.dmi | Bin 9853 -> 9978 bytes icons/obj/card.dmi | Bin 23297 -> 23327 bytes .../icons/hud/lobby/bottom_buttons.dmi | Bin 878 -> 0 bytes tgstation.dme | 3 +- .../tgui/interfaces/common/JobToIcon.ts | 1 + 34 files changed, 408 insertions(+), 126 deletions(-) create mode 100644 code/modules/jobs/job_types/station_trait/bridge_assistant.dm create mode 100644 code/modules/jobs/job_types/station_trait/cargo_gorilla.dm delete mode 100644 code/modules/mob/dead/crew_manifest.dm delete mode 100644 modular_nova/master_files/icons/hud/lobby/bottom_buttons.dmi diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index eeac64d4bca..ee2d52ce8b9 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -95,6 +95,7 @@ #define SECHUD_BARTENDER "hudbartender" #define SECHUD_BITRUNNER "hudbitrunner" #define SECHUD_BOTANIST "hudbotanist" +#define SECHUD_BRIDGE_ASSISTANT "hudbridgeassistant" #define SECHUD_CAPTAIN "hudcaptain" #define SECHUD_CARGO_TECHNICIAN "hudcargotechnician" #define SECHUD_CHAPLAIN "hudchaplain" diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 8fefe464d59..46d3f1a83e6 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -48,6 +48,7 @@ #define JOB_RESEARCH_DIRECTOR "Research Director" #define JOB_CHIEF_ENGINEER "Chief Engineer" #define JOB_CHIEF_MEDICAL_OFFICER "Chief Medical Officer" +#define JOB_BRIDGE_ASSISTANT "Bridge Assistant" //Silicon #define JOB_AI "AI" #define JOB_CYBORG "Cyborg" @@ -76,7 +77,7 @@ #define JOB_SCIENTIST "Scientist" #define JOB_ROBOTICIST "Roboticist" #define JOB_GENETICIST "Geneticist" -#define JOB_SCIENCE_GUARD "Science Guard" +#define JOB_SCIENCE_GUARD "Science Guard" // NOVA EDIT ADDITION //Supply #define JOB_QUARTERMASTER "Quartermaster" #define JOB_CARGO_TECHNICIAN "Cargo Technician" @@ -146,51 +147,52 @@ #define JOB_DISPLAY_ORDER_ASSISTANT 1 #define JOB_DISPLAY_ORDER_CAPTAIN 2 #define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 3 -#define JOB_DISPLAY_ORDER_BARTENDER 4 -#define JOB_DISPLAY_ORDER_BOTANIST 5 -#define JOB_DISPLAY_ORDER_COOK 6 -#define JOB_DISPLAY_ORDER_JANITOR 7 -#define JOB_DISPLAY_ORDER_CLOWN 8 -#define JOB_DISPLAY_ORDER_MIME 9 -#define JOB_DISPLAY_ORDER_CURATOR 10 -#define JOB_DISPLAY_ORDER_LAWYER 11 -#define JOB_DISPLAY_ORDER_CHAPLAIN 12 -#define JOB_DISPLAY_ORDER_PSYCHOLOGIST 13 -#define JOB_DISPLAY_ORDER_AI 14 -#define JOB_DISPLAY_ORDER_CYBORG 15 -#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 16 -#define JOB_DISPLAY_ORDER_STATION_ENGINEER 17 -#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 18 -#define JOB_DISPLAY_ORDER_QUARTERMASTER 19 -#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 20 -#define JOB_DISPLAY_ORDER_SHAFT_MINER 21 -#define JOB_DISPLAY_ORDER_BITRUNNER 22 -#define JOB_DISPLAY_ORDER_CARGO_GORILLA 23 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 24 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 25 -#define JOB_DISPLAY_ORDER_PARAMEDIC 26 -#define JOB_DISPLAY_ORDER_CHEMIST 27 -#define JOB_DISPLAY_ORDER_VIROLOGIST 28 -#define JOB_DISPLAY_ORDER_CORONER 29 -#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 30 -#define JOB_DISPLAY_ORDER_SCIENTIST 31 -#define JOB_DISPLAY_ORDER_ROBOTICIST 32 -#define JOB_DISPLAY_ORDER_GENETICIST 33 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 34 -#define JOB_DISPLAY_ORDER_WARDEN 35 -#define JOB_DISPLAY_ORDER_DETECTIVE 36 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 37 -#define JOB_DISPLAY_ORDER_PRISONER 38 -#define JOB_DISPLAY_ORDER_SECURITY_MEDIC 39 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 40 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 41 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_BLUESHIELD 42 //NOVA EDIT ADDITON -#define JOB_DISPLAY_ORDER_ORDERLY 43 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 44 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_BOUNCER 45 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 46 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 47 //NOVA EDIT ADDITION -#define JOB_DISPLAY_ORDER_EXP_CORPS 48 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_BRIDGE_ASSISTANT 4 +#define JOB_DISPLAY_ORDER_BARTENDER 5 +#define JOB_DISPLAY_ORDER_BOTANIST 6 +#define JOB_DISPLAY_ORDER_COOK 7 +#define JOB_DISPLAY_ORDER_JANITOR 8 +#define JOB_DISPLAY_ORDER_CLOWN 9 +#define JOB_DISPLAY_ORDER_MIME 10 +#define JOB_DISPLAY_ORDER_CURATOR 11 +#define JOB_DISPLAY_ORDER_LAWYER 12 +#define JOB_DISPLAY_ORDER_CHAPLAIN 13 +#define JOB_DISPLAY_ORDER_PSYCHOLOGIST 14 +#define JOB_DISPLAY_ORDER_AI 15 +#define JOB_DISPLAY_ORDER_CYBORG 16 +#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 17 +#define JOB_DISPLAY_ORDER_STATION_ENGINEER 18 +#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 19 +#define JOB_DISPLAY_ORDER_QUARTERMASTER 20 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 21 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 22 +#define JOB_DISPLAY_ORDER_BITRUNNER 23 +#define JOB_DISPLAY_ORDER_CARGO_GORILLA 24 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 25 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 26 +#define JOB_DISPLAY_ORDER_PARAMEDIC 27 +#define JOB_DISPLAY_ORDER_CHEMIST 28 +#define JOB_DISPLAY_ORDER_VIROLOGIST 29 +#define JOB_DISPLAY_ORDER_CORONER 30 +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 31 +#define JOB_DISPLAY_ORDER_SCIENTIST 32 +#define JOB_DISPLAY_ORDER_ROBOTICIST 33 +#define JOB_DISPLAY_ORDER_GENETICIST 34 +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 35 +#define JOB_DISPLAY_ORDER_WARDEN 36 +#define JOB_DISPLAY_ORDER_DETECTIVE 37 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 38 +#define JOB_DISPLAY_ORDER_PRISONER 39 +#define JOB_DISPLAY_ORDER_SECURITY_MEDIC 40 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 41 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 42 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_BLUESHIELD 43 //NOVA EDIT ADDITON +#define JOB_DISPLAY_ORDER_ORDERLY 44 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_SCIENCE_GUARD 45 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_BOUNCER 46 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_ENGINEER_GUARD 47 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_CUSTOMS_AGENT 48 //NOVA EDIT ADDITION +#define JOB_DISPLAY_ORDER_EXP_CORPS 49 //NOVA EDIT ADDITON #define DEPARTMENT_UNASSIGNED "No Department" diff --git a/code/__DEFINES/station.dm b/code/__DEFINES/station.dm index 63430b52c37..5a04961429f 100644 --- a/code/__DEFINES/station.dm +++ b/code/__DEFINES/station.dm @@ -2,6 +2,13 @@ #define STATION_TRAIT_NEUTRAL 2 #define STATION_TRAIT_NEGATIVE 3 +///Defines for the cost of different station traits. This one is the default. +#define STATION_TRAIT_COST_FULL 1 +///Cost for smaller traits that could fly under the radar, and are only minorly negative/positive if not neutral. +#define STATION_TRAIT_COST_LOW 0.5 +///Cost for very little, and mainly neutral traits that hardly amount to anything really that interesting. +#define STATION_TRAIT_COST_MINIMAL 0.3 + /// Only run on planet stations #define STATION_TRAIT_PLANETARY (1<<0) /// Only run on space stations diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 8f7fab41367..b79fe449c16 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -4,8 +4,8 @@ // BEGIN TRAIT DEFINES /* - *Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. - */ +Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. +*/ //mob traits /// Forces the user to stay unconscious. @@ -829,6 +829,9 @@ /// Similar trait given to temporary bodies inhabited by players #define TRAIT_TEMPORARY_BODY "temporary_body" +/// Trait given to objects with the wallmounted component +#define TRAIT_WALLMOUNTED "wallmounted" + /// Trait given to mechs that can have orebox functionality on movement #define TRAIT_OREBOX_FUNCTIONAL "orebox_functional" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 41169dfc600..6435db5ff3a 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -99,6 +99,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( /datum/wound = list( "TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED, ), + /obj = list( + "TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED, + ), /mob = list( "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 406dbc1c73a..9cdf936fde0 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -39,7 +39,7 @@ var/y_offset = 397 var/y_button_offset = 27 for (var/datum/station_trait/trait as anything in GLOB.lobby_station_traits) - if (!trait.can_display_lobby_button()) + if (!trait.can_display_lobby_button(mymob.client)) continue var/atom/movable/screen/lobby/button/sign_up/sign_up_button = new(our_hud = src) sign_up_button.SlowInit() @@ -111,7 +111,7 @@ return flick("[base_icon_state]_pressed", src) update_appearance(UPDATE_ICON) - SEND_SOUND(hud.mymob, sound('modular_nova/master_files/sound/effects/save.ogg')) //NOVA EDIT ADDITION + SEND_SOUND(hud.mymob, sound('modular_nova/master_files/sound/effects/save.ogg')) // NOVA EDIT ADDITION return TRUE /atom/movable/screen/lobby/button/MouseEntered(location,control,params) @@ -280,6 +280,7 @@ to_chat(new_player, span_warning("Opening emergency fallback late join menu! If THIS doesn't show, ahelp immediately!")) GLOB.latejoin_menu.fallback_ui(new_player) + /atom/movable/screen/lobby/button/join/proc/show_join_button() SIGNAL_HANDLER set_button_status(TRUE) diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index fd6a5ecf9a5..9c84fcc2c1e 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -935,6 +935,9 @@ SUBSYSTEM_DEF(dynamic) stack_trace("Invalid dynamic configuration variable [variable] in [ruleset.ruletype] [ruleset.name].") continue ruleset.vars[variable] = rule_conf[variable] + ruleset.restricted_roles |= SSstation.antag_restricted_roles + if(length(ruleset.protected_roles)) //if we care to protect any role, we should protect station trait roles too + ruleset.protected_roles |= SSstation.antag_protected_roles if(CONFIG_GET(flag/protect_roles_from_antagonist)) ruleset.restricted_roles |= ruleset.protected_roles if(CONFIG_GET(flag/protect_assistant_from_antagonist)) diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 95a47a8de5c..00c9d14a845 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -11,6 +11,10 @@ PROCESSING_SUBSYSTEM_DEF(station) var/list/selectable_traits_by_types = list(STATION_TRAIT_POSITIVE = list(), STATION_TRAIT_NEUTRAL = list(), STATION_TRAIT_NEGATIVE = list()) ///Currently active announcer. Starts as a type but gets initialized after traits are selected var/datum/centcom_announcer/announcer = /datum/centcom_announcer/default + ///A list of trait roles that should be protected from antag + var/list/antag_protected_roles = list() + ///A list of trait roles that should never be able to roll antag + var/list/antag_restricted_roles = list() /datum/controller/subsystem/processing/station/Initialize() diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 6d033469cc2..464f1a58a07 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -173,17 +173,25 @@ /datum/component/two_handed/proc/wield(mob/living/carbon/user) if(wielded) return + var/atom/atom_parent = parent + if(HAS_TRAIT(user, TRAIT_NO_TWOHANDING)) + if(require_twohands) + atom_parent.balloon_alert(user, "too weak to wield!") + user.dropItemToGround(parent, force = TRUE) + else + atom_parent.balloon_alert(user, "too weak to wield with both hands!") + return if(user.get_inactive_held_item()) if(require_twohands) - to_chat(user, span_notice("[parent] is too cumbersome to carry in one hand!")) - user.dropItemToGround(parent, force=TRUE) + atom_parent.balloon_alert(user, "can't carry in one hand!") + user.dropItemToGround(parent, force = TRUE) else - to_chat(user, span_warning("You need your other hand to be empty!")) + atom_parent.balloon_alert(user, "holding something in other hand!") return if(user.usable_hands < 2) if(require_twohands) user.dropItemToGround(parent, force=TRUE) - to_chat(user, span_warning("You don't have enough intact hands.")) + atom_parent.balloon_alert(user, "not enough hands!") return // wield update status diff --git a/code/datums/components/wall_mounted.dm b/code/datums/components/wall_mounted.dm index 62af35dc974..a10fb246833 100644 --- a/code/datums/components/wall_mounted.dm +++ b/code/datums/components/wall_mounted.dm @@ -16,12 +16,14 @@ on_drop = on_drop_callback /datum/component/wall_mounted/RegisterWithParent() + ADD_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src)) RegisterSignal(hanging_wall_turf, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(hanging_wall_turf, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changing)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_linked_destroyed)) /datum/component/wall_mounted/UnregisterFromParent() + REMOVE_TRAIT(parent, TRAIT_WALLMOUNTED, REF(src)) UnregisterSignal(hanging_wall_turf, list(COMSIG_ATOM_EXAMINE, COMSIG_TURF_CHANGE)) UnregisterSignal(parent, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED)) hanging_wall_turf = null diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 72a23adf768..ea46cc91319 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -203,6 +203,28 @@ ) job = /datum/job/botanist +/datum/id_trim/job/bridge_assistant + assignment = "Bridge Assistant" + trim_state = "trim_assistant" + department_color = COLOR_COMMAND_BLUE + subdepartment_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_BRIDGE_ASSISTANT + minimal_access = list( + ACCESS_COMMAND, + ACCESS_EVA, + ACCESS_GATEWAY, + ACCESS_MAINT_TUNNELS, + ACCESS_RC_ANNOUNCE, + ACCESS_TELEPORTER, + ACCESS_WEAPONS, + ) + extra_access = list() + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ) + job = /datum/job/bridge_assistant + /datum/id_trim/job/captain assignment = "Captain" intern_alt_name = "Captain-in-Training" diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index febd6374f7f..1ba59b72d86 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -174,3 +174,36 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) target.rank = assignment target.trim = trim + +/datum/manifest/ui_state(mob/user) + return GLOB.always_state + +/datum/manifest/ui_status(mob/user, datum/ui_state/state) + return (isnewplayer(user) || isobserver(user) || isAI(user) || ispAI(user) || user.client?.holder) ? UI_INTERACTIVE : UI_CLOSE + +/datum/manifest/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "CrewManifest") + ui.open() + +/datum/manifest/ui_data(mob/user) + var/list/positions = list() + for(var/datum/job_department/department as anything in SSjob.joinable_departments) + var/open = 0 + var/list/exceptions = list() + for(var/datum/job/job as anything in department.department_jobs) + if(job.total_positions == -1) + exceptions += job.title + continue + var/open_slots = job.total_positions - job.current_positions + if(open_slots < 1) + continue + open += open_slots + positions[department.department_name] = list("exceptions" = exceptions, "open" = open) + + return list( + "manifest" = get_manifest(), + "positions" = positions + ) + diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index 8b2f7158b2e..7130f1c896b 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -11,6 +11,8 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) var/trait_processes = FALSE ///Chance relative to other traits of its type to be picked var/weight = 10 + ///The cost of the trait, which is removed from the budget. + var/cost = STATION_TRAIT_COST_FULL ///Whether this trait is always enabled; generally used for debugging var/force = FALSE ///Does this trait show in the centcom report? @@ -83,7 +85,7 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) return /// Return TRUE if we want to show a lobby button, by default we assume we don't want it after the round begins -/datum/station_trait/proc/can_display_lobby_button() +/datum/station_trait/proc/can_display_lobby_button(client/player) return sign_up_button && !SSticker.HasRoundStarted() /// Apply any additional handling we need to our lobby button diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 300d6da8fa2..8dea2f96bbf 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -1,3 +1,7 @@ +#define CAN_ROLL_ALWAYS 1 //always can roll for antag +#define CAN_ROLL_PROTECTED 2 //can roll if config lets protected roles roll +#define CAN_ROLL_NEVER 3 //never roll antag + /** * A station trait which enables a temporary job * Generally speaking these should always all be mutually exclusive, don't have too many at once @@ -7,13 +11,22 @@ abstract_type = /datum/station_trait/job /// What tooltip to show on the button var/button_desc = "Sign up to gain some kind of unusual job, not available in most rounds." + /// Can this job roll antag? + var/can_roll_antag = CAN_ROLL_ALWAYS + /// How many positions to spawn? + var/position_amount = 1 /// Type of job to enable - var/job_to_add = /datum/job/clown + var/datum/job/job_to_add = /datum/job/clown /// Who signed up to this in the lobby var/list/lobby_candidates /datum/station_trait/job/New() . = ..() + switch(can_roll_antag) + if(CAN_ROLL_PROTECTED) + SSstation.antag_protected_roles += job_to_add::title + if(CAN_ROLL_NEVER) + SSstation.antag_restricted_roles += job_to_add::title blacklist += subtypesof(/datum/station_trait/job) - type // All but ourselves RegisterSignal(SSdcs, COMSIG_GLOB_PRE_JOBS_ASSIGNED, PROC_REF(pre_jobs_assigned)) @@ -50,16 +63,19 @@ if (!LAZYLEN(lobby_candidates)) on_failed_assignment() return // Nobody signed up :( - var/mob/dead/new_player/picked_player = pick(lobby_candidates) - picked_player.mind.assigned_role = new job_to_add() + for(var/_ in 1 to position_amount) + var/mob/dead/new_player/picked_player = pick_n_take(lobby_candidates) + picked_player.mind.assigned_role = new job_to_add() lobby_candidates = null /// Called if we didn't assign a role before the round began, we add it to the latejoin menu instead /datum/station_trait/job/proc/on_failed_assignment() - var/datum/job/our_job = job_to_add - our_job = SSjob.GetJob(our_job::title) - our_job.total_positions++ + var/datum/job/our_job = SSjob.GetJob(job_to_add::title) + our_job.total_positions = position_amount +/datum/station_trait/job/can_display_lobby_button(client/player) + var/datum/job/our_job = SSjob.GetJob(job_to_add::title) + return our_job.player_old_enough(player) && ..() /// Adds a gorilla to the cargo department, replacing the sloth and the mech /datum/station_trait/job/cargorilla @@ -67,6 +83,7 @@ button_desc = "Sign up to become the Cargo Gorilla, a peaceful shepherd of boxes." weight = 1 show_in_report = FALSE // Selective attention test. Did you spot the gorilla? + can_roll_antag = CAN_ROLL_NEVER job_to_add = /datum/job/cargo_gorilla /datum/station_trait/job/cargorilla/New() @@ -92,3 +109,61 @@ // monkey carries the crates, the age of robot is over if(GLOB.cargo_ripley) qdel(GLOB.cargo_ripley) + +/datum/station_trait/job/bridge_assistant + name = "Bridge Assistant" + button_desc = "Sign up to become the Bridge Assistant and watch over the Bridge." + weight = 2 + report_message = "We have installed a Bridge Assistant on your station." + show_in_report = TRUE + can_roll_antag = CAN_ROLL_PROTECTED + job_to_add = /datum/job/bridge_assistant + +/datum/station_trait/job/bridge_assistant/New() + . = ..() + RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(add_coffeemaker)) + +/datum/station_trait/job/bridge_assistant/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += "bridge_assistant" + +/// Creates a coffeemaker in the bridge, if we don't have one yet. +/datum/station_trait/job/bridge_assistant/proc/add_coffeemaker(datum/source) + SIGNAL_HANDLER + var/area/bridge = GLOB.areas_by_type[/area/station/command/bridge] + if(isnull(bridge)) //no bridge, what will he assist? + return + var/list/possible_coffeemaker_positions = list(/area/station/command/bridge, /area/station/command/meeting_room) + var/list/coffeemakers = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/coffeemaker) + for(var/obj/machinery/coffeemaker as anything in coffeemakers) //don't spawn a coffeemaker if there is already one on the bridge + if(is_type_in_list(get_area(coffeemaker), possible_coffeemaker_positions)) + return + var/list/tables = list() + for(var/turf/area_turf as anything in bridge.get_turfs_from_all_zlevels()) + var/obj/structure/table/table = locate() in area_turf + if(isnull(table)) + continue + if(area_turf.is_blocked_turf(ignore_atoms = list(table))) //don't spawn a coffeemaker on a fax machine or smth + continue + tables += table + if(!length(tables)) + return + var/picked_table = pick_n_take(tables) + var/picked_turf = get_turf(picked_table) + if(length(tables)) + var/another_table = pick(tables) + for(var/obj/thing_on_table in picked_turf) //if there's paper bins or other shit on the table, get that off + if(thing_on_table == picked_table) + continue + if(HAS_TRAIT(thing_on_table, TRAIT_WALLMOUNTED) || (thing_on_table.flags_1 & ON_BORDER_1) || thing_on_table.layer < TABLE_LAYER) + continue + if(thing_on_table.invisibility || !thing_on_table.alpha || !thing_on_table.mouse_opacity) + continue + thing_on_table.forceMove(get_turf(another_table)) + new /obj/machinery/coffeemaker/impressa(picked_turf) + new /obj/item/reagent_containers/cup/coffeepot(picked_turf) + new /obj/item/storage/box/coffeepack(picked_turf) + +#undef CAN_ROLL_ALWAYS +#undef CAN_ROLL_PROTECTED +#undef CAN_ROLL_NEVER diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index adb5edde449..dd940b3b821 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -2,7 +2,7 @@ name = "Bananium Shipment" trait_type = STATION_TRAIT_NEUTRAL weight = 5 - report_message = "Rumors has it that the clown planet has been sending support packages to clowns in this system" + report_message = "Rumors has it that the clown planet has been sending support packages to clowns in this system." trait_to_give = STATION_TRAIT_BANANIUM_SHIPMENTS /datum/station_trait/unnatural_atmosphere @@ -10,7 +10,7 @@ trait_type = STATION_TRAIT_NEUTRAL weight = 5 show_in_report = TRUE - report_message = "System's local planet has irregular atmospherical properties" + report_message = "System's local planet has irregular atmospherical properties." trait_to_give = STATION_TRAIT_UNNATURAL_ATMOSPHERE // This station trait modifies the atmosphere, which is too far past the time admins are able to revert it @@ -198,7 +198,7 @@ /datum/station_trait/birthday/proc/announce_birthday() - report_message = "We here at Nanotrasen would all like to wish [birthday_person ? birthday_person_name : "Employee Name"] a very happy birthday" + report_message = "We here at Nanotrasen would all like to wish [birthday_person ? birthday_person_name : "Employee Name"] a very happy birthday." priority_announce("Happy birthday to [birthday_person ? birthday_person_name : "Employee Name"]! Nanotrasen wishes you a very happy [birthday_person ? thtotext(birthday_person.age + 1) : "255th"] birthday.") if(birthday_person) playsound(birthday_person, 'sound/items/party_horn.ogg', 50) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index bc331db0775..0acbed5540c 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -190,6 +190,26 @@ to_preload += /obj/item/extinguisher/mini return to_preload +/obj/item/storage/belt/utility/full/inducer/PopulateContents() + SSwardrobe.provide_type(/obj/item/screwdriver, src) + SSwardrobe.provide_type(/obj/item/wrench, src) + SSwardrobe.provide_type(/obj/item/weldingtool, src) + SSwardrobe.provide_type(/obj/item/crowbar/red, src) + SSwardrobe.provide_type(/obj/item/wirecutters, src) + SSwardrobe.provide_type(/obj/item/multitool, src) + SSwardrobe.provide_type(/obj/item/inducer, src) + +/obj/item/storage/belt/utility/full/inducer/get_types_to_preload() + var/list/to_preload = list() //Yes this is a pain. Yes this is the point + to_preload += /obj/item/screwdriver + to_preload += /obj/item/wrench + to_preload += /obj/item/weldingtool + to_preload += /obj/item/crowbar + to_preload += /obj/item/wirecutters + to_preload += /obj/item/multitool + to_preload += /obj/item/inducer + return to_preload + /obj/item/storage/belt/utility/syndicate preload = FALSE diff --git a/code/modules/admin/verbs/list_exposer.dm b/code/modules/admin/verbs/list_exposer.dm index 445097e8bef..5ea2e227750 100644 --- a/code/modules/admin/verbs/list_exposer.dm +++ b/code/modules/admin/verbs/list_exposer.dm @@ -51,12 +51,7 @@ if(!SSticker.HasRoundStarted()) tgui_alert(usr, "The game hasn't started yet!") return - var/data = "Showing Crew Manifest.
" - data += "" - for(var/datum/record/crew/entry in GLOB.manifest.general) - data += "" - data += "
NamePosition
[entry.name][entry.rank][entry.rank != entry.trim ? " ([entry.trim])" : ""]
" - usr << browse(data, "window=manifest;size=440x410") + GLOB.manifest.ui_interact(usr) /datum/admins/proc/output_ai_laws() var/law_bound_entities = 0 diff --git a/code/modules/bitrunning/job.dm b/code/modules/bitrunning/job.dm index 57581753c0f..1e749a3c7a5 100644 --- a/code/modules/bitrunning/job.dm +++ b/code/modules/bitrunning/job.dm @@ -29,7 +29,7 @@ /obj/item/food/cornchips/blue = 1, ) rpg_title = "Recluse" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = STATION_JOB_FLAGS /datum/outfit/job/bitrunner name = "Bitrunner" diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index a422d2d736e..40d7cfa888e 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -288,3 +288,10 @@ uniform = /obj/item/clothing/under/plasmaman/bitrunner gloves = /obj/item/clothing/gloves/color/plasmaman/black head = /obj/item/clothing/head/helmet/space/plasmaman/bitrunner + +/datum/outfit/plasmaman/bridge_assistant + name = "Bridge Assistant Plasmaman" + + uniform = /obj/item/clothing/under/plasmaman //call me when this is gags and not 10 million new assets + gloves = /obj/item/clothing/gloves/color/plasmaman/black + head = /obj/item/clothing/head/helmet/space/plasmaman diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 8a58dc233a7..bd0c3a3ed27 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -23,7 +23,7 @@ family_heirlooms = list(/obj/item/pen/blue) rpg_title = "Defeated Miniboss" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_CANNOT_OPEN_SLOTS + job_flags = STATION_JOB_FLAGS | JOB_CANNOT_OPEN_SLOTS & ~JOB_REOPEN_ON_ROUNDSTART_LOSS /datum/job/prisoner/New() . = ..() diff --git a/code/modules/jobs/job_types/station_trait/bridge_assistant.dm b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm new file mode 100644 index 00000000000..b1ae57de1ff --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/bridge_assistant.dm @@ -0,0 +1,80 @@ +/datum/job/bridge_assistant + title = JOB_BRIDGE_ASSISTANT + description = "Watch over the Bridge, command its consoles, and spend your days brewing coffee for higher-ups." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD //not really a head but close enough + department_head = list(JOB_CAPTAIN) + faction = FACTION_STATION + total_positions = 0 + spawn_positions = 0 + supervisors = "the Captain, and in non-Bridge related situations the other heads" + minimal_player_age = 7 + exp_requirements = 300 + exp_required_type = EXP_TYPE_CREW + exp_granted_type = EXP_TYPE_CREW + config_tag = "BRIDGE_ASSISTANT" + + outfit = /datum/outfit/job/bridge_assistant + plasmaman_outfit = /datum/outfit/plasmaman/bridge_assistant + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_CIV + + liver_traits = list(TRAIT_PRETENDER_ROYAL_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_BRIDGE_ASSISTANT + departments_list = list(/datum/job_department/command) + + family_heirlooms = list(/obj/item/banner/command/mundane) + + mail_goodies = list( + /obj/item/storage/fancy/cigarettes = 1, + /obj/item/pen/fountain = 1, + ) + rpg_title = "Royal Guard" + allow_bureaucratic_error = FALSE + job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS + ignore_human_authority = TRUE + +/datum/job/bridge_assistant/after_spawn(mob/living/spawned, client/player_client) + . = ..() + ADD_TRAIT(spawned, TRAIT_NO_TWOHANDING, JOB_TRAIT) + +/datum/job/bridge_assistant/get_roundstart_spawn_point() + var/list/chair_turfs = list() + var/list/possible_turfs = list() + var/area/bridge = GLOB.areas_by_type[/area/station/command/bridge] + if(isnull(bridge)) + return ..() //if no bridge, spawn on the arrivals shuttle (but also what the fuck) + for (var/list/zlevel_turfs as anything in bridge.get_zlevel_turf_lists()) + for (var/turf/possible_turf as anything in zlevel_turfs) + if(possible_turf.is_blocked_turf()) + continue + if(locate(/obj/structure/chair) in possible_turf) + chair_turfs += possible_turf + continue + possible_turfs += possible_turf + if(length(chair_turfs)) + return pick(chair_turfs) //prioritize turfs with a chair + if(length(possible_turfs)) + return pick(possible_turfs) //if none, just pick a random turf in the bridge + return ..() //if the bridge has no turfs, spawn on the arrivals shuttle + +/datum/outfit/job/bridge_assistant + name = "Bridge Assistant" + jobtype = /datum/job/bridge_assistant + + id_trim = /datum/id_trim/job/bridge_assistant + backpack_contents = list( + /obj/item/modular_computer/pda/bridge_assistant = 1, + ) + + uniform = /obj/item/clothing/under/trek/command/next + neck = /obj/item/clothing/neck/large_scarf/blue + belt = /obj/item/storage/belt/utility/full/inducer + ears = /obj/item/radio/headset/headset_com + glasses = /obj/item/clothing/glasses/sunglasses + gloves = /obj/item/clothing/gloves/fingerless + head = /obj/item/clothing/head/soft/black + shoes = /obj/item/clothing/shoes/laceup + l_pocket = /obj/item/gun/energy/e_gun/mini + r_pocket = /obj/item/assembly/flash/handheld diff --git a/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm new file mode 100644 index 00000000000..87363bf9b7b --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/cargo_gorilla.dm @@ -0,0 +1,50 @@ +/datum/job/cargo_gorilla + title = JOB_CARGO_GORILLA + description = "Assist the supply department by moving freight and disposing of unwanted fruits." + department_head = list(JOB_QUARTERMASTER) + faction = FACTION_STATION + total_positions = 0 + spawn_positions = 0 + supervisors = SUPERVISOR_QM + spawn_type = /mob/living/basic/gorilla/cargorilla + config_tag = "CARGO_GORILLA" + random_spawns_possible = FALSE + display_order = JOB_DISPLAY_ORDER_CARGO_GORILLA + departments_list = list(/datum/job_department/cargo) + mail_goodies = list( + /obj/item/food/grown/banana = 1, + ) + rpg_title = "Beast of Burden" + allow_bureaucratic_error = FALSE + job_flags = STATION_TRAIT_JOB_FLAGS | JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK + +/datum/job/cargo_gorilla/get_roundstart_spawn_point() + if (length(GLOB.gorilla_start)) + return pick(GLOB.gorilla_start) + return ..() + +/datum/job/cargo_gorilla/get_spawn_mob(client/player_client, atom/spawn_point) + if (!player_client) + return + var/mob/living/the_big_man = new spawn_type(get_turf(spawn_point)) + the_big_man.fully_replace_character_name(the_big_man.real_name, pick(GLOB.cargorilla_names)) + return the_big_man + +/datum/job/cargo_gorilla/after_spawn(mob/living/spawned, client/player_client) + . = ..() + // Gorilla with a wage, what's he buyin? + var/datum/bank_account/bank_account = new(spawned.real_name, src) + bank_account.payday(STARTING_PAYCHECKS, TRUE) + bank_account.replaceable = FALSE + spawned.add_mob_memory(/datum/memory/key/account, remembered_id = bank_account.account_id) + + var/obj/item/card/id/advanced/cargo_gorilla/gorilla_id = new(spawned.loc) + gorilla_id.registered_name = spawned.name + gorilla_id.update_label() + gorilla_id.registered_account = bank_account + bank_account.bank_cards += gorilla_id + spawned.put_in_hands(gorilla_id, del_on_fail = TRUE) + + to_chat(spawned, span_boldnotice("You are Cargorilla, a pacifist friend of the station and carrier of freight.")) + to_chat(spawned, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground.")) + spawned.mind.special_role = "Cargorilla" diff --git a/code/modules/mob/dead/crew_manifest.dm b/code/modules/mob/dead/crew_manifest.dm deleted file mode 100644 index 6a2c84622a2..00000000000 --- a/code/modules/mob/dead/crew_manifest.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/crew_manifest - -/datum/crew_manifest/ui_state(mob/user) - return GLOB.always_state - -/datum/crew_manifest/ui_status(mob/user, datum/ui_state/state) - return (isnewplayer(user) || isobserver(user) || isAI(user) || ispAI(user)) ? UI_INTERACTIVE : UI_CLOSE - -/datum/crew_manifest/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if (!ui) - ui = new(user, src, "CrewManifest") - ui.open() - -/datum/crew_manifest/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - -/datum/crew_manifest/ui_data(mob/user) - var/list/positions = list() - for(var/datum/job_department/department as anything in SSjob.joinable_departments) - var/open = 0 - var/list/exceptions = list() - for(var/datum/job/job as anything in department.department_jobs) - if(job.total_positions == -1) - exceptions += job.title - continue - var/open_slots = job.total_positions - job.current_positions - if(open_slots < 1) - continue - open += open_slots - positions[department.department_name] = list("exceptions" = exceptions, "open" = open) - - return list( - "manifest" = GLOB.manifest.get_manifest(), - "positions" = positions - ) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index c10c027bc3d..e1033e24f35 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -338,11 +338,7 @@ return client.crew_manifest_delay = world.time + (1 SECONDS) - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - - GLOB.crew_manifest_tgui.ui_interact(src) + GLOB.manifest.ui_interact(src) /mob/dead/new_player/Move() return 0 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 86c0da5acf7..0a3e0bde103 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -726,10 +726,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return client.crew_manifest_delay = world.time + (1 SECONDS) - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - GLOB.crew_manifest_tgui.ui_interact(src) + GLOB.manifest.ui_interact(src) //this is called when a ghost is drag clicked to something. /mob/dead/observer/MouseDrop(atom/over) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 31096fbffc7..5efce52d6e8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -353,10 +353,7 @@ return client.crew_manifest_delay = world.time + (1 SECONDS) - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - GLOB.crew_manifest_tgui.ui_interact(src) + GLOB.manifest.ui_interact(src) /mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals). if(!radio) diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 31d763054b6..0d9b7167d7a 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -103,7 +103,7 @@ /obj/item/modular_computer/pda/heads/quartermaster name = "quartermaster PDA" - greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_config = /datum/greyscale_config/tablet/stripe_thick/head greyscale_colors = "#c4b787#18191e#8b4c31" inserted_item = /obj/item/pen/survival stored_paper = 20 @@ -414,7 +414,7 @@ ) /** - * No Department + * No Department/Station Trait */ /obj/item/modular_computer/pda/assistant @@ -423,6 +423,14 @@ /datum/computer_file/program/bounty_board, ) +/obj/item/modular_computer/pda/bridge_assistant + name = "bridge assistant PDA" + greyscale_colors = "#374f7e#a92323" + starting_programs = list( + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/status, + ) + /** * Non-roles */ diff --git a/code/modules/unit_tests/station_trait_tests.dm b/code/modules/unit_tests/station_trait_tests.dm index 430e83b9af7..21173e152d7 100644 --- a/code/modules/unit_tests/station_trait_tests.dm +++ b/code/modules/unit_tests/station_trait_tests.dm @@ -6,5 +6,7 @@ for(var/datum/job/job as anything in subtypesof(/datum/job)) if(!(initial(job.job_flags) & JOB_CREW_MEMBER)) continue + if((initial(job.job_flags) & STATION_TRAIT_JOB_FLAGS) == STATION_TRAIT_JOB_FLAGS) + continue if(!(job in cyber_trait.job_to_cybernetic)) TEST_FAIL("Job [job] does not have an assigned cybernetic for [cyber_trait.type] station trait.") diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index 4ff31a316c2ac3b3cb47c4130f1b79b1cb872547..a67cc5584424e0a78c9069417a0e9ff16e923c65 100644 GIT binary patch delta 573 zcmV-D0>b^I1)K$tYJbCeR9JLGWpiV4X>fFDZ*Bkpc$}S*O$x#=5QW#xDMGsy(bBCO zX^}4M6-sQV}r*nmmL`pl4nLnIcGYA5xNVa2Sj|NqWa_V$wfYt3n4oc7G9kX=HE$aSqReD>QqJ za`T_HX6Y1b*6bEitJag&f!3_GeIFh5W#hM89B?UGh6uqkJ{stpMT}A&y6YU2(W)sw zkMjmZf~#In5daMU00B-(L_t(oh3%CwPQ)+}MaPBv$u4t{h!Y@j0J|_kh!$}JH~|GW zfCJEk8_-j71An*+lZ8xvur0C;VkN&cZzuD2oMhuA*BOjXz@ol6HhOey!a8kw^M2v@ zMNqF!sD222|6}mo#Omv2|6}mol-ixzEy6nl5&3k zs65=IgiTndi{W|L@iIKEab1$=(M3IEjgwDCSmV_8rGFM^0SIi(4|rd?eEU$|Uk`U* z`mf;5IQ!R4g|=W<5aC*8-z6Oc{3I?#Dmae=Fkll{*wz8g95`YCC;5W2IPXdU2TMg~ z9nqBn>{*C&kNO{>pK^kpppZL@NO3|KZ)M1xyBLcX9rafFDZ*Bkpc$}S*!3u*g42I9`Qxv_9v5D7R zhB7?NSCC?(4eMHIx{ba4>bz};;_XlP{^SoN73cC&)uOmo{0W}WS#c8i{=nG_RnW1> za?UhhuftSOkO87h2z&b&63!HQij5;@otJl*^bgkPIKhllK!2^Z3?7K)@GN%0$oD9B z|6XU;ZgF-?w&>av&pQK)J9_8Q7}>b4ThA^Z+d-cz-V4e*Lh%KhJkAts=eH;Lw9p zGM|{_;tI5;z*m%qb@_aaTJCI3k5urIfQ%I!7BJSBDb9@4FTzRHq4LQMIT}>_{N-Hz zHpTvoHkM)^$Rk5qgX2Gvv;oK`8uPMa$P-nLH_u;|ib-BKR!tcWxv{5)f>UP9MT6!9 zOJg1xbUrHWY3KquQ{ZEio^ap8o0`c2)StSQPEyrB(9&_{mi{;v&&#T+sulDL^Q-!K Th`d__00000NkvXXu0mjf>HQmH diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index 3e32e17437cb763a4fce98f20d571abc00033238..3dff7642a96139d946054f13fcbb1e19542d27b3 100644 GIT binary patch literal 9978 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 X!bp_%Lv5@e0KT-<_0%d=tit{a<%Hs( literal 9853 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 diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index fdf3657c9d1300bd6cef2fb3c0a7906191018f64..6397cf6fb5b5a036813538367b7123006b2e26ef 100644 GIT binary patch literal 23327 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 literal 23297 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 diff --git a/modular_nova/master_files/icons/hud/lobby/bottom_buttons.dmi b/modular_nova/master_files/icons/hud/lobby/bottom_buttons.dmi deleted file mode 100644 index 990a6d1bc171968764ebdc31d4f4a6cec59e8ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmV-!1CjiRP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGj7+#VGg33tGfE(w;*!LYR3KBSIJF3ku|SE7GbOXA7$|DU#hF%= zn41b=V^bTS0W>QIWL|0tN%{(kQj3dm=`jL|rsgD8f|xo;1|+4%C+3wTrpM>!5wr|R zElG|<)<>Zu)6z(=EiH{qX96{n;!b4+S3ehU5&-~nJ*eb0h_nI#00J^eL_t(YiRG3t zjuSByhD}3_$3qG_GF-rMD!NIwp`@T^n;{Oqyc=OL4g zgpgL+7b*JlKYwq=qw%kpN4C}zYJ+P0F4XeWTtwe=u4>u3rB(dc z>-bq+qRnHypSPE2b3b!wEpnZ&pt^;tF9+yq2;bz(x0-|0PX}oKQoiyTP)%6 Date: Wed, 24 Jan 2024 20:36:03 +0300 Subject: [PATCH 36/62] Can you feel the power? | Fixes, rebalances, or otherwise changes a lot of colony lathe stuff | We have TEG at home (#1641) * stirling generator, various fixes * nerfs, sounds, burn in a giant fire * changes a single seed * fixes some stuff for compile * sets myself up for success later * capitalization fix * rrrahhhh!!! * that part doesnt exist anymore * fixes stirling desc * turns out, portable superfire, not my best idea * multitude of missing designs * what the flip ? * messes with some cargo stuff, adds big crates for some of these goods * ooprs * fixes griddle * that doesnt need the furnace actually * fixes packed up griddle * fixes missing icon test * undoes the thumper change --------- Co-authored-by: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Iajret --- .../code/appliances/chem_machines.dm | 28 +++- .../code/appliances/co2_cracker.dm | 3 + .../code/appliances/foodricator.dm | 4 + .../appliances/kitchen_appliances/griddle.dm | 38 +++++ .../kitchen_appliances/macrowave.dm | 42 ++++++ .../appliances/kitchen_appliances/range.dm | 38 +++++ .../code/appliances/space_heater.dm | 58 ++++++++ .../code/appliances/wind_turbine.dm | 1 + .../colony_fabricator/code/cargo_packs.dm | 49 +++++++ .../code/construction/doors.dm | 2 + .../code/design_datums/appliances.dm | 75 ++++++++++ .../machine_boards.dm | 12 -- .../fabricator_flag_additions/tools.dm | 48 ++++++ .../code/design_datums/flatpack_machines.dm | 44 ++++-- .../rations_printer_designs/seeds.dm | 8 +- .../code/machines/arc_furnace.dm | 2 + .../code/machines/ore_silo.dm | 8 +- .../code/machines/power_storage_unit.dm | 10 ++ .../code/machines/solar_panels.dm | 2 + .../code/machines/stirling_generator.dm | 138 ++++++++++++++++++ .../code/machines/thermomachine.dm | 3 + .../icons/kitchen_stuff/griddle.dmi | Bin 0 -> 840 bytes .../icons/kitchen_stuff/microwave.dmi | Bin 0 -> 3437 bytes .../icons/kitchen_stuff/range.dmi | Bin 0 -> 1771 bytes .../colony_fabricator/icons/space_heater.dmi | Bin 0 -> 1067 bytes .../stirling_generator/big_generator.dmi | Bin 0 -> 2623 bytes .../stirling_generator/packed_machines.dmi | Bin 0 -> 918 bytes .../code/armament_datums/akh_frontier.dm | 26 ++-- tgstation.dme | 6 + 29 files changed, 598 insertions(+), 47 deletions(-) create mode 100644 modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/griddle.dm create mode 100644 modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/macrowave.dm create mode 100644 modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/range.dm create mode 100644 modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm create mode 100644 modular_nova/modules/colony_fabricator/code/cargo_packs.dm create mode 100644 modular_nova/modules/colony_fabricator/code/machines/stirling_generator.dm create mode 100644 modular_nova/modules/colony_fabricator/icons/kitchen_stuff/griddle.dmi create mode 100644 modular_nova/modules/colony_fabricator/icons/kitchen_stuff/microwave.dmi create mode 100644 modular_nova/modules/colony_fabricator/icons/kitchen_stuff/range.dmi create mode 100644 modular_nova/modules/colony_fabricator/icons/space_heater.dmi create mode 100644 modular_nova/modules/colony_fabricator/icons/stirling_generator/big_generator.dmi create mode 100644 modular_nova/modules/colony_fabricator/icons/stirling_generator/packed_machines.dmi diff --git a/modular_nova/modules/colony_fabricator/code/appliances/chem_machines.dm b/modular_nova/modules/colony_fabricator/code/appliances/chem_machines.dm index 63e0831f6d3..045adfc4733 100644 --- a/modular_nova/modules/colony_fabricator/code/appliances/chem_machines.dm +++ b/modular_nova/modules/colony_fabricator/code/appliances/chem_machines.dm @@ -12,10 +12,13 @@ var/static/list/synthesizable_reagents = list( /datum/reagent/water, ) + /// What this repacks into + var/repacked_type = /obj/item/flatpacked_machine/water_synth -/obj/machinery/plumbing/synthesizer/water_synth/Initialize(mapload, bolt, layer) +/obj/machinery/plumbing/synthesizer/water_synth/Initialize(mapload, bolt = FALSE, layer) . = ..() dispensable_reagents = synthesizable_reagents + AddElement(/datum/element/repackable, repacked_type, 2 SECONDS) AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) // Deployable item for cargo for the water synth @@ -27,6 +30,10 @@ w_class = WEIGHT_CLASS_NORMAL type_to_deploy = /obj/machinery/plumbing/synthesizer/water_synth deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) // Machine that makes botany nutrients for hydroponics farming @@ -48,10 +55,13 @@ /datum/reagent/toxin/plantbgone/weedkiller, /datum/reagent/toxin/pestkiller, ) + /// What this repacks into + var/repacked_type = /obj/item/flatpacked_machine/hydro_synth -/obj/machinery/plumbing/synthesizer/colony_hydroponics/Initialize(mapload, bolt, layer) +/obj/machinery/plumbing/synthesizer/colony_hydroponics/Initialize(mapload, bolt = FALSE, layer) . = ..() dispensable_reagents = synthesizable_reagents + AddElement(/datum/element/repackable, repacked_type, 2 SECONDS) AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) // Deployable item for cargo for the hydro synth @@ -63,6 +73,10 @@ w_class = WEIGHT_CLASS_NORMAL type_to_deploy = /obj/machinery/plumbing/synthesizer/colony_hydroponics deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + ) // Chem dispenser with a limited range of thematic reagents to dispense @@ -117,8 +131,9 @@ powerefficiency = 0.5 recharge_amount = 50 -/obj/machinery/chem_dispenser/frontier_appliance/default_deconstruction_crowbar() - return +/obj/machinery/chem_dispenser/frontier_appliance/examine(mob/user) + . = ..() + . += span_notice("It cannot be repacked, but can be deconstructed normally.") // Deployable item for cargo for the sustenance machine @@ -129,3 +144,8 @@ w_class = WEIGHT_CLASS_NORMAL type_to_deploy = /obj/machinery/chem_dispenser/frontier_appliance deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/colony_fabricator/code/appliances/co2_cracker.dm b/modular_nova/modules/colony_fabricator/code/appliances/co2_cracker.dm index 51901079aed..66b78ca16d8 100644 --- a/modular_nova/modules/colony_fabricator/code/appliances/co2_cracker.dm +++ b/modular_nova/modules/colony_fabricator/code/appliances/co2_cracker.dm @@ -71,10 +71,13 @@ GLOBAL_LIST_INIT(cracker_reactions, cracker_reactions_list()) working_power = 1 /// Soundloop for while the thermomachine is turned on var/datum/looping_sound/conditioner_running/soundloop + /// What this repacks into + var/repacked_type = /obj/item/flatpacked_machine/co2_cracker /obj/machinery/electrolyzer/co2_cracker/Initialize(mapload) . = ..() soundloop = new(src, FALSE) + AddElement(/datum/element/repackable, repacked_type, 2 SECONDS) AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) /obj/machinery/electrolyzer/co2_cracker/process_atmos() diff --git a/modular_nova/modules/colony_fabricator/code/appliances/foodricator.dm b/modular_nova/modules/colony_fabricator/code/appliances/foodricator.dm index 51274cb99a8..b707a2ec446 100644 --- a/modular_nova/modules/colony_fabricator/code/appliances/foodricator.dm +++ b/modular_nova/modules/colony_fabricator/code/appliances/foodricator.dm @@ -18,10 +18,13 @@ RND_CATEGORY_AKHTER_FOODRICATOR_UTENSILS, RND_CATEGORY_AKHTER_SEEDS, ) + /// What this repacks into + var/repacked_type = /obj/item/flatpacked_machine/organics_ration_printer /obj/machinery/biogenerator/foodricator/Initialize(mapload) . = ..() AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + AddElement(/datum/element/repackable, repacked_type, 5 SECONDS) /obj/machinery/biogenerator/foodricator/RefreshParts() . = ..() @@ -38,6 +41,7 @@ icon = 'modular_nova/modules/colony_fabricator/icons/foodricator.dmi' icon_state = "biogenerator_parts" type_to_deploy = /obj/machinery/biogenerator/foodricator + w_class = WEIGHT_CLASS_NORMAL custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, diff --git a/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/griddle.dm b/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/griddle.dm new file mode 100644 index 00000000000..0d79cbf2d74 --- /dev/null +++ b/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/griddle.dm @@ -0,0 +1,38 @@ +/obj/machinery/griddle/frontier_tabletop + name = "tabletop griddle" + desc = "A griddle type slim enough to fit atop a table without much fuss. This type in particular \ + was made to be broken down into many parts and shipped across the glaxy. This makes it a favourite in \ + pop-up food stalls and colony kitchens all around." + icon = 'modular_nova/modules/colony_fabricator/icons/kitchen_stuff/griddle.dmi' + icon_state = "griddletable_off" + variant = "table" + pass_flags_self = LETPASSTHROW + pass_flags = PASSTABLE + circuit = null + // Lines up perfectly with tables when anchored on them + anchored_tabletop_offset = 3 + /// What type this repacks into + var/repacked_type = /obj/item/flatpacked_machine/frontier_griddle + +/obj/machinery/griddle/frontier_tabletop/Initialize(mapload) + . = ..() + AddElement(/datum/element/repackable, repacked_type, 2 SECONDS) + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +/obj/machinery/griddle/frontier_tabletop/unanchored + anchored = FALSE + +// Deployable item for cargo + +/obj/item/flatpacked_machine/frontier_griddle + name = "flat-packed tabletop griddle" + icon = 'modular_nova/modules/colony_fabricator/icons/kitchen_stuff/griddle.dmi' + icon_state = "griddle_parts" + w_class = WEIGHT_CLASS_NORMAL + type_to_deploy = /obj/machinery/griddle/frontier_tabletop + deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/macrowave.dm b/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/macrowave.dm new file mode 100644 index 00000000000..8359250d438 --- /dev/null +++ b/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/macrowave.dm @@ -0,0 +1,42 @@ +/obj/machinery/microwave/frontier_printed + desc = "A plastic-paneled microwave oven, capable of doing anything a standard microwave could do. \ + This one is special designed to be tightly packed into a shape that can be easily re-assembled \ + later from the factory. There don't seem to be included instructions on getting it folded back \ + together, though..." + icon = 'modular_nova/modules/colony_fabricator/icons/kitchen_stuff/microwave.dmi' + circuit = null + max_n_of_items = 5 + efficiency = 2 + vampire_charging_capable = TRUE + +/obj/machinery/microwave/frontier_printed/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +/obj/machinery/microwave/frontier_printed/RefreshParts() + . = ..() + max_n_of_items = 5 + efficiency = 2 + vampire_charging_capable = TRUE + +/obj/machinery/microwave/frontier_printed/examine(mob/user) + . = ..() + . += span_notice("It cannot be repacked, but can be deconstructed normally.") + +/obj/machinery/microwave/frontier_printed/unanchored + anchored = FALSE + +// Deployable item for cargo + +/obj/item/flatpacked_machine/macrowave + name = "microwave oven parts kit" + icon = 'modular_nova/modules/colony_fabricator/icons/kitchen_stuff/microwave.dmi' + icon_state = "packed_microwave" + w_class = WEIGHT_CLASS_NORMAL + type_to_deploy = /obj/machinery/microwave/frontier_printed + deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/range.dm b/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/range.dm new file mode 100644 index 00000000000..6f8c48bf789 --- /dev/null +++ b/modular_nova/modules/colony_fabricator/code/appliances/kitchen_appliances/range.dm @@ -0,0 +1,38 @@ +/obj/machinery/oven/range_frontier + name = "frontier range" + desc = "A combined oven and stove commonly seen on the frontier. Comes from the factory packed up \ + in a neatly compact format that can then be deployed into a nearly full size appliance. \ + It seems, however, that the designer forgot to include instructions on packing these things back up." + icon = 'modular_nova/modules/colony_fabricator/icons/kitchen_stuff/range.dmi' + icon_state = "range_off" + base_icon_state = "range" + pass_flags_self = PASSMACHINE|PASSTABLE|LETPASSTHROW + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.2 + circuit = null + +/obj/machinery/oven/range_frontier/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + AddComponent(/datum/component/stove, container_x = -3, container_y = 14) + +/obj/machinery/oven/range_frontier/examine(mob/user) + . = ..() + . += span_notice("It cannot be repacked, but can be deconstructed normally.") + +/obj/machinery/oven/range_frontier/unanchored + anchored = FALSE + +// Deployable item for cargo + +/obj/item/flatpacked_machine/frontier_range + name = "frontier range parts kit" + icon = 'modular_nova/modules/colony_fabricator/icons/kitchen_stuff/range.dmi' + icon_state = "range_packed" + w_class = WEIGHT_CLASS_NORMAL + type_to_deploy = /obj/machinery/oven/range_frontier + deploy_time = 2 SECONDS + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm b/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm new file mode 100644 index 00000000000..18303a21930 --- /dev/null +++ b/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm @@ -0,0 +1,58 @@ +/obj/machinery/space_heater/wall_mounted + name = "mounted heater" + desc = "A compact heating and cooling device for small scale applications, made to mount onto walls up and out of the way. \ + Like other, more free-standing space heaters however, these still require cell power to function." + icon = 'modular_nova/modules/colony_fabricator/icons/space_heater.dmi' + anchored = TRUE + density = FALSE + circuit = null + heating_power = 20000 + efficiency = 10000 + display_panel = TRUE + /// What this repacks into when its wrenched off a wall + var/repacked_type = /obj/item/wallframe/wall_heater + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/space_heater/wall_mounted, 29) + +/obj/machinery/space_heater/wall_mounted/Initialize(mapload) + . = ..() + find_and_hang_on_wall() + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +/obj/machinery/space_heater/wall_mounted/RefreshParts() + . = ..() + heating_power = 20000 + efficiency = 10000 + +/obj/machinery/space_heater/wall_mounted/default_deconstruction_crowbar() + return + +/obj/machinery/space_heater/wall_mounted/default_unfasten_wrench(mob/living/user, obj/item/wrench, time) + user.balloon_alert(user, "deconstructing...") + wrench.play_tool_sound(src) + if(wrench.use_tool(src, user, 1 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE) + return + +/obj/machinery/space_heater/wall_mounted/deconstruct(disassembled) + if(disassembled) + new repacked_type(drop_location()) + return ..() + +// Wallmount for creating the heaters + +/obj/item/wallframe/wall_heater + name = "unmounted wall heater" + desc = "A compact heating and cooling device for small scale applications, made to mount onto walls up and out of the way. \ + Like other, more free-standing space heaters however, these still require cell power to function." + icon = 'modular_nova/modules/colony_fabricator/icons/space_heater.dmi' + icon_state = "sheater-off" + w_class = WEIGHT_CLASS_NORMAL + result_path = /obj/machinery/space_heater/wall_mounted + pixel_shift = 29 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1, + /datum/material/gold = SMALL_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/colony_fabricator/code/appliances/wind_turbine.dm b/modular_nova/modules/colony_fabricator/code/appliances/wind_turbine.dm index 1713f78a925..5f6dcfffdc8 100644 --- a/modular_nova/modules/colony_fabricator/code/appliances/wind_turbine.dm +++ b/modular_nova/modules/colony_fabricator/code/appliances/wind_turbine.dm @@ -80,6 +80,7 @@ icon = 'modular_nova/modules/colony_fabricator/icons/wind_turbine.dmi' icon_state = "turbine_packed" type_to_deploy = /obj/machinery/power/colony_wind_turbine + w_class = WEIGHT_CLASS_NORMAL custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, diff --git a/modular_nova/modules/colony_fabricator/code/cargo_packs.dm b/modular_nova/modules/colony_fabricator/code/cargo_packs.dm new file mode 100644 index 00000000000..9f9611b335f --- /dev/null +++ b/modular_nova/modules/colony_fabricator/code/cargo_packs.dm @@ -0,0 +1,49 @@ +// Service + +/datum/supply_pack/service/hydro_synthesizers + name = "Hydroponics Plumbing Synthesizer Pack" + desc = "Watering and feeding your plants got you down? Worry no further as this kit contains two each of water and hydroponics fertilizer synthesizers." + cost = CARGO_CRATE_VALUE * 2 + contains = list( + /obj/machinery/plumbing/synthesizer/water_synth, + /obj/machinery/plumbing/synthesizer/water_synth, + /obj/machinery/plumbing/synthesizer/colony_hydroponics, + /obj/machinery/plumbing/synthesizer/colony_hydroponics, + ) + crate_name = "hydroponics synthesizers crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/service/frontier_kitchen + name = "Frontier Kitchen Equipment" + desc = "A range of frontier appliance classics, enough to set up a functioning kitchen no matter where you are in the galaxy." + cost = CARGO_CRATE_VALUE * 5 + contains = list( + /obj/machinery/plumbing/synthesizer/water_synth, + /obj/machinery/chem_dispenser/frontier_appliance, + /obj/machinery/griddle/frontier_tabletop/unanchored, + /obj/machinery/microwave/frontier_printed/unanchored, + /obj/machinery/oven/range_frontier/unanchored, + /obj/machinery/biogenerator/foodricator, + ) + crate_name = "frontier kitchen crate" + +// Engineering + +/datum/supply_pack/engineering/colony_starter + name = "Colonization Starter Kit" + desc = "The Sol standard minimum kit for frontier colonization, contains everything you need to construct a mostly functioning colony in most places across the galaxy." + cost = CARGO_CRATE_VALUE * 11 // 6 for the lathe, 3 for the organics printer, 2 for the rest of the stuff + contains = list( + /obj/item/flatpacked_machine, + /obj/item/flatpacked_machine/organics_printer, + /obj/item/flatpacked_machine/gps_beacon, + /obj/item/stack/sheet/plastic_wall_panel/fifty, + /obj/item/stack/rods/twentyfive, + /obj/item/stack/sheet/iron/twenty, + /obj/item/flatpacked_machine/airlock_kit_manual, + /obj/item/flatpacked_machine/airlock_kit_manual, + /obj/item/wallframe/apc, + /obj/item/electronics/apc, + /obj/item/stock_parts/cell/high, + ) + crate_name = "colonization kit crate" diff --git a/modular_nova/modules/colony_fabricator/code/construction/doors.dm b/modular_nova/modules/colony_fabricator/code/construction/doors.dm index a40a15ef9e6..1fbf4dc595a 100644 --- a/modular_nova/modules/colony_fabricator/code/construction/doors.dm +++ b/modular_nova/modules/colony_fabricator/code/construction/doors.dm @@ -25,6 +25,7 @@ icon = 'modular_nova/modules/colony_fabricator/icons/doors/packed.dmi' icon_state = "shutters_parts" type_to_deploy = /obj/machinery/door/poddoor/shutters/colony_fabricator/preopen + w_class = WEIGHT_CLASS_NORMAL custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, @@ -50,6 +51,7 @@ icon = 'modular_nova/modules/colony_fabricator/icons/doors/packed.dmi' icon_state = "airlock_parts" type_to_deploy = /obj/machinery/door/airlock/colony_prefab + w_class = WEIGHT_CLASS_NORMAL custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, diff --git a/modular_nova/modules/colony_fabricator/code/design_datums/appliances.dm b/modular_nova/modules/colony_fabricator/code/design_datums/appliances.dm index 8a4a70f318f..6a85f5a6139 100644 --- a/modular_nova/modules/colony_fabricator/code/design_datums/appliances.dm +++ b/modular_nova/modules/colony_fabricator/code/design_datums/appliances.dm @@ -25,6 +25,9 @@ "co2_cracker", "portable_recycler", "foodricator", + "wall_heater", + "macrowave", + "frontier_range", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000000000000000) // God save you hidden = TRUE @@ -80,6 +83,24 @@ ) construction_time = 30 SECONDS +/// Space heater, but it mounts on walls + +/datum/design/wall_mounted_space_heater + name = "Mounted Heater" + id = "wall_heater" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1, + /datum/material/gold = SMALL_MATERIAL_AMOUNT, + ) + build_path = /obj/item/wallframe/wall_heater + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_ATMOS, + ) + construction_time = 30 SECONDS + // Plumbable chem machine that makes nothing but water /datum/design/water_synthesizer @@ -187,6 +208,60 @@ ) construction_time = 30 SECONDS +// Really, its just a microwave + +/datum/design/macrowave + name = "Microwave Oven" + id = "macrowave" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/machinery/microwave/frontier_printed/unanchored + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_SUSTENANCE, + ) + construction_time = 30 SECONDS + +// A range, but it looks cool af + +/datum/design/frontier_range + name = "Frontier Range" + id = "frontier_range" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/machinery/oven/range_frontier/unanchored + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_SUSTENANCE, + ) + construction_time = 1 MINUTES + +// Griddles that fit on top of any regular table + +/datum/design/tabletop_griddle + name = "Tabletop Griddle" + id = "tabletop_griddle" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/machinery/griddle/frontier_tabletop/unanchored + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_APPLIANCES + FABRICATOR_SUBCATEGORY_SUSTENANCE, + ) + construction_time = 1 MINUTES + #undef FABRICATOR_CATEGORY_APPLIANCES #undef FABRICATOR_SUBCATEGORY_POWER #undef FABRICATOR_SUBCATEGORY_ATMOS diff --git a/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm b/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm index 47560f14e6a..b05045ed60e 100644 --- a/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm +++ b/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/machine_boards.dm @@ -6,10 +6,6 @@ . = ..() build_type |= COLONY_FABRICATOR -/datum/design/board/microwave/New() - . = ..() - build_type |= COLONY_FABRICATOR - /datum/design/board/processor/New() . = ..() build_type |= COLONY_FABRICATOR @@ -18,14 +14,6 @@ . = ..() build_type |= COLONY_FABRICATOR -/datum/design/board/range/New() - . = ..() - build_type |= COLONY_FABRICATOR - -/datum/design/board/griddle/New() - . = ..() - build_type |= COLONY_FABRICATOR - /datum/design/board/reagentgrinder/New() . = ..() build_type |= COLONY_FABRICATOR diff --git a/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/tools.dm b/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/tools.dm index 92a68bade56..9d24a6d043f 100644 --- a/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/tools.dm +++ b/modular_nova/modules/colony_fabricator/code/design_datums/fabricator_flag_additions/tools.dm @@ -107,3 +107,51 @@ /datum/design/spraycan/New() . = ..() build_type |= COLONY_FABRICATOR + +/datum/design/pickaxe/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/bucket/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/watering_can/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/mop/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/broom/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/tray/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/cultivator/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/plant_analyzer/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/shovel/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/spade/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/hatchet/New() + . = ..() + build_type |= COLONY_FABRICATOR + +/datum/design/secateurs/New() + . = ..() + build_type |= COLONY_FABRICATOR diff --git a/modular_nova/modules/colony_fabricator/code/design_datums/flatpack_machines.dm b/modular_nova/modules/colony_fabricator/code/design_datums/flatpack_machines.dm index 5912a347bd2..c4305cd9935 100644 --- a/modular_nova/modules/colony_fabricator/code/design_datums/flatpack_machines.dm +++ b/modular_nova/modules/colony_fabricator/code/design_datums/flatpack_machines.dm @@ -33,7 +33,7 @@ // Lets the colony lathe make more colony lathes but at very hihg cost, for fun /datum/design/flatpack_colony_fabricator - name = "Flat-packed Colony Fabricator" + name = "Flat-Packed Colony Fabricator" desc = "A deployable fabricator capable of producing other flat-packed machines and other special equipment tailored for \ rapidly constructing functional structures given resources and power. While it cannot be upgraded, it can be repacked \ and moved to any location you see fit." @@ -56,7 +56,7 @@ // Solar panels and trackers /datum/design/flatpack_solar_panel - name = "Flat-packed Solar Panel" + name = "Flat-Packed Solar Panel" desc = "A deployable solar panel, able to be repacked after placement for relocation or recycling." id = "flatpack_solar_panel" build_type = COLONY_FABRICATOR @@ -72,7 +72,7 @@ construction_time = 5 SECONDS /datum/design/flatpack_solar_tracker - name = "Flat-packed Solar Tracker" + name = "Flat-Packed Solar Tracker" desc = "A deployable solar tracker, able to be repacked after placement for relocation or recycling." id = "flatpack_solar_tracker" build_type = COLONY_FABRICATOR @@ -90,7 +90,7 @@ // Arc furance /datum/design/flatpack_arc_furnace - name = "Flat-packed Arc Furnace" + name = "Flat-Packed Arc Furnace" desc = "A deployable furnace for refining ores. While slower and less safe than conventional refining methods, \ it multiplies the output of refined materials enough to still outperform simply recycling ore." id = "flatpack_arc_furnace" @@ -109,7 +109,7 @@ // Power storage structures /datum/design/flatpack_power_storage - name = "Flat-packed Stationary Battery" + name = "Flat-Packed Stationary Battery" desc = "A deployable station-scale power cell with an overall low capacity, but high input and output rate." id = "flatpack_station_battery" build_type = COLONY_FABRICATOR @@ -126,7 +126,7 @@ construction_time = 20 SECONDS /datum/design/flatpack_power_storage_large - name = "Flat-packed Large Stationary Battery" + name = "Flat-Packed Large Stationary Battery" desc = "A deployable station-scale power cell with an overall extremely high capacity, but low input and output rate." id = "flatpack_station_battery_large" build_type = COLONY_FABRICATOR @@ -166,7 +166,7 @@ // Buildable RTG that is quite radioactive /datum/design/flatpack_rtg - name = "Flat-packed Radioisotope Thermoelectric Generator" + name = "Flat-Packed Radioisotope Thermoelectric Generator" desc = "A deployable radioisotope generator capable of producing a practically free trickle of power. \ Free if you can tolerate the radiation that the machine makes while deployed, that is." id = "flatpack_rtg" @@ -187,7 +187,7 @@ // Thermomachine with decent temperature change rate, but a limited max/min temperature /datum/design/flatpack_thermomachine - name = "Flat-packed Atmospheric Temperature Regulator" + name = "Flat-Packed Atmospheric Temperature Regulator" desc = "A deployable temperature control device for use with atmospherics pipe systems. \ Limited in its temperature range, however comes with a higher than normal heat capacity." id = "flatpack_thermo" @@ -206,7 +206,7 @@ // Ore silo except it beeps /datum/design/flatpack_ore_silo - name = "Flat-packed Ore Silo" + name = "Flat-Packed Ore Silo" desc = "An all-in-one materials management solution. Connects resource-using machines \ through a network of distrobution systems." id = "flatpack_ore_silo" @@ -225,7 +225,7 @@ // Wind turbine, produces tiny amounts of power when placed outdoors in an atmosphere, but makes significantly more if there's a storm in that area /datum/design/flatpack_turbine_team_fortress_two - name = "Flat-packed Miniature Wind Turbine" + name = "Flat-Packed Miniature Wind Turbine" desc = "A deployable fabricator capable of producing other flat-packed machines and other special equipment tailored for \ rapidly constructing functional structures given resources and power. While it cannot be upgraded, it can be repacked \ and moved to any location you see fit. This one makes specialized engineering designs and tools." @@ -243,6 +243,30 @@ ) construction_time = 30 SECONDS +// Stirling generator, kinda like a TEG but on a smaller scale and producing less insane amounts of power + +/datum/design/flatpack_bootleg_teg + name = "Flat-Packed Stirling Generator" + desc = "An industrial scale stirling generator. Stirling generators operate by intaking \ + hot gasses through their inlet pipes, and being cooled by the ambient air around them. \ + The cycling compression and expansion that this creates creates power, and this one is made \ + to make power on the scale of small stations and outposts." + id = "flatpack_bootleg_teg" + build_type = COLONY_FABRICATOR + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5, + ) + build_path = /obj/item/flatpacked_machine/stirling_generator + category = list( + RND_CATEGORY_INITIAL, + FABRICATOR_CATEGORY_FLATPACK_MACHINES + FABRICATOR_SUBCATEGORY_POWER, + ) + construction_time = 2 MINUTES + #undef FABRICATOR_CATEGORY_FLATPACK_MACHINES #undef FABRICATOR_SUBCATEGORY_MANUFACTURING #undef FABRICATOR_SUBCATEGORY_POWER diff --git a/modular_nova/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm b/modular_nova/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm index ed1590d71b3..f64ba01c5ff 100644 --- a/modular_nova/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm +++ b/modular_nova/modules/colony_fabricator/code/design_datums/rations_printer_designs/seeds.dm @@ -75,12 +75,12 @@ RND_CATEGORY_AKHTER_SEEDS, ) -/datum/design/organic_herb_seed - name = "Pack of Herb Seeds" - id = "oganic_herb_seed" +/datum/design/organic_plump_helmet + name = "Pack of Plump-Helmet Seeds" + id = "oganic_plump_helmet" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 25) - build_path = /obj/item/seeds/herbs + build_path = /obj/item/seeds/plump category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_AKHTER_SEEDS, diff --git a/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm b/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm index 7e22e231f70..f175a1c9cfb 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm @@ -169,6 +169,8 @@ where_we_spawn_air.atmos_spawn_air("co2=50;TEMP=1200") if(/obj/item/stack/sheet/mineral/titanium) where_we_spawn_air.atmos_spawn_air("n2=10;co2=10;TEMP=1200") + if(/obj/item/stack/sheet/mineral/plasma) + where_we_spawn_air.atmos_spawn_air("co2=75;TEMP=2000") else where_we_spawn_air.atmos_spawn_air("co2=20;TEMP=1200") diff --git a/modular_nova/modules/colony_fabricator/code/machines/ore_silo.dm b/modular_nova/modules/colony_fabricator/code/machines/ore_silo.dm index c06a99f40a1..8a072446591 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/ore_silo.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/ore_silo.dm @@ -4,12 +4,16 @@ through a network of distribution systems." icon = 'modular_nova/modules/colony_fabricator/icons/ore_silo.dmi' circuit = null - /// What this unpacks into - var/unpacked_type = /obj/item/flatpacked_machine/ore_silo + /// What this packs into + var/packed_type = /obj/item/flatpacked_machine/ore_silo /obj/machinery/ore_silo/colony_lathe/silo_log(obj/machinery/machinery_in_question, action, amount, noun, list/mats) . = ..() playsound(src, 'sound/machines/beep.ogg', 30, TRUE) + AddElement(/datum/element/repackable, packed_type, 10 SECONDS) + +/obj/machinery/ore_silo/colony_lathe/default_deconstruction_crowbar() + return // Item for deploying ore silos /obj/item/flatpacked_machine/ore_silo diff --git a/modular_nova/modules/colony_fabricator/code/machines/power_storage_unit.dm b/modular_nova/modules/colony_fabricator/code/machines/power_storage_unit.dm index 7bb15f98e8f..113e5234c4e 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/power_storage_unit.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/power_storage_unit.dm @@ -56,6 +56,11 @@ name = "flat-packed stationary battery" icon_state = "battery_small_packed" type_to_deploy = /obj/machinery/power/smes/battery_pack + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) // Larger station batteries, hold more but have less in/output @@ -83,3 +88,8 @@ name = "flat-packed large stationary battery" icon_state = "battery_large_packed" type_to_deploy = /obj/machinery/power/smes/battery_pack/large + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 12, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4, + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm b/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm index d8cba4dfada..98c270025de 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm @@ -27,6 +27,7 @@ icon_state = "solar_panel_packed" type_to_deploy = /obj/machinery/power/solar/deployable deploy_time = 2 SECONDS + w_class = WEIGHT_CLASS_NORMAL custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.75, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 3, @@ -61,6 +62,7 @@ icon_state = "solar_tracker_packed" type_to_deploy = /obj/machinery/power/tracker/deployable deploy_time = 3 SECONDS + w_class = WEIGHT_CLASS_NORMAL custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 3.5, diff --git a/modular_nova/modules/colony_fabricator/code/machines/stirling_generator.dm b/modular_nova/modules/colony_fabricator/code/machines/stirling_generator.dm new file mode 100644 index 00000000000..c7f242638ba --- /dev/null +++ b/modular_nova/modules/colony_fabricator/code/machines/stirling_generator.dm @@ -0,0 +1,138 @@ +// Stirling generator, like a miniature TEG, pipe hot air in, and keep the air around it cold + +/obj/machinery/power/stirling_generator + name = "stirling generator" + desc = "An industrial scale stirling generator. Stirling generators operate by intaking \ + hot gasses through their inlet pipes, and being cooled by the ambient air around them. \ + The cycling compression and expansion caused by this creates power, and this one is made \ + to make power on the scale of small stations and outposts." + icon = 'modular_nova/modules/colony_fabricator/icons/stirling_generator/big_generator.dmi' + icon_state = "stirling" + density = TRUE + use_power = NO_POWER_USE + circuit = null + max_integrity = 300 + armor_type = /datum/armor/unary_thermomachine + set_dir_on_move = FALSE + can_change_cable_layer = TRUE + /// Reference to the datum connector we're using to interface with the pipe network + var/datum/gas_machine_connector/connected_chamber + /// What this thing deconstructs into + var/deconstruction_type = /obj/item/flatpacked_machine/stirling_generator + /// Maximum efficient heat difference, at what heat difference does more difference stop meaning anything for power? + var/max_efficient_heat_difference = 8000 + /// Maximum power output from this machine + var/max_power_output = 100 * 1000 + /// How much power the generator is currently making + var/current_power_generation + /// Our looping fan sound that we play when turned on + var/datum/looping_sound/ore_thumper_fan/soundloop + + +/obj/machinery/power/stirling_generator/Initialize(mapload) + . = ..() + soundloop = new(src, FALSE) + connected_chamber = new(loc, src, dir, CELL_VOLUME * 0.5) + connect_to_network() + AddElement(/datum/element/repackable, deconstruction_type, 10 SECONDS) + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + // This is just to make sure our atmos connection spawns facing the right way + setDir(dir) + + +/obj/machinery/power/stirling_generator/examine(mob/user) + . = ..() + . += span_notice("You can use a wrench with Left-Click to rotate the generator.") + . += span_notice("It will not work in a vacuum as it must be cooled by the gas around it.") + . += span_notice("It is currently generating [current_power_generation / 1000] kW of power.") + . += span_notice("It has a maximum power output of [max_power_output / 1000] kW at a temperature difference of [max_efficient_heat_difference] K.") + + +/obj/machinery/power/stirling_generator/Destroy() + QDEL_NULL(connected_chamber) + return ..() + + +/obj/machinery/power/stirling_generator/process_atmos() + if(!powernet) + connect_to_network() + if(!powernet) + return + + var/turf/our_turf = get_turf(src) + + var/datum/gas_mixture/hot_air_from_pipe = connected_chamber.gas_connector.airs[1] + var/datum/gas_mixture/environment = our_turf.return_air() + + if(!QUANTIZE(hot_air_from_pipe.total_moles()) || !QUANTIZE(environment.total_moles())) //Don't transfer if there's no gas + return + + var/gas_temperature_delta = hot_air_from_pipe.temperature - environment.temperature + + if(!(gas_temperature_delta > 0)) + current_power_generation = 0 + return + + var/input_capacity = hot_air_from_pipe.heat_capacity() + var/output_capacity = environment.heat_capacity() + var/cooling_heat_amount = CALCULATE_CONDUCTION_ENERGY(gas_temperature_delta, input_capacity, output_capacity) + hot_air_from_pipe.temperature = max(hot_air_from_pipe.temperature - (cooling_heat_amount / input_capacity), TCMB) + + /// Takes the amount of heat moved, and divides it by the maximum temperature difference we expect, creating a number to divide power generation by + var/effective_energy_transfer = round((max_efficient_heat_difference / min(gas_temperature_delta, max_efficient_heat_difference)), 0.01) + current_power_generation = round(max_power_output / effective_energy_transfer) + + +/obj/machinery/power/stirling_generator/process() + var/power_output = round(current_power_generation) + add_avail(power_output) + var/new_icon_state = (power_output ? "stirling_on" : "stirling") + icon_state = new_icon_state + if(soundloop.is_active() && !power_output) + soundloop.stop() + else if(!soundloop.is_active() && power_output) + soundloop.start() + + +/obj/machinery/power/stirling_generator/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) + return + + +/obj/machinery/power/stirling_generator/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct) + return + + +/obj/machinery/power/stirling_generator/wrench_act(mob/living/user, obj/item/tool) + return default_change_direction_wrench(user, tool) + + +/obj/machinery/power/stirling_generator/default_change_direction_wrench(mob/user, obj/item/wrench) + if(wrench.tool_behaviour != TOOL_WRENCH) + return FALSE + + wrench.play_tool_sound(src, 50) + setDir(turn(dir,-90)) + to_chat(user, span_notice("You rotate [src].")) + SEND_SIGNAL(src, COMSIG_MACHINERY_DEFAULT_ROTATE_WRENCH, user, wrench) + return TRUE + + +/obj/machinery/power/stirling_generator/Destroy() + QDEL_NULL(connected_chamber) + return ..() + + +// Item for creating stirling generators + +/obj/item/flatpacked_machine/stirling_generator + name = "flat-packed stirling generator" + icon = 'modular_nova/modules/colony_fabricator/icons/stirling_generator/packed_machines.dmi' + icon_state = "stirling" + type_to_deploy = /obj/machinery/power/stirling_generator + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5, + ) diff --git a/modular_nova/modules/colony_fabricator/code/machines/thermomachine.dm b/modular_nova/modules/colony_fabricator/code/machines/thermomachine.dm index 063a9f07bd5..c620a1f7423 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/thermomachine.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/thermomachine.dm @@ -20,7 +20,10 @@ AddElement(/datum/element/repackable, repacked_type, 2 SECONDS) AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) flick("thermo_deploy", src) + + // Makes for certain that we are visually facing the correct way setDir(dir) + update_appearance() /obj/machinery/atmospherics/components/unary/thermomachine/deployable/RefreshParts() . = ..() diff --git a/modular_nova/modules/colony_fabricator/icons/kitchen_stuff/griddle.dmi b/modular_nova/modules/colony_fabricator/icons/kitchen_stuff/griddle.dmi new file mode 100644 index 0000000000000000000000000000000000000000..46cde00af6740e52386d78eaa5b8ecef1625f768 GIT binary patch literal 840 zcmV-O1GoH%P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DZMB&B_$`dBrz!`H9kKrO^J&$C9|j)C}qgSnO2mTn+jp$(2z&0 z`uKvxqLN}Lj?7P6`DF-9#wpBy<@4g2eo4b>8901&RYr{RM5Se(;U6_ zdYAN?yq?JiZPHxG_wGybX!0IH3JOvqL@Ke^d@B+e6GGZ-ejvlBh1%Po_%+gq$>Z@! zAqHR=hW$4bza;=xMHHO4p!h8T-rpL+3~=It;@8?Ah}wg_UKWBsOe*6OQ6c2LxS;sM zF8!o{5&+r&Xea@o4SwMpN9{|PAO#rtU z5V1OF`MKT*WinZmUYP4@uiibNLSfU^2E}i?5gMcccsxv=n4O~T55aF;OpcC3ThlX% zff?}pR7ZRJ2c{9*JGG~@=J~|{bV7nCM$-h-SK^sYgF76RJP3LX=HXp!iZ<5*d z8lM-xR{Qx%{*~#DXQV>ZqFu5ys6W1#W%<11*_S7ODVI0P^;~x!YZ@*XG^7`R={|rpfXO=qJ_smP62vfqN&q+KH|U72Xiy2@mc2ouu1-k^K>(EiZq6^2TKpZz zB?)1eLG1&2IX|-h-I5T78NLG-#p0Qn*wAkh0(5N9cb;HpvQy9?{aHYI0lopz?*j)0 SW+#UL0000_u~ud>E54r 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 literal 0 HcmV?d00001 diff --git a/modular_nova/modules/colony_fabricator/icons/kitchen_stuff/range.dmi b/modular_nova/modules/colony_fabricator/icons/kitchen_stuff/range.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1e6ed4cfa73c4fd6c2f5b89f16bb6aee2ecc8e0a GIT binary patch literal 1771 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 literal 0 HcmV?d00001 diff --git a/modular_nova/modules/colony_fabricator/icons/stirling_generator/big_generator.dmi b/modular_nova/modules/colony_fabricator/icons/stirling_generator/big_generator.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d8cac6292e23603062481d3aa3eefb198fe4df23 GIT binary patch literal 2623 zcmZuzc|25m8>e(9U7Fi<3?Z#MQ>JGBKj*2A9WJy^kHw`1Qj6oVRlR~y+kgbd; zOA$h4X(-#Zj$I^6wh(49nPFzUNAKtMdEd|H{o|bHd4A_Pzw>>*-{(1>U(7jcGwD4C z_K1mzNt>TBu?1}ocu{u$0N&#-|0NHah%oz$K_*x5mjiMBK{&r_Vq&2W>>T_93F~Wi z{w(f{nuUg1cPGQH?EKMQ)a0il3`^BEvB3C**SaWMR6pu0{J|$`6V)DWSM>UDg$e?N zbd8BaDOD8y`ZzHTRibk2`2HrHCi`D$v}jk2dk?9Z$rmL(4t&m7gu82A*>wSsE8~dC zBx`EdvHaj-Vv?ceCMWDeA1pt>+_68e(2DLKct%|~`E^ocWB$AOP_Xu44T%^D3^nDB z_M_XMPi(B>Q=ZuLbbLLhzHis3#)yGN&8og`dzP8ll)yx>bwKm4Vl*R|RyT6yrs zAmr=#^h5r#-uz}{?fiI#!8(3r%wRsd7C)C~-#s!y&sl4(F;!CIjK9n{RcpWSwy2zNfzKn`u(g4qjP1h*K|r!PV3bT>##E` z>TmQ9^yS#nTzu5(-5SsgBwMD$*O#DPmVe`N(YSsJtNhp#WzrBQ%W1{Fek`-vu1Wp%I5)oE*tD*ci8hbFRuNu4<_@zoxdHPIi+Pxy*6e zGL>+=B5UIhUsn8VIQ3Z98G)P)A3S#0!^ATf~U4d*AH{# zVPs1oDcEBakA>aN92;CJeVUY)S_@ZOPaOTozO{+~xRU7uF@`)GP4h2SaX5*aP^=YnJ!$V7NEZ-7lWb{Q>)?5Z|84d>_)yyOhz}CUYGg# zN!}>(^-$G$3CakO@*ecQ#j&=g=`52;q3!z0Hfv@@}neH{?yR2{N4rA|LO?j!*5qI#F%T z+&OPn6L~|nGR3RY!M0l%;FQ7WPqe(4Z~~*+OMcVEEqt8LnPX2Rr{xzZzF>PgLj^5t zj=re(l7!+BUEk0un-+)+`%HAZO0<<4{h-=3XD-mtk#8oEl|b+C4BK(L6#vwBMh@I5QDU(wkxC_k};1z1EP&UwnxK$ zBHDlmC*#;t5D82Q6oB(`i2;BD&zrK(^L|9FSK9D|48ff7Y@e zplQ@QOhSC%fUgUOV-9}JvTc2kf#~`NlIrv`8aneofWEQryeS^e>K|cGkV9yNupT*j zD(v2;I9hiUyp}>J6D2ST&Kui`H&5(f*Agqc+SFz=U0l~TgD8e z^8+*u#J1czO;>KNe5}&}{VY$r8;%7oWs`K}0a_(25gL&K>p{>Jdws7x9wF&EZ!a=D z`XOS(&FwDhY=njwkc@DE;_S1V;x<6;5>a22yRF2#xqj9^HUF;+->Qz=oN9n(eWwA; z6!?SMIkCf8-&m`h+59x0Jl6>IY6G=EbcOV(9+v}YLFR9;CZ6~WfD4GE|7rw*W$=-xiYKuy8pR%kqNCNv(i(JWCVDfs z+)+Dt*VrWjN*_rdYgec#P^PRZ0u`{M+1Sm6^wvNH>k6=^<~tZcGKZE6E=RTH*JyP> zcaucKk2~`D$m6b?ZBWlBfj{xj7sV}>CCWS|w`$)~Q;Mmo22CMoY%N(fUV)&+l4m#F z_nkCoL3)6-ZZ3dAj@szC9B0a}dUoQs;`WV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5skkJwC?_*7U5Se`C9|j)C}haRnO2mTn+jnoE4cc(fK3JfpEw(L zfX(@Y0008zNklPe3aYza>LZY1!M1+ce#QX#9 zhW-XoaUn$O5Xo5tVFYgS$HrO=*(Skg*QVF|?wj*CbKg1lz9)V#j@*0C`Mz`RdFP#} z7!RHrHz$N_={n9f>NcoG^GToW zkApq?on3)Mt`QSxA3|UQP&N|#9`UHDjiF0dnlsr06wFPEDAjuX<6sS@`s2-yD8CPyS0qaDW_pwKCCz9Fa=Vix80>pquj+YS%4bVDaHV Date: Wed, 24 Jan 2024 20:36:22 +0300 Subject: [PATCH 37/62] [MIRROR] Moves the curator hat up a pixel (#1653) * Moves the curator hat up a pixel (#81046) ## About The Pull Request The tomb raider kit is one of my favorite kits for the Curator, but for years the worst part of it was the hat. The hat singlehandedly ruined the entire kit for me because it was digged into my fucking eyeballs. I am finally fixing it by moving it up a single pixel Here is pictures with and without the hat ![image](https://github.com/tgstation/tgstation/assets/53777086/c2b72c79-efae-4039-a90b-5868912a5e3c) ![image](https://github.com/tgstation/tgstation/assets/53777086/e10729b6-3e46-44be-88af-778f6cf024f7) ![image](https://github.com/tgstation/tgstation/assets/53777086/286ac522-cc82-44d9-9f93-cddeb4ab04fd) ![image](https://github.com/tgstation/tgstation/assets/53777086/af78b6ba-dd32-4ff0-9afd-769bf9ae0fc8) ![image](https://github.com/tgstation/tgstation/assets/53777086/f978b21a-0114-4aa3-93a9-d02f7bfe832c) ![image](https://github.com/tgstation/tgstation/assets/53777086/b867083c-7499-4b7d-aff8-6a009cbf2222) ## Why It's Good For The Game Saving the curator's hat from digging into my eyeballs, bringing it up move in line with the detective's hat ![image](https://github.com/tgstation/tgstation/assets/53777086/82c69f1b-c396-402b-bbca-9ed58e1f36bc) ## Changelog :cl: fix: Moved the curator's treasure hunter fedora up by a single pixel. /:cl: * Moves the curator hat up a pixel --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> --- icons/mob/clothing/head/hats.dmi | Bin 16037 -> 16032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index 3477cb1820a96e3beff92210fffb8552a3a252be..0fd0de8e4250e5eca3c3f83c2d6db758879d04b5 100644 GIT binary patch literal 16032 zcmdUWcU+U%wsvfT$^beFDhQ|q5d;~PA~hl^1OyZ*QllawAWceWNmO(g8%Su<1?dQp z-V=&|^iF^fLN5UlN?hy7H)aG zW78Lp{3ZhJ^?B?KC#e)ykd2%qBuATz-(!=JQ3laQPVO#k$z&tKmEMQy#m)&j&QriM zwg?fwXX%XCu(b3?dU0&qx$)xnzn7&~))?B-!p;-qB-Zs$4&?B)D^XL-+EdR?7- zi%WmW@;S@hUEUOW%%#5TpG@{WP}^6ytR^q{_^j{A2v<1TSbFdMlpZgz#n7-+UU*vz z`j?ZNx*roq6d=YgmNlX{XwM+@n^fAq21iG}*WH4Yvl&+&24PJrkTZw+ejUUdEeLNr z*=zU=jjE95dn$Kqf9!^icipJvLA=7^r_WoluL!Rd%(OLv&!j6A9{I}Ao$eNbj)hpR zCA?;Z998ssHSR`|*OoGh)4l)NVk?zJYcF^0R|(rAZsatSM|Y`Zmaby#>^byUx<}^* zVdyCgz9OUB(;ap9Amly>bP5E$u4Cq(xIzr_KRQd~u9=)lL|^^xX>j%MX&re9Q0YCz z(-N|8O@!}Qe-=JuW|n@`P3umHKD{vGXz!URDYLcbXUN@m3(GD%v3aWI?{e|L@xxGk z{hn8kPNO}!oO_RlpYHaZ?z**##1)*kEMin`Bj=M_$5P@1F3KJ~C@W!U>-E~1P?kSh z>Y7zDU}kP^>DryFHCheFBnMF{(<`u6NA}vm&=;x}&h%ILy815k=(rKe%&lE=%MhGO z4?3n|>Y(?naEaX9f}!!+Aag6L91NCefT`V#SERpihSUyraM=iGmlJ^;enO+(hcY&Z zScVJrBLnliu;Z1**G;r4U!@?vE2u5};yKgW*{NLUkb3(^`H|b+U#U()I{1{$ej6kF zg(T(2%X|B|8thrdnUg+-PC85u}!;rMD z5G0AADbJWRr8r`>A(}PPz3-daKy3P+QgJN(P$?UoKD9y^95{6ybk)}Q%H&@9La%PV zO}Rx&m^i)Z7;GUAgYBD7LAg63pxDhrc3j{!8q9EokhvQvDW9B@18=g8HOIvXv=oz) zO(H7ca@UpdjU)HH^A%fTB@&tF-3fd2I(9EqpIYLpUFp444Yyp|TrmoCGp)hxSzT=u zO8EL!UO+tK2z)-$Tso#pVu(0rA)l$L6&IErI7R=t6hp0N|~0h})!giI-m? z55Md8SDS>ThgjB{&Ky)?lFN(Iu3>75`XZU)X_R1KCrfoC(It-FSQ&bf1cz|azm#o^ za1wkujD!ZdjJ(Tq#dirb8yfhzbW|8>LAc7HO!QGRp-=)6>V@Zy?wWXezF^B*MiQF5 zbIG=cKD{_eu$FwDBWKCoD0A4ICSm7n$vp`$nz{B&` z`+>)MfBqYXr`-8bUhm#;p4zZ&WQ>$}FIbas_QGhnas2TgCntX3XF#5|?=+9FM?5-H zk+e`Zde)9lDsY1XdqF6Hthm#pkZD=&LsWN8TO3p%GHzU1U;_6(d4}_@3G_9DLw1(y zN09SU42_m{>Y;B7_~KhMC)_?eQqD^7$(+)Jqo6R?2&XXeQ0@4>+Vm4z0GuoMfjHNj!P1E>&EHR{zK~D`4P`R-?sSV=70)gwgKKaAiJBO;bn6)64P-dYrdpWgm)F?k?$4JymB<1s7 zE69RdxSv@$h54+-59X>J!7c1+lgO4?hisO*d*`6+apQpx`&%eZIIRe-SFJ>{eRXGS zRk!v!?s0QIKF>16o-+Ko^L5~61XtP8e&ZcjZ0VT$g@Mn8GloLO2&h2d>KD$EA@_b* zCwX*XYjq7Dq|NOt#lp0}RY=owN8jeX;LG}Od89>xc)w<%*sjWpbEzAC)jL}eszdjz zSc#npV5?M;l6=0y)dR<}v4kW`grzfK8ldZ>P3@!eas>qWJ498b@24tYMDXRo-ovV9k~naPTYj;Y_sPNJuPwS8(-r1RsF(liOQP&;QM+ z{|EEV{q)$Pfe(Lt<(Rmm^XVbWU(}wma-79FgUt8rUOK(N)Y&{tD>H!w;JmQOs_XMu zhF75d9%| zrP`)+JIymh+XY@mrFT;-+|nfZF7owiZCR1j79_jvzoZ=fHDZP;^q_|>wj_n?d1eVQNT^X3}$S z_`S9e*h>DxZKrzkSbCl&ZZ!7PAv@Bf6T6XK=u*c}T1`d;4zBD9n8O*&8TrRRhP_Can>_L zV{N%#J9-hp0%x4yc`C31l*I}&nHt6}CLix!B5m~QW&)EzZf*vtZ!d!pt7W~^E^Tub ze;>l?&qQY7POc*Ki_1g!8PsK#6g>F6d|n|S7Bc2_!=vJ-I#q32`J%#BWFK- zQJ-1JK5_v*|A5xlADjpA-jpj2-cg5Ba64N82&*`Zv|)_D1;nr3CYKSdcK_{L)e8gu zNoQIKuPX}osm4g^)K%`L279^HR)srZ?#w-xU1t`I^&HX7^q;=QPQR~TTRFV#GV>T& zLy%xlL08_v4Cbc?3aH!9L{7^b-Kt+q&2))%$@ObpYzdc097T^Y0sCOm?Gg|PA)KIb z72}2d)E%?Qq?D>@dpyUpHE0y}u^_VB*cA9Bp2=1e_3@#G;~P~zwang~uT*(XmqNwH z1!7*uuDfG4&ynZ4F&4Z_0jr_UlH_&mwZZf4h1%8=}{waE@$^O0X*WJ6Qn2~Lrg&F{Y|K6qO1$k|(~Pr1hc zgU@acGDis1oSB#;Q8)>z?m^SwJ7Zsl4tJ`yHwERi#>nLWllXAt zT4EC^Cuk#V@aJvxomkBr@s)uMSYHLpxUW;g0-x}%>lj`RU`)T|xW|;5(05Pl31{KP;d-*vDoCTnK{-*=2pVI;ckvU$0stT7i*7z=E{*2pvm;ff#`wHWhA-~ zKI9lZiD1$sc8ok_$tNo%Gg!M1mJG|cRJ6wc#?q|bH*^mXDhcSjeXW0O^U~3kU}dXb zOE8l7$NSpfo{{~q6&8kc>;WfEvwUjIv00i-o zQpx>IIJZeFp(D*EO5*D2OLWpvS?{`|@EQP20yt^I=xAZq=VC$kviUx5)j)`=Aq^L45Fz5%=uyRVFMq0}*7q=F70EY(yMSene|C3tY%JHEB62X|pfJUN*5E!m zp8$4yOFdI2i{8XWis#c_etwUJ%cf!7x2v_UNs28Iu9ucSKw%EoCE( zlIo%!Ui(!DwB@&blgrCPPsVNOUj6s06*__0u-H#g?!s@(kz%4g`C+kf#g>(Hr|y$; zLF{4e+%^^cb>xM_0Fx!9+or!0v{y10Z=x?P!`75m5`=g(*jdLMte*-{ZHJ-6)ZZF5Jl-~+pR>Eg&Ch^?gJm}$Ou0VmQ4 zaVy0S6R^a^V%m|BQLtiung`U0w3wI029^jm&S%~LkQc7;1BfKw5_R7L(YT|_K&OA*N~s=3~+>BB0=B7G#$1E;^_fh*Y^ ziC4b&OFV{@HS0&X#iX~b{{~%mBOLosIi85_Gi^y9s&XLYM$(ZL#&~TyUw06&IN)X< z0|P_oGuEOuDm6>%X^M(;5jRf?Poah`fpc03oYFm4mtQhw{+y5Mqn>%KTANvju|3^N zXv+TS@!zF-??Vn8h{fks146-bo>X&zRT}7uvfGyf9)U)H0$X@ozyk6C9Up)3r`?tX zXYS#Lnpty_NUE+v4RR}=KYpv(yX(e!*MYs#2$XCw|kyi%wO&gF@;1&Kc%OK z8rucM3qi)x^VQK_BJ9~L(;C9@;WH;_8^sW)DLCn?0x9ArL*^d2>@3M;36Pfs` z0)4xZ(IoDT7~!(!J3LzwS1#nf89QFX+TPmz1CQjNXm1M!NVq&3zsd0VaK7^+Ef?%; zxqYpZYyUbEmAJxzznKdrmFx+3pn~)x2&?vkDZf8>sg|o7mZtmXUAW)ovkyVb{?W0J zf^DH+SJSZ$3*TF!BO+2q5V5Y0>z_a)DzA`VwVT^mWb?oavzT*jMN1!m>}ODjd9^`| zTp$e(q|Ak((?eyJ@!wz;PpIRyZ!W-xnSeti_nao$(Euk4SX$b75EB+TL!4SdQb$8O zY9VbsZYHskWs-_!F|iAzS!wdeUUN8UONwVR#Mb25&cIb?hQWa0;A~Uw1x1V57ZPc# zXChY>?baJ}nyt3PyP_+=oq^x3o2o&Rz99n2Yr>$!IHdMm@YOpX?%XlTFA}63B3j<*ObvmibyNkv z^%6mbdP`q`RXxUV0^uG}@XCPzj6(Bxh8MrQAKy2x|yeVa^$Bpx8) znl+2c0$iiGdCU7eXKoGlRh!vh8RcYAL)A}TMPt97yGDCkfhPA zOMJbSbsh!x(l_+%mf8oi8Y}7J$8iN5>72U+7idJaVsFcoq7!k^SqN9fk|^h!uZT@A zs^uez(4IlA!*)SdIW9z>ww|*vgvx90rP_-~JGNn;(~1;?+v&)atgimRBKeDe(wXHC zzHED~A7F}n>(^br=dcm6aHwZk5vA-mJ3oKsI58AP#i`1CV9Wcf9Yf+>Z+STncWe*d za&&a8bhvTjM%8p|arB6E6AQHZCFPUxi6pTB#q*>br)1<sAERe&Q+~Het1g8#>TpG_H3Yk8#2F)QH1^- zHsHlJ@ka`;{D?Vv@by$+{j0SjMi~1R)#HltJKtk(oLgXq zF4c#h`b`XZ66wzEglj*sew?_VU2vWojtuJlfZg};^O9t)5R^$;oDUprQJiC!+Hdi@ z5Tu=%ZLH3k2#Aop|EN8#lJ;E6GLiy{ij6hoDasgzebk4&Ad#q@{v)~qFL(a@SfI|+ z>f(jcMf5YzZ|%-i+g*GgB>C?+&|Q7fJm}JkS@@3MTY==WUi0Kacb>L8c0(t!k6IGw z&{c+y5g{|eJLrzAf8;Qm`M(h(H$KXCV`5U?-R_}dL{T3i(!X%C!YSJer|%Xm9D(+| z+{fwQ4&+>Z5B9Cy+zMpxcr8j{2T*=Z?Q`jOjr}B1TO7WsX9LpMPE-$lz9Y`Hh&88= zPGc>^68mE%RD_@UD(=<}=I()->eyo`6%IGY=+jkuZvR9RM=fiK+ofpOwRLn{a0 zb>ciUS5_bhsXY2*>q=cX)0Eu=u}-)kTeXlcL%;QIC|ThVH9SaScVbhyCB}hR*wD}&Z1XClfR{)#ND@Nv zr|;jbw>V;R_wC*nnXjH>fB;+%a?+v7XHib}S!uO@YP!RjaNiOdE#TNq7&{(t*5pN} zWP{=BI}4!>w+Ll!#1@9HzNJHXy^!tUguXuXt08#cN3fFwrCRSTTWc>b_>5>axwUZe zx(6yWi1HDvU_bn=3>+O3a~yhrgoNfQD44l9r;^)(WLc41eOZM;_F#*-=gu48gIhk8 zzqCO}pJ{u5bU1%1Pf?RvpJQ%gojr4bkF~(T{0R211aUbLl~7k1Bjv6{J;ro75k6Rv za<_$PS-#-04_#zleePL@CDArx#v3g)EyZ4HoRqIKH&1!uG-BMnq^4}jU*&I~rzZEK z-Q)K;d8Ce~$bG2w_VPiZSIe&^OZmZmuW#C`$vq$`Qb@a=6Gd6GdaXFv^JBC4KGxLgWg&qKSxD{z+W^>e!HZX zyxcDSTry0|$<)-;jEEh_JUka@{FY%Xv2GZ|kHm3tQ;yz!vNF}-5P+9< zYGic!E8oG6B@ek_mo!(yzj^wHq8862j~Ja1;2Yh#xaDN*K+5mPv_&9PK-gMYrAix0 zZn$wm3Q$eicg`y0hk#|P!ncJwHZpi_6CRFhYdZ)vH8;;lwkdqcriOf;hb&Bc1VM*q zXp0o>E>evhu{v{0g{y-{&1NV+uAArwLwgZsR8B*zged{;6OP;IBuGQW@CE&UO8)w$ z`e*fSXLb4I5w{LsW-e0zsKU8lDF7|326W@l%y zNjxSd1}7cycq(b1@+ym{MEpJ!b%sAe5^#ANl0NL8GwZer4q~V`ixW&MI?H)=)vhV3 z{7xalUwk((8>K?!4E;k-4EF!Y61=Koj|{o!v{qc-=4AO~Ci=@u_r}@1hh+N*;_#0B z-^8fq=H@ELy^XN|&OuN)xzV`*Er`oWWA6kMZl4yna7UZ-vdn9x>KBKuDLk7`H<;RD z^<3I{yC_zvVOkMs@{2+Z2_cqtw=*eFjRTHulIl}+4JD~y7|Xg z#d(p6%X7-}Z5q`cVHVoeY4sZb7-dfi2939bCaAcy57pc(R|7udA$e`x_&Tr|xw&#g zo0P6ku)aR^CnhVF2BS7BVJkUogD!N3uu0%nAS*UhHnobaUYIZzU+#ISzCwR zbS;N4p8yxAL`aJX({}iLca&qdg~(gpPi?D>flZ3^<{vu|In%yd^Zu%H{KaX}jP&#h z2Y_AP^V(AZZcyvZF)8b9@}&`rkZkH45n6M1N~t z>?a};aRJp;a3iR}JIan&b!sH|2BY^`!zEZ?w#}t3 zEslYH2d$JVCzP9qQbh+U9*t{*XeGq{~m53Iazyw`A8^hb=xuL+Ki}r z^s=08PpD8#<&o|8{{ZgEv0Z-w7v0k==m^Yfw8Aeb(PpCS6WCZ@hGN~wE3(%k&RW|_+lc)BV2v-d3g*|Q@1C+VA+ zQ9}puLn`ZS-wy_ILex3&?K}on(&1%jKZ>`9R<*;r(=LgDfD~j*Y+96C?@~Ce8avro zBj=SoHfW%@Y=n2zI4`=A|726Ye}J$SIz1L}e84Ku&7pA~Hca4&VC?s8#59usv)X

03mq;OrH{REIJprqotKFbopl^qG9OOR?Jp8+d(yFsJZWQaq7igJ| zwMeIgMk{+enl@Cq%+Z%(-e2x5m3C%#Syauun8ngo*Nwh(e(quc8ne;EV*{CLrA(x0 zX>=kI8Gg~D0txdx+ChA%N*lx%5z8luEl#q!5HyRFtun?>T& z=|=Umke1UTGEt9%7;Ab>)ykLKaT^{z^p@9H59ZwUuIgTdZ46Bh7U*AZJ1c>b6sE?2 zXJVAjm*1t=53m^8Hf;S>+B>Cx$Rhr>LK6i5Oj zMC_=&qxN7IDZ}KNgCvp3&r2HbaK)=Fo0Go#fr&XjbTx=L)f08-5JUVqUBkxtV*{ED zdx7DxWDQv?)#ED0*hjpkWekcqQ)_qWblv0NRlo@7+yP6E3I|Fn{1cabh5tENOB-ie zSsq|RUE7Xkww9=JSg3`FITbFFKak_Fjo8_zpa>be-(j`$^4{~refQAGFuSz&XSMl^ z9WweA5?8UO4%iu5am~?;ry9pW4G$LK2rhs1Uc>HvCxTf(&1oT3NYPUZ$90!QQ0vII7^&)RuWm6@SiJgBBo5 zZAOoJZ|>FN>WHH{9eEr)8L<5T*ixcRH{cgwA`@6OStg_VuGy!)W^w+|C0Y`z7NYi&P!y#LGq*T2aJ``t2b zVH6z|D>+m&2HEawtmt7FkrI#cB=09F$Rrknm`Ny%qfCpZ2rrdUOBuXClG`qWkMpZ# z8UWejr=Bluu@W)C$#W7Y4ej$W;1$`9eoS+6Gl!uA1Z}jn@~yYNnU-1d46g@P5oaOu z-DRqwOt}44(PErL9AiPd3-)Q&P{_kr_E|Wtq38^>Z|Lnq;zqOdKd~=#(+J*TF>k(A zwjU7OecsXkt>Sg6%}u;W!R7z>SH(kj_uqPIBwKW7yKp}c*XiJe0NQDD04X&Ys-GyV z%pU%iIC4DE^wB>vu4c!R7f0T;kW$==2|)TndlUwye+H6{mG$(gP_5SiqlYigB?i-L z`*}ek2%O{Tt1r6bCiFT_x39<6#Pwf-%F?uo`cK7M`|5#sQntjgwu|9^_*XY8Md#ZM zSlHOE&mKSy#NIe6oLS=4(lDuxnCHBr``r5njH&;SH=?RcM(?2>W{!ion4n?hIQ`T= zqj;hc0D8QgQlEc-%tMn0$p`s2N~Y@+^qp>@75T4L+au^4$;|9i(oFyf8r5f+uaogH z={tB7CMxRa$_b#dTT29XzxmyHo%uG59R?e51o6Jx5|ZY5MgD_b%#R|0|HLty^KVN_ z)9$@?jH5U2^j+4vi*nuw${4sIj&f^IS7c{l2S{U%m2XW=OMKg<0p;YOBBy*>sHJkF z=d#wu)&1F+g^E~V_aiX_-!P4DSPIYQPA!mjeY5MK);GAHMAaW;YWah^4xa$ztWLEN zvS;tVry}*=2e7m}t9btRVBE7XcDJJS$L3{vPHR~vkWF>%c7&TsR6t%_z zCfhTe0yDv~ff7H#&qlHRsuoeE@vN;cLU}&S&W+#%?&l@a7Q6jDn66Ql*Y(4BK8!Wk zh(l@+wK$wOoL++V`3SJqR@Sj$uJ#}tEBKHH=po~HmoR8P5TE854^8MD`Mk63)bDv`a3wjT-jW_#yDFR{A?1_3(8n&`Wo)>a~;7sK2x$Zhg; zj+1cr?X9P7vcK)!*}v5`Iz;>(wNzD{sf!#p8_r&Qd8bDX1l)WK5i3A-*_IS9F;c+~q~uHEez7r#L-5G+Jce_xUry zQ*GDvw=_R&k>CbQrddzYLix(tmh1wvuy*+NFa%G*a6!J=0u2)WI)hTDsBR}~G>>j6Yj$x2v2=MbSd>fsU#N`V&jauLN+ECOH=wR<%P!p8tB(Z-N zU09q^1YCu_uvQY@X%~}sPWpyTxzg8ufF$oQ_nZI?EL<%9&5e1B97`%4{{)NIW&fD} zp>WTsW1E?Rw{=oMSfE!4^{PnjrRjk`^PPeC=MGM-6E#zeYf1T%-JG4BX<^PMQp10f zl#9n@v#E-=KBJ^jId`G|r3>?*nr&VYVLcuV(eCtJmPh{kw3aUMZ(vqrn@< ziVKr)DUrVqkzA!`UoFv)9UC4*zb_+2h*$~4PEG~6nJseF`w)!^8m6SW7F_P7YH=>3 z!WGM5yWUJIKIwWmv-+?;1QPZGU?&KBf^*^&2qba_7~en5YgYX?4^w9{Yo4s6=gfT? zux6~4ksk>leRTecKg&%L9)cI6llTlp29FcjJJ(==pZ;b{&f%mF;2c&kip=$I5I;*_ z_(CTx7Skv-)#kOXvB~!?wUlqefdlUX)NHhBoJ!7$G*A}N)Pw`|7+Y0`0xxXAc&Q=U z>~5`1w>IlJh6Sk#J++Ct-2(ed7TNV1x9Z=jGrTslW5~#97{K}4?geke+XY?+=cj1p zW`J`D+X|&$zb3^j!_s>`x?^b{s~?BP^-NiRSSr!e7=OPU`cl}}C_dz`%#gQ%SNM%f zEd90O$q%nLhe5x9Y`l7M!v(MhkalorMgw zO)jgoJX*|9D>r=mwEC#kpF8(n{gvkaEYx5q)BK&4ETBs=KSfT!`p^lkYu=DcK!aFv zH|m@!{*eJ$Lb=S&v~cIZuGBHx%h&kISj{@<^x38i<|Io}pKCoEu>Xf$apMB*LEv0e zq_TRk;iJ`hx;4Z+@WxuV&KOWjbh#DM@$zHW{eN%j_hmlLgCKV?pwvoD3&gji4lcShU>9p`^fPq z58?7O(JyK7*5=~(Rxcb!?CSn!G`U(|(-Lm2Rz(EZA6f*EgcO51LUe=mmCx{yV~yPq5MS zGCUSxLm#9hQHHUI2c^)JMMJhoK0L=fuXeOFKjO9L8iKj@@B|Q*fAL_csF0lXRtB*{ zlhSi{@SL9(a23mT-}Dy$ z5c#mK5i&M(tc7>`!uh;7u2j$era&X=q|cr!mu3s%T&(HFc&vi(K>@3eGePVunG?Pq zGH#?VJ>e4cQY586@;x{wNQ0f)e-t=TkOMlT%O$R*eq8L!cvqlkbIy%)?5?r&T1;*WV-SUIu0?vKQD9#UTt-ZEX+N6%?x<*A zXFs#6)da0l!${W9ULCkA-MSHZn>KZ%J^aSGG7exkbb8+sC(T5~V>6hQv<<J@45++o#9L!NffUlrOi2MURha61Uq(W8^<+5%)J6EXUnZ91mcW0DfzKA!`QO= zb+IyrjubvBy!7(56*h^hm=O2K{T#tw1{$LJAp$Irh)7)TwkNlre1!8Z?L85pVbW4V zutG<1n)d`gD0>qmIK>fv4tV_5C?D$qy-ZP|efHU`t!tMbKS_G5@bRX8eCbuu%O%FX zlCT9s_L#E9dt=GW2S+p(##~MMKFu2seoFNfJ&pQliJRw&IvtWV%;)Wc(0>>$pGwk} z?@MS=hpzyqR(-zOX)U#LwqDIhrLuDYQ*{cktYdn#mopg)>hvkY%ov-ui_c3>9y)&Q5@6@@Z4{tgUk%+ zPheT6_hcxG%^-~l#7pBIgW&eI(Zw+;N*XHq=ojb`Uay%uU~IX48@1ebNh_ertStYg zkQ*UW%sR%v$snhke%nu{aGqYQS8C?sm+3P%-^Zi}W)~RNjw_`nIF(lWET(O)5SHG^ zBtQ9G+hyRK?_%HVA_vF~4b?qu0NTCc*0_tCf`oRN1-+714YFVaoGMYu`iPgN=}1aZcsm6A9n28mr?@4l<(_ zwf(~E@obqgYOl637NkzqP4S<4lN_z6pa85bPswE<`JAA=A z(7w$*k~uf{x*0c?45SgMF*5$v)@UCWE1{fQa`J-J4yf@Gdngo&t_rfpnXk#e))q@| zD7pph``ds?Z|HB%H?<;tBMwK7dhl9mo#ZgK^< ze5eIh9LIeg1_=&Y3w^#?I;*YKTB6>8yEI(>ICLKMYZLqYlMkyaLWL*adh=`6b0uoV zB~fY}XO7S|S%uV)E1a;XZ3cO(vHaLBkk=cw;iC)2>Z`k2BtQOrTFMnT^#7)|tSk%a z_#x&(A@($-&(4X?FI`t1N?Zb@!yEWF%E4UVp9qpZLOK-2i2z+AYj+^(F3SPLODS|E z_RM_hDY8l|Q-|^K&r#mN&lol@66`!aT-dxlY64V&szT?!vC#w0?32zDGoRb|>>&#h zFLM!ux;}7@*+z31&{wE3`1e&l4e?&4qzNSFWdZPeZ?cnk-6hC7=I-ups!*%q@Vj%X zCg!%|=G$&Ds#`wRQ7pmVowMr255xGjMCq?LWB%$L-mKuu|CF94D^iHVZ-lO)T%| z@TdLK9p%CIqIiRay@D4{u(zKj=l~yRTg9Q%IViOj#D(_IkW;LrJR@LQ#1`2ACny>_ zYC72teg5;Sin$|PQW%?R&q|G4n@=J@T%m;~2EOb!)u zo&FKPRQ%ZYsit?GGp&)4@jC+8(*z#Wdk7vu?9V~_16ghu9@;%{EA%71y1?)JUto4N zO-{AEEFt~tNQZS=P3wdPwwsNqDDr`Ldo1%@3Hx!;425d{roBblFO(~ zoX-q}`|8#w0Dv!W;&bm5^ERQgb|LPKr9ZLgc1r6TH>8onIL5-A-b8s~7dhb?phW8- zUAf4E?;0t?DXRIFrl#n0ikIpk%nF~j>AS!RhyRc>OUC~Uvl`cHrg>9V2N5dzuN@=y zUICLU53i^jxMmLdxUM{aiQ-03&2dpTs3C#DYT5)sJ1=^2Qe_(+C^6qoPH1 z<&5WtLYn0Y}0T*m*VcB0BvA;3YXDhSSM=C;(TJrm%Z}Hjw`s zSWe#vDNJla_3W12$TrD9>BpUrZp%4gx1`7ZALGj8?ia;djMg@@l&`mZBL|F3dpk^` zH#YrYb0CoCjNuRSVgP5@uiO``B9|1iapeUSTa7fVu|P3r4+xtKoNVPdYNcPw`F3SF zj2+M)C@n1wB`5zF7cFJi>ABnyf`5Htmy@nIu)dc{w*Mc)omjY$zKgl0VQTj;Ip5^( zqLuzDvQ`uh0|w86;`SUW8B@ONYC|`MOHv7@sXZU}$@?4CQF-0@0geG02NsaVQ zKm?@s8Xy8ffIvbEfz)@#wa-51p5K1Y$Ggt`lFSKn%sJ*5&%Zp+7>T%Jq<7-D;BgKP zjuVhu*G)J$4g!YEVYsX1HLHfsqGD6+g6se+Aj0JcT*WW z`4Hip(1fJqdvbYV*ZJA9jYa0ygcA{jl7sR@qLhcl}1RZ8xyt{VDl-%4b*Wo%` zv3B0_V4p9MoN#&Q`Uhjq`)Zt}Yie?0kEHyCW87dUBgw<}G6uXQEXF3p3!}R_P)CG! zb>F8>%7cxbt%2g0s3#$)h|C?%uTD-}Vf{QrsT|b@Ax$PVh@U5iej7!fE{X0E9yIVl zA!{VL+%E_mP2AS@ZJx3`J}$rV;p1N7OKh0DnHDJYT()xQsUoKCLO(BL`i13YN*L|M zX+`gsvmQ7(Epfvn-FsmcdzrMI?rOK;t5JtU44uac$*zsm$_=!=1CyLc_Uhfnj=4i& z>(aUd{c)zp!S^^g&Tv4kYnuh8uFr%7nvG5}H$f+jAZH$^N`8F({tQ3wQ=6j1lhLQ! zs^6TKA2@#g!UdBzRq5w#vZ+%hZyx`?$>+NH^xSH{X{ilYg?yE;M&*aYZ(mDDNZiu7 zd=g@X0l#WYx_!`pey#BZfmW+f^3Wnxqu(LKd8~2#@a^MaI&V7oEbZ=3Re2N!tWU|v zUokfy9i1w7j@~8C6ynoE6l6-g#tv(bCuT<~)P1k;oUsv6_q&6w@`z7JE+~eE&e<|# zOKQFf4`+oJ6ckp%NDk%}7OREmrXe?UFvMGSa*TXD<=NSfjnlxYzZG0Dx{!mmT zcS2OdN;714BthP`;!&?4A0OWem4K$u=eg^eBp7r&Sj8nje|4y`@W=_l>~zhL0_Xm8 z_N*$Bv6XJlRqm6YH$K1hni#{&`KlpZQ zxZXG_`vt7g8Rjr=GC95BU!k9%j?{KkLo zZ#;aBeGZ*={REz}U{$$EC39kGMi~n*#`09Pz0#%kYRxfQU@AfEMgiJr%>FUp^hWc&k4 z@RCtXlu(QOxIK|THF?;gIPEa_Q5t-G{LOl+A~#ZV_&TzpxXBc|@0&g5ImGj{oI@?Z z1GhvFdF)$Ag7IpP!}y!m6w=J^)amB%*}@wSdGL^t%Bq%L9@9nJRPvaukP2<;g)iM` zoqaa!rqeWn+#O_H!Ka3#2a{J8qxd{8j9`&)14{=Qw;RD=D~BtuDZ6>;W9bci9f-KO zjz|BZhU;U|APx;>|I|*c-Q^<-oEfAM!|jA%tpmN8O%j}=t#eUO6rPM-L*RDSU=JEg z<%L+{kOCKE0e%~oN}vturp%D)!Sr|JIdev#LgUD9#1whRn^}ayw8LFeR7H(@9&>L# z@)&8Zz(DazQW}o~MN{dr;Lcfy+tzW7eA3PaZmGF&0k#VAJ^5|ZV2EJAeDWRCH@D!m zK?iy`PRRGylxGxuR!oF75 zK#a9mUBVn+Z;7U&cqW0!zmE>AN^Yz<#Z!mS&=iJ{Q|JayIXHfNZ-X8>%+aiK7>Iqj z>%hm~c-X0}@>G0$;FRv8QKV0-d$HI8VGz1`lQ zjsa5|qeH-miDINBOXyGvS6=iM-4!z1AEre5Q!O9Wv|lP6rjscJu4SdeZg)5wBKPf% zTr+B(oGIu{3?q=e>&xM2WI(m+DTeB6wb#U!ern$h*7aRiM)tke5=i9H7bQ3=v3-w( zeH(Dzql#mz6V5$0E)p)2dzFHXKb0XvMSr%25&#i+M~*@Eq%qT3#pQ-4JG4C74oQhi zo6DEUR`@hil-*l#m6$X3i~FNZho3D|dB6m*lIZwDO?l5K%;9pa+~UCIA`IcT6W9$H zY%N7JB=+DnmL};R5dEoIh~9}hlln2u!st5V4Ki2rF)`GR(_AoQOaAB%ZaWIH5}G=d zEg}z@sw7$`WzqHoulErxJOYYCEY_*%q$o!D>OcAkIND}w?u~#j#BLu=eSb{?z85t} z>eDi(aSy?*U#C(_=>>|AtUTk(*3M3a+ijK9&B!2i(oiE6(sB~F%5J?Bu{Ih^XseQ%7z0k=UY;rUt`Gr?4iu>qZPK#Assn zu~SkXvebVre?FxE!{6UQ4Tlzj9mn*`-RU+kA`HIO5MaLKwmILHJ{oPmk+6KoiRVMn z{0VMlhrC-`0cSnkTiz||oqR%U20`s?(Zo}eh4E_l${J?lg@PY^Kka4pG2`@a`6>b+ zhj;Ev9U*JpEPzG!a{RQ6fFV$H{@q9CnOLf*Ye7Iku4`T@g1+36FW*^=DQxgMp(7Y`0g2O*f4y`4Wt6ZkIRi)Qs#U@<;@ ztHo1gI`GXEC5OZkOK@@qIjs#`Z2EJlH7UHHjNCMmm<@aprwvSO@}8*|=tfE1{_taR zUy*A2tZTcFTn?MH>?{T;6PdAov&*n6z_*zXfrqh{Mlnx^7JtI<1==8y+QC_17SKg= z2GEH=rC+K>VoWIs>xI9Xt?nxZnSiG9@tACHN=CMA6}mu0AWgBv{H9R>I}*QbtDhX_ zX_ns3{S%_!{a6vAzPl#}8Nz4q=NE)l8+}k8PdrTTY;cj1&w@8nQD){%wkQokYrbs0 zwg(0XY%axB5Z1U&h<|zBl1oNhdUWQwVn2GUPylVZ^t3bGCn%^K3n0=FK|KGBG6ChRrMXbS%F2Ir@Sv z+R|$h9fuHDNiAd*)oy!Ia++GB0o#C{ErU8jYjx_if*f4Zj&x1F`z$YOWwLV4>d?&B+$?ar zP21UZjY$dm&U%FWY*jBCK-dIpEkSsV_7b!0S)^0`%O|Zvl`dbd*r|$^fV6t`4mEH! z1~D>%x0Sc4Ugyx{1tJ)-xVVVQ?&>-&LIz9UGMNTFgMv6zVTpY+=yJyT=lrP^1aZ`2 z=T8^gnTNigseLm~K2<*WlJQ4t?0OSIj}D9FRLZkfrEW zS-%jcpPC)*CRN)nyrJQhb*to^m!5iD_Lx#p;lW1tJ^vhM?k|29pZ->p^#ZgcT-_SE zka6+;b88Jb$S~9UM;rPwrUmJ17A_1KnpWagzMlhG4)7Zw3lUm=pXtUSMmvT%Cyt$Q zX86SZY7Je(|1iIGUhO5nApHKG#OyE2p+*f z==LXKrmK2%V-YXMUcmlMBsZW;!byAKfMk6+c>p-!{vG)ETMi{v$PvT2v(Bmg_`Z5g znM>=TaHU7ZeuVzyOFa~7Dcmf+IPoXLPIWtd%;jVDy(su<@9r!d71R;v)wL;a!O=%o&)dPiHZ>>a0| zi1eVnC@(l;SxX{c_ogMphn957`*ogXPjF~u%()IZNc^HC>L<2TQP}r|nq*E+6r|X{ zqsl^>@Zw2YNysX1I@^u{jaTC05>P*PhvBmajYB4``uqH(Tj~*Kz(>a+Cb7{BH?F4> zoTSd*`(<))H;#LS8nTg#s*b$t$n7Zy=GVpZ&;h|fTfzXfWpgLs0Di1+K5?Boa%y%j z`KF>;@vPk%^=A-dmU!)(LZ~dlxAf*LwZJQKAd}w#OfWzV>pD5zXheHiY27$fhuJg)dVf{?+89D{CCxUvVylYN>vOUsR$`9PuB;{UP1VD^K6Q&!A%I9x z_qzoX&;+l79ta>HHv5GO5<%5_b-4Q7`@Xp7%YL-s#qjkGZXhtIu%HNbJZY*hZb_$& z7>mIx?kb4|Pc@z*n*bwK&>d+W^f7$7DV1};fIYNVVJFo@FZT% znR`V*;Q4=FF6i3&!+xt(roHgwhIWmS*h_J4Xg`#N?gQif8uxcG6^l_&;hIy$!}k=A zi`_AEG&3_TEIOolonmh0yL=CIUP&>-Jv9tBHyvSsBJPD51@E(hrdks~h|CEm8W5i9 zl9HEs*%!?pJK){O`D6N7Bf?EOXQ%$V2rm$ktw__QeUS+^V)!BUJo{uu?#M7jH|^vZ zNd1N5r{OAfeh;$OHgIu4b)0l+ahe2VK~#lI42{;0o{k8t+ygzIeePS*G9ki&scKH6 zN+*ooD!_0qlSSV9Z79eEaBqOqruHs#4Z@ne6ri8C_3ZK8GkL9(!Cr5nFcxYg-=i}7 zJJDdLa<4lH2J{3Fr0I5RB1=oBO%lV z_)k2hHkIWFtM+CI^&fm{h7`J*ET*WX?R5a8`7P?oRj~-31Me7HmX0t4LgD!!e2>fw z@g17zf1c<&2WxCUo%pJE4cdFh!Xg1=VP=*MLaG@g*_$-*a)7B3D{+Ih+KjR-k>I5j z>CoEUoEKo{ww(Lo5cZ6tb_Vr?G*iOohrUFVh<6tAVG}J?S-6sIF&L0%S1${k>%jT9-|!CM1l-qCOg2C2eVbA3U;mt~_! z=k#AgDFeC0BjWcAE`ALUG|n!#Ii?T-;`n7K-oE{f;tS@q2iI}s@yhr}6Dt9WQSETD zgD4m5QI{<&yylbaSxY#((4jM8#SlzewuM8eE0x2BK8X&l7kRm;+Xd0K#NhAQJD}p( z558-aIbl>rmT#yU(?wSFB9K27!0WG5mNeV}=edYyze8a=)JKo zWD|HB?9}Ba4zWjrnjFALyRFZP69jEPd%F}4Ay*ntg_lal_DOD84s0rYBW6*jN#YQ;;mxN#aFk<6TY&15? z+AEv|f(4b`qac%RsN)Bu7b9RhULyvhJg<<}z?r`D#bfp1@O+<|x*c3G8XU0MxV$b+ zo>Fs^gj~tF-%q+JbV7`4?=G|ev!~}aEO|qqk&&J5GB{NpwwE_)858ugJAq%Q!gfT|q&C z2JZpW+}kQHE-tP}m=FZW8op!SOLBwF7l||J;T+DJ>!SoKSkadaUmXA3M*=7kQ@+u$ zJLi9N!s<)gx3Rc$+8<@k{%~98pf86z-cD4om%Kp?5RiZGcl&2)R6@EI>FaVmv>Ygm zYBG9EkEOg8V?2550?;;XkIA#*>MlfY7AcjHmxnxt=W#)NmgbltITJYD_ki^jbfJHH z*{8j;39F$PL54nYo^UfTadC-=iQ8C6%$^$38BO3XC}~J612dxIhD>Ila2?K$jL%a; zU#};+eWXW{^}%;ArLz~Bs6*SLsWw2U=o5XuL=#zWdcqUAH%MY>u@y_nGVMv*%LsZE zjVMTQT(x4Y@&kFINtLU>&652B+k&`IBcF$%*+{r*DrZf>s_FW9>|Bs$-c46+fqu6u zdYnP~C)!in6p!{Dl!M5o+m`^*Ky+#3>sJ{6E~_WGMr&h$IKJ3AV(91hDUq+W$D`M8 zpgz$y%c3V7VLH_r9h$*ZiC8nUtR7ivy<=NHTrPI>COb=Y;`$ia7OoFbtKmM)6CSU& z^$;4sfl&2Kg+L&8{b|9NH<`<7GE`gbulNUmtCk`ZxkI?{Ae&X9L|E&6&2qo|Jl~5U zyTam-KK>fNCwD!&`28Bvfe5$WoG&|qNB+#of=?cJ(uX9a!-Yb7lVWo{JH(83usrX= z(t2&TlKq&+I5_6#-CIF)1g~hzajIsZ1ke8-w)-zdPd4$fU+n*YF2v+(o$C@=h2QZ~i){ZXC+Y^+08xa2s>|#{24wJ{wuIiQMP{6^(5SZ)M+@`$2`NZFy%jS{Z14?!IunR4C@5?Bustty*!jTw z>`$MH)5o{7+UJz3_bIl(D0GtuijRfHiaahZ$suNt7r#*ushn1*1bH|_T!VOjawt(b zc$)W*UB)~Q$0XdhV!q9Zx-Fzw?>P6wN?cJS?Mp6C9xz1!n0x@waS5#koBeg!2@ zrXYj#uXA7U@X!kH7gxPH-F7~d)0UPe7ZrsRVdn}8E|{B}uXw`M9T5-%!bi2lje`yBY8n zBjj$=2)|FXy!s43F~ukG1JR5q`hn?GSlG8HLy7zkh}@<#d1gnzE97n896kWn0cvd^Zlt@SLpTS%tvaMTfjCiBr;c-A zW29kEU9q7Q9>_S?0CeyF2UgIG7nCR=mC;{!##z(T!oXF$Xx(cw^WIWbxu=gEGz7dk ziNoEhysG6x`JO+k<$WM#=6C0RBH_7b>*C>)GDFzcUi)f$U#cvo>Mh^Y9-;$Btp}Go ztT`lB!U`_Tta>*J6cqSb+a!0G^Ay+iVsOvXSyl)rQrosVEB=U#Tt1VhxlW`wj_(?n ztv_gwi97?TKwDDf3ECf2HrNgw$;e$9Mw{z*wVXQ16Mn_HFYB1c+MTOK)`b8Ibxj_G zwMzsEUP}d$4!kfPF3VB8vPXSmnRr2%C!~o(5l*~Y9O$2a(?O%8W&Fr*T83EtukGDw zuYtKD-#3p>mA~bD8>PtI+}YV_V^?n}L*r#q^=ksqQWDjgJ>`Emr@2;^`n!<}3tTIz z;}_7E{(_#gv@{{?rmNR&m*OWL9^(DCi$3B3)S+v8kaxy2Y>|4hE*)Ah!lXznn0w=6 zA8n_+;dGAsI|pPoj(kFF$vR^DXP-szeXlwN?A^h~UhF_&YgbhH_QlWTJ5#S-L6P^p zqyZ7M{{v5X2c)P=XO?jXzSs|tTE2SPA^(!HzTf`@VArhD`oCu#;TQPgrsJgfdIeqT zc5iu$C5HZPG4_`4FBgxt)#$rEo{;SivROfKCGHQkcB@2ReW6Z@mAKKb+kMOco{w=} zR34_RDO0>>LFTS1?j^rKGXOX3g>l_1^Ys(U$m`k433qH&nkFcc(k?)TLI@OD%5KoV zP*?uuW->Er9dN(`q_MYhEC=L^60pJ!d{{+#t4?U9!wG@}46s0tIgw29-t>f+I3TPH zd|ARUM)sZar^inLiUUAn^8P}u%`dk&E-&i*Z>22P3A!9*&et%9jeIgdP7{FQE4X)C zfofSddoMtk3V z{nE%*!pV*2wO#*VNzV{Po&sa#^8PDo755Acu!Hp`qFj8yO=y>MMn}_#Bj#MA{pGXG zk3u(QsSH%Xh^1GJBQcV6kwx?7=YRx1aLDoTqEyYE+P*-J&G({HSOem{9!v)R4!vWG zM&-6~K-93Y%~{H!#{ES?6H{N*Ck!Pv;aM+JG!H%d1OSnloI)JTA{H&UCN}HtS7Rg8R z?uSnq!m3LXv%5v9j~Z%D`4Q>t%hNwtPW~VmpC;Z_6}Ip^7kTv@FsQ3kHwCr;;=gzE z$|{1_JT*b=`#+^EWiR8v#&_@Q3&G@sONL>h8%I0_#!$4M7q9{KyX2}7G1uG^ zmOK`xZ+t|t{Eg>N#m+YWB~k)t-KX30DZV`|++d_zjF%!CKMtX30<#lZ4T#?z=r@uh zie+x_p9Aw}0<^qL)$T_QjAxYZ?RKjFL*ptRAB}zE|5Uu@l-NkNM*eX)`HzG1vj>3q zQTc~2KiKKY)=RG>yk-31e_<^_$W9S4VfrC&{gPu}B)SQfOk${VKb7DsISz4bT+e)B zeoHW!;PS53#dDif4Lm#nHx3=BGCR$_A?A!K0J5;F=;3`)#pjv51c?*+6O>30$4)O~ z5Q9wr^fm4((Mr`WkEHSbOF9n_!$l4BF96KmLbjBjs={XBz9xbv4ismoTU5?{i6hwa zqRePk(tNqu=e>IHCz{4oq;CM^CkR-|-P23?UoIMBdEK?ue}Qa@yjsZ1ylBlSBLh4_ zcuYn`Zlj?}Vi5zRs@d6(`vFQ>UvI*YuKuNO>%ruA4Fer}4@R>9>o+u!6CsDa_J7#R zoKIG^7v7j#C0Kj)C~6KXku6eivN;L>2v3a#t$@in%v^Aposf-Nsp6Lbg?sAt z3UlNr$J4N*z=_ps_Fw+y!}GN=#x{O!Hp7Lc3ACCoMYm$pLGm*9?XLh!Peuxtfo#pi z;6^DCzVHV$xQ6gG(XfB#HXCKBm^0mpR2Fqzd6<>048T*&d}YUWiTW#FTcIWX30Z}? zTc*Vf_lZyn!;y@D#Ij{}WQTy5K~d7+bvsMkB3-U`JnvaNRSw;r-&0^JcmB<85`w zi+}me{Vw$$WZFN(kY=Ml!a9uE<%qUd$)#iuEfxUuiZj8JHfco|1jUE4SxeGX%T-vM$#QGN)TFoWg=(+7sB{XH0KfwxVD>Sk>GDm9@;Rw!kUM;?gvDCMJ1LF7m72h5@`+FYw=f?o{;!AKE6WUJp#m^{dZeKh4 z8NFPS$me+~!7m~Y?!H=f`-Y6nR9Wr)wDgrEcFZg+8hvZ;H>lY3&4(h!gB=krJY;b( zaoaC_AGY_w=*C%hdV|CqwnYWby1X#*y4VGn*1H(BUgXa#%y>rD=l0K^b1lrd_#3!y z;&R6^MGTVh?T<)F(oi4P%g2)5+gU%-C^eHfHBNu{c4da~SVUwN>ZO6lkyZzlUg@Lu z&)6ky%)AbB^t_mtT`?jEQJYhTpWG%_dto}=XRA!3H8;)d{1*`1AJvXhVI1z1jmq(q zWr`>(3Dc3dZh38<%AH*P548rXjUUnfo6+gpd)oK5YcVa*&A;pj_$v4>bYgRjuA+9j zqFzWwy1pd_A)YB}_B4c+b-Ma~8F}4z6Ey-)2a}N+b4IbjJA+hWMN+UAQL|vS))Z-@ zfvw&Lwh7Tokc;suDOdB?B_V@wjmyq;ikfy{c$Bvm8n_H)X4+`muSNTa#)Ip^&-4M= z0Q9d4%X;Sa?UpTdiudm4gjK|_ZBsAuyvq2usKr-0O=JC{qb8`4b$Wu0&6rUnMbYf> zEfr|+cl*Yf+mF4|+Wn`p*1c}_>9%auN%d-*oIm}BaE!ZS`d%uh^pq?J$Ul3EP50ZK27O%i{d zBa%Al4-{iSWDvVD6Ax5oMt_N^LteDl^uF7om;BI6QSU5WuEhz`4RibSa35d8+-%}qN2~;2 zcgD$+UAs6r7nb`v)8O=5j4!ThD^xS_HDbqXzp*kq)8 zM89ynoAIHlK8JTyoNQXIl%s@sKUO^4>Tf@derInYbz)`7g;8qIwexeuWO7VUv%$a6 z)7|<)noQ2@tnMUdn>P|8)yTPl{%JoIL^CA5!Kei#){SSYEZVje|2qz#zhZN4Dr(5Y zO=9sSVMn`X9M{BGV?gBN72Is>xOHRr@B&jVD7l4FH_mOJ2{BRG0CtL$BD@qSE!-omkxBeTp}`IkoG;66>hnb@m4PjoyuMjst(s z=7#^Wt3r}%h9l~BZDHOAi^kzfFW)d7-6iRL2iA()+q&x5s`b0edeOknI0|qsksktL zWDY-!Pe{0+qB34Bs+0MCWhf`o^StdD5A3NwxgYQxOh(E~5EOqQH6>kT#IIoX^CTE_ zcU)e1)vWPuHLqM{E@D7aqAUPl7X2q7dslrO=&w!)EkzaE)ecn)oOPb_cA%$4Bjm3W zzrvcu)D6d)O^ru0aDlCf3%p@EOEdw8&twut%=)RYmKgF5yPymdA#rmQvVh0nryGxk zvLQ|3m?abNvgjXo>mdiu#HF}B=ryP?n z8Llx3sbKWp665S9gr>Z><5|-AZ%ERZ08&JtDwqt)%;vMa^b3%5%+VW)TBUTWmk$Ue ztle42g+``4yv`*S-$CkOZNjOayT$Pk6NW>m7V|M;1jxkQ0H;nN<3D%x7OzXmxQ%&t z2{V)4bk|?N^j^jV#P-9T3tVPE_UrsTL(^k4^E+lm-24yscd5w9w-UaNlU3>v!3OWQ z5-vZA7UGb*e?XVc&}ItX^}Sxx5ZQKchL})=cvr)$rHE>;X)q3*+FB{oA(y+z%cFtk zH*{vC1(Gl65|n+Lly!!B_J=-X`WMiC>OfcVC9|G>)QcxlCbaPmFjTt+tf2k3;^CwF zN?e)Kc1k)ij-uPs`RbIqSY`JITq`^GV`eqRYTYa$F#`5@5&(6*g4TZFekI z=*`ljY#ETODKg3KXEy;;zDMcoGRr8s?H@a0XfpV=KW@7(upiHUVZ)`3{tr4;M?Ayla3h^GrgRQpJtL+InLrEs9>zZ-)ch-U!K%~Scr^%%4hgEo{ ziIxyd&?*3#TCXeE*L{Z5cB#V|%#nMcBcJcC4&`*8O;56FlHV=m@utW^T3?+Q?uwVy zlozWfixiK(_ausBjz3RkeMDoL@!%go`R;Q2t@cDR=Gpq)jJ#Kk{nzRXb|H%q-1VDY z)~WxEtHkdciuBDhxGMt}B7)E3Lsv3vCH)5t_r3IKtOXYiE9Ff`afn)uitE}tUPA6B zud7ZZLHX{A;J8clNV%D2)p#eN`->h;oeyBE!KpE}@|(QlCqX}#8l;;6#AKtq2`uc# zijqi^2_MQ&5b6(+;8%Bbum!NXPdFj+w<^u4ymoG(M0140&{gTcunqG=SsNT8X3P?K{#KWZi3CPD@@?U$Yy$R+3iocn~pV^ z>92oQxr(n{kVXtSpepVgm)h|4$N9nRa4JNpdS0gEP(eX^`vSwr@RZWBN5dhYY5@EAhe* z1jzSp({Ys7bhoFvQ0sUzWTq{jmEzT;G)AuHz=`mNLn*+KPdvf?kT&jF*`X(2EPewo z{pWL0f(pB{05yv1J>!KIi-R1D~_B0vnO^#fy=*2RcX{wLo)_$r7%Rz>9M@%<)Zf7kbWj^V1=*CyWCT zx_~e?>(FukmxS?7?7`-phRmfVvi)rv&k}DfV?W2S`soIp2KZ7y= zDa&4562$wata8oh`l=#iw$x8wpZTZGfPfS|c^GDnlIRryjj3kPWPmylWk4ACIe~g{ ziu{Sx(`Nh41fb!aN-r_1WQllJ;zVit{&entTxDdXX|yUd-47igzaXCdy)srO^Ukz! z!M~A-GO4hLTvbY1ey%^suhRCSfv+veQu}VHg4O#)tWMzntP>OB5cQ?TK2-LOis%S; z`CCQb=6yUJ*r3A#w&t+t9U>g5v0y-{ek5(JpL=42zzN`M9EZCKL+g*G#^R)9O;IDP zV&7@B)Bcm+A7Vl(I|22gsY;T7t;3cnvY|o0|M=@>$Uau}0-csH)$s6b%LxzrA7^2lziu{T-W`sMA9&)w z=vHoMO*4_H%$l7@#YbiAK|&xyuQc0S%{5GiW`Nof2R>uF|JQqCMDQ30=Ft24V119m z*%jgfJVo}j;ANI=Y06Vp)V7yOA7%#F)g)@j{)yy|@9p5jhyV6+&}Ybjd%?4Jd~s9- zDS4G~)ePynORFk4(dSwSEI}nv^!aB9<3~u17hFI|)9W*&yZ1^TeuQHADfkvp@-*~( z@K2KjF=QUWyjHIZZe>*qn<5ty&jEF z&KqrY_p}qdPTh@9vBesii~%l0jjqI(2s1~dICUaM`w4)*&m)HIe1(SM=og@b%G2~JEKd-p$Z4_KLLvnCqYIMgeh*;S`9~^{EFoM z>5f!nAI9%zI_u@_50`FUeufcQiu^0`w5#W)M9D#}HCNw@soF8v2skl$i}9}x^H9ylTiBgahv zK76KwcGdE{^1~)C(t)#9smOY7Hd>7TRiZ>51BF5Zm7pzvJRce1%pno3 zuc%DQ`;?TFX5c5ndT+cc4n6t0>K(EAf~xm~7x*2XF}spLgW#K#Mk@f%7Qp?;#go9e zaQ?y=CwEzB{i%|F$8}y6DZfXr!O&OL9it^yK2X#RP(!%DJBmG*n|fNDlu$kIoUp4B zE*tHaP}$GQqfD8T2J`8M0ssjy0v3~1Bar}sEl>2E?(My08eoyjyj=S|aPXd-^QM?G zv`b@EX+_NB(ai`S*PG+iyWs!HSfcR0KjfJ3vdg0Y3C>9P$C@cGC@nT9%_gb=OK|&t z_>8;1jd`m`K>i3YUytpoKQi;mEo20re}4?g(L8<%#-aLe%+IMw+pH>)y;z%(RuNen z+Y2iOl^QMeb(T$6v2m4(@g|_vcfCQxy@-s8LuU&g1W){0&k+ zfE}96MtVO#P2MY|AQlb)C2u}J#sB`z6fChwxdzknAOR@Awj7WfM%PPp?mhqi0Lr?r A9RL6T From beba0dc66e46a256ba735487286e1ade45c546a0 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:36:27 +0300 Subject: [PATCH 38/62] Automatic changelog for PR #1641 [ci skip] --- html/changelogs/AutoChangeLog-pr-1641.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1641.yml diff --git a/html/changelogs/AutoChangeLog-pr-1641.yml b/html/changelogs/AutoChangeLog-pr-1641.yml new file mode 100644 index 00000000000..a60b7438983 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1641.yml @@ -0,0 +1,10 @@ +author: "Paxilmaniac" +delete-after: True +changes: + - rscadd: "Cargo, and the rapid construction fabricator, are now hosts to a new source of power. The stirling generator, operating something like the old TEG, creates power from large differences in temperature. Handy!" + - rscadd: "A variety of special kitchen machines have been created for the rapid construction fabricator. While they might not perform *too* much different from their standard counterparts, they are easier to move around and can be printed whole." + - rscadd: "Three new crates have been added to cargo, each one featuring a bundle of frontier equipment. In the service tab, kits for frontier kitchens and botany chemical synthesizers can be found. In the engineering tab, the colony starter kit can be found." + - qol: "Many flatpack machines that were needlessly large have been made normal sized, meaning they fit inside of backpacks now!" + - bugfix: "A large number of flatpack machines that were missing custom materials now have them, meaning they can now be recycled as well." + - image: "New sprites for all the new machines and whatnot made by me" + - spellcheck: "Every instance of Flat-packed has been changed to Flat-Packed where appropriate" \ No newline at end of file From 18ef712b553348740048f3031f2acf2dc69e18c9 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:36:41 +0300 Subject: [PATCH 39/62] [MIRROR] Fixes for Oatmeal & multi-result reaction termination (#1654) * Fixes for Oatmeal & multi-result reaction termination (#81039) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- .../food_and_drinks/recipes/soup_mixtures.dm | 1 - .../modules/reagents/chemistry/equilibrium.dm | 39 ++++++++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index 7a80f291b87..312d3731864 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -1228,7 +1228,6 @@ ) results = list( /datum/reagent/consumable/nutriment/soup/oatmeal = 20, - /datum/reagent/consumable/milk = 12, /datum/reagent/consumable/nutriment/vitamin = 8, ) percentage_of_nutriment_converted = 0 // Oats have barely any nutrients diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index c07c349f893..d2a037f91d1 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -84,6 +84,8 @@ * Don't call this unless you know what you're doing, this is an internal proc */ /datum/equilibrium/proc/check_inital_conditions() + PRIVATE_PROC(TRUE) + if(QDELETED(holder)) stack_trace("an equilibrium is missing it's holder.") return FALSE @@ -95,7 +97,7 @@ return FALSE //Make sure we have the right multipler for on_reaction() - for(var/single_reagent in reaction.required_reagents) + for(var/datum/reagent/single_reagent as anything in reaction.required_reagents) multiplier = min(multiplier, holder.get_reagent_amount(single_reagent) / reaction.required_reagents[single_reagent]) multiplier = round(multiplier, CHEMICAL_QUANTISATION_LEVEL) if(!multiplier) //we have no more or very little reagents left @@ -108,7 +110,7 @@ //All checks pass. cache the product ratio if(length(reaction.results)) product_ratio = 0 - for(var/product in reaction.results) + for(var/datum/reagent/product as anything in reaction.results) product_ratio += reaction.results[product] else product_ratio = 1 @@ -123,6 +125,8 @@ * otherwise, generally, don't call this directed except internally */ /datum/equilibrium/proc/check_reagent_properties() + PRIVATE_PROC(TRUE) + //Have we exploded from on_reaction or did we run out of reagents? if(QDELETED(holder.my_atom) || !holder.reagent_list.len) return FALSE @@ -150,8 +154,10 @@ * Generally an internal proc */ /datum/equilibrium/proc/calculate_yield() + PRIVATE_PROC(TRUE) + multiplier = INFINITY - for(var/reagent in reaction.required_reagents) + for(var/datum/reagent/reagent as anything in reaction.required_reagents) multiplier = min(multiplier, holder.get_reagent_amount(reagent) / reaction.required_reagents[reagent]) multiplier = round(multiplier, CHEMICAL_QUANTISATION_LEVEL) if(!multiplier) //we have no more or very little reagents left @@ -160,14 +166,14 @@ //Incase of no reagent product if(!length(reaction.results)) step_target_vol = INFINITY - for(var/reagent in reaction.required_reagents) + for(var/datum/reagent/reagent as anything in reaction.required_reagents) step_target_vol = min(step_target_vol, multiplier * reaction.required_reagents[reagent]) return TRUE //If we have reagent products step_target_vol = 0 reacted_vol = 0 //Because volumes can be lost mid reactions - for(var/product in reaction.results) + for(var/datum/reagent/product as anything in reaction.results) step_target_vol += multiplier * reaction.results[product] reacted_vol += holder.get_reagent_amount(product) target_vol = reacted_vol + step_target_vol @@ -181,6 +187,8 @@ * step_volume_added is how much product (across all products) was added for this single step */ /datum/equilibrium/proc/check_fail_states(step_volume_added) + PRIVATE_PROC(TRUE) + //Are we overheated? if(reaction.is_cold_recipe) if(holder.chem_temp < reaction.overheat_temp && reaction.overheat_temp != NO_OVERHEAT) //This is before the process - this is here so that overly_impure and overheated() share the same code location (and therefore vars) for calls. @@ -192,7 +200,7 @@ reaction.overheated(holder, src, step_volume_added) //is our product too impure? - for(var/product in reaction.results) + for(var/datum/reagent/product as anything in reaction.results) var/datum/reagent/reagent = holder.has_reagent(product) if(!reagent) //might be missing from overheat exploding continue @@ -212,6 +220,8 @@ * * seconds_per_tick - the time between the last proc in world.time */ /datum/equilibrium/proc/deal_with_time(seconds_per_tick) + PRIVATE_PROC(TRUE) + if(seconds_per_tick > 1) time_deficit += seconds_per_tick - 1 seconds_per_tick = 1 //Lets make sure reactions aren't super speedy and blow people up from a big lag spike @@ -306,7 +316,7 @@ purity = delta_ph //Then adjust purity of result with beaker reagent purity. - purity *= reactant_purity(reaction) + purity *= average_purity() //Then adjust it from the input modifier purity *= purity_modifier @@ -324,13 +334,13 @@ //Calculate how much product to make and how much reactant to remove factors.. var/required_amount + var/pH_adjust for(var/datum/reagent/requirement as anything in reaction.required_reagents) required_amount = reaction.required_reagents[requirement] if(!holder.remove_reagent(requirement, delta_chem_factor * required_amount)) to_delete = TRUE return //Apply pH changes - var/pH_adjust if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) pH_adjust = ((delta_chem_factor * required_amount) / target_vol) * (reaction.H_ion_release * h_ion_mod) else //Default adds pH independant of volume @@ -347,7 +357,6 @@ return //Apply pH changes - var/pH_adjust if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) pH_adjust = (step_add / target_vol) * (reaction.H_ion_release * h_ion_mod) else @@ -386,9 +395,9 @@ to_delete = TRUE return - //end reactions faster so plumbing is faster - //length is so that plumbing is faster - but it doesn't disable competitive reactions. Basically, competitive reactions will likely reach their step target at the start, so this will disable that. We want to avoid that. But equally, we do want to full stop a holder from reacting asap so plumbing isn't waiting an tick to resolve. - if((step_add >= step_target_vol) && (length(holder.reaction_list) == 1)) + //If the volume of reagents created(total_step_added) >= volume of reagents still to be created(step_target_vol) then end + //i.e. we have created all the reagents needed for this reaction + if(total_step_added >= step_target_vol) to_delete = TRUE /* @@ -396,12 +405,14 @@ * Currently calculates it irrespective of required reagents at the start, but this should be changed if this is powergamed to required reagents * It's not currently because overly_impure affects all reagents */ -/datum/equilibrium/proc/reactant_purity(datum/chemical_reaction/C) +/datum/equilibrium/proc/average_purity() + PRIVATE_PROC(TRUE) + var/list/cached_reagents = holder.reagent_list var/num_of_reagents = cached_reagents.len if(!num_of_reagents)//I've never seen it get here with 0, but in case - it gets here when it blows up from overheat - stack_trace("No reactants found mid reaction for [C.type]. Beaker: [holder.my_atom]") + stack_trace("No reactants found mid reaction for [reaction.type]. Beaker: [holder.my_atom]") return 0 //we exploded and cleared reagents - but lets not kill the process var/cached_purity From 97b4c23cb768284b55f775190169fa37048f9654 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:36:44 +0300 Subject: [PATCH 40/62] Automatic changelog for PR #1653 [ci skip] --- html/changelogs/AutoChangeLog-pr-1653.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1653.yml diff --git a/html/changelogs/AutoChangeLog-pr-1653.yml b/html/changelogs/AutoChangeLog-pr-1653.yml new file mode 100644 index 00000000000..12f0d258a2f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1653.yml @@ -0,0 +1,4 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - bugfix: "Moved the curator's treasure hunter fedora up by a single pixel." \ No newline at end of file From 4fe21d39161203752cabb0418b05fdbb405c83d6 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:36:57 +0300 Subject: [PATCH 41/62] [MIRROR] Removes all nosmooth walls (#1655) * Removes all nosmooth walls (#81037) ## About The Pull Request These are basically impossible to implement with wallening, and I can't bounce map edits back and forth. Plus honestly they're a bit silly, and barely used * Removes all nosmooth walls * Update spaceship_turfs.dm --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> --- _maps/shuttles/cargo_birdshot.dmm | 7 ++----- _maps/templates/battlecruiser_starfury.dmm | 11 ++++------- code/game/turfs/closed/wall/mineral_walls.dm | 10 ---------- code/game/turfs/closed/wall/reinf_walls.dm | 5 ----- modular_nova/modules/mapping/code/spaceship_turfs.dm | 4 ---- 5 files changed, 6 insertions(+), 31 deletions(-) diff --git a/_maps/shuttles/cargo_birdshot.dmm b/_maps/shuttles/cargo_birdshot.dmm index 4706a71d082..a0cc7901c18 100644 --- a/_maps/shuttles/cargo_birdshot.dmm +++ b/_maps/shuttles/cargo_birdshot.dmm @@ -69,9 +69,6 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/supply) -"t" = ( -/turf/closed/wall/mineral/titanium/nosmooth, -/area/shuttle/supply) "w" = ( /obj/effect/turf_decal/stripes/box, /obj/machinery/conveyor{ @@ -247,7 +244,7 @@ T X W Z -t +T M J w @@ -289,7 +286,7 @@ T R m i -t +T P e I diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 672cc444fbd..cc2abc8c5d9 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -5791,9 +5791,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"ZF" = ( -/turf/closed/wall/mineral/plastitanium/nosmooth, -/area/shuttle/sbc_starfury) "ZK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5974,7 +5971,7 @@ cH ow ae ae -ZF +ac aa aa aa @@ -6110,7 +6107,7 @@ cH Zl ae ae -ZF +ac aa aa aa @@ -8014,7 +8011,7 @@ cH vC ae ae -ZF +ac aa aa aa @@ -8150,7 +8147,7 @@ cH xI ae ae -ZF +ac aa aa aa diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 23e9a2cf775..b42e194ffcf 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -270,11 +270,6 @@ base_icon_state = "shuttle_wall" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/mineral/titanium/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smoothing_flags = NONE - /turf/closed/wall/mineral/titanium/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS @@ -332,11 +327,6 @@ base_icon_state = "plastitanium_wall" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/mineral/plastitanium/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smoothing_flags = NONE - /turf/closed/wall/mineral/plastitanium/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 3172e5a9e56..20926fe9d32 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -253,11 +253,6 @@ base_icon_state = "plastitanium_wall" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/r_wall/syndicate/nosmooth - icon = 'icons/turf/shuttle.dmi' - icon_state = "wall" - smoothing_flags = NONE - /turf/closed/wall/r_wall/syndicate/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS diff --git a/modular_nova/modules/mapping/code/spaceship_turfs.dm b/modular_nova/modules/mapping/code/spaceship_turfs.dm index cef19636158..52f2d75a350 100644 --- a/modular_nova/modules/mapping/code/spaceship_turfs.dm +++ b/modular_nova/modules/mapping/code/spaceship_turfs.dm @@ -14,10 +14,6 @@ icon_state = "map-shuttle_nd" smoothing_flags = SMOOTH_BITMASK -/turf/closed/wall/mineral/titanium/spaceship/nosmooth - icon_state = "ship_walls-0" - smoothing_flags = NONE - /turf/closed/wall/mineral/titanium/spaceship/overspace icon_state = "map-overspace" smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS From d6a653f73fb24bf171754d9a41b4db088e8ca271 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:37:21 +0300 Subject: [PATCH 42/62] Chronic Break: psifinil DeForest medkits for spacers & other disease sufferers (#1656) * Add psifinil cheesekit variant and make spacers use it instead of ondansetron, add to cargo dept orders + exports * Reskin narcolepsy pills as 'alifil' and add to symptom support kit, give SSK to narcolepsy sufferers at roundstart * Add new symptom_kit sprite for the SSK and fix storage runtime * Update departmental order blurb for CDSSK packs * Modularization updates * Apply suggestions from code review --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/datums/quirks/positive_quirks/spacer.dm | 8 +-- .../quirks/negative_quirks/narcolepsy.dm | 18 +------ .../code/armament_datums/deforest_medical.dm | 4 ++ .../code/cargo_packs.dm | 10 ++++ .../code/storage_items.dm | 46 ++++++++++++++++++ .../deforest_medical_items/icons/storage.dmi | Bin 2042 -> 1099 bytes 6 files changed, 66 insertions(+), 20 deletions(-) diff --git a/code/datums/quirks/positive_quirks/spacer.dm b/code/datums/quirks/positive_quirks/spacer.dm index 83157352901..641c010407a 100644 --- a/code/datums/quirks/positive_quirks/spacer.dm +++ b/code/datums/quirks/positive_quirks/spacer.dm @@ -13,7 +13,7 @@ quirk_flags = QUIRK_CHANGES_APPEARANCE //NOVA EDIT CHANGE - ORIGINAL: quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE medical_record_text = "Patient is well-adapted to non-terrestrial environments." mail_goodies = list( - /obj/item/storage/pill_bottle/ondansetron, + /obj/item/reagent_containers/hypospray/medipen/deforest/psifinil, // NOVA EDIT CHANGE - ORIGINAL: /obj/item/storage/pill_bottle/ondansetron, /obj/item/reagent_containers/pill/gravitum, ) /// How high spacers get bumped up to @@ -63,10 +63,10 @@ you are awarded with a 25% hazard pay bonus due to your [on_a_planet ? "station" : "occupational"] assignment.")) // Supply them with some patches to help out on their new assignment - var/obj/item/storage/pill_bottle/ondansetron/disgust_killers = new() - disgust_killers.desc += " Best to take one when travelling to a planet's surface." + var/obj/item/storage/medkit/civil_defense/comfort/stocked/disgust_killers = new() // NOVA EDIT CHANGE - a custom deforest cheesekit filled with much better meds - ORIGINAL: var/obj/item/storage/pill_bottle/ondansetron/disgust_killers = new() + //disgust_killers.desc += " Best to take one when travelling to a planet's surface." NOVA EDIT REMOVAL - remove extra blurb, unneeded if(quirk_holder.equip_to_slot_if_possible(disgust_killers, ITEM_SLOT_BACKPACK, qdel_on_fail = TRUE, initial = TRUE, indirect_action = TRUE)) - to_chat(quirk_holder, span_info("You have[isnull(spacer_account) ? " " : " also "]been given some anti-emetic patches to assist in adjusting to planetary gravity.")) + to_chat(quirk_holder, span_info("You have[isnull(spacer_account) ? " " : " also "]been given a kit of symptom-alleviating autoinjectors to aid in adjusting to planetary gravity.")) // NOVA EDIT CHANGE - rewords to make sense - ORIGINAL: to_chat(quirk_holder, span_info("You have[isnull(spacer_account) ? " " : " also "]been given some anti-emetic patches to assist in adjusting to planetary gravity.")) /datum/quirk/spacer_born/remove() UnregisterSignal(quirk_holder, COMSIG_MOVABLE_Z_CHANGED) diff --git a/modular_nova/master_files/code/datums/quirks/negative_quirks/narcolepsy.dm b/modular_nova/master_files/code/datums/quirks/negative_quirks/narcolepsy.dm index 424295157c8..3807f65264f 100644 --- a/modular_nova/master_files/code/datums/quirks/negative_quirks/narcolepsy.dm +++ b/modular_nova/master_files/code/datums/quirks/negative_quirks/narcolepsy.dm @@ -16,9 +16,9 @@ var/mob/living/carbon/human/user = quirk_holder user.gain_trauma(/datum/brain_trauma/severe/narcolepsy/permanent, TRAUMA_RESILIENCE_ABSOLUTE) - var/obj/item/storage/pill_bottle/prescription_stimulant/stimmies = new() + var/obj/item/storage/medkit/civil_defense/comfort/stocked/stimmies = new() if(quirk_holder.equip_to_slot_if_possible(stimmies, ITEM_SLOT_BACKPACK, qdel_on_fail = TRUE, initial = TRUE, indirect_action = TRUE)) - to_chat(quirk_holder, span_info("You have been given a bottle of mild stimulants to assist in staying awake this shift...")) + to_chat(quirk_holder, span_info("You have been given a company-issued symptom support kit containing mild stimulants to assist in staying awake this shift. Dose responsibly. Consult your allocated care provider if you experience any side-effects.")) /datum/quirk/narcolepsy/remove() . = ..() @@ -52,17 +52,3 @@ else if(drowsy && SPT_PROB(sleep_chance, seconds_per_tick)) to_chat(owner, span_warning("You fall asleep.")) owner.Sleeping(rand(20 SECONDS, 30 SECONDS)) - -/obj/item/storage/pill_bottle/prescription_stimulant - name = "bottle of prescribed stimulant pills" - desc = "A bottle of mild and medicinally approved stimulants to help prevent drowsiness." - -/obj/item/storage/pill_bottle/prescription_stimulant/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/pill/prescription_stimulant(src) - -/obj/item/reagent_containers/pill/prescription_stimulant - name = "prescription stimulant pill" - desc = "Used to treat symptoms of drowsiness and sudden loss of consciousness. A warning label reads: Take in moderation." - list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/synaptizine = 5, /datum/reagent/medicine/modafinil = 3) - icon_state = "pill15" diff --git a/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm index c9bd351f5f2..874fb9a680f 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -7,6 +7,10 @@ /datum/armament_entry/company_import/deforest/first_aid_kit subcategory = "First-Aid Kits" +/datum/armament_entry/deforest/first_aid_kit/civil_defense/comfort + item_type = /obj/item/storage/medkit/civil_defense/comfort/stocked + cost = PAYCHECK_COMMAND * 2 + /datum/armament_entry/company_import/deforest/first_aid_kit/civil_defense item_type = /obj/item/storage/medkit/civil_defense/stocked cost = PAYCHECK_COMMAND * 4 diff --git a/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm b/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm index ab38a07a646..010aa149a73 100644 --- a/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm +++ b/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm @@ -8,6 +8,16 @@ /obj/item/storage/medkit/civil_defense/stocked = 5, ) +/datum/supply_pack/medical/civil_defense/comfort + name = "\improper Civil Defense Symptom Support Kit Crate" + crate_name = "civil defense symptom support kit crate" + desc = "Contains five civil defense symptom support kits stocked with three pens of psifinil and a tube containing 5 pills of alifil, two proprietary DeForest mixes designed to provide long-lasting relief from chronic disease and syndromes like gravity sickness." + access = ACCESS_MEDICAL + cost = CARGO_CRATE_VALUE * 5 // 2000 + contains = list( + /obj/item/storage/medkit/civil_defense/comfort/stocked = 5, + ) + /datum/supply_pack/medical/frontier_first_aid name = "Frontier First Aid Crate" crate_name = "frontier first aid crate" diff --git a/modular_nova/modules/deforest_medical_items/code/storage_items.dm b/modular_nova/modules/deforest_medical_items/code/storage_items.dm index b8452cfe5f2..e2e3af11c4d 100644 --- a/modular_nova/modules/deforest_medical_items/code/storage_items.dm +++ b/modular_nova/modules/deforest_medical_items/code/storage_items.dm @@ -19,6 +19,36 @@ /datum/reagent/consumable/sugar = 5, ) +// Narcolepsy quirk medicines +/obj/item/storage/pill_bottle/prescription_stimulant + name = "alifil pill bottle" + desc = "A special miniaturized pill bottle with an insert resembling a revolver cylinder, fitted for the inside of a 'civil defense'-class shell medkit. Holds five alifil pills, and is designed only to accept their proprietary DeForest(tm) shape. A big, bold yellow warning label on the side reads: 'FOLLOW DOSAGE DIRECTIONS'." + icon = 'modular_nova/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "painkiller_bottle" + w_class = WEIGHT_CLASS_TINY // this is fine because we hard limit what can go in this thing + +/obj/item/storage/pill_bottle/prescription_stimulant/Initialize(mapload) + . = ..() + // Make sure we can only hold alifil pills since this is nested inside a symptom support kit + atom_storage.max_slots = 5 + atom_storage.set_holdable(list( + /obj/item/reagent_containers/pill/prescription_stimulant, + )) + +/obj/item/storage/pill_bottle/prescription_stimulant/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/prescription_stimulant(src) + +/obj/item/reagent_containers/pill/prescription_stimulant + name = "alifil pill" + desc = "Used to treat symptoms of drowsiness and sudden loss of consciousness. Contains a mix of sugar, synaptizine and modafinil. A warning label reads: Take in moderation." + icon_state = "pill15" + list_reagents = list( + /datum/reagent/consumable/sugar = 5, + /datum/reagent/medicine/synaptizine = 5, + /datum/reagent/medicine/modafinil = 3 + ) + // Pre-packed civil defense medkit, with items to heal low damages inside /obj/item/storage/medkit/civil_defense name = "civil defense medical kit" @@ -37,6 +67,7 @@ atom_storage.max_slots = 4 atom_storage.set_holdable(list( /obj/item/reagent_containers/hypospray/medipen, + /obj/item/storage/pill_bottle/prescription_stimulant, )) /obj/item/storage/medkit/civil_defense/stocked @@ -50,6 +81,21 @@ ) generate_items_inside(items_inside,src) +// Variant on the civil defense medkit for spacer planetside personnel (or other people suffering from chronic illnesses) +/obj/item/storage/medkit/civil_defense/comfort + name = "civil defense symptom support kit" + desc = "A small, pocket-sized kit that can typically only fit autoinjectors in it. This variant on the classic 'cheese' civil defense kit contains supplies to address hindering symptomatic burden associated with common chronic diseases or adaptation syndromes, such as gravity sickness." + icon_state = "symptom_kit" + +/obj/item/storage/medkit/civil_defense/comfort/stocked + +/obj/item/storage/medkit/civil_defense/comfort/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/psifinil = 3, + /obj/item/storage/pill_bottle/prescription_stimulant = 1, + ) + generate_items_inside(items_inside, src) + // Pre-packed frontier medkit, with supplies to repair most common frontier health issues /obj/item/storage/medkit/frontier name = "frontier medical kit" diff --git a/modular_nova/modules/deforest_medical_items/icons/storage.dmi b/modular_nova/modules/deforest_medical_items/icons/storage.dmi index 516e7cd30a78dc67bf40a4653e82c29c60dae923..5335ffddda03ba2033a356dd64207d1bd1f737a2 100644 GIT binary patch delta 1091 zcmV-J1ibtD56cLU7k^*~0{{R3)kcR30001NP)t-s0000qG(w7so*o`DR8(QY!O4gu zEu}9ha6c)xc`;cUDoICN-nKpI?(XaB>+0KsvqzzR8Gt_%DK-F7VIvcaDh~||84?l~ zBO)l#TN^qzKIW5LURz)~PhMDgkaCi!x5v_Yn62jP@1?oN_J7R#%>V!Z0d!JMQvg8b z*k%9#0IPabSad{Xb7OL8aCB*JZU6vyoQ;sZ4udcZgy-ZbBG{|`tz9Y*VkobG(qf23 zNRZ>U;_Vy3(5>lqCx1TaE?3vGsvA|@YWV^R=$*Q#^KLK28#^}9oQ_f$z`^il0&9jS zvst4X(ORJP?thsrWKwiUA>IyB^rR=)^!LMK@DAP3j>t*6C+`@6l3;k!0N$lJ%?|_i zkGwf{T2pCB)5|oopMF)!RoN8l#ve9AYyS^YE}Z}X0@g`HK~!jg?U-$MqaYAQ1q2&R zY-5}FvTc%f|Nnp78AOB#YEAvHJzUR8?1?@%17p!7Nq;2rJqR#)00q{^Gm-*?P2_W6 ztwCfY#R^iAiK+a6;c4gap|@C=)Jp*%1|CO_6dO`w-r+FT#z^Y-lQoxG>6yYIyxB?JBAH5vcRZxO~a+P0B z2#znu*L4-306KV1@OoT32Po(alLEfFO_e}!Iw7DuEHLAvM`?V-qBd1+wEjYy6X5^T zK)zl~dVGt@5(szw%V=v(`eY@*^~kJuup)H= z9l=tcAT3M$g+2vwvX6c(9Hn|0&{Tk8uTPD63lgxzfGMkYCAz|GjtJAcgBuDmUf$Z z=>=7-uLIsqvdOQE01XlzJ>)=X-Ca!!&;Ve7l+J~0B2-u3!<-77!N04(bMjpTNlP}O z9J=V#I5nt0I5m@8jZf~VhBlRAgtP^a$A24mPA_;~|LeAi;4f_I<@2`95N$pO@I3W3 zTTQa{{bL1Q!EdNw(>68Zqetn-1)Ene|MUIBhPj{bBaz5j{sDAyhYWU-7Igps002ov JPDHLkV1jMI?@Isx delta 2041 zcmVK6@7k@wq1^@s6V=-0C=2@ki8DV zFbss}tEy`wpFk0V zS0{DcY^8W%&o-IEUJ46nEUzZAW=OJ_HTn^q1L|&p*+C&ikAD*-l8_P`^>DRm1uWRwHnb2=xk$@#|8vfFx@UKG&zZfn z2c2JXm}O^oXZHWie6w>akw&A@Xf&E>A#b`faIdm>@v6A_|6N^2J!x6sH3K_#e4dtp z&6{8OUl_Btc2T^tvV`W%d)N}QDn2xHjr#h2R?@+f0e>L=(x>Lz&i$8-@L|J(_(MhG z^ig3#{7aYqNQ-BKY%gt&Umh!<_j*rfrG>HqWa0yy3&RK-S2V|4m)+;--UBCY(XNj3 zf#wIL95nX-m3F>|<4V<@r(^&p@fpOeZGAbu|G<}ly)?vcT3+n={#_lx1I;XXnzi^=RoJlvm$SE$KDA%eYh34mrSU- zAf+}S>Dxs+0KpOBrMbjy-}W&D>Hp2ddJd+AvU4v!+Dt`{u;Wz?Kg^@YM}kTvm|G_Ye4^PjJ!;wJ~8t*Y!Zd> z#QIm$u0sQyxHda{JF~+t?WZRntD~PzU8EldPWgSDBe_-s*b~s6-8Lhr;M)K!dhw=O zDnHU|^#A=nQOIg2yUo|uhD2U8jVJy(P%UpjYgxy9JOnEq&z-n*n$W4mKc|Cm-1QKy?KGCMkMq9-wTt@UZynyPHxwQGy7!E<7lV zAQzqXx*QBt;^Y9Uy+eGk-Z#ZhSra z3F^F!Yop@-e2?F7JsAdVG2ZK3yHdWb`@yVRldSNyliQfwYlO`JJnhFD5*YI;h|9|B z;R~oM`Ru+v_bXYjeai=pe+RL&A&_w0@haDJA=v0hzcfGiu`W1%V`jqle_x*Ngiu?o z?;)!J=E9hBZ2*L?SlVJ7)qe!~+|H#$!=1+{(q)fhapC_P8q$~BG&B&ko;gW$=O(Q= z{G&K`@VRG_arSGOmZn6$e|IQPNYhr@vv^U^Scy1Q{!cZjSwVm;&Z_m9T}3ww|_d^*W0VE$>8u1 z{WDRJxec%`$M%Zqa%~WJA0YY6Of>+VBw+0eaE<3enDPLM+m|6e(kLyPY~Q2?5UqY) zHT7RaXCdJ}@=ePRRW_kP{4wKM*|?wS1o^A4pHCMq*q2#GZzY;a)_~uC@UFbZI05mI zhFJ@#0nkFT5qRTi&wn?jyJ3v?jz0kyTQ6Mw##_o(4~&8}amf8*m) z@lzehXy!CA5LZ Date: Wed, 24 Jan 2024 20:38:23 +0300 Subject: [PATCH 43/62] [MIRROR] Fix sepsis burns disabling the limb forever until brain surgery (#1657) * Fix sepsis burns disabling the limb forever until brain surgery (#81055) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/datums/wounds/burns.dm | 3 +-- code/modules/surgery/bodyparts/parts.dm | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 2e655018517..18d710ca0d3 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -129,8 +129,7 @@ if(0) to_chat(victim, span_deadsay("The last of the nerve endings in your [limb.plaintext_zone] wither away, as the infection completely paralyzes your joint connector.")) threshold_penalty = 120 // piss easy to destroy - var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone) - victim.gain_trauma(sepsis) + set_disabling(TRUE) /datum/wound/burn/flesh/get_wound_description(mob/user) if(strikes_to_lose_limb <= 0) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index c657e89cefd..2031ea4c723 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -227,7 +227,7 @@ if(bodypart_disabled) owner.set_usable_hands(owner.usable_hands - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) else if(!bodypart_disabled) @@ -324,7 +324,7 @@ if(bodypart_disabled) owner.set_usable_hands(owner.usable_hands - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) else if(!bodypart_disabled) @@ -443,7 +443,7 @@ if(bodypart_disabled) owner.set_usable_legs(owner.usable_legs - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) @@ -532,7 +532,7 @@ if(bodypart_disabled) owner.set_usable_legs(owner.usable_legs - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("You lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) From bddae2a196ddb50ccfc2dddab4cb598c0c719272 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:38:42 +0300 Subject: [PATCH 44/62] [MIRROR] Fixes a spurious CI runtime in do_charge() (#1658) * Fixes a spurious CI runtime in do_charge() (#81048) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/datums/actions/mobs/charge.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index d235b4d50ab..c1ff66dcfa9 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -48,10 +48,10 @@ charging += charger actively_moving = FALSE SEND_SIGNAL(owner, COMSIG_STARTED_CHARGE) - RegisterSignal(charger, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump), TRUE) - RegisterSignal(charger, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), TRUE) - RegisterSignal(charger, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), TRUE) - RegisterSignal(charger, COMSIG_LIVING_DEATH, PROC_REF(charge_end)) + RegisterSignal(charger, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump), override = TRUE) + RegisterSignal(charger, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE) + RegisterSignal(charger, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), override = TRUE) + RegisterSignal(charger, COMSIG_LIVING_DEATH, PROC_REF(charge_end), override = TRUE) charger.setDir(dir) do_charge_indicator(charger, target) @@ -62,9 +62,9 @@ var/datum/move_loop/new_loop = SSmove_manager.home_onto(charger, target, delay = charge_speed, timeout = time_to_hit, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) if(!new_loop) return - RegisterSignal(new_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) - RegisterSignal(new_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) - RegisterSignal(new_loop, COMSIG_QDELETING, PROC_REF(charge_end)) + RegisterSignal(new_loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move), override = TRUE) + RegisterSignal(new_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move), override = TRUE) + RegisterSignal(new_loop, COMSIG_QDELETING, PROC_REF(charge_end), override = TRUE) // Yes this is disgusting. But we need to queue this stuff, and this code just isn't setup to support that right now. So gotta do it with sleeps sleep(time_to_hit + charge_speed) From b2c995ba240b0e2bfc8d9e6a8c3d9add2708f683 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:39:10 +0300 Subject: [PATCH 45/62] [MIRROR] Fixes ejecting pAIs card without a pAI in it (#1659) * Fixes ejecting pAIs card without a pAI in it (#81047) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> --- .../computers/item/computer.dm | 9 ++++----- code/modules/pai/pai.dm | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 80422dfc0c7..3728901352c 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -927,17 +927,16 @@ return FALSE inserted_pai = card balloon_alert(user, "inserted pai") - var/datum/action/innate/pai/messenger/messenger_ability = new(inserted_pai.pai) - messenger_ability.Grant(inserted_pai.pai) + if(inserted_pai.pai) + inserted_pai.pai.give_messenger_ability() update_appearance(UPDATE_ICON) return TRUE /obj/item/modular_computer/proc/remove_pai(mob/user) if(!inserted_pai) return FALSE - var/datum/action/innate/pai/messenger/messenger_ability = locate() in inserted_pai.pai.actions - messenger_ability.Remove(inserted_pai.pai) - qdel(messenger_ability) + if(inserted_pai.pai) + inserted_pai.pai.remove_messenger_ability() if(user) user.put_in_hands(inserted_pai) balloon_alert(user, "removed pAI") diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 19e00a04556..494c39eb33f 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -80,6 +80,9 @@ /// Remote signaler var/obj/item/assembly/signaler/internal/signaler + ///The messeenger ability that pAIs get when they are put in a PDA. + var/datum/action/innate/pai/messenger/messenger_ability + // Static lists /// List of all available downloads var/static/list/available_software = list( @@ -149,6 +152,7 @@ return ..(target, action_bitflags) /mob/living/silicon/pai/Destroy() + QDEL_NULL(messenger_ability) QDEL_NULL(atmos_analyzer) QDEL_NULL(hacking_cable) QDEL_NULL(instrument) @@ -203,6 +207,8 @@ /mob/living/silicon/pai/Initialize(mapload) . = ..() + if(istype(loc, /obj/item/modular_computer)) + give_messenger_ability() START_PROCESSING(SSfastprocess, src) GLOB.pai_list += src make_laws() @@ -457,3 +463,14 @@ if (new_distance < HOLOFORM_MIN_RANGE || new_distance > HOLOFORM_MAX_RANGE) return leash.set_distance(new_distance) + +///Gives the messenger ability to the pAI, creating a new one if it doesn't have one already. +/mob/living/silicon/pai/proc/give_messenger_ability() + if(!messenger_ability) + messenger_ability = new(src) + messenger_ability.Grant(src) + +///Removes the messenger ability from the pAI, but does not delete it. +/mob/living/silicon/pai/proc/remove_messenger_ability() + if(messenger_ability) + messenger_ability.Remove(src) From ed1524de39dc102f37d91751c85b5cef8423cbd0 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:39:30 +0300 Subject: [PATCH 46/62] [MIRROR] Fixes HTML in server admin announcements (#1660) * Fixes HTML in server admin announcements (#81056) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> --- code/__HELPERS/announcements.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/announcements.dm b/code/__HELPERS/announcements.dm index 7a27be43a75..d8653a2eb05 100644 --- a/code/__HELPERS/announcements.dm +++ b/code/__HELPERS/announcements.dm @@ -16,8 +16,8 @@ * * play_sound - if TRUE, play a sound with the announcement (based on player option) * * sound_override - optional, override the default announcement sound * * sender_override - optional, modifies the sender of the announcement - * * encode_title - if TRUE, the title will be HTML encoded - * * encode_text - if TRUE, the text will be HTML encoded + * * encode_title - if TRUE, the title will be HTML encoded (escaped) + * * encode_text - if TRUE, the text will be HTML encoded (escaped) */ /proc/send_ooc_announcement( @@ -28,7 +28,7 @@ sound_override = 'sound/misc/bloop.ogg', sender_override = "Server Admin Announcement", encode_title = TRUE, - encode_text = TRUE, + encode_text = FALSE, ) if(isnull(text)) return From 2e129ccae590e397e972e2ad6040d9ec1e845477 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:39:50 +0300 Subject: [PATCH 47/62] [MIRROR] Fixes a hard del in legion_brood (#1661) * Fixes a hard del in legion_brood (#81051) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- .../mob/living/basic/lavaland/legion/legion_brood.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm index 91edf40615c..7cc5ea06ad8 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -30,7 +30,7 @@ density = FALSE ai_controller = /datum/ai_controller/basic_controller/legion_brood /// Reference to a guy who made us - var/mob/living/created_by + var/datum/weakref/created_by /mob/living/basic/legion_brood/Initialize(mapload) . = ..() @@ -49,7 +49,12 @@ if (ishuman(target) && target.stat > SOFT_CRIT) infest(target) return - if (isliving(target) && faction_check_atom(target) && !istype(target, created_by?.type)) + + var/mob/living/mob_creator = created_by?.resolve() + if(isnull(mob_creator)) + created_by = null + + if (isliving(target) && faction_check_atom(target) && !istype(target, mob_creator?.type)) visible_message(span_warning("[src] melds with [target]'s flesh!")) target.apply_status_effect(/datum/status_effect/regenerative_core) new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) @@ -78,7 +83,7 @@ faction = creator.faction.Copy() else faction |= REF(creator) - created_by = creator + created_by = WEAKREF(creator) ai_controller?.set_blackboard_key(BB_LEGION_BROOD_CREATOR, creator) RegisterSignal(creator, COMSIG_QDELETING, PROC_REF(creator_destroyed)) From 55f753d2a45eab534689f58c9e156fa0e2e539f7 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:40:11 +0300 Subject: [PATCH 48/62] Make holobadges accessory-only in loadout categories (#1663) Move holobadges to accessory only to allow concurrent use w/ neck slot items Co-authored-by: Ephemeralis --- .../loadouts/loadout_items/loadout_datum_neck.dm | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_neck.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_neck.dm index df9f0c69c27..bb8d4a3e326 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_neck.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_neck.dm @@ -287,16 +287,6 @@ GLOBAL_LIST_INIT(loadout_necks, generate_loadout_items(/datum/loadout_item/neck) name = "MODlink Scryer" item_path = /obj/item/clothing/neck/link_scryer/loaded -/datum/loadout_item/neck/holobadge - name = "Holobadge" - item_path = /obj/item/clothing/accessory/badge/holo - restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) - -/datum/loadout_item/neck/holobadge_cord - name = "Holobadge with Lanyard" - item_path = /obj/item/clothing/accessory/badge/holo/cord - restricted_roles = list(JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) - /* * DONATOR */ From 46ac6c011d67a8e3191df343b0beb18ea9093806 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:40:37 +0300 Subject: [PATCH 49/62] Updates the GAGS Croptop Turtleneck (courtesy of Halcyon) plus some code cleanup (#1665) * it's not even polychromatic... that's a dead system... * jacket.dmi creation * organize and repath icon files * use the magic of subtyping to remove a whole .json and fix the probably broken mob icon * OPTIONAL COMMIT - remove spraycan-ability (its weird on clothes) * OPTIONAL COMMIT - repath it to be a jacket subtype (technically a buff?) * oh yea teshari sprites too!! * oh yeah these need set up whoops * UpdatePaths --------- Co-authored-by: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com> Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> --- _maps/map_files/NSVBlueshift/Blueshift.dmm | 2 +- .../mob/clothing/species/teshari/suit.dmi | Bin 85972 -> 98934 bytes .../icons/mob/clothing/suits/jacket.dmi | Bin 0 -> 1121 bytes .../icons/obj/clothing/suits/jacket.dmi | Bin 0 -> 532 bytes .../modules/GAGS/greyscale_configs.dm | 8 ++++++-- .../suits/croptop/croptop_worn.json | 10 ---------- .../modules/clothing/suits/coats.dm | 18 +++++++----------- .../loadout_items/loadout_datum_suit.dm | 2 +- .../modular_vending/code/clothesmate.dm | 2 +- .../Scripts_Nova/573_croptop_repath.txt | 1 + 10 files changed, 17 insertions(+), 26 deletions(-) create mode 100644 modular_nova/master_files/icons/mob/clothing/suits/jacket.dmi create mode 100644 modular_nova/master_files/icons/obj/clothing/suits/jacket.dmi delete mode 100644 modular_nova/modules/GAGS/json_configs/suits/croptop/croptop_worn.json create mode 100644 tools/UpdatePaths/Scripts_Nova/573_croptop_repath.txt diff --git a/_maps/map_files/NSVBlueshift/Blueshift.dmm b/_maps/map_files/NSVBlueshift/Blueshift.dmm index b4c280df87a..33b1872f727 100644 --- a/_maps/map_files/NSVBlueshift/Blueshift.dmm +++ b/_maps/map_files/NSVBlueshift/Blueshift.dmm @@ -18359,7 +18359,7 @@ /obj/item/clothing/suit/jacket/letterman_syndie, /obj/item/clothing/suit/jacket/miljacket, /obj/item/clothing/suit/jacket/leather, -/obj/item/clothing/suit/croptop, +/obj/item/clothing/suit/jacket/croptop, /turf/open/floor/iron/dark, /area/station/common/tailoring) "dwK" = ( diff --git a/modular_nova/master_files/icons/mob/clothing/species/teshari/suit.dmi b/modular_nova/master_files/icons/mob/clothing/species/teshari/suit.dmi index e4db1a1654e90cb19c3c7e42c68cfb23f569fc42..5420cf652e8968b44535c653e6d27e65a7738093 100644 GIT binary patch literal 98934 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�+mfq#AXA>Din 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 literal 85972 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 ~wKM@~^FVf5Q6>>11jlRd0glfo0)qd_$ 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 literal 0 HcmV?d00001 diff --git a/modular_nova/master_files/icons/obj/clothing/suits/jacket.dmi b/modular_nova/master_files/icons/obj/clothing/suits/jacket.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ace9238ecd24b847d3de19880428bbf56aa48adf GIT binary patch literal 532 zcmV+v0_**WP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KAHiHkEOv#1!zH00t;D@x2w zg|OiYl8f>SO7aVEsZ&;P^>YE+3;=(wBd|xvE2aPd0O3hQK~zYI?UIQKgD?z0P14%k zZo185r~m(xOHC(CTNoAw10&i>c+Vs@N#>a2*8#{6gkYYOEELFV)Chd*5Z?<@KW|VQ zzR>s$N-6pDBK6i_dEg2lU{Jkaxgw7Njj;-}xH0GztOeU_Jpz0;;F=g2hy^>rvOSFq zmIup0zZ(`{p@X<6FOH|rG;;vpD&U Date: Wed, 24 Jan 2024 20:41:11 +0300 Subject: [PATCH 50/62] [MODULAR] Spacer fixes: anti gravity harness now applies appropriate buffs/debuffs & improved wellness messaging (#1666) * Fix gravity harness not applying spacer buffs/debuffs and improve spacer wellness messaging * OCD edit * Update antigravityharness.dm --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../code/datums/quirks/positive_quirks/spacer.dm | 8 ++++++++ .../modules/clothing/back/antigravityharness.dm | 15 ++++++++++++++- tgstation.dme | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 modular_nova/master_files/code/datums/quirks/positive_quirks/spacer.dm diff --git a/modular_nova/master_files/code/datums/quirks/positive_quirks/spacer.dm b/modular_nova/master_files/code/datums/quirks/positive_quirks/spacer.dm new file mode 100644 index 00000000000..ac2cb947ddb --- /dev/null +++ b/modular_nova/master_files/code/datums/quirks/positive_quirks/spacer.dm @@ -0,0 +1,8 @@ +// Make spacer's gravity wellness effect visible so players know something is happening. +/datum/status_effect/spacer/gravity_wellness + alert_type = /atom/movable/screen/alert/status_effect/gravity_wellness + +/atom/movable/screen/alert/status_effect/gravity_wellness + name = "Gravity Wellness" + desc = "Your physiology thrives in low-gravity conditions: you catch your breath quicker and are more mobile." + icon_state = "negative" diff --git a/modular_nova/master_files/code/modules/clothing/back/antigravityharness.dm b/modular_nova/master_files/code/modules/clothing/back/antigravityharness.dm index a75b6c1b5c8..d0f8cae6d43 100644 --- a/modular_nova/master_files/code/modules/clothing/back/antigravityharness.dm +++ b/modular_nova/master_files/code/modules/clothing/back/antigravityharness.dm @@ -101,6 +101,7 @@ user.RemoveElement(/datum/element/forced_gravity, 0) REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, CLOTHING_TRAIT) + var/datum/quirk/spacer_born/spacer = user.get_quirk(/datum/quirk/spacer_born) switch(target_mode) if(MODE_ANTIGRAVITY) mode = MODE_ANTIGRAVITY @@ -115,6 +116,10 @@ icon_state = ANTIGRAVITY_STATE worn_icon_state = ANTIGRAVITY_STATE + //are we a spacer? if so, let the quirk know we're back in low gravity conditions + if (!isnull(spacer)) + spacer.in_space(user) + if(MODE_EXTRAGRAVITY) mode = MODE_EXTRAGRAVITY @@ -128,6 +133,10 @@ icon_state = EXTRAGRAVITY_STATE worn_icon_state = EXTRAGRAVITY_STATE + //are we a spacer? if so, let the quirk know we're in extremely uncomfortable extragrav + if (!isnull(spacer)) + spacer.on_planet(user) + if(MODE_GRAVOFF) if(!user.has_gravity() && mode != MODE_GRAVOFF) new /obj/effect/temp_visual/mook_dust/robot(get_turf(src)) @@ -145,6 +154,10 @@ icon_state = OFF_STATE worn_icon_state = OFF_STATE + //are we a spacer? if so, make the quirk assert the correct condition based on where we are + if (!isnull(spacer)) + spacer.check_z(user) + else return FALSE @@ -153,7 +166,6 @@ return TRUE - /obj/item/gravity_harness/dropped(mob/user) . = ..() change_mode(MODE_GRAVOFF) @@ -164,6 +176,7 @@ /obj/item/gravity_harness/attack_self(mob/user) toggle_mode(user, TRUE) + /// This outputs the harness's current mode and cell charge to your status tab, so you don't need to examine it every time. /obj/item/gravity_harness/proc/get_status_tab_item(mob/living/source, list/items) SIGNAL_HANDLER diff --git a/tgstation.dme b/tgstation.dme index 89c9bab4bee..b59e279c4f7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6219,6 +6219,7 @@ #include "modular_nova\master_files\code\datums\quirks\negative_quirks\nerve_staple.dm" #include "modular_nova\master_files\code\datums\quirks\neutral_quirks\equipping.dm" #include "modular_nova\master_files\code\datums\quirks\neutral_quirks\lungs.dm" +#include "modular_nova\master_files\code\datums\quirks\positive_quirks\spacer.dm" #include "modular_nova\master_files\code\datums\records\record.dm" #include "modular_nova\master_files\code\datums\station_traits\negative_traits.dm" #include "modular_nova\master_files\code\datums\storage\storage.dm" From ffb67951b5272fe32bcde8d5f010744910a627f3 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:41:28 +0300 Subject: [PATCH 51/62] Fixes a typo in systemic fault's examine text (#1667) dw Co-authored-by: nikothedude <59709059+nikothedude@users.noreply.github.com> --- modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm b/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm index 43e02113422..b6b0216ef72 100644 --- a/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm +++ b/modular_nova/modules/medical/code/wounds/synth/robotic_slash.dm @@ -579,7 +579,7 @@ name = "Systemic Fault" desc = "A significant portion of the power distribution network has been cut open, resulting in massive power loss and runaway electrocution." occur_text = "lets out a violent \"zhwarp\" sound as angry electric arcs attack the surrounding air" - examine_desc = "has lots of wires mauled wires sticking out" + examine_desc = "has lots of mauled wires sticking out" treat_text = "Immediate securing via gauze, followed by emergency cable replacement and securing via wirecutters or retractor. \ If the fault has become uncontrollable, extreme heat therapy is recommended." From 24fa2189d9c700b57d19646ee2d08bc372b90e42 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:41:52 +0300 Subject: [PATCH 52/62] [MISSED MIRROR] Lizard spines no longer "float" on characters without lizard tails.(#1668) * Lizard spines no longer "float" on characters without lizard tails. (#80456) --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> --- code/__DEFINES/external_organs.dm | 4 + code/__HELPERS/global_lists.dm | 1 + code/_globalvars/lists/flavor_misc.dm | 1 + code/datums/sprite_accessories.dm | 32 +++++++ .../organs/external/_external_organ.dm | 9 ++ .../modules/surgery/organs/external/spines.dm | 28 ++---- code/modules/surgery/organs/external/tails.dm | 89 +++++++++++++----- .../human/species/lizard/lizard_spines.dmi | Bin 3643 -> 2462 bytes .../mutant_bodypart_overlay.dm | 8 +- .../mob/sprite_accessory/lizard_spines.dmi | Bin 3643 -> 0 bytes .../icons/mob/sprite_accessory/vox_spines.dmi | Bin 19525 -> 19941 bytes .../mob/dead/new_player/sprite_accessories.dm | 13 --- .../new_player/sprite_accessories/genitals.dm | 11 --- .../new_player/sprite_accessories/spines.dm | 40 ++++---- .../new_player/sprite_accessories/tails.dm | 5 - .../dead/new_player/sprite_accessories/vox.dm | 24 ++++- .../modules/surgery/organs/spines.dm | 24 +++-- 17 files changed, 181 insertions(+), 108 deletions(-) delete mode 100644 modular_nova/master_files/icons/mob/sprite_accessory/lizard_spines.dmi diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm index da8c4ddc272..07a329677fe 100644 --- a/code/__DEFINES/external_organs.dm +++ b/code/__DEFINES/external_organs.dm @@ -8,3 +8,7 @@ ///Tail wagging #define WAG_ABLE (1<<0) #define WAG_WAGGING (1<<1) + +/// Tail spine defines +#define SPINE_KEY_LIZARD "lizard" +#define SPINE_KEY_VOX "vox" // NOVA EDIT ADDITION diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 408852af459..1e447ac1470 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -28,6 +28,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, GLOB.tail_spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 1fceed44004..a26ff1752f2 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -26,6 +26,7 @@ GLOBAL_LIST_EMPTY(snouts_list) GLOBAL_LIST_EMPTY(horns_list) GLOBAL_LIST_EMPTY(frills_list) GLOBAL_LIST_EMPTY(spines_list) +GLOBAL_LIST_EMPTY(tail_spines_list) GLOBAL_LIST_EMPTY(legs_list) GLOBAL_LIST_EMPTY(animated_spines_list) diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index 02e12504576..4ce7cb55177 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -1756,9 +1756,12 @@ /datum/sprite_accessory/tails em_block = TRUE + /// Describes which tail spine sprites to use, if any. + var/spine_key = NONE /datum/sprite_accessory/tails/lizard icon = 'icons/mob/human/species/lizard/lizard_tails.dmi' + spine_key = SPINE_KEY_LIZARD /datum/sprite_accessory/tails/lizard/smooth name = "Smooth" @@ -1779,6 +1782,7 @@ /datum/sprite_accessory/tails/lizard/short name = "Short" icon_state = "short" + spine_key = NONE /datum/sprite_accessory/tails/human/cat name = "Cat" @@ -2091,6 +2095,10 @@ icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' em_block = TRUE +/datum/sprite_accessory/tail_spines + icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' + em_block = TRUE + /datum/sprite_accessory/spines/none name = "None" icon_state = "none" @@ -2099,6 +2107,10 @@ name = "None" icon_state = "none" +/datum/sprite_accessory/tail_spines/none + name = "None" + icon_state = "none" + /datum/sprite_accessory/spines/short name = "Short" icon_state = "short" @@ -2107,6 +2119,10 @@ name = "Short" icon_state = "short" +/datum/sprite_accessory/tail_spines/short + name = "Short" + icon_state = "short" + /datum/sprite_accessory/spines/shortmeme name = "Short + Membrane" icon_state = "shortmeme" @@ -2115,6 +2131,10 @@ name = "Short + Membrane" icon_state = "shortmeme" +/datum/sprite_accessory/tail_spines/shortmeme + name = "Short + Membrane" + icon_state = "shortmeme" + /datum/sprite_accessory/spines/long name = "Long" icon_state = "long" @@ -2123,6 +2143,10 @@ name = "Long" icon_state = "long" +/datum/sprite_accessory/tail_spines/long + name = "Long" + icon_state = "long" + /datum/sprite_accessory/spines/longmeme name = "Long + Membrane" icon_state = "longmeme" @@ -2131,6 +2155,10 @@ name = "Long + Membrane" icon_state = "longmeme" +/datum/sprite_accessory/tail_spines/longmeme + name = "Long + Membrane" + icon_state = "longmeme" + /datum/sprite_accessory/spines/aquatic name = "Aquatic" icon_state = "aqua" @@ -2139,6 +2167,10 @@ name = "Aquatic" icon_state = "aqua" +/datum/sprite_accessory/tail_spines/aquatic + name = "Aquatic" + icon_state = "aqua" + /datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them. icon = null //These datums exist for selecting legs on preference, and little else em_block = TRUE diff --git a/code/modules/surgery/organs/external/_external_organ.dm b/code/modules/surgery/organs/external/_external_organ.dm index 5b9f9d67347..23b74ef9b4e 100644 --- a/code/modules/surgery/organs/external/_external_organ.dm +++ b/code/modules/surgery/organs/external/_external_organ.dm @@ -57,6 +57,15 @@ if(restyle_flags) RegisterSignal(src, COMSIG_ATOM_RESTYLE, PROC_REF(on_attempt_feature_restyle)) +/obj/item/organ/external/Insert(mob/living/carbon/receiver, special, movement_flags) + . = ..() + receiver.update_body_parts() + +/obj/item/organ/external/Remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + if(!special) + organ_owner.update_body_parts() + /obj/item/organ/external/mob_insert(mob/living/carbon/receiver, special, movement_flags) if(!should_external_organ_apply_to(type, receiver)) stack_trace("adding a [type] to a [receiver.type] when it shouldn't be!") diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 86bc8c800a1..d632246500b 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -13,37 +13,27 @@ bodypart_overlay = /datum/bodypart_overlay/mutant/spines - ///A two-way reference between the tail and the spines because of wagging sprites. Bruh. - var/obj/item/organ/external/tail/lizard/paired_tail - /obj/item/organ/external/spines/Insert(mob/living/carbon/receiver, special, movement_flags) - . = ..() - if(.) - paired_tail = locate(/obj/item/organ/external/tail/lizard) in receiver.organs //We want specifically a lizard tail, so we don't use the slot. - paired_tail?.paired_spines = src + // If we have a tail, attempt to add a tail spines overlay + var/obj/item/organ/external/tail/our_tail = receiver.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + our_tail?.try_insert_tail_spines(our_tail.bodypart_owner) + return ..() /obj/item/organ/external/spines/Remove(mob/living/carbon/organ_owner, special, movement_flags) - . = ..() - if(paired_tail) - paired_tail.paired_spines = null - paired_tail = null + // If we have a tail, remove any tail spines overlay + var/obj/item/organ/external/tail/our_tail = organ_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + our_tail?.remove_tail_spines(our_tail.bodypart_owner) + return ..() -///Bodypart overlay for spines (wagging gets updated by tail) +///Bodypart overlay for spines /datum/bodypart_overlay/mutant/spines layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND feature_key = "spines" - ///Spines moth with the tail, so track it - var/wagging = FALSE /datum/bodypart_overlay/mutant/spines/get_global_feature_list() return GLOB.sprite_accessories["spines"] // NOVA EDIT - Customization - ORIGINAL: return GLOB.spines_list -/datum/bodypart_overlay/mutant/spines/get_base_icon_state() - return (wagging ? "wagging_" : "") + sprite_datum.icon_state //add the wagging tag if we be wagging - - /datum/bodypart_overlay/mutant/spines/can_draw_on_bodypart(mob/living/carbon/human/human) . = ..() if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) return FALSE - diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 5c620eea161..1e8cf71b5f0 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -17,6 +17,8 @@ var/wag_flags = NONE ///The original owner of this tail var/original_owner //Yay, snowflake code! + ///The overlay for tail spines, if any + var/datum/bodypart_overlay/mutant/tail_spines/tail_spines_overlay /obj/item/organ/external/tail/Insert(mob/living/carbon/receiver, special, movement_flags) . = ..() @@ -32,6 +34,42 @@ else if(type in receiver.dna.species.external_organs) receiver.add_mood_event("wrong_tail_regained", /datum/mood_event/tail_regained_wrong) +/obj/item/organ/external/tail/on_bodypart_insert(obj/item/bodypart/bodypart) + var/obj/item/organ/external/spines/our_spines = bodypart.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) + if(our_spines) + try_insert_tail_spines(bodypart) + return ..() + +/obj/item/organ/external/tail/on_bodypart_remove(obj/item/bodypart/bodypart) + remove_tail_spines(bodypart) + return ..() + +/// If the owner has spines and an appropriate overlay exists, add a tail spines overlay. +/obj/item/organ/external/tail/proc/try_insert_tail_spines(obj/item/bodypart/bodypart) + // Don't insert another overlay if there already is one. + if(tail_spines_overlay) + return + // If this tail doesn't have a valid set of tail spines, don't insert them + var/datum/sprite_accessory/tails/tail_sprite_datum = bodypart_overlay.sprite_datum + if(!istype(tail_sprite_datum)) + return + var/tail_spine_key = tail_sprite_datum.spine_key + if(!tail_spine_key) + return + + tail_spines_overlay = new + tail_spines_overlay.tail_spine_key = tail_spine_key + var/feature_name = bodypart.owner.dna.mutant_bodyparts["spines"][MUTANT_INDEX_NAME] // NOVA EDIT CHANGE - ORIGINAL: var/feature_name = bodypart.owner.dna.features["spines"] //tail spines don't live in DNA, but share feature names with regular spines + tail_spines_overlay.set_appearance_from_dna(bodypart.owner.dna, feature_name, feature_key = "spines") // NOVA EDIT CHANGE - ORIGINAL: tail_spines_overlay.set_appearance_from_name(feature_name) + bodypart.add_bodypart_overlay(tail_spines_overlay) + +/// If we have a tail spines overlay, delete it +/obj/item/organ/external/tail/proc/remove_tail_spines(obj/item/bodypart/bodypart) + if(!tail_spines_overlay) + return + bodypart.remove_bodypart_overlay(tail_spines_overlay) + QDEL_NULL(tail_spines_overlay) + /obj/item/organ/external/tail/on_mob_remove(mob/living/carbon/organ_owner, special) . = ..() @@ -64,6 +102,8 @@ var/datum/bodypart_overlay/mutant/tail/accessory = bodypart_overlay wag_flags |= WAG_WAGGING accessory.wagging = TRUE + if(tail_spines_overlay) //if there are spines, they should wag with the tail + tail_spines_overlay.wagging = TRUE organ_owner.update_body_parts() RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(stop_wag)) return TRUE @@ -75,6 +115,8 @@ var/datum/bodypart_overlay/mutant/tail/accessory = bodypart_overlay wag_flags &= ~WAG_WAGGING accessory.wagging = FALSE + if(tail_spines_overlay) //if there are spines, they should stop wagging with the tail + tail_spines_overlay.wagging = FALSE if(isnull(organ_owner)) return @@ -135,32 +177,7 @@ bodypart_overlay = /datum/bodypart_overlay/mutant/tail/lizard wag_flags = WAG_ABLE - ///A reference to the paired_spines, since for some fucking reason tail spines are tied to the spines themselves. - var/obj/item/organ/external/spines/paired_spines - -/obj/item/organ/external/tail/lizard/Insert(mob/living/carbon/receiver, special, movement_flags) - . = ..() - if(.) - paired_spines = bodypart_owner.owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) - paired_spines?.paired_tail = src - -/obj/item/organ/external/tail/lizard/Remove(mob/living/carbon/organ_owner, special, movement_flags) - . = ..() - if(paired_spines) - paired_spines.paired_tail = null - paired_spines = null - -/obj/item/organ/external/tail/lizard/start_wag() - if(paired_spines) - var/datum/bodypart_overlay/mutant/spines/accessory = paired_spines.bodypart_overlay - accessory.wagging = TRUE - return ..() - -/obj/item/organ/external/tail/lizard/stop_wag() - if(paired_spines) - var/datum/bodypart_overlay/mutant/spines/accessory = paired_spines.bodypart_overlay - accessory.wagging = FALSE - return ..() + //dna_block = DNA_LIZARD_TAIL_BLOCK // NOVA EDIT REMOVAL - Customization - We have our own system to handle DNA. ///Lizard tail bodypart overlay datum /datum/bodypart_overlay/mutant/tail/lizard @@ -172,3 +189,23 @@ /obj/item/organ/external/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." + +///Bodypart overlay for tail spines. Handled by the tail - has no actual organ associated. +/datum/bodypart_overlay/mutant/tail_spines + layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND + feature_key = "tailspines" + ///Spines wag when the tail does + var/wagging = FALSE + /// Key for tail spine states, depends on the shape of the tail. Defined in the tail sprite datum. + var/tail_spine_key = NONE + +/datum/bodypart_overlay/mutant/tail_spines/get_global_feature_list() + return GLOB.sprite_accessories["tailspines"] // NOVA EDIT CHANGE - ORIGINAL: return GLOB.tail_spines_list + +/datum/bodypart_overlay/mutant/tail_spines/get_base_icon_state() + return (!isnull(tail_spine_key) ? "[tail_spine_key]_" : "") + (wagging ? "wagging_" : "") + sprite_datum.icon_state // Select the wagging state if appropriate + +/datum/bodypart_overlay/mutant/tail_spines/can_draw_on_bodypart(mob/living/carbon/human/human) + . = ..() + if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + return FALSE diff --git a/icons/mob/human/species/lizard/lizard_spines.dmi b/icons/mob/human/species/lizard/lizard_spines.dmi index 82eb636b339c60975f4b276f9e5583a14914b7b1..5112c8a0a6eca70c5478790a6b3aa3610d0f7b97 100644 GIT binary patch literal 2462 zcmYjQ3pf+%8()-rC$!z}mbDrn_J>U0y@AKY%@ArPc_r?i-?~Pi6$g-_rORJ@ilal|)yV_f!kTL_;sBGOc zexcXP`0q9!gGrk%_biCz9ZmAIAfrL!E)k5n1hd6MB1!JH@2{yH%XY5VIpI7f-}kyG zWkxk$W6~?iydnsTY*%Aw0=As-pCb^Nznlgs%F6qq}SIE`X6g2EC9aS35bKu@N2XCKkgk zW*ENeez&wa4;#W#i$OdB05mLoJlq3Q3%`vd+`S73$je#&QcxRNGv)$9V^aLUrWdQrub_IrlU$WV8A_yc&X`6GJh?ad<3pWr zOdc*P50{;2JA<-)7KaIqhlSHQ{FR@cK~t4s5^+49fZuIfZKJ&)C)jAue`ku``Nep^ zl|gR_WJ~K!G@2s$bNF=$dyKv7YGVETm2m4s-T-^RCH#3yCbs6_@0;_(wYX`%-d$0_ z@M2uN->09%TL<%FM@zV2OXEht&$}9-g9bAMe1+|9GV0^ZmopS=EQoSJeL3%mVE^pY z`TA?Z<%yZ&xqp2DgK7`X<|%$=&`tkumrifE*%cUg-^*HWbYYf{W*}YD#^Z|qyzi~| z;O(%~3<4(s`R|G>HuRyh&nS&^BRcRfP?+k>)6mf;Rj*t&$b2$|P32Df;v@ypDmeK4 zawU~nE2&>#6foH4{$CY~$9iaaTv34Jcf~G&xL>Hg!tj+vH;sHoP5j=cEYKR!+Y*#q zC5neAtp;Up-$4VkDx?PTA0lo4%*Z0u5`4Hz8Ud9Ft0 zq|U`6hFQhGuVGqy3i**PX-0YWIhyDpC zL+7Rtm&#ANVqDMJxuVtkZ<*L|i;{ue^a8~V!K_K6SBX5QWG>6T2@VYM$FXYS#~k$k zFyNDi-7<^A`nQZg>V|meBdJw*R!FSgvpeZz-qZHujjEgP6N}DXVbAM!T+fHR$}}9b zp{2L#>~-D-L`~U$NJt(rFjPwz(0kO9vfI)lmHzvDnB9N2@U<}gGRqt5gO8tryl#a^>izzh+H%Lp@_R|RE_Cc zE23^vp(x41-d+xVwl`nhh1r?4cixcGkK}vaY!51s0y)1r*<*4Fcww;#&ATQFaSv0- z2`%X&rm`B?*2+ryFgkMjnXQtYRqiyx)#jq9gsI~#Of6y$kApZlb;w|o37q>d_{FYO zxS7LfCNpO%x0yeA9+cj^H}O zOqdp~sVem|_QDjW7uC?3C`;X%u3MSp9vYlC%6s&-4&Nzr z!FV`rh2SgoznQh9@&5I@cI1DATPNPiY#Dmesn-3t`K&AB$#RY% zg5s-YAK5C4$ErsoNVH?Ahns5=p-zP#I?=ohjv}qo-v~OZZ=!?4mOfL;NW1}lzIWes zcWUr0qns5|eceuT4sC#n_EA?z^}Vq2PF%wQYK*dXHlHGZSiEIG7%w{|^5lhc7|Eu; zjg}MYsRxZ5x4rl+Ym)RR2`h_;3Qe{V9vgRj6z}_~Ia|SVhH3L&8pR}SD zg2?F!S{vm^G5bY^{JfOEMuToCu`Zh_NH(ZNh8Bj~rFq27H&!(L280KM^(|2Xv$SK} zBox@|JqVC$dUK9{9Cw~eqD4jsZ&pY?Yx-H*4Fl7S^tGXBih@Lj{HM;+;03)JxS-8# zEj{2`r`{M){CPJy!dueGjt9c)8OA|pBaa= z(6w$)wA8hhVA7k)*d*4N;lb zBV^vx$< literal 3643 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 diff --git a/modular_nova/master_files/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/modular_nova/master_files/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index 3fcf2bbe707..1a86afbea05 100644 --- a/modular_nova/master_files/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/modular_nova/master_files/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -27,10 +27,14 @@ * * Arguments: * * dna - The `/datum/dna` datum from which we're going to be extracting the data to set the + * * accessory_name - instead of using the name from mutant_bodyparts[feature_key][MUTANT_INDEX_NAME] you can optionally pass one explicitly + * * feature_key - same as with accessory_key, you can optionally pass a feature_key explicitly * appearance. */ -/datum/bodypart_overlay/mutant/proc/set_appearance_from_dna(datum/dna/dna) - sprite_datum = fetch_sprite_datum_from_name(dna.mutant_bodyparts[feature_key][MUTANT_INDEX_NAME]) +/datum/bodypart_overlay/mutant/proc/set_appearance_from_dna(datum/dna/dna, accessory_name, feature_key) + if(isnull(feature_key)) // if not explicitly set, just use the feature_key of the bodypart_overlay + feature_key = src.feature_key + sprite_datum = fetch_sprite_datum_from_name(accessory_name ? accessory_name : dna.mutant_bodyparts[feature_key][MUTANT_INDEX_NAME]) modsuit_affected = sprite_datum.use_custom_mod_icon draw_color = dna.mutant_bodyparts[feature_key][MUTANT_INDEX_COLOR_LIST] build_emissive_eligibility(dna.mutant_bodyparts[feature_key][MUTANT_INDEX_EMISSIVE_LIST]) diff --git a/modular_nova/master_files/icons/mob/sprite_accessory/lizard_spines.dmi b/modular_nova/master_files/icons/mob/sprite_accessory/lizard_spines.dmi deleted file mode 100644 index eaadb820ebc1fa6eb496cdf376567affee52b627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3643 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 Ib4q9e0AY6njsO4v diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm index 0a7d45a50fc..e9f96e84df6 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm @@ -39,16 +39,12 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) ///Set this to true to make an accessory appear as color customizable in preferences despite advanced color settings being off, will also prevent the accessory from being reset var/always_color_customizable - ///Whether the accessory can have a special icon_state to render, i.e. wagging tails - var/special_render_case ///Special case of whether the accessory should be shifted in the X dimension, check taur genitals for example var/special_x_dimension ///Special case of whether the accessory should have a different icon, check taur genitals for example var/special_icon_case ///Special case for MODsuit overlays var/use_custom_mod_icon - ///Special case of applying a different color - var/special_colorize ///If defined, the accessory will be only available to ckeys inside the list. ITS ASSOCIATIVE, ie. ("ckey" = TRUE). For speed var/list/ckey_whitelist ///Whether this feature is genetic, and thus modifiable by DNA consoles @@ -87,15 +83,6 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) /datum/sprite_accessory/proc/is_hidden(mob/living/carbon/human/owner) return FALSE -/datum/sprite_accessory/proc/get_special_render_state(mob/living/carbon/human/H) - return null - -/datum/sprite_accessory/proc/get_special_render_key(mob/living/carbon/human/owner) - return key - -/datum/sprite_accessory/proc/get_special_render_colour(mob/living/carbon/human/H, passed_state) - return null - /datum/sprite_accessory/proc/get_special_icon(mob/living/carbon/human/H, passed_state) return icon diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm index 89a0e31bbfe..2819d0a5199 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm @@ -2,8 +2,6 @@ #define TAUR_DIMENSION_X 64 /datum/sprite_accessory/genital - special_render_case = TRUE - special_colorize = TRUE var/associated_organ_slot /// If true, then there should be a variant in the icon file that's slightly pinkier to match human base colors. var/has_skintone_shading = FALSE @@ -57,15 +55,6 @@ else return TRUE -/datum/sprite_accessory/genital/get_special_render_state(mob/living/carbon/human/human) - var/obj/item/organ/external/genital/genital = human.get_organ_slot(associated_organ_slot) - return "[genital?.sprite_suffix]" - -/datum/sprite_accessory/genital/get_special_render_colour(mob/living/carbon/human/human, render_state) - var/obj/item/organ/external/genital/genital = human.get_organ_slot(associated_organ_slot) - if(genital?.uses_skin_color && HAS_TRAIT(human, TRAIT_USES_SKINTONES)) - return skintone2hex(human.skin_tone) - /datum/sprite_accessory/genital/penis icon = 'modular_nova/master_files/icons/mob/sprite_accessory/genitals/penis_onmob.dmi' organ_type = /obj/item/organ/external/genital/penis diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/spines.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/spines.dm index 51a93be25ae..4f631993af4 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/spines.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -1,8 +1,6 @@ /datum/sprite_accessory/spines key = "spines" generic = "Spines" - icon = 'modular_nova/master_files/icons/mob/sprite_accessory/lizard_spines.dmi' - special_render_case = TRUE default_color = DEFAULT_SECONDARY recommended_species = list(SPECIES_LIZARD, SPECIES_UNATHI, SPECIES_LIZARD_ASH, SPECIES_LIZARD_SILVER) relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) @@ -10,43 +8,39 @@ organ_type = /obj/item/organ/external/spines /datum/sprite_accessory/spines/is_hidden(mob/living/carbon/human/wearer) - var/obj/item/organ/external/tail/tail = wearer.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(!wearer.w_uniform && !wearer.wear_suit) - return FALSE - // Can hide if wearing uniform - if(key in wearer.try_hide_mutant_parts) - return TRUE + if(wearer.w_uniform) + if(wearer.w_uniform.flags_inv & HIDESPINE) + return TRUE if(wearer.wear_suit) - // Exception for MODs - if(istype(wearer.wear_suit, /obj/item/clothing/suit/mod)) - return FALSE - else if(!tail \ - || (wearer.wear_suit \ - && (wearer.wear_suit.flags_inv & HIDETAIL \ - || wearer.wear_suit.flags_inv & HIDESPINE) \ - ) - ) + if(wearer.wear_suit.flags_inv & HIDESPINE) + return TRUE + if(key in wearer.try_hide_mutant_parts) return TRUE -/datum/sprite_accessory/spines/get_special_render_state(mob/living/carbon/human/H) - return icon_state + return FALSE -/datum/sprite_accessory/spines/is_hidden(mob/living/carbon/human/wearer) +/datum/sprite_accessory/tail_spines + key = "tailspines" + default_color = DEFAULT_SECONDARY + relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) + +/datum/sprite_accessory/tail_spines/is_hidden(mob/living/carbon/human/wearer) var/list/used_in_turf = list("tail") - // Emote exception if(wearer.owned_turf?.name in used_in_turf) + // Emote exception return TRUE if(!wearer.w_uniform && !wearer.wear_suit) return FALSE - if(key in wearer.try_hide_mutant_parts) + if("spines" in wearer.try_hide_mutant_parts) + return TRUE + if("tail" in wearer.try_hide_mutant_parts) return TRUE if(wearer.wear_suit) // Exception for MODs if(istype(wearer.wear_suit, /obj/item/clothing/suit/mod)) return FALSE - // Hide accessory if flagged to do so else if(wearer.wear_suit.flags_inv & HIDETAIL) return TRUE diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm index 208fcf4b7f1..41be5d0fc3c 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -3,8 +3,6 @@ generic = "Tail" organ_type = /obj/item/organ/external/tail icon = 'modular_nova/master_files/icons/mob/sprite_accessory/tails.dmi' - special_render_case = TRUE - special_colorize = TRUE relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) genetic = TRUE /// Can we use this tail for the fluffy tail turf emote? @@ -29,9 +27,6 @@ else if(wearer.wear_suit.flags_inv & HIDETAIL) return TRUE -/datum/sprite_accessory/tails/get_special_render_state(mob/living/carbon/human/wearer) - return icon_state - /datum/sprite_accessory/tails/none name = "None" icon_state = "none" diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/vox.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/vox.dm index 00ef0c74826..6459c622c4f 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/vox.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/vox.dm @@ -123,6 +123,7 @@ icon_state = "vox" recommended_species = list(SPECIES_VOX) organ_type = /obj/item/organ/external/tail/lizard + spine_key = SPINE_KEY_VOX //The tail markings /datum/sprite_accessory/spines/vox @@ -131,14 +132,31 @@ recommended_species = list(SPECIES_VOX) relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/tail_spines/vox + icon = 'modular_nova/master_files/icons/mob/sprite_accessory/vox_spines.dmi' + default_color = DEFAULT_TERTIARY + recommended_species = list(SPECIES_VOX) + relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) + /datum/sprite_accessory/spines/vox/vox_bands name = "Vox Bands" - icon_state = "vox_bands" + icon_state = "bands" + +/datum/sprite_accessory/tail_spines/vox/vox_bands + name = "Vox Bands" + icon_state = "bands" /datum/sprite_accessory/spines/vox/vox_tip name = "Vox Tip" - icon_state = "vox_tip" + icon_state = "tip" +/datum/sprite_accessory/tail_spines/vox/vox_tip + name = "Vox Tip" + icon_state = "tip" /datum/sprite_accessory/spines/vox/vox_stripe name = "Vox Stripe" - icon_state = "vox_stripe" + icon_state = "stripe" + +/datum/sprite_accessory/tail_spines/vox/vox_stripe + name = "Vox Stripe" + icon_state = "stripe" diff --git a/modular_nova/modules/customization/modules/surgery/organs/spines.dm b/modular_nova/modules/customization/modules/surgery/organs/spines.dm index 1849bb0a5c5..98cdd9869ee 100644 --- a/modular_nova/modules/customization/modules/surgery/organs/spines.dm +++ b/modular_nova/modules/customization/modules/surgery/organs/spines.dm @@ -12,12 +12,6 @@ /datum/bodypart_overlay/mutant/spines/can_draw_on_bodypart(mob/living/carbon/human/human) return !sprite_datum.is_hidden(human) -/datum/bodypart_overlay/mutant/spines/get_feature_key_for_overlay() - return (wagging ? "wagging" : "") + feature_key - -/datum/bodypart_overlay/mutant/spines/get_base_icon_state() - return sprite_datum.icon_state - /// We overwrite this just because we need to change the layer to be ever so slightly above the tails. /// It sucks, but it's the best I could do without refactoring a lot more. /datum/bodypart_overlay/mutant/spines/get_images(image_layer, obj/item/bodypart/limb) @@ -27,3 +21,21 @@ overlay.layer += SPINES_LAYER_OFFSET return returned_overlays + +/datum/bodypart_overlay/mutant/tail_spines + color_source = ORGAN_COLOR_OVERRIDE + layers = ALL_EXTERNAL_OVERLAYS + +/datum/bodypart_overlay/mutant/tail_spines/override_color(rgb_value) + return draw_color + +/datum/bodypart_overlay/mutant/tail_spines/can_draw_on_bodypart(mob/living/carbon/human/human) + return !sprite_datum.is_hidden(human) + +/datum/bodypart_overlay/mutant/tail_spines/get_images(image_layer, obj/item/bodypart/limb) + var/list/mutable_appearance/returned_overlays = ..() + + for(var/mutable_appearance/overlay in returned_overlays) + overlay.layer += SPINES_LAYER_OFFSET + + return returned_overlays From b9d8c6b5bfc2b63511a3b2f7e46c68fb030af5a8 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:42:12 +0300 Subject: [PATCH 53/62] [MIRROR] Fixes contractor support unit (#1669) * Fixes contractor support unit * Modular update * Update contract_teammate.dm --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/role_preferences.dm | 1 + .../antagonists/_common/antag_spawner.dm | 27 ++++++++++++-- .../traitor/contractor/contract_teammate.dm | 31 ++-------------- .../traitor/contractor/syndicate_contract.dm | 19 +++++----- .../antagonists/traitor/datum_traitor.dm | 36 ++++++++++--------- .../modules/uplink/uplink_items/contractor.dm | 27 +++----------- .../code/datums/contractor_items.dm | 28 --------------- .../contractor/code/datums/mind_datum.dm | 5 --- strings/antagonist_flavor/traitor_flavor.json | 8 +++++ tgstation.dme | 1 - .../tgui/interfaces/AntagInfoTraitor.tsx | 11 +++--- 11 files changed, 75 insertions(+), 119 deletions(-) delete mode 100644 modular_nova/modules/contractor/code/datums/mind_datum.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 5b82fa07e89..76ea6b5910b 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -87,6 +87,7 @@ #define ROLE_SLAUGHTER_DEMON "Slaughter Demon" #define ROLE_WIZARD_APPRENTICE "apprentice" #define ROLE_SYNDICATE_MONKEY "Syndicate Monkey Agent" +#define ROLE_CONTRACTOR_SUPPORT "Contractor Support Unit" //Spawner roles #define ROLE_ANCIENT_CREW "Ancient Crew" diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 6ff809b59cb..9ef40a9cebf 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -332,7 +332,15 @@ return to_chat(user, span_notice("You activate [src] and wait for confirmation.")) - var/list/baddie_candidates = SSpolling.poll_ghost_candidates("Do you want to play as a [role_to_play]?", check_jobban = poll_role_check, role = poll_role_check, poll_time = 10 SECONDS, ignore_category = poll_ignore_category, pic_source = src, role_name_text = role_to_play) + var/list/baddie_candidates = SSpolling.poll_ghost_candidates( + "Do you want to play as a [role_to_play]?", + check_jobban = poll_role_check, + role = poll_role_check, + poll_time = 10 SECONDS, + ignore_category = poll_ignore_category, + pic_source = src, + role_name_text = role_to_play, + ) if(!LAZYLEN(baddie_candidates)) to_chat(user, span_warning(fail_text)) return @@ -359,7 +367,7 @@ else spawned_mob.forceMove(locate(1,1,1)) - antag_datum = new() + op_mind.add_antag_datum(antag_datum) if(ishuman(spawned_mob)) var/mob/living/carbon/human/human_mob = spawned_mob @@ -373,6 +381,21 @@ spawned_mob.forceMove(pod) new /obj/effect/pod_landingzone(get_turf(src), pod) +/obj/item/antag_spawner/loadout/contractor + name = "contractor support beacon" + desc = "A beacon sold to the most prestigeous syndicate members, a single-use radio for calling immediate backup." + icon = 'icons/obj/devices/voice.dmi' + icon_state = "nukietalkie" + outfit = /datum/outfit/contractor_partner + use_subtypes = FALSE + antag_datum = /datum/antagonist/traitor/contractor_support + poll_ignore_category = ROLE_TRAITOR + role_to_play = ROLE_CONTRACTOR_SUPPORT + +/obj/item/antag_spawner/loadout/contractor/do_special_things(mob/living/carbon/human/contractor_support, mob/user) + to_chat(contractor_support, "\n[span_alertwarning("[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.")]") + to_chat(contractor_support, "[span_alertwarning("Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.")]") + /obj/item/antag_spawner/loadout/monkey_man name = "monkey agent beacon" desc = "Call up some backup from ARC for monkey mayhem." diff --git a/code/modules/antagonists/traitor/contractor/contract_teammate.dm b/code/modules/antagonists/traitor/contractor/contract_teammate.dm index 47a3c704194..54fc958c1f8 100644 --- a/code/modules/antagonists/traitor/contractor/contract_teammate.dm +++ b/code/modules/antagonists/traitor/contractor/contract_teammate.dm @@ -1,35 +1,8 @@ -///Spawns a contractor partner to a spawning user, with a given key to assign to the new player. -/proc/spawn_contractor_partner(mob/living/user, key) - var/mob/living/carbon/human/partner = new() - var/datum/outfit/contractor_partner/partner_outfit = new() - - partner_outfit.equip(partner) - - var/obj/structure/closet/supplypod/arrival_pod = new(null, STYLE_SYNDICATE) - arrival_pod.explosionSize = list(0,0,0,1) - arrival_pod.bluespace = TRUE - - var/turf/free_location = find_obstruction_free_location(2, user) - - // We really want to send them - if we can't find a nice location just land it on top of them. - if (!free_location) - free_location = get_turf(user) - - partner.forceMove(arrival_pod) - partner.ckey = key - - /// We give a reference to the mind that'll be the support unit - var/datum/antagonist/traitor/contractor_support/new_datum = partner.mind.make_contractor_support() // NOVA EDIT CHANGE - ORIGINAL: var/datum/antagonist/traitor/contractor_support/new_datum = partner.mind.add_antag_datum(/datum/antagonist/traitor/contractor_support) - - to_chat(partner, "\n[span_alertwarning("[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.")]") - to_chat(partner, "[span_alertwarning("Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.")]") - - new /obj/effect/pod_landingzone(free_location, arrival_pod) - return new_datum - /// Support unit gets it's own very basic antag datum for admin logging. /datum/antagonist/traitor/contractor_support name = "Contractor Support Unit" + job_rank = ROLE_CONTRACTOR_SUPPORT + employer = "Contractor Support Unit" show_in_roundend = FALSE give_objectives = TRUE give_uplink = FALSE diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index 775841e977f..e14b454526b 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -107,16 +107,15 @@ if(opfor_data.contractor_hub.current_contract == src) // NOVA EDIT CHANGE - ORIGINAL: if(traitor_data.uplink_handler.contractor_hub.current_contract == src) opfor_data.contractor_hub.current_contract = null // NOVA EDIT CHANGE - ORIGINAL: traitor_data.uplink_handler.contractor_hub.current_contract = null - if(iscarbon(person_sent)) - for(var/obj/item/person_contents in person_sent.gather_belongings()) - if(ishuman(person_sent)) - var/mob/living/carbon/human/human_sent = person_sent - if(person_contents == human_sent.w_uniform) - continue //So all they're left with are shoes and uniform. - if(person_contents == human_sent.shoes) - continue - person_sent.transferItemToLoc(person_contents) - victim_belongings.Add(WEAKREF(person_contents)) + for(var/obj/item/person_contents as anything in person_sent.gather_belongings()) + if(ishuman(person_sent)) + var/mob/living/carbon/human/human_sent = person_sent + if(person_contents == human_sent.w_uniform) + continue //So all they're left with are shoes and uniform. + if(person_contents == human_sent.shoes) + continue + person_sent.transferItemToLoc(person_contents) + victim_belongings.Add(WEAKREF(person_contents)) var/obj/structure/closet/supplypod/extractionpod/pod = source // Handle the pod returning diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 4b5332140d7..1d2551b0917 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -34,7 +34,7 @@ ///if TRUE, this traitor will always get hijacking as their final objective var/is_hijacker = FALSE - ///the name of the antag flavor this traitor has. + ///the name of the antag flavor this traitor has, set in Traitor's setup if not preset. var/employer ///assoc list of strings set up after employer is given @@ -188,22 +188,23 @@ return ..() /datum/antagonist/traitor/proc/pick_employer() - var/faction = prob(75) ? FLAVOR_FACTION_SYNDICATE : FLAVOR_FACTION_NANOTRASEN - var/list/possible_employers = list() - - possible_employers.Add(GLOB.syndicate_employers, GLOB.nanotrasen_employers) - - if(istype(ending_objective, /datum/objective/hijack)) - possible_employers -= GLOB.normal_employers - else //escape or martyrdom - possible_employers -= GLOB.hijack_employers - - switch(faction) - if(FLAVOR_FACTION_SYNDICATE) - possible_employers -= GLOB.nanotrasen_employers - if(FLAVOR_FACTION_NANOTRASEN) - possible_employers -= GLOB.syndicate_employers - employer = pick(possible_employers) + if(!employer) + var/faction = prob(75) ? FLAVOR_FACTION_SYNDICATE : FLAVOR_FACTION_NANOTRASEN + var/list/possible_employers = list() + + possible_employers.Add(GLOB.syndicate_employers, GLOB.nanotrasen_employers) + + if(istype(ending_objective, /datum/objective/hijack)) + possible_employers -= GLOB.normal_employers + else //escape or martyrdom + possible_employers -= GLOB.hijack_employers + + switch(faction) + if(FLAVOR_FACTION_SYNDICATE) + possible_employers -= GLOB.nanotrasen_employers + if(FLAVOR_FACTION_NANOTRASEN) + possible_employers -= GLOB.syndicate_employers + employer = pick(possible_employers) traitor_flavor = strings(TRAITOR_FLAVOR_FILE, employer) /// Generates a complete set of traitor objectives up to the traitor objective limit, including non-generic objectives such as martyr and hijack. @@ -308,6 +309,7 @@ data["allies"] = traitor_flavor["allies"] data["goal"] = traitor_flavor["goal"] data["has_uplink"] = uplink ? TRUE : FALSE + data["given_uplink"] = give_uplink if(uplink) data["uplink_intro"] = traitor_flavor["uplink"] data["uplink_unlock_info"] = uplink.unlock_text diff --git a/code/modules/uplink/uplink_items/contractor.dm b/code/modules/uplink/uplink_items/contractor.dm index 1364f8b088b..b774d05e59d 100644 --- a/code/modules/uplink/uplink_items/contractor.dm +++ b/code/modules/uplink/uplink_items/contractor.dm @@ -82,28 +82,9 @@ cost = 1 /datum/uplink_item/contractor/partner - name = "Reinforcements" - desc = "Upon purchase we'll contact available units in the area. Should there be an agent free, \ - we'll send them down to assist you immediately. If no units are free, we give a full refund." - item = /obj/effect/gibspawner/generic + name = "Contractor Reinforcement" + desc = "A reinforecment operative will be sent to aid you in your goals, \ + they are paid separately, and will not take a cut from your profits." + item = /obj/item/antag_spawner/loadout/contractor limited_stock = 1 cost = 2 - -/datum/uplink_item/contractor/partner/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) - to_chat(user, span_notice("The uplink vibrates quietly, connecting to nearby agents...")) - var/list/candidates = SSpolling.poll_ghost_candidates( - question = "Do you want to play as the Contractor Support Unit for [user.real_name]?", - check_jobban = ROLE_TRAITOR, - role = ROLE_TRAITOR, - poll_time = 10 SECONDS, - ignore_category = POLL_IGNORE_CONTRACTOR_SUPPORT, - pic_source = /obj/item/modular_computer/pda/syndicate_contract_uplink, - role_name_text = "contractor support unit", - ) - if(!LAZYLEN(candidates)) - to_chat(user, span_notice("No available agents at this time, please try again later.")) - limited_stock++ - return //bobux no icon - var/mob/dead/observer/selected_player = pick(candidates) - uplink_handler.contractor_hub.contractor_teammate = spawn_contractor_partner(user, selected_player.key) - return source //for log icon diff --git a/modular_nova/modules/contractor/code/datums/contractor_items.dm b/modular_nova/modules/contractor/code/datums/contractor_items.dm index 386a306ca07..58973be6297 100644 --- a/modular_nova/modules/contractor/code/datums/contractor_items.dm +++ b/modular_nova/modules/contractor/code/datums/contractor_items.dm @@ -92,34 +92,6 @@ limited = 1 cost = 2 -/datum/contractor_item/contractor_partner/handle_purchase(datum/contractor_hub/hub, mob/living/user) - . = ..() - - if(!.) - return - to_chat(user, span_notice("The uplink vibrates quietly, connecting to nearby agents...")) - - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates( - "Do you want to play as the Contractor Support Unit for [user.real_name]?", - role = ROLE_PAI, - check_jobban = FALSE, - poll_time = 10 SECONDS, - ignore_category = POLL_IGNORE_CONTRACTOR_SUPPORT, - pic_source = user, - role_name_text = "[user.real_name]'s support", - ) - - if(LAZYLEN(candidates)) - var/mob/dead/observer/picked_obs = pick(candidates) - hub.contractor_teammate = spawn_contractor_partner(user, picked_obs.key) - else - to_chat(user, span_notice("No available agents at this time, please try again later.")) - - // refund and add the limit back. - limited += 1 - hub.contract_rep += cost - hub.purchased_items -= src - /datum/contractor_item/blackout name = "Blackout" desc = "Request Syndicate Command to distrupt the station's powernet. Disables power across the station for a short duration." diff --git a/modular_nova/modules/contractor/code/datums/mind_datum.dm b/modular_nova/modules/contractor/code/datums/mind_datum.dm deleted file mode 100644 index d95e6e524fa..00000000000 --- a/modular_nova/modules/contractor/code/datums/mind_datum.dm +++ /dev/null @@ -1,5 +0,0 @@ -/datum/mind/proc/make_contractor_support() - var/contractor_support_datum = has_antag_datum(/datum/antagonist/traitor/contractor_support) - if(contractor_support_datum) - return contractor_support_datum - return add_antag_datum(/datum/antagonist/traitor/contractor_support) diff --git a/strings/antagonist_flavor/traitor_flavor.json b/strings/antagonist_flavor/traitor_flavor.json index 93da8d01374..773d2f55370 100644 --- a/strings/antagonist_flavor/traitor_flavor.json +++ b/strings/antagonist_flavor/traitor_flavor.json @@ -111,5 +111,13 @@ "roundend_report": "was a terrorist from Waffle Corporation.", "ui_theme": "syndicate", "uplink": "You have been provided with a standard uplink to accomplish your task." + }, + "Contractor Support Unit": { + "allies": "You are being sent to help your designated agent. Their allegiences are above all others.", + "goal": "Help your designated agent to the furtest extent you can, their life is above your own.", + "introduction": "You are the Contractor Support Agent.", + "roundend_report": "was a contractor support agent.", + "ui_theme": "syndicate", + "uplink": "You do not come with your own uplink, defer to your agent." } } diff --git a/tgstation.dme b/tgstation.dme index b59e279c4f7..fb7072bf3f3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6939,7 +6939,6 @@ #include "modular_nova\modules\contractor\code\datums\contractor_items.dm" #include "modular_nova\modules\contractor\code\datums\contractor_support.dm" #include "modular_nova\modules\contractor\code\datums\contractor_tablet.dm" -#include "modular_nova\modules\contractor\code\datums\mind_datum.dm" #include "modular_nova\modules\contractor\code\datums\objective.dm" #include "modular_nova\modules\contractor\code\datums\midround\antag_datum.dm" #include "modular_nova\modules\contractor\code\datums\midround\event.dm" diff --git a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx index a425a519253..2a625d907cd 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx @@ -37,6 +37,7 @@ type Info = { has_uplink: BooleanLike; uplink_intro: string; uplink_unlock_info: string; + given_uplink: BooleanLike; objectives: Objective[]; }; @@ -233,7 +234,7 @@ const CodewordsSection = (props) => { // NOVA EDIT: change height from 580 to 650 export const AntagInfoTraitor = (props) => { const { data } = useBackend(); - const { theme } = data; + const { theme, given_uplink } = data; return ( @@ -248,9 +249,11 @@ export const AntagInfoTraitor = (props) => { - - - + {!!given_uplink && ( + + + + )} From 7c253e1ba26472cde16aaf72e04f543c69fde9bb Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:42:31 +0300 Subject: [PATCH 54/62] [what a kawaii morning!] Snail Resprite, Brought To You By Supugaru (#1671) * wowza * wew Co-authored-by: Nerevar <12636964+Nerev4r@users.noreply.github.com> --- code/__DEFINES/~nova_defines/mobs.dm | 1 + ...eenshot_humanoids__datum_species_snail.png | Bin 2718 -> 2601 bytes .../master_files/icons/mob/clothing/back.dmi | Bin 36956 -> 37696 bytes .../modules/bodyparts/code/snail_bodyparts.dm | 12 ++++++------ .../bodyparts/icons/snail_parts_greyscale.dmi | Bin 0 -> 1175 bytes .../modules/organs/icons/snail_eyes.dmi | Bin 1963 -> 2035 bytes 6 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 modular_nova/modules/bodyparts/icons/snail_parts_greyscale.dmi diff --git a/code/__DEFINES/~nova_defines/mobs.dm b/code/__DEFINES/~nova_defines/mobs.dm index 2943a1b5e3c..a040ec993d7 100644 --- a/code/__DEFINES/~nova_defines/mobs.dm +++ b/code/__DEFINES/~nova_defines/mobs.dm @@ -32,3 +32,4 @@ #define BODYPART_ICON_SYNTHMAMMAL 'modular_nova/modules/bodyparts/icons/synthmammal_parts_greyscale.dmi' #define BODYPART_ICON_IPC 'modular_nova/modules/bodyparts/icons/ipc_parts.dmi' #define BODYPART_ICON_SYNTHLIZARD 'modular_nova/modules/bodyparts/icons/synthliz_parts_greyscale.dmi' +#define BODYPART_ICON_SNAIL 'modular_nova/modules/bodyparts/icons/snail_parts_greyscale.dmi' diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_snail.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_snail.png index a9e62a2ac8db8db5bf9f8779be91dfdf409805cb..f699cf7b70289dae4fc0a823d1c62f5ffb6e0096 100644 GIT binary patch delta 2472 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 A`2YX_ diff --git a/modular_nova/master_files/icons/mob/clothing/back.dmi b/modular_nova/master_files/icons/mob/clothing/back.dmi index 4e8d6bc375fc4af777fbc33f641bfde683b85efe..0fd5d84f1e623a22dd7cb56d0fe457523520be81 100644 GIT binary patch delta 16421 zcma*Oby!qU*ET++lys=1G*W_uNJ>k0H_|NibaQjv`-S_o=vCca+C zlZrnFoq}gxGs%W1es@%IS+?X{6FGUuDe%Wry*7U3;)Kg-ww0M)Bmq?%OG_$IUk*l@ zqUtwq&M)P;Tx25#MXA+(gj-r39ff{SOdT2$B8?H22Lw8zu_#e*!_+capt9Hh z1eB~RzI$JX+lo^b1UDLRPbB<-uKUASt$8*~LVniO64NV!EsHaRX#Oipl*LwO-TH|f zbWy^_kd>vkeSwnFVzNHQ2B?eCeY9pG;)K2uHTe|KM#`_wyrYG+F)#a4mx^%muLW9G zWcp91S3#I2OSB#hRn^bDzAssjH%GCb3en;+R!I_g5<8t5VwCCGjMg#=U1x8&* zQv3asFWtHId}hiTrnQ;@08b7#7Rg_q{=Qs!BzxPr*3#V$SDS9}NTn6-OK9>&vMn3q z{PRUw3w*ZGJcu!yZk^?+17D4TXwu6w5~;+39K3|-HCf%(|1I&{k;ERtzX_!sniyw@ zd+eP8r@r5vWN0)r_7`qoVL3>NgS}jqjpL{myp4|EE%uNxA-AxuHwx zwnciA38(r(qy<_c4aPT`5}elXuQ8O;ZZWT09`U11ZEAyXDAS?H5jQ0_(JB z7cP}u*T_FVmz-GiG2yMLht8 z&_oq>lnDC?jSRt?n*=@$QBzNs-HEB++0FQx6dzurTs^%Ze{f%NnxovHmM$1E#9ygZ zldt|YR__*0pjrqDzFM6&^tet`G~edV>F(UTZZhMQvq$|12G;)2S=$@szQJH-jgq?( zE))k{bM$>bc-Xr4V+NnK?c;-}Lxu0+p7ee7G229KJJ_2Ja4o9nHFq_Uo8aaIsQT~= zH7ly$k*6tJilVmmXn$M{Pze{ULMe}04C>@(@A&Z~ z$j(-<&5ogN=q`gVYMc&bbvVD}=yEsK`GU|mdaWBh8+iPPL(PZpwG^;Wog;(Zk)rrz z>3~JSE2KOac)nm9h2zhka@I6c4ZkEbCg5EVon3i^f%;(IUlrGM?HPVyDt%S1Q=Z|5 z4)K}1(>j!+_FvPNI29kU=4(GLs0(p|nvqOZ&fa)BY5LA{9|Nziqmw+hldOb}__NvP zt8}%z7~DntBDNnCzSyu1rl&Zf{Hx_dgCI299_T5pM~2{135Ck=`v#HqEe9KZxtpsX zpK@@GZaI#uh#DLrhXPeq|dUqWxoNiTBgJ#*#dhYSs&z~&#qBr11zBuMoh-79q;Beqp5R4M(x0z~4c zb99#t=GiFS^;BZwC+E-Jz9imh^qJ*?OVEKnvZ2Yuf92#D7Q7D{sqAHahx9e>La=hPnFRYA4IS#evv;!|55{dRHvSl&Stpc zwto>Ie6wM|-&1uSWvYD(VWBisr7Uh5HeX4Vnl>aUtxHk$K{DCX+|oIN4=3N4#KMp} zKnLY%KW?Af2 ze0pCDwInv~@V0u-9!_YSnFsH_ev4Ei+4WG@K8jqj`JuHN#XYE=r4iC5l{seoem{lJW9otPmNQahVI00OQS5KzM);*zjREKw|qZRJGwME*$ z#@Fv|V}aR7UsuvQ*Aaw^ZrQv`;U%JUOejsXOx8_UhAp_YTVx2UMa>l4OZ>;FlW{bx z)VcQI9u6$vK^&t`1n2a5n)jTWrA6(E12Qv54sR@g;!5XEcu{@K`1-+b_!s&TnLBcL zNhx8CJ&@BoqkeZTJG*jq?M)cZ4+6t)UpY(=0?L(df*e4T$i-gc=aex6Mg%DCwo5>l z|I1AqZQIU94DEm1K8JyGyTeVWs66y>HhXS1uAUk(`_26Sq6TdE1NM*s{>_WI2VOd| zj=vw2<;JSu!}vEvOAmF6iw2sMsi5DUpuOcK&&EI*Gx)#m9_5r4HS=cp{~|)>)pa-s z11Pog#%@TAppVDM_T9C>iFu$@k5K`LfTDK1L>dmVs=j+^FNV2T_6#?ecE$6+iM^Vw z?QJig=dIu;B*@CjbfxWWClq=0it}BX5?5v=SZXxZg_pe{R!&EcA^H+νAwQ!!P^ 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

Ax|W92J=UxVXe-dG@ZIUyRVnjE{a5{OlII9ck|D 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 diff --git a/modular_nova/modules/bodyparts/code/snail_bodyparts.dm b/modular_nova/modules/bodyparts/code/snail_bodyparts.dm index 9a4c166922c..b80ad943352 100644 --- a/modular_nova/modules/bodyparts/code/snail_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/snail_bodyparts.dm @@ -1,28 +1,28 @@ // MODULAR SNAIL OVERRIDES /obj/item/bodypart/head/snail - icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC + icon_greyscale = BODYPART_ICON_SNAIL head_flags = HEAD_HAIR|HEAD_FACIAL_HAIR|HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_DEBRAIN /obj/item/bodypart/chest/snail - icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC + icon_greyscale = BODYPART_ICON_SNAIL /obj/item/bodypart/arm/left/snail - icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC + icon_greyscale = BODYPART_ICON_SNAIL unarmed_damage_low = 1 // Roundstart Snails - Lowest possible punch damage. if this is set to 0, punches will always miss. unarmed_damage_high = 5 // Roundstart Snails - A Bit More damage. /obj/item/bodypart/arm/right/snail - icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC + icon_greyscale = BODYPART_ICON_SNAIL unarmed_damage_low = 1 unarmed_damage_high = 5 /obj/item/bodypart/leg/left/snail - icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC + icon_greyscale = BODYPART_ICON_SNAIL unarmed_damage_low = 1. unarmed_damage_high = 5 /obj/item/bodypart/leg/right/snail - icon_greyscale = DEFAULT_BODYPART_ICON_ORGANIC + icon_greyscale = BODYPART_ICON_SNAIL unarmed_damage_low = 1 unarmed_damage_high = 5 diff --git a/modular_nova/modules/bodyparts/icons/snail_parts_greyscale.dmi b/modular_nova/modules/bodyparts/icons/snail_parts_greyscale.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0b57859dca4ec44d8fe7a96dcea2907773e59546 GIT binary patch literal 1175 zcmV;I1Zew-P)bGWWlV6{lkH19~t+s$5Bbt7+2W7a)=DMn0XG zgQ)L2c7rylvi{G{k2|*QLtEJA=ni%mEOwBwFI)B=Vp7V1ZB1yOhEBsAk)DbKWaC{2 zwrWEAM5KHl+<;e2v?x1}Qa#vy0^7F+N6;EyBp~&OHlZz)f(94e&_4ck^Phzp!9h9@ zIBV6=hP{te9X3oV6nuEp6h5~PM$^x-=XewGW@nbiP8hO=iXO8afhX_1ds=LJX`8Ya zWd~B4!bKrNWcn57ThQ|iU4jm^nx>|vz`W+L=!tzVV%`bD7g2P2EPK=U1dLJ_uzlHH zwJXqC3nOS%TXzJ>Zmh|zdf$M&cy|r$tG!-Vy>Ag9+zey;e!RooGPWxyyl&eJ!!Qi< zZ=iLQ_bRPx_Ak_g`NH|7E6tI%1#F`rj(JmriSoSyjqxxg+P73yz*|hhCS}9C_nXytbIhTV0mP?;sl6;3AWyzN&yCT;#c-robF-V}G+^Q*{lT zcK8&HSRG08AyHN-kUm;d5AnB1AE^m6g^6kzawwVrY5KT{U~7>&8e`^`wh&mJ`VfF5 zPxvTf5@T}3ra-#l4yUM%9Aw!>ASrRjl9-H#D7vyW(CG+3KwRPxq?5YEl;(8a;bWFm z#7YEYlNkZLC{h!?M>@S?OTcGF0B=t0k-LIn80Ih2A8x!2k=@uT7EXt32-Eh}1Ss28 zzV#M_$xczd^0>&?!B?7Z5y(gSvTAvpsQ||NRnJF$1Mz+me9JgAoQmI5i1(9xAPJVK zD02I_0uOnj{)CGfTyY@)58C2NDOy6!_y^$haz*<1^l0 z$p<3uBg14EhG7_nVHoDCQR#qTJwXxq{3fiVMt_p>E$2Th0&zjE&1Q|^#~#sn%sJ=Z z{;4X;F)1nL&%wt0?_c-0>7Vwuat8C7|GmcIQ}ydDhG7_nVHk#~&kwMM`k%L8k}z~D pZnx8efFDZ*Bkpc$}S(u?mAQ6h-H}uej)1idvTr zS&C8|^cN)HYYaq%yioD)J9KS_I9@pCUbs0P?Xw%u^c}r9h}%|Z)YpR4?xr|H<5rQH z+1WXMgG3V<8kwxd`H>HnjMU_UK%*x03T9z}M)?aJ7boIYn}4E&6a8tDKeLb|S-K~#90?cKdj97!03;TnXH zWkfKM1LwX7%T{+{ZMwnc8%<&-do$jIh@1d9LnPI*#ohzjlz@l;fe^BoO{Trg{J?bA zf1mfs7$m-8s((&*O(VXVSZfWSYA5vofRuU#;P*fNoV$GARqFaLiBUi0@0j}i4^e;8 zcMEiRbvJ+e=JjOT*L_P}zg5@ujO{ww_?)zhfBE&;0e{$LOd%{Uwpfcl1U>`wlydPK zW6bT%^<@8Gx^k;u+>Myeo(8>P7yn*9`!!ICK>=9aYscJs=c=457~DH+0dN<}jhMycCO)jtQvJAoH)!qE$_$cQ22rIo%&rZJuuiLFr z*Y!?2j-duEo^D^7_Hc+4thGPeal{J3+c&S*wkJ<5^5Gy8Ywg^aw2ir}wU6yMh6bVc zf1=sclquFB3H9OOdpnz*uhgeMeiYrs-<84n2=gH!V8IN)c?jd-EdcG+KSqE2)cxo= z4`Eg3e1u@{P5ZNb-f6rqR{G;>Tem&R`DfD^4$_>?2cSQ`w(fQ(1-H3-R-N1>ofPXtJ&|a}MlmcAmOFeuDE6ocrVZ661V=5a%=WZ;!sA zJ$Y&|8|IFwKfVw92h(}1hQYq;@EM?|O--3HI3Hn9e|&WW0M1H2FJagbNs0UO=csc& zLh%0hxxN1-pO?TLz_Zf&evE78h4W)12B_61P6cSH30O-FRwqoPbJR(-~g=akAHUh&BvIY)vb|J zfBYEd6XbM0!&uHo7}gw@{`gPF5veu0F?lq`9n<{xKOkd6Q>Oic>HPNQI`|^Iy}6$3 zA52&K^V1(cim{!Kz=vQ+^A>>i>K~&&evCU!A31DGQY-a*1n+kM`r~UWZT>mw3Z3{$yd~K!9KaW8n%{c({$JbW+{PPqD(%1q) zlYs^nlQ0Ave_F2qR8{rC<@;k+Rn_M))>^8YbpAus-#P$QRegB1_wM_qA}@V^%&MyT z{A%yr*BA>kX04^VN#{RQ{jCGgG|i9uhl`KKn3W=nufN|vTzqVr=0~3al&Y@lNw+ut z{li7H+TB{Q&PYf-|Do#l+5#)1j#f>pii{Dy1e^1#Pzt#50j}-!waQ@r+%XK!r zz70ME_q5!UX|WagYK-~PG|k_k>o012F~&UE2C1BnuxXJG4Icr3H2MPd^jurM80`U5 z*B=}103O9yd@OLkxC20%)A<1E#?T*M9a|s=IV`*!#!xc0K%SJ^A734J07xSMj!N&3 zuZ}Gc1Eg^WlR*L-lP&`pe{TVZ*%n=~1v|p<5`dUz1Ef5M;I~h+XFD;x^!?K7=Th5e zt-%4vp+Ej&3{S=p(&^dZq^hd5Z+=x(^V74#p#P+vx_;MK=6_IUxK3Z1q`hf6y>aHT zdgU}tGpVX--Zagx#kTx)==yzL4`EF6-#a;L`r}7EAYQ6xW}L@er>+z-#GxO{`kZn tz4B1{{PPqD(u&&x0s%gg9s@5H{sXVfTGg)LBTWDR002ovPDHLkV1h)~i_-uA delta 1688 zcmV;J250&6533K5B!8!RR9JLGWpiV4X>fFDZ*Bkpc$}S%u?mAQ6h-IcD=xa0qSiG_ zQHq29LJ0Uw0;xh?sQC9Cy4pfIUO0zyOWga%Frga<`J%{vTcOZiD=BtACkKUFBZVVx zUHS}8CJ_`0UX2f$4q_b(DP|uT3au1NG*4nE)Ti*%GyB!*=zpzCIb!&y5@^Ya*s$%n zytaIx2ffJ5DN>M|q9^GUymq&}Le9}ekPU_O6q$y}AAAiEWk8z))mUW%tSB}=qEwr2$ z0Oy`B0@FKTjPVdcD1LEh4FP~OlK|APEh%Yu{W-3{Lyel=^IY4XHE;(olw%KGYM;MV z9bbe&naQU>s>WNM+*jt3wYP*VP=Xp3UJYYt8CxJDIX{Ol`I-OLa0h4%i{BOjNL1>} zC%*Ku!37ow(zpYYkOm%;fCLYdjspsRvjD8!8@^Pnv0D4`4@!=&)$PFa}jMy!WYNFxvvrA75Lm^WWUZpe%lE*7Khn0Q%!=YkmIt z6bRCq+X4ZWlTigIlVAl5f8Nb|f0gohjTQxwKX>OA`CE_I zYEb}oF?Q3g%(d_#>~}F1>yN+n^AY;K|NZcI|HV1?Vv!$zzI%AQ|I+vU@3qHbY4IC3 z*P6TrIh*AUtvOcdo#D8+PeL#(e&<|si{CkZQ3qIz^AWa%06-dj zffjnLGg*$Vb*1ZX4R-)TE%wJ(#~lFDlFkQEw}t-r>evD$sA1vNFou?~1v1iVe|&Y^ z0UE>Nw?zOFwca0J9a|ts;|`O611giy2MT{?0q`MYYm1$;)=AyM{qalJucfwSEt3HF z5UxId`ui@&!pvFgq;BE<_@(QojIHKc7YAV4m;T|ue=WxIF5_Augb%q|gO}`&U%LL( zi}`=N&r$ZImc{u97yZXt`r|w2T#WH4S8MRn{qcwT(>mw=eJ!=jzs30oivuw2OLKqR ziaalX7+0TwV~yuUINAoO^v6H9$a63L;pf~3WXxTJoV$Gf`4kA!lAGfmugINqS^MMv zshQjH3e=tZSbZ%cL4h1Yin`-=?n*HNn0TL<7?Z({3mUJYFKzRj6qcm?|teR z%(g)E$Jf^C{PQs=nqnQaH4+QF7-NphVW|Lw;r#t{-OZf++KIy``IGi`@_xc^{Rg$UAq3*R{G;F zv5T?uA?)WK^C9eaF|PXluTlS^KZ^I>ANs!U&i%Y~bFDdYz6W!)a`xr%A?*7Y_ve0Y z3BLm@RC@6{=Um_SFYbgY=S(A5BLI*_U!a9v+iGO&k6*0*)^G_}QS1Hj)v*PFH13l<0xOeG0t|o6 zEC6fwhA&lXtn~Q=rR&#H+p^Zh0hsos|K;2dn<2ezsFk}ve(CcGO4lFT%J~Qvb%q From 7faa6a03144609155b092d0760204b064059a86a Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:42:51 +0300 Subject: [PATCH 55/62] [MIRROR] Fixes medical bed interaction (#1673) * Fixes medical bed interaction (#81062) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Co-authored-by: san7890 --- code/game/objects/structures/beds_chairs/bed.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 0eeb8ee15b2..e2038cb623b 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -118,6 +118,12 @@ /obj/structure/bed/medical/AltClick(mob/user) . = ..() + if(!can_interact(user)) + return + + if(has_buckled_mobs() && (user in buckled_mobs)) + return + anchored = !anchored balloon_alert(user, "brakes [anchored ? "applied" : "released"]") update_appearance() From 82e980585d4e2b06eeaa6a20c0cab09b0a866148 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:43:12 +0300 Subject: [PATCH 56/62] uuuuh glaive sprite updates i guess (#1674) * i dont remember what i did to the item sprite * last revision i think. i hope --------- Co-authored-by: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Co-authored-by: Hatterhat --- .../master_files/icons/mob/64x64_lefthand.dmi | Bin 1436 -> 1400 bytes .../icons/mob/64x64_righthand.dmi | Bin 1437 -> 1385 bytes .../master_files/icons/obj/kinetic_glaive.dmi | Bin 1304 -> 1280 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_nova/master_files/icons/mob/64x64_lefthand.dmi b/modular_nova/master_files/icons/mob/64x64_lefthand.dmi index 70ac1d387c1aca9807b10ea72a0a5ca36e1df14b..2197d194135dc78abc95303abf00ea502297776f 100644 GIT binary patch delta 1152 zcmbQk{ex>llA)2d#>3~YOf4Lv{9G2T+!z*>Txr#?pe>2<|9u%5owT&HLPzV{OOp3^ z%})6LJ!*d9oQacH)~kEEIEGZrd3z_edX|GgTjGX`5vGQ3PpJu+oc#ZP@?F;bNzymx zMs^*1Zg=7;bNY-**EQ@DQW+qi?~_gV)qXeS+}icLpJJvT@TmL~cpja#n}Jb7dIkHA zul)zM#;{yv^f+DrhV%9NZ%dfJ{LwY2w_`C7yXw!!=+h#c@%eJ8#C#S7&x9hO2A#%@ z%e@YWUyn_3x93#Yclb##!y*=rgzfwF8muE39&ctyiuO6jG(qJ;IfMFrrbP^X`&c<1 zM6+G^?f$^8T5!&r@8Ts24bl7x*1Oq`$p86l>R{mbtlj^Ez2kkCu)DwW8B=%eI=uJu z;rjoA*Zk*N|96krKRZ5V?Yn^Y>v$A`Sq(x%S6d4(FbW*-WiP1baF}-Bi$Fs~`${uL z-{#+w8B{oZ{Fx@aGYC~%uxkHLXlNi&68q+V6#b}rJx6TsIh%b;j5*b29%mPbzciC& zGDj3o)_-ZU)0>VuKUbZuTmNbv6HwMxPkx?Q?DUvz6;%;-UP2xQC*Krq`y;x$zQl9( z(e+P#CO9;C)^y)LoqAk#?X-2tH9$R?QD@RW`*}z0%xhv1@+ngNeOgH3(!WV8ZCmSW zn4E9hn>9XsD?j~!!1sR7gc-lv)eWxvbrzO*_b-u?r}F;-Xz6icH>d z|H4LH7S$qOrg*jm^N)P($W_z`{Jm2RR4S+ z=Msr~-!I4hDlmFBYXCGTR`-fo8nWsy1F4yFIYwrGL&nN%$-CWa1Q+Km>u^ej+m->D> zTX?3>-gQar%s|zGfUB8o1$@%M^-DOboV_Ne z{SUEx$1;Dvc*|bJM8mCKQy)7%_&M8Q5x2vt^Y!VxyQlp!zajc(88eEXL7W2<-{tkc zuU~({?bDwIm#glAmdpBLfXtAq?6-42{5?>%J5=tC&(AEapIp0M$!@OQJlpq1wz>50 zZNB9~^;1%}ZQC~KuKnAi;kTbHdwOVE-`adD)1{pIRPRikx&Qsut(&Y*-3`o5>nZsE zYuU>mukPBmP2JeH@>R6O+26k&-)+4V_B!svzm0YOf3tM#E8JN5t#R%AW~JNv`Sd4; zymvQ!ROf7`9mb_|8fnM-@l)yn_T_mf8OQdtECs^9A0og=F_jJ za|nHV-}d2Uc02zMcQW`DzO>#yyK3TxR+x_;*#BmB(@T6a@k_*1keH{dpUXO@geCw$ C-4%BL delta 1188 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 D!t5}J diff --git a/modular_nova/master_files/icons/obj/kinetic_glaive.dmi b/modular_nova/master_files/icons/obj/kinetic_glaive.dmi index ae0bbdb0625ce689c6478246407b6add6cb83f09..407ae6bf135396db0823b9cf8126e3a41c265ab5 100644 GIT binary patch delta 1099 zcmV-R1ho5@3V;fb#D6DAL_t(|ob8%zXj@erho3vQ4`qr2>9n(`xm#;N+7A8ThNIO^ z9Y~wv%NRn}4;5@&T33?>Qruz_a1126IWt=jgmpwl#bUQ9QwL30haFag$+i~Sno;eD zNT-VwnQ;6Nb9WQ6t$A5aUhV^-NhtUHpWi+Ib57GJV`F2KGJh*_Ihe!g77nLd@peg_X>OW-Z;6owk`o+ zQq@d`(@2m927d_zyb6=RB)*)?0KI%@VUbHS^8j?eTE+ACY$Y)Sld96(YG%U*l?T_| zpYE`Fbn+1eAQ15?frvMy*2-uG=;e>~J;j=TRH{{bL<2B&Y%sj!* zdg<){iQhIIWYf?SjHu5t5k4OGds)8wStIRT;D_;`_J7>`(#JfxwgqOtV`L|+`+hfr z{Tq44IYC8bIVM$&lYiyK9b{t{V6v0OyAi2Qdp$}z2ca+BZ;OYj9;LZK;Y3hSJHMIJ zSAPXyB7B_DFW#W$g#(&=kG+T8);IZlRoJJ>fp zz+nHzIDh%(R&(CULmC0ttQO&W_ccbpJ{R}?zS9G=G}XsV`{q_NhdwxvxAKtYA~<#7 zA^@k(oY#J~G}Yt%>YOHTGCh*_@{r~lV6$4pwk@^V>!Fj;K=ksD)z#71usN^gAC}erKMF4tv0R6sS=+b(Uwt&OwPPp??PMtYlRPvA{0Eg2pOsdMB!_l*T?9LaX zJS4P0Odg`g+M$ydS$prlKygibJz4;I`MKFy7Uq91$bCIkRzP&Yvzkqu4NjDlJiuL- zr+(HJy!z^L#wSB1BM<-20R3to>-kba+kXYNZK)-+uqd+@DXhHuS0rw)FE!HoM5vg^ z>A%PG5hDQE1<1w-Kz0GLF#^c;1*f;SOZ^g*%jHUG{Hz8ry}ezi%HPsLaJgKftgI}h z5V9IT_3#m8R;;Fa_=uE0raT^xvb3~>$KzS{_{K?4b^)?60+3yRY>WV87a$uW07TgZ z$i@gjb^)?60+3yRY>WV87a$uW0NDk|#t1-m0kSaykX?Xmi~wX8Ae)j8;6KPF#NlOY RV_5(I002ovPDHLkV1neDCj$Tg delta 1123 zcmV-p1f2VT3YZFz#D70YL_t(|ob8%#Xd7i5$3HjQ7iAU)vQ6huleM)VX@|aW!_nwm zok-g;bri9yP+zn*{b$ociyG62V<6GZn%ROVtfewK9CmJ6-Jl8WSjP%NWorv*&4^Yb zlIbc%CY&#_oR_Y)$tC7Vn)|-GyM%jwpYQW~e!u4~kw!*FNPnis9N)w3dy!Dx(kNFV~a5aS1Jv-o`5;qX zKLCv{=JRy!Q;HG)qaxq|+zU=A7I=uW2&&;vbUx08zt(g3N)3QwLZW9sQvbqhRoq=* z%InATSsS(X@AzrQQFin_$|>U>#sjA#zPA+qh5eN&(SHgx8*q8d!|>=N02R-D#ABPv z**|-Ziw7szat$WRqv}}aF=z3kgKmQ@hN+iDY z$e8>)Ie+~}0LBBS8T$NH3ZFfqz_(aiXtp$Q^3;ixnfb6ZbpdzaHwavyZ!C0Pxa}G> z8!9<8(|<#+eR~9a*}jUDg$E4=v|8$9*E_E;^wp(^>xa(wP`HlCtoi zu?9?ExeB1vfZ@?e%6AvzJbOujHy9pFd3exR16nP0^4?u0<-G4q$PhLB!$n1yOLnF- zJZQ{-Cw}%S$G-U>C6C-gc%N@Dqz^o3r~yOImw(C+$T#`;(?Lwn>|x65C-8d~FTGp| zKz&0kkUD*SHN}(xVR(Sj+-xSlKBqkV%+37(K)bawZQvn>8lZ;vN!fgR<0jqTj6^)} zgpd3CKTHdFh;j)yI@{!G>p`6MPbkg39lq64C-?WS{1}|7T6GCHI@{#x@*<{vH?Z1k zmVbp`?HxcWYsCyu!-smliR}DBS}k=-x~DTdtYCl|9zfmq(;Zr^WtTvEN7s^>4{3OG za!tX*G6uAFbjb#zkvEQo_WI$OUyJatWC?`fA+)XSJ9Cvycl`~lt+ZE5F+dGJH#^I` z|JStY=UTN6LIuxKVc>#iJfq+N?zlGny?;{hiVHR}HsQ+{c(|1T>S`Ze^O+*03+&xx z!Z#lj8H*5QUH@YtqSt4dG`$g8OG@g`nRvKF63d#;c!Tci;FlMj$Ek6 z*LQ-V0}w6U0MP-6mTrLP07OeSKy(12r5hkR0MXJ75FLPM=>~`nK(urNL!A$ Date: Wed, 24 Jan 2024 20:43:30 +0300 Subject: [PATCH 57/62] [MIRROR] Fixes runtime when mineral scanning(#1675) * Fixes runtime when mineral scanning (#81049) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/game/objects/items.dm | 2 +- code/modules/mining/equipment/mineral_scanner.dm | 1 - code/modules/surgery/organs/internal/eyes/_eyes.dm | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a71c479811f..04895e528ae 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1092,7 +1092,7 @@ skill_modifier = user.mind.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER) if(user.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_JOURNEYMAN && prob(user.mind.get_skill_modifier(/datum/skill/mining, SKILL_PROBS_MODIFIER))) // we check if the skill level is greater than Journeyman and then we check for the probality for that specific level. - mineral_scan_pulse(get_turf(user), SKILL_LEVEL_JOURNEYMAN - 2) //SKILL_LEVEL_JOURNEYMAN = 3 So to get range of 1+ we have to subtract 2 from it,. + mineral_scan_pulse(get_turf(user), SKILL_LEVEL_JOURNEYMAN - 2, scanner = src) //SKILL_LEVEL_JOURNEYMAN = 3 So to get range of 1+ we have to subtract 2 from it,. delay *= toolspeed * skill_modifier diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 7ef529af133..55a0ab44949 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -71,7 +71,6 @@ var/vents_nearby = FALSE var/undiscovered = FALSE var/radar_volume = 30 - scanner.transform = matrix() for(var/turf/closed/mineral/mineral in RANGE_TURFS(range, T)) if(mineral.scan_state) minerals += mineral diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 884f3a9043d..a447b508c71 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -310,7 +310,7 @@ /datum/action/cooldown/golem_ore_sight/Activate(atom/target) . = ..() - mineral_scan_pulse(get_turf(target), scanner = src) + mineral_scan_pulse(get_turf(target), scanner = target) ///Robotic From 6b4ebf7e667a324186a0bdd25dec5adb5cb07749 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:43:54 +0300 Subject: [PATCH 58/62] [MIRROR] Fixes boulder processing mining point gain. (#1676) * Fixes boulder processing mining point gain. (#81067) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/modules/mining/boulder_processing/_boulder_processing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index 5cf9544141a..daa6620a233 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -211,7 +211,7 @@ if(!is_type_in_list(possible_mat, processable_materials)) continue var/quantity = chosen_boulder.custom_materials[possible_mat] - points_held = round((points_held + (quantity * possible_mat.points_per_unit)) * MINING_POINT_MACHINE_MULTIPLIER) // put point total here into machine + points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine processable_ores += possible_mat processable_ores[possible_mat] = quantity chosen_boulder.custom_materials -= possible_mat //Remove it from the boulder now that it's tracked From 1fab4f6348f31b40076e7081d09e21a965822736 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:44:15 +0300 Subject: [PATCH 59/62] [MIRROR] The addiction withdrawal blur effect is now properly centered (#1677) * The addiction withdrawal blur effect is now properly centered (#81069) --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: A miscellaneous Fern <80640114+FernandoJ8@users.noreply.github.com> --- code/modules/reagents/withdrawal/generic_addictions.dm | 2 +- code/modules/religion/burdened/psyker.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index b42345ae97d..4eabfa1095a 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -74,8 +74,8 @@ /datum/addiction/hallucinogens/withdrawal_enters_stage_2(mob/living/carbon/affected_carbon) . = ..() var/atom/movable/plane_master_controller/game_plane_master_controller = affected_carbon.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] - game_plane_master_controller.add_filter("hallucinogen_wave", 10, wave_filter(300, 300, 3, 0, WAVE_SIDEWAYS)) game_plane_master_controller.add_filter("hallucinogen_blur", 10, angular_blur_filter(0, 0, 3)) + game_plane_master_controller.add_filter("hallucinogen_wave", 10, wave_filter(300, 300, 3, 0, WAVE_SIDEWAYS)) /datum/addiction/hallucinogens/withdrawal_enters_stage_3(mob/living/carbon/affected_carbon) diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index f43e33aa25a..bd063dea439 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -317,8 +317,8 @@ var/atom/movable/plane_master_controller/game_plane_master_controller = owner.hud_used?.plane_master_controllers[PLANE_MASTERS_GAME] if(!game_plane_master_controller) return FALSE - game_plane_master_controller.add_filter("psychic_wave", 10, wave_filter(240, 240, 3, 0, WAVE_SIDEWAYS)) game_plane_master_controller.add_filter("psychic_blur", 10, angular_blur_filter(0, 0, 3)) + game_plane_master_controller.add_filter("psychic_wave", 10, wave_filter(240, 240, 3, 0, WAVE_SIDEWAYS)) return TRUE /datum/status_effect/psychic_projection/on_remove() From 2ab6bc9acfdc9379ce58e810509e96537de52ca8 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:44:33 +0300 Subject: [PATCH 60/62] Adds a modular override to remove individual pirate ship spawns(#1678) * Interdyne Play nice * Simplify this a bit, turns out there is a proc for this very purpose --------- Co-authored-by: Zergspower Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> --- .../code/modules/antagonists/pirate/pirate_gang.dm | 4 ++++ tgstation.dme | 1 + 2 files changed, 5 insertions(+) create mode 100644 modular_nova/master_files/code/modules/antagonists/pirate/pirate_gang.dm diff --git a/modular_nova/master_files/code/modules/antagonists/pirate/pirate_gang.dm b/modular_nova/master_files/code/modules/antagonists/pirate/pirate_gang.dm new file mode 100644 index 00000000000..fc05a926507 --- /dev/null +++ b/modular_nova/master_files/code/modules/antagonists/pirate/pirate_gang.dm @@ -0,0 +1,4 @@ +// Override for Pirates for lore or policy reasons +// Interdyne isnt a hostile faction in current lore, balance reasons aside +/datum/pirate_gang/interdyne/can_roll() + return FALSE diff --git a/tgstation.dme b/tgstation.dme index fb7072bf3f3..b1f4f87d928 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6291,6 +6291,7 @@ #include "modular_nova\master_files\code\modules\antagonists\changeling\powers\tiny_prick.dm" #include "modular_nova\master_files\code\modules\antagonists\cult\cult_items.dm" #include "modular_nova\master_files\code\modules\antagonists\ert\ert.dm" +#include "modular_nova\master_files\code\modules\antagonists\pirate\pirate_gang.dm" #include "modular_nova\master_files\code\modules\antagonists\pirate\pirate_outfits.dm" #include "modular_nova\master_files\code\modules\antagonists\pirate\pirate_shuttle_equipment.dm" #include "modular_nova\master_files\code\modules\antagonists\traitor\objectives\kill_pet.dm" From 63a8fd893c82d6e47b6b80bbbb5532460078c48d Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:45:03 +0300 Subject: [PATCH 61/62] Custom say emote formatting fixes: no title case and trim whitespaces (#1679) * Ensure custom emotes are not titlecase and are appropriately whitespace trimmed * Satisfy unit tests * Use splicetext --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/modules/mob/mob_say.dm | 4 ++-- modular_nova/master_files/code/_globalvars/text.dm | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 28b3da6580a..1f384878e8d 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -169,8 +169,8 @@ return message if (is_banned_from(ckey, "Emote")) return copytext(message, customsaypos + 1) - mods[MODE_CUSTOM_SAY_EMOTE] = copytext(message, 1, customsaypos) - message = copytext(message, customsaypos + 1) + mods[MODE_CUSTOM_SAY_EMOTE] = lowercase_title(copytext(message, 1, customsaypos)) // NOVA EDIT: ORIGINAL: mods[MODE_CUSTOM_SAY_EMOTE] = copytext(message, 1, customsaypos) + message = trim(copytext(message, customsaypos + 1)) //NOVA EDIT: ORIGINAL: message = copytext(message, customsaypos + 1) if (!message) mods[MODE_CUSTOM_SAY_ERASE_INPUT] = TRUE message = "an interesting thing to say" diff --git a/modular_nova/master_files/code/_globalvars/text.dm b/modular_nova/master_files/code/_globalvars/text.dm index f730a8ff817..3517f458fea 100644 --- a/modular_nova/master_files/code/_globalvars/text.dm +++ b/modular_nova/master_files/code/_globalvars/text.dm @@ -7,3 +7,10 @@ input_text = replacetext(input_text, GLOB.noncapital_i, "I") return input_text + +/// Ensures text does not start with capital letters. +/proc/lowercase_title(input_text) + if (!input_text) + return input_text + var/start = lowertext(input_text[1]) + return splicetext(input_text, 1, 2, start) From 3eb3646759c4c3c94aa92d834c96fe2fa362b477 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:47:57 +0300 Subject: [PATCH 62/62] Automatic changelog for PR #1654 [ci skip] --- html/changelogs/AutoChangeLog-pr-1654.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1654.yml diff --git a/html/changelogs/AutoChangeLog-pr-1654.yml b/html/changelogs/AutoChangeLog-pr-1654.yml new file mode 100644 index 00000000000..458aab740aa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1654.yml @@ -0,0 +1,5 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "reactions that create multiple reagents now terminate without looping endlessly." + - bugfix: "oatmeal reactions now terminate & produce the right quantity of results but without milk." \ No newline at end of file