[Icebox] Half remaps security, deletes the labor shuttle because it made no sense (#95766)

## About The Pull Request

Click the triangles to see pictures

<Details>

<Summary> Top floor security has seen some changes, with EVA being
attached to the security lockers, and the firing range being added in
the place of the old transfer center </Summary>

<img width="1029" height="803" alt="image"
src="https://github.com/user-attachments/assets/c84065f6-6e92-4a0a-b6b4-c323f948fc38"
/>

</Details>

<Details>

<Summary> The middle floor didn't see a ton of changes, though
visitation has shifted left to make room for the new labor camp exit
</Summary>

<img width="616" height="574" alt="image"
src="https://github.com/user-attachments/assets/44658fe1-a048-4c3c-a951-3727d9b710f4"
/>

</Details>

<Details>

<Summary> The biggest changes are seen on the bottom floor - the lowest
perma-brig floor was trimmed down in size ab it, and the room has been
replaced with the Labor camp.</Summary>

<img width="993" height="950" alt="image"
src="https://github.com/user-attachments/assets/446a1677-3f67-4f8e-933e-92a20d22aa36"
/>

</Details>

This also comes with some mechanic changes to icebox labor, given
there's no more shuttle: You still teleport people into the labor camp,
but when the amount of points have been achieved, you can walk through
the point gate rather than needing to fly a shuttle home.

## Why It's Good For The Game

The labor shuttle didn't have much of a reason to exist on icebox, you
weren't flying anywhere, you were just walking a few steps downwards

Integrating it into the perma-brig allows for a more unique labor
experience than other maps, and one that fits the setting a bit more

## Changelog

🆑 Melbert
add: [Icebox] Security saw a minor remapping, with most notably the
removal of the labor shuttle and the integration of the labor camp into
the bottom floor of the perma-brig.
/🆑
This commit is contained in:
MrMelbert
2026-05-18 11:16:27 -04:00
committed by GitHub
parent 799d25c7d7
commit 3edf7f0099
4 changed files with 7663 additions and 7890 deletions
File diff suppressed because it is too large Load Diff
+66 -27
View File
@@ -1,4 +1,7 @@
#define SPAM_CD (3 SECONDS)
#define ALLOW_EXIT "allow_exit"
#define BLOCK_EXIT "block_exit"
#define SKIP_EXIT null
/obj/machinery/prisongate
name = "prison gate scanner"
@@ -14,6 +17,7 @@
idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05
active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.03
anchored = TRUE
req_one_access = list(ACCESS_BRIG)
/// dictates whether the gate barrier is up or not
var/gate_active = TRUE
COOLDOWN_DECLARE(spam_cooldown_time)
@@ -55,39 +59,74 @@
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return FALSE
var/mob/living/carbon/the_toucher = gate_toucher
if(gate_active == FALSE)
if(!gate_active)
return TRUE
for(var/obj/item/card/id/regular_id in the_toucher.get_all_contents())
var/list/id_access = regular_id.GetAccess()
if(ACCESS_BRIG in id_access)
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
say("Brig clearance detected. Access granted.")
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return TRUE
for(var/obj/item/card/id/advanced/prisoner/prison_id in the_toucher.get_all_contents())
if(!prison_id.timed)
continue
if(prison_id.time_to_assign)
say("Prison ID with active sentence detected. Please enjoy your stay in our corporate rehabilitation center, [prison_id.registered_name]!")
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
prison_id.time_left = prison_id.time_to_assign
prison_id.time_to_assign = initial(prison_id.time_to_assign)
prison_id.start_timer()
return TRUE
if(prison_id.time_left <= 0)
say("Prison ID with served sentence detected. Access granted.")
prison_id.timed = FALSE //disables the id check from earlier so you can't just throw it back into perma for mass escapes
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
return TRUE
if(allowed(the_toucher))
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
say("Prison ID with ongoing sentence detected. Access denied.")
playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE)
say("Brig clearance detected. Access granted.")
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return FALSE
return TRUE
else if(the_toucher.pulledby && allowed(the_toucher.pulledby))
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
say("Brig escort detected. Access granted.")
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return TRUE
for(var/obj/item/card/id/advanced/prisoner/prison_id in the_toucher.get_all_contents())
switch(allow_prisoner_id(prison_id))
if(ALLOW_EXIT)
return TRUE
if(BLOCK_EXIT)
return FALSE
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
to_chat(the_toucher, span_warning("You try to push through the hardlight barrier with little effect."))
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return FALSE
/obj/machinery/prisongate/proc/allow_prisoner_id(obj/item/card/id/advanced/prisoner/prison_id)
if(!prison_id.timed)
return SKIP_EXIT
if(prison_id.time_to_assign)
say("Prison ID with active sentence detected. Please enjoy your stay in our corporate rehabilitation center, [prison_id.registered_name]!")
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
prison_id.time_left = prison_id.time_to_assign
prison_id.time_to_assign = initial(prison_id.time_to_assign)
prison_id.start_timer()
return ALLOW_EXIT
if(prison_id.time_left <= 0)
say("Prison ID with served sentence detected. Access granted.")
prison_id.timed = FALSE //disables the id check from earlier so you can't just throw it back into perma for mass escapes
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
return ALLOW_EXIT
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
say("Prison ID with ongoing sentence detected. Access denied.")
playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE)
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return BLOCK_EXIT
/obj/machinery/prisongate/labour
name = "labor camp gate scanner"
/obj/machinery/prisongate/labour/allow_prisoner_id(obj/item/card/id/advanced/prisoner/prison_id)
if(!prison_id.goal)
return SKIP_EXIT
if(prison_id.points >= prison_id.goal)
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
say("All points served. Access granted.")
playsound(src, 'sound/machines/chime.ogg', 50, FALSE)
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return ALLOW_EXIT
if(COOLDOWN_FINISHED(src, spam_cooldown_time))
say("[prison_id.goal - prison_id.points] point\s remaining on sentence. Access denied.")
playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE)
COOLDOWN_START(src, spam_cooldown_time, SPAM_CD)
return BLOCK_EXIT
#undef SPAM_CD
#undef ALLOW_EXIT
#undef BLOCK_EXIT
#undef SKIP_EXIT
+14 -1
View File
@@ -29,7 +29,8 @@
/obj/machinery/mineral/labor_claim_console/proc/register_shuttle_signal()
SIGNAL_HANDLER
var/obj/docking_port/mobile/laborshuttle = SSshuttle.getShuttle("laborcamp")
RegisterSignal(laborshuttle, COMSIG_SHUTTLE_SHOULD_MOVE, PROC_REF(on_laborshuttle_can_move))
if(laborshuttle)
RegisterSignal(laborshuttle, COMSIG_SHUTTLE_SHOULD_MOVE, PROC_REF(on_laborshuttle_can_move))
UnregisterSignal(SSshuttle, COMSIG_SUBSYSTEM_POST_INITIALIZE)
/obj/machinery/mineral/labor_claim_console/Destroy()
@@ -77,6 +78,11 @@
data["can_go_home"] = can_go_home
return data
/obj/machinery/mineral/labor_claim_console/ui_static_data(mob/user)
var/list/data = list()
data["shuttle_exists"] = !isnull(SSshuttle.getShuttle("laborcamp"))
return data
/obj/machinery/mineral/labor_claim_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
@@ -103,6 +109,12 @@
COOLDOWN_START(src, say_cooldown, 2 SECONDS)
if("move_shuttle")
if(isnull(SSshuttle.getShuttle("laborcamp")))
if(COOLDOWN_FINISHED(src, say_cooldown))
say("Shuttle not found.")
COOLDOWN_START(src, say_cooldown, 2 SECONDS)
return
var/list/labor_shuttle_mobs = find_labor_shuttle_mobs()
if(length(labor_shuttle_mobs) > 1 || labor_shuttle_mobs[1] != user_mob)
if(COOLDOWN_FINISHED(src, say_cooldown))
@@ -171,6 +183,7 @@
/**********************Prisoner Collection Unit**************************/
/obj/machinery/mineral/stacking_machine/laborstacker
name = "labor camp collection unit"
force_connect = TRUE
damage_deflection = 21 //otherwise prisoners will destroy it
///Idle points sitting in the machine left to be claimed.
@@ -5,20 +5,29 @@ import { Window } from '../layouts';
export const LaborClaimConsole = (props) => {
const { act, data } = useBackend();
const { can_go_home, id_points, ores, status_info, unclaimed_points } = data;
const {
can_go_home,
id_points,
ores,
status_info,
unclaimed_points,
shuttle_exists,
} = data;
return (
<Window width={315} height={440}>
<Window.Content>
<Section>
<LabeledList>
<LabeledList.Item label="Status">{status_info}</LabeledList.Item>
<LabeledList.Item label="Shuttle controls">
<Button
content="Move shuttle"
disabled={!can_go_home}
onClick={() => act('move_shuttle')}
/>
</LabeledList.Item>
{!!shuttle_exists && (
<LabeledList.Item label="Shuttle controls">
<Button
content="Move shuttle"
disabled={!can_go_home}
onClick={() => act('move_shuttle')}
/>
</LabeledList.Item>
)}
<LabeledList.Item label="Points">{id_points}</LabeledList.Item>
<LabeledList.Item
label="Unclaimed points"
@@ -35,13 +44,21 @@ export const LaborClaimConsole = (props) => {
</LabeledList>
</Section>
<Section title="Directions">
The nearby stacking machine will unload crates and collect smelted
materials, points will be calculated based on volume of delivered
materials.
Collect boulders and ores from the mining area and bring them to the
unloading machine. Then, pull the lever to smelt them into sheets. Use
the production console to dispense the sheets, and then bring bring
them to the claim console to earn points.
<br />
Please note that only sheets printed with our manufacturer&apos;s seal
of quality, such as those produced from the work camp furnace, will be
accepted as proof of labour.
<br />
Boulders cannot be smelted directly, and will require additional
manual processing - strike them with a pickaxe to break them down
further.
<br />
<br />
Sheets smelted from the labor camp's furnace will be stamped with an
official seal of quality. Only stamped sheets can be claimed for
points - so don't bother trying to strip down tables and chairs for
bonus metal.
</Section>
</Window.Content>
</Window>