mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 07:57:00 +00:00
Compare commits
4 Commits
258a4c8537
...
8a478f0827
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a478f0827 | ||
|
|
95c03abd07 | ||
|
|
8b1b3d0324 | ||
|
|
22a09e47a1 |
@@ -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>"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
7
html/changelogs_ch/AutoChangeLog-pr-12063.yml
Normal file
7
html/changelogs_ch/AutoChangeLog-pr-12063.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
author: "CHOMPStation2StaffMirrorBot"
|
||||
delete-after: True
|
||||
changes:
|
||||
- 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"
|
||||
4
html/changelogs_ch/AutoChangeLog-pr-12064.yml
Normal file
4
html/changelogs_ch/AutoChangeLog-pr-12064.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
author: "Guti"
|
||||
delete-after: True
|
||||
changes:
|
||||
- refactor: "Improved filling cabinet UI and makes use of span_bold"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
@@ -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()
|
||||
..()
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
};
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user