9 Commits

Author SHA1 Message Date
NanoMap Generation
160e65130d NanoMap Auto-Update (Wed Dec 3 19:03:54 UTC 2025) 2025-12-03 19:03:54 +00:00
chompstation-ci[bot]
0cfffbf94c Automatic changelog for PR #12065 [ci skip] 2025-12-03 18:58:01 +00:00
FluffMedic
cf85818600 Tyr Hotfix Thingy (#12065) 2025-12-03 13:57:19 -05:00
chompstation-ci[bot]
6f65a96a96 Automatic changelog compile [ci skip] 2025-12-03 01:22:33 +00:00
chompstation-ci[bot]
8a478f0827 Automatic changelog for PR #12064 [ci skip] 2025-12-02 10:16:10 +00:00
CHOMPStation2StaffMirrorBot
95c03abd07 [MIRROR] Upports Filling Cabinet UI (#12064)
Co-authored-by: Guti <32563288+TheCaramelion@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-12-02 05:15:33 -05:00
chompstation-ci[bot]
8b1b3d0324 Automatic changelog for PR #12063 [ci skip] 2025-12-02 08:53:06 +00:00
CHOMPStation2StaffMirrorBot
22a09e47a1 [MIRROR] Fusion Coil Updates (#12063)
Co-authored-by: Killian <49700375+KillianKirilenko@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-12-02 03:52:28 -05:00
chompstation-ci[bot]
258a4c8537 Automatic changelog compile [ci skip] 2025-12-02 01:22:27 +00:00
48 changed files with 197 additions and 326 deletions

View File

@@ -91,24 +91,27 @@
ui.open()
/obj/structure/filingcabinet/tgui_data(mob/user)
var/list/files = list()
for(var/obj/item/P in src)
files.Add(list(list(
"name" = P.name,
"ref" = "\ref[P]",
)))
var/list/data = list()
return list("contents" = files)
data["cabinet_name"] = "[name]"
data["contents"] = list()
data["contents_ref"] = list()
for(var/obj/item/content in src)
data["contents"] += "[content]"
data["contents_ref"] += "[REF(content)]"
/obj/structure/filingcabinet/tgui_act(action, params, datum/tgui/ui)
if(..())
return TRUE
return data
/obj/structure/filingcabinet/tgui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("retrieve")
var/obj/item/P = locate(params["ref"])
if(istype(P) && (P.loc == src) && ui.user.Adjacent(src))
ui.user.put_in_hands(P)
if("remove_object")
var/obj/item/content = locate(params["ref"]) in src
if(istype(content) && (content.loc == src) && usr.Adjacent(src))
usr.put_in_hands(content)
open_animation()
SStgui.update_uis(src)
@@ -134,9 +137,9 @@
S = R
break
var/obj/item/paper/P = new /obj/item/paper(src)
P.info = "<CENTER><B>Security Record</B></CENTER><BR>"
P.info = "<CENTER>" + span_bold("Security Record") + "</CENTER><BR>"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
P.info += "<BR>\n<CENTER><B>Security Data</B></CENTER><BR>\nCriminal Status: [S.fields["criminal"]]<BR>\n<BR>\nMinor Crimes: [S.fields["mi_crim"]]<BR>\nDetails: [S.fields["mi_crim_d"]]<BR>\n<BR>\nMajor Crimes: [S.fields["ma_crim"]]<BR>\nDetails: [S.fields["ma_crim_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[S.fields["notes"]]<BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>"
P.info += "<BR>\n<CENTER>" + span_bold("Security Data") + "</CENTER><BR>\nCriminal Status: [S.fields["criminal"]]<BR>\n<BR>\nMinor Crimes: [S.fields["mi_crim"]]<BR>\nDetails: [S.fields["mi_crim_d"]]<BR>\n<BR>\nMajor Crimes: [S.fields["ma_crim"]]<BR>\nDetails: [S.fields["ma_crim_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[S.fields["notes"]]<BR>\n<BR>\n<CENTER>" + span_bold("Comments/Log") + "</CENTER><BR>"
var/counter = 1
while(S.fields["com_[counter]"])
P.info += "[S.fields["com_[counter]"]]<BR>"
@@ -170,10 +173,10 @@
break
if(M)
var/obj/item/paper/P = new /obj/item/paper(src)
P.info = "<CENTER><B>Medical Record</B></CENTER><BR>"
P.info = "<CENTER>" + span_bold("Medical Record") + "</CENTER><BR>"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
P.info += "<BR>\n<CENTER><B>Medical Data</B></CENTER><BR>\nBlood Type: [M.fields["b_type"]]<BR>\nDNA: [M.fields["b_dna"]]<BR>\n<BR>\nMinor Disabilities: [M.fields["mi_dis"]]<BR>\nDetails: [M.fields["mi_dis_d"]]<BR>\n<BR>\nMajor Disabilities: [M.fields["ma_dis"]]<BR>\nDetails: [M.fields["ma_dis_d"]]<BR>\n<BR>\nAllergies: [M.fields["alg"]]<BR>\nDetails: [M.fields["alg_d"]]<BR>\n<BR>\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)<BR>\nDetails: [M.fields["cdi_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[M.fields["notes"]]<BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>"
P.info += "<BR>\n<CENTER>" + span_bold("Medical Data") + "</CENTER><BR>\nBlood Type: [M.fields["b_type"]]<BR>\nDNA: [M.fields["b_dna"]]<BR>\n<BR>\nMinor Disabilities: [M.fields["mi_dis"]]<BR>\nDetails: [M.fields["mi_dis_d"]]<BR>\n<BR>\nMajor Disabilities: [M.fields["ma_dis"]]<BR>\nDetails: [M.fields["ma_dis_d"]]<BR>\n<BR>\nAllergies: [M.fields["alg"]]<BR>\nDetails: [M.fields["alg_d"]]<BR>\n<BR>\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)<BR>\nDetails: [M.fields["cdi_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[M.fields["notes"]]<BR>\n<BR>\n<CENTER>" + span_bold("Comments/Log") + "</CENTER><BR>"
var/counter = 1
while(M.fields["com_[counter]"])
P.info += "[M.fields["com_[counter]"]]<BR>"

View File

@@ -2,8 +2,9 @@
name = "fusion coil"
desc = "A special heavy-duty battery used to recharge SMES units. It dumps its entire power reserve into the SMES unit at once, and cannot be recharged locally. Safety systems on the coil itself mean it can't be used on charged SMES units if it would put them over their capacity."
icon = 'icons/obj/power_cells.dmi'
icon_state = "fc_charged"
var/spent_icon = "fc_spent" //icon state used after a fusion coil is "burned out"
icon_state = "fc_spent"
light_color = "#30B5E6"
var/light_color_danger = "#D04E4C"
item_state = "egg6"
drop_sound = 'sound/items/drop/metalboots.ogg'
pickup_sound = 'sound/items/pickup/gascan.ogg'
@@ -13,8 +14,59 @@
force = 15
throw_speed = 4
throw_range = 4
slowdown = 0.5
slowdown = 1 //0.5 was not very much in practice, let's make this a bit more meaningful
var/spent = FALSE //have we been discharged into something yet?
var/coil_charged = TRUE //have we been discharged into something yet?
var/coil_damaged = FALSE //have we been damaged? one hit is fine, but two direct hits will explode us if we're charged
var/coil_charge = 4800000 //how much power do we dump into the SMES on use? restores the main (if unupgraded) by 20%, or engine by 80%
matter = list(MAT_STEEL = 6000, MAT_COPPER = 4000, MAT_PLASTIC = 2000)
/obj/item/fusion_coil/Initialize(mapload)
. = ..()
update_icon()
/obj/item/fusion_coil/update_icon()
icon_state = "fc_spent"
cut_overlays()
. = list()
if(coil_damaged)
. += mutable_appearance(icon, "fc_unstable")
. += emissive_appearance(icon, "fc_unstable")
set_light(1, 3, light_color_danger)
return add_overlay(.)
else if(coil_charged)
. += mutable_appearance(icon, "fc_charged")
. += emissive_appearance(icon, "fc_charged")
set_light(1, 2, light_color)
return add_overlay(.)
else
set_light(0)
return
/obj/item/fusion_coil/bullet_act(obj/item/projectile/P, def_zone)
. = ..()
if(P.nodamage) //the projectile does no damage, abort!
return
if(!coil_charged)
return
if(coil_damaged)
visible_message(span_danger("\The [src] explodes in a blinding flash!"))
explosion(src.loc, 0, 1, 3)
qdel(src)
return
visible_message(span_danger("\The [src] sparks and sputters!"))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
playsound(src, "sparks", 50, 1)
coil_damaged = TRUE
coil_charge = (coil_charge / 2)
update_icon()

View File

@@ -349,11 +349,11 @@ GLOBAL_LIST_EMPTY(smeses)
if(istype(W, /obj/item/fusion_coil))
var/obj/item/fusion_coil/FC = W
if(FC.spent || FC.coil_charge == 0)
if(!(FC.coil_charged || FC.coil_charge))
to_chat(user, span_filter_notice("\The [FC] has no charge remaining."))
return FALSE
else if(charge + FC.coil_charge > capacity)
to_chat(user, span_filter_notice("\The [FC] has too much charge stored to recharge \the [src]."))
to_chat(user, span_filter_notice("\The [FC] has too much charge stored to safely recharge \the [src]."))
return FALSE
else
playsound(src, 'sound/effects/lightning_chargeup.ogg', 75, 0, 1)
@@ -361,9 +361,9 @@ GLOBAL_LIST_EMPTY(smeses)
to_chat(user, span_filter_notice("You successfully recharge \the [src] with \the [FC]. It is now depleted."))
charge += FC.coil_charge
FC.coil_charge = 0
FC.spent = TRUE
FC.coil_charged = FALSE
FC.name = "depleted [FC.name]"
FC.icon_state = FC.spent_icon
FC.update_icon()
return FALSE
else if(W.has_tool_quality(TOOL_WELDER))

View File

@@ -1,6 +0,0 @@
author: "FluffMedic"
delete-after: True
changes:
- rscadd: "More areas to explore on Tyr. New mini-boss, encrypted lore, and some other weird stuff."
- balance: "Several Tyr mobs nerfed. Tyr firearms condensed into one"
- bugfix: "Improves some code bits, and some unintended effects"

View File

@@ -1,4 +0,0 @@
author: "CHOMPStation2StaffMirrorBot"
delete-after: True
changes:
- bugfix: "species whitelist commands for the bot now properly work and do not throw an invalid species error"

View File

@@ -1,4 +0,0 @@
author: "Guti"
delete-after: True
changes:
- bugfix: "Fixed snow not being able to be scooped up"

View File

@@ -1,4 +0,0 @@
author: "VictorZisthus"
delete-after: True
changes:
- maptweak: "Fixes fire alarms in some POI's reporting to the station when triggered."

View File

@@ -0,0 +1,4 @@
author: "FluffMedic"
delete-after: True
changes:
- bugfix: "A certain Tyr boss mechanic functions as intended, and one tyr wrecked shuttles is more accurate"

View File

@@ -3,3 +3,27 @@
- bugfix: mechs no longer vanish when attempting to construct them
- bugfix: slimecores not being produced during grinding
- code_imp: Unittest for mech construction datums
2025-12-02:
CHOMPStation2StaffMirrorBot:
- bugfix: species whitelist commands for the bot now properly work and do not throw
an invalid species error
FluffMedic:
- rscadd: More areas to explore on Tyr. New mini-boss, encrypted lore, and some
other weird stuff.
- balance: Several Tyr mobs nerfed. Tyr firearms condensed into one
- bugfix: Improves some code bits, and some unintended effects
Guti:
- bugfix: Fixed snow not being able to be scooped up
VictorZisthus:
- maptweak: Fixes fire alarms in some POI's reporting to the station when triggered.
2025-12-03:
CHOMPStation2StaffMirrorBot:
- rscadd: fusion coils can explode if shot by damaging guns; one hit is fine, two
will make them detonate. damaged coils have their charge cap halved. unstable
coils can still be safely discharged, which will also mean they won't explode
if hit again.
- qol: fusion coils glow in the dark to make them easier to find
- balance: fusion coils are heavier and incur more slowdown
- image: fusion coil sprite tweaks
Guti:
- refactor: Improved filling cabinet UI and makes use of span_bold

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 700 KiB

After

Width:  |  Height:  |  Size: 700 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 MiB

After

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 740 KiB

After

Width:  |  Height:  |  Size: 741 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 959 KiB

After

Width:  |  Height:  |  Size: 959 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 991 KiB

After

Width:  |  Height:  |  Size: 991 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 KiB

After

Width:  |  Height:  |  Size: 924 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 980 KiB

After

Width:  |  Height:  |  Size: 980 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -341,13 +341,12 @@
icon = 'icons/mob/hivebot.dmi'
size_multiplier = 3
wreckage = /obj/item/prop/tyrlore/medical_boss
special_attack_cooldown = 8 SECONDS
melee_damage_lower = 20
melee_damage_upper = 20
attack_armor_pen = 50
movement_cooldown = 4
special_attack_cooldown = 10 SECONDS
special_attack_cooldown = 12 SECONDS
var/datum/disease/base_disease = /datum/disease/advance/agate_rot
@@ -356,8 +355,8 @@
var/mob/living/carbon/human/H = A
H.ContractDisease(base_disease)
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/swarm_ai/do_special_attack(atom/A)
for(var/i =1 to 3)
/mob/living/simple_mob/mechanical/mecha/eclipse/tankyboss/medical_bot/do_special_attack(atom/A)
for(var/i =1 to 2)
new /mob/living/simple_mob/mechanical/hivebot/tyr/heart(src.loc)
/mob/living/simple_mob/mechanical/hivebot/tyr/heart

View File

@@ -1,190 +0,0 @@
/* Filing cabinets!
* Contains:
* Filing Cabinets
* Security Record Cabinets
* Medical Record Cabinets
*/
/*
* Filing Cabinets
*/
/obj/structure/filingcabinet
name = "filing cabinet"
desc = "A large cabinet with drawers."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "filingcabinet"
density = TRUE
anchored = TRUE
/obj/structure/filingcabinet/chestdrawer
name = "chest drawer"
icon_state = "chestdrawer"
/obj/structure/filingcabinet/filingcabinet //not changing the path to avoid unecessary map issues, but please don't name stuff like this in the future -Pete
icon_state = "tallcabinet"
/obj/structure/filingcabinet/Initialize(mapload)
for(var/obj/item/I in loc)
if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo) || istype(I, /obj/item/paper_bundle))
I.loc = src
. = ..()
/obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob)
if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/paper_bundle))
to_chat(user, span_notice("You put [P] in [src]."))
user.drop_item()
P.loc = src
open_animation()
SStgui.update_uis(src)
else if(P.has_tool_quality(TOOL_WRENCH))
playsound(src, P.usesound, 50, 1)
anchored = !anchored
to_chat(user, span_notice("You [anchored ? "wrench" : "unwrench"] \the [src]."))
else if(P.has_tool_quality(TOOL_SCREWDRIVER))
to_chat(user, span_notice("You begin taking the [name] apart."))
playsound(src, P.usesound, 50, 1)
if(do_after(user, 10 * P.toolspeed))
playsound(src, P.usesound, 50, 1)
to_chat(user, span_notice("You take the [name] apart."))
new /obj/item/stack/material/steel( src.loc, 4 )
for(var/obj/item/I in contents)
I.forceMove(loc)
qdel(src)
return
else
to_chat(user, span_notice("You can't put [P] in [src]!"))
/obj/structure/filingcabinet/attack_hand(mob/user as mob)
tgui_interact(user)
/obj/structure/filingcabinet/attack_tk(mob/user)
if(anchored)
return attack_self_tk(user)
return ..()
/obj/structure/filingcabinet/attack_self_tk(mob/user)
if(contents.len)
if(prob(40 + contents.len * 5))
var/obj/item/I = pick(contents)
I.loc = loc
if(prob(25))
step_rand(I)
to_chat(user, span_notice("You pull \a [I] out of [src] at random."))
return
to_chat(user, span_notice("You find nothing in [src]."))
/obj/structure/filingcabinet/tgui_state(mob/user)
return GLOB.tgui_physical_state
/obj/structure/filingcabinet/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "FilingCabinet", name)
ui.set_autoupdate(FALSE)
ui.open()
/obj/structure/filingcabinet/tgui_data(mob/user)
var/list/data = list()
data["cabinet_name"] = "[name]"
data["contents"] = list()
data["contents_ref"] = list()
for(var/obj/item/content in src)
data["contents"] += "[content]"
data["contents_ref"] += "[REF(content)]"
return data
/obj/structure/filingcabinet/tgui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("remove_object")
var/obj/item/content = locate(params["ref"]) in src
if(istype(content) && (content.loc == src) && usr.Adjacent(src))
usr.put_in_hands(content)
open_animation()
SStgui.update_uis(src)
/obj/structure/filingcabinet/proc/open_animation()
flick("[initial(icon_state)]-open",src)
playsound(src, 'sound/bureaucracy/filingcabinet.ogg', 50, 1)
spawn(0)
sleep(20)
icon_state = initial(icon_state)
/*
* Security Record Cabinets
*/
/obj/structure/filingcabinet/security
var/virgin = 1
/obj/structure/filingcabinet/security/proc/populate()
if(virgin)
for(var/datum/data/record/G in GLOB.data_core.general)
var/datum/data/record/S
for(var/datum/data/record/R in GLOB.data_core.security)
if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
S = R
break
var/obj/item/paper/P = new /obj/item/paper(src)
P.info = "<CENTER>" + span_bold("Security Record") + "</CENTER><BR>"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
P.info += "<BR>\n<CENTER>" + span_bold("Security Data") + "</CENTER><BR>\nCriminal Status: [S.fields["criminal"]]<BR>\n<BR>\nMinor Crimes: [S.fields["mi_crim"]]<BR>\nDetails: [S.fields["mi_crim_d"]]<BR>\n<BR>\nMajor Crimes: [S.fields["ma_crim"]]<BR>\nDetails: [S.fields["ma_crim_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[S.fields["notes"]]<BR>\n<BR>\n<CENTER>" + span_bold("Comments/Log") + "</CENTER><BR>"
var/counter = 1
while(S.fields["com_[counter]"])
P.info += "[S.fields["com_[counter]"]]<BR>"
counter++
P.info += "</TT>"
P.name = "Security Record ([G.fields["name"]])"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
/obj/structure/filingcabinet/security/attack_hand()
populate()
..()
/obj/structure/filingcabinet/security/attack_tk()
populate()
..()
/*
* Medical Record Cabinets
*/
/obj/structure/filingcabinet/medical
var/virgin = 1
/obj/structure/filingcabinet/medical/proc/populate()
if(virgin)
for(var/datum/data/record/G in GLOB.data_core.general)
var/datum/data/record/M
for(var/datum/data/record/R in GLOB.data_core.medical)
if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
M = R
break
if(M)
var/obj/item/paper/P = new /obj/item/paper(src)
P.info = "<CENTER>" + span_bold("Medical Record") + "</CENTER><BR>"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
P.info += "<BR>\n<CENTER>" + span_bold("Medical Data") + "</CENTER><BR>\nBlood Type: [M.fields["b_type"]]<BR>\nDNA: [M.fields["b_dna"]]<BR>\n<BR>\nMinor Disabilities: [M.fields["mi_dis"]]<BR>\nDetails: [M.fields["mi_dis_d"]]<BR>\n<BR>\nMajor Disabilities: [M.fields["ma_dis"]]<BR>\nDetails: [M.fields["ma_dis_d"]]<BR>\n<BR>\nAllergies: [M.fields["alg"]]<BR>\nDetails: [M.fields["alg_d"]]<BR>\n<BR>\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)<BR>\nDetails: [M.fields["cdi_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[M.fields["notes"]]<BR>\n<BR>\n<CENTER>" + span_bold("Comments/Log") + "</CENTER><BR>"
var/counter = 1
while(M.fields["com_[counter]"])
P.info += "[M.fields["com_[counter]"]]<BR>"
counter++
P.info += "</TT>"
P.name = "Medical Record ([G.fields["name"]])"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
//before the records have been generated, so we do this inside the loop.
/obj/structure/filingcabinet/medical/attack_hand()
populate()
..()
/obj/structure/filingcabinet/medical/attack_tk()
populate()
..()

View File

@@ -725,6 +725,26 @@
},
/turf/simulated/shuttle/floor/alien,
/area/surface/tyr/south_caverns)
"cJ" = (
/obj/item/material/shard{
pixel_x = 5;
pixel_y = 3
},
/turf/simulated/floor/outdoors/desert_planet/sand/tyr,
/area/surface/tyr/northern_wilderness)
"cK" = (
/obj/item/material/shard{
pixel_x = 5;
pixel_y = 3
},
/obj/item/stack/rods,
/turf/simulated/shuttle/floor/voidcraft/tyr,
/area/surface/tyr/wrecked_shipD)
"cL" = (
/mob/living/simple_mob/animal/space/carp,
/obj/item/stack/rods,
/turf/simulated/shuttle/floor/voidcraft/tyr,
/area/surface/tyr/wrecked_shipD)
"cM" = (
/obj/random/tyroutcrop,
/turf/simulated/floor/outdoors/desert_planet/gravel/tyr,
@@ -907,6 +927,10 @@
},
/turf/simulated/shuttle/floor/black,
/area/surface/tyr/precursorruins)
"dp" = (
/obj/item/stack/rods,
/turf/simulated/shuttle/floor/voidcraft/tyr,
/area/surface/tyr/wrecked_shipD)
"dq" = (
/obj/machinery/door/airlock/hatch{
req_one_access = null
@@ -2079,6 +2103,14 @@
"hn" = (
/turf/simulated/shuttle/wall/alien/orange,
/area/surface/tyr/precursorruins/northwest)
"ho" = (
/obj/structure/table/steel,
/obj/item/material/shard{
pixel_x = 5;
pixel_y = 3
},
/turf/simulated/shuttle/floor/voidcraft/tyr,
/area/surface/tyr/wrecked_shipD)
"hp" = (
/obj/structure/closet,
/obj/item/borg/upgrade/modkit/cooldown/repeater,
@@ -35149,7 +35181,7 @@ Uo
Uo
Uo
Uo
Uo
cJ
Uo
Uo
Uo
@@ -35408,9 +35440,9 @@ Uo
Uo
Uo
Uo
cJ
Uo
Uo
Uo
cJ
Uo
Uo
Uo
@@ -35665,7 +35697,7 @@ Uo
Uo
Uo
co
ia
cK
vc
ia
ia
@@ -35923,10 +35955,10 @@ Uo
Uo
co
co
cq
cq
cq
cq
ia
dp
ia
ia
co
co
Uo
@@ -36180,11 +36212,11 @@ Uo
Uo
co
co
cr
cq
cq
cq
ho
cq
ia
ia
cK
cr
co
co
@@ -36440,9 +36472,9 @@ co
co
cr
cq
cq
uW
cq
ia
cL
ia
cr
co
co

View File

@@ -1,34 +1,47 @@
import { useBackend } from 'tgui/backend';
import { Window } from 'tgui/layouts';
import { Button, Section } from 'tgui-core/components';
import { Box, Button, Section, Stack } from 'tgui-core/components';
type Data = { contents: content[] };
type content = { name: string; ref: string };
type Data = {
cabinet_name: string;
contents: string[];
contents_ref: string[];
};
export const FileCabinet = (props) => {
const { act, data } = useBackend<Data>();
const { contents } = data;
// Wow, the filing cabinets sort themselves in 2320.
contents.sort((a, b) => a.name.localeCompare(b.name));
const { cabinet_name, contents, contents_ref } = data;
return (
<Window width={350} height={300}>
<Window.Content scrollable>
<Section>
{contents.map((item) => (
<Button
key={item.ref}
fluid
icon="file"
onClick={() => act('retrieve', { ref: item.ref })}
>
{item.name}
</Button>
))}
</Section>
<Window title={cabinet_name || 'Filing Cabinet'} width={350} height={300}>
<Window.Content backgroundColor="#B88F3D" scrollable>
{contents.map((object, index) => (
<Stack
key={contents_ref[index]}
color="black"
backgroundColor="white"
style={{ padding: '2px' }}
mb={0.5}
>
<Stack.Item align="center" grow>
<Box align="center">{object}</Box>
</Stack.Item>
<Stack.Item>
<Button
icon="eject"
onClick={() =>
act('remove_object', { ref: contents_ref[index] })
}
/>
</Stack.Item>
</Stack>
))}
{contents.length === 0 && (
<Section>
<Box color="white" align="center">
The {cabinet_name} is empty!
</Box>
</Section>
)}
</Window.Content>
</Window>
);

View File

@@ -1,48 +0,0 @@
import { useBackend } from 'tgui/backend';
import { Window } from 'tgui/layouts';
import { Box, Button, Section, Stack } from 'tgui-core/components';
type Data = {
cabinet_name: string;
contents: string[];
contents_ref: string[];
};
export const FilingCabinet = (props) => {
const { act, data } = useBackend<Data>();
const { cabinet_name, contents, contents_ref } = data;
return (
<Window title={cabinet_name || 'Filing Cabinet'} width={350} height={300}>
<Window.Content backgroundColor="#B88F3D" scrollable>
{contents.map((object, index) => (
<Stack
key={contents_ref[index]}
color="black"
backgroundColor="white"
style={{ padding: '2px' }}
mb={0.5}
>
<Stack.Item align="center" grow>
<Box align="center">{object}</Box>
</Stack.Item>
<Stack.Item>
<Button
icon="eject"
onClick={() =>
act('remove_object', { ref: contents_ref[index] })
}
/>
</Stack.Item>
</Stack>
))}
{contents.length === 0 && (
<Section>
<Box color="white" align="center">
The {cabinet_name} is empty!
</Box>
</Section>
)}
</Window.Content>
</Window>
);
};

View File

@@ -4134,6 +4134,7 @@
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\faxmachine.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
#include "code\modules\paperwork\handlabeler.dm"
#include "code\modules\paperwork\paper.dm"
@@ -5344,7 +5345,6 @@
#include "modular_chomp\code\modules\organs\internal\malignant\malignant.dm"
#include "modular_chomp\code\modules\overmap\dynamic_sector.dm"
#include "modular_chomp\code\modules\paperwork\faxmachine.dm"
#include "modular_chomp\code\modules\paperwork\filingcabinet.dm"
#include "modular_chomp\code\modules\paperwork\paper.dm"
#include "modular_chomp\code\modules\paperwork\pen.dm"
#include "modular_chomp\code\modules\pda\core_apps.dm"