diff --git a/baystation12.dme b/baystation12.dme index 69a61b42524..8da74bc8662 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -708,6 +708,7 @@ #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" #include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\gimmicks.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\massmodvar.dm" #include "code\modules\admin\verbs\MC.dm" diff --git a/code/defines/obj/computer.dm b/code/defines/obj/computer.dm index 6a1a62134d7..8c29401ce5a 100644 --- a/code/defines/obj/computer.dm +++ b/code/defines/obj/computer.dm @@ -134,6 +134,7 @@ req_access = list(access_medical) circuit = "/obj/item/weapon/circuitboard/med_data" var/obj/item/weapon/card/id/scan = null + var/obj/item/weapon/disk/records/disk = null var/authenticated = null var/rank = null var/screen = null @@ -182,6 +183,7 @@ req_access = list(access_security) circuit = "/obj/item/weapon/circuitboard/secure_data" var/obj/item/weapon/card/id/scan = null + var/obj/item/weapon/disk/records/disk = null var/authenticated = null var/rank = null var/screen = null diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 303febedba2..926aaacbe44 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -1,3 +1,16 @@ +/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob) + if(istype(O, /obj/item/weapon/card/id) && !scan) + usr.drop_item() + O.loc = src + scan = O + user << "You insert [O]." + else if(istype(O, /obj/item/weapon/disk/records) && !disk) + usr.drop_item() + O.loc = src + disk = O + user << "You insert [O]." + ..() + /obj/machinery/computer/med_data/attack_ai(user as mob) return src.attack_hand(user) @@ -33,7 +46,24 @@ //Foreach goto(132) dat += text("
Back", src) if(3.0) - dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) + dat += "Records Maintenance
" + if(disk) + dat += "Disk Contents:Backup To Disk
" + if(disk.general && disk.medical) + dat += "Restore From Disk
" + else + dat += "Disk does not contain medical records.
" + dat += "Eject Disk
" + else + dat += "Please insert a records disk.
" + dat += "
Delete All Records

Back" if(4.0) dat += "
Medical Record

" if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) @@ -98,8 +128,11 @@ src.temp = null if (href_list["scan"]) if (src.scan) - src.scan.loc = src.loc - src.scan = null + if(!usr.get_active_hand()) + usr.put_in_hand(scan) + else + scan.loc = get_turf(src) + scan = null else var/obj/item/I = usr.equipped() if (istype(I, /obj/item/weapon/card/id)) @@ -422,6 +455,24 @@ if ((E.fields["name"] == active2.fields["name"] || E.fields["id"] == active2.fields["id"])) active1 = E screen = 4 + if (href_list["eject_disk"]) + if (!disk) + return + if(!usr.get_active_hand()) + usr.put_in_hand(disk) + else + disk.loc = get_turf(src) + disk = null + if (href_list["backup"]) + if (!disk) + return + disk.backup(1, 0) + temp = "Data backup complete." + if (href_list["restore"]) + if (!disk) + return + disk.restore(1, 0) + temp = "Data restore complete." src.add_fingerprint(usr) src.updateUsrDialog() diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 3fe19ce1762..8e2b81390c2 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -1,3 +1,16 @@ +/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob) + if(istype(O, /obj/item/weapon/card/id) && !scan) + usr.drop_item() + O.loc = src + scan = O + user << "You insert [O]." + else if(istype(O, /obj/item/weapon/disk/records) && !disk) + usr.drop_item() + O.loc = src + disk = O + user << "You insert [O]." + ..() + /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) return attack_hand(user) @@ -65,7 +78,24 @@ dat += text("Record Maintenance

", src) dat += text("{Log Out}",src) if(2.0) - dat += text("Records Maintenance
\nDelete All Records
\n
\nBack", src, src) + dat += "Records Maintenance
" + if(disk) + dat += "Disk Contents:Backup To Disk
" + if(disk.general && disk.security) + dat += "Restore From Disk
" + else + dat += "Disk does not contain security records.
" + dat += "Eject Disk
" + else + dat += "Please insert a records disk.
" + dat += "
Delete All Records

Back" if(3.0) dat += "
Security Record

" if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) @@ -162,7 +192,10 @@ What a mess.*/ if("Confirm Identity") if (scan) - scan.loc = loc + if(!usr.get_active_hand()) + usr.put_in_hand(scan) + else + scan.loc = get_turf(src) scan = null else var/obj/item/I = usr.equipped() @@ -425,6 +458,24 @@ What a mess.*/ temp += "" else alert(usr, "You do not have the required rank to do this!") + if ("eject_disk") + if (!disk) + return + if(!usr.get_active_hand()) + usr.put_in_hand(disk) + else + disk.loc = get_turf(src) + disk = null + if ("backup") + if (!disk) + return + disk.backup(0, 1) + temp = "Data backup complete." + if ("restore") + if (!disk) + return + disk.restore(0, 1) + temp = "Data restore complete." //TEMPORARY MENU FUNCTIONS else//To properly clear as per clear screen. temp=null @@ -466,3 +517,100 @@ What a mess.*/ updateUsrDialog() return +/obj/item/weapon/disk/records + name = "Crew Records Disk" + desc = "Stores security and medical records." + icon = 'cloning.dmi' + icon_state = "datadisk2" + item_state = "card-id" + w_class = 1.0 + var/list/general + var/list/security + var/list/medical + +/obj/item/weapon/disk/records/verb/label(t as text) + set name = "Label Disk" + set category = "Object" + set src in usr + + if (t) + src.name = text("Records Disk - '[]'", t) + else + src.name = "Crew Records Disk" + src.add_fingerprint(usr) + return + +/obj/item/weapon/disk/records/proc/backup(var/med, var/sec) + // have to manually copy each field so there's no references between data_core and the disk + general = new() + for(var/datum/data/record/E in data_core.general) + var/datum/data/record/G = new /datum/data/record() + for(var/F in E.fields) + G.fields[F] += E.fields[F] + general += G + + if(med) + medical = new() + for(var/datum/data/record/E in data_core.medical) + var/datum/data/record/G = new /datum/data/record() + for(var/F in E.fields) + G.fields[F] += E.fields[F] + medical += G + + if(sec) + security = new() + for(var/datum/data/record/E in data_core.security) + var/datum/data/record/G = new /datum/data/record() + for(var/F in E.fields) + G.fields[F] += E.fields[F] + security += G + +/obj/item/weapon/disk/records/proc/restore(var/med, var/sec) + // actually merge the content to not wipe new arrivals, etc + if(general) + for(var/datum/data/record/R in general) + for(var/datum/data/record/E in data_core.general) + if (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]) + data_core.general -= E + break + var/datum/data/record/G = new /datum/data/record() + for(var/F in R.fields) + G.fields[F] += R.fields[F] + data_core.general += G + + if(med && medical) + for(var/datum/data/record/R in medical) + for(var/datum/data/record/E in data_core.medical) + if (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]) + data_core.medical -= E + break + var/datum/data/record/G = new /datum/data/record() + for(var/F in R.fields) + G.fields[F] += R.fields[F] + data_core.medical += G + + if(sec && security) + for(var/datum/data/record/R in security) + for(var/datum/data/record/E in data_core.security) + if (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]) + data_core.security -= E + break + var/datum/data/record/G = new /datum/data/record() + for(var/F in R.fields) + G.fields[F] += R.fields[F] + data_core.security += G + +/obj/item/weapon/storage/recordsbox + name = "Records Diskette Box" + icon_state = "disk_kit" + item_state = "syringe_kit" + +/obj/item/weapon/storage/recordsbox/New() + ..() + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) + new /obj/item/weapon/disk/records(src) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 50fc1241a22..e3133bdc82c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -207,6 +207,7 @@ verbs += /client/proc/admin_cancel_shuttle verbs += /obj/admins/proc/show_traitor_panel verbs += /client/proc/cmd_admin_dress + verbs += /client/proc/cmd_admin_christmas verbs += /client/proc/respawn_character verbs += /client/proc/spawn_xeno verbs += /proc/possess @@ -340,6 +341,7 @@ verbs -= /client/proc/admin_cancel_shuttle verbs -= /obj/admins/proc/show_traitor_panel verbs -= /client/proc/cmd_admin_dress + verbs -= /client/proc/cmd_admin_christmas verbs -= /client/proc/respawn_character verbs -= /client/proc/spawn_xeno verbs -= /proc/possess diff --git a/code/modules/admin/verbs/gimmicks.dm b/code/modules/admin/verbs/gimmicks.dm new file mode 100644 index 00000000000..ae37d3ce2a9 --- /dev/null +++ b/code/modules/admin/verbs/gimmicks.dm @@ -0,0 +1,23 @@ +var/global/gimmick_hat = null + +// irreversable, for now +/client/proc/cmd_admin_christmas() + set category = "Fun" + set name = "Christmas Time" + + if(!authenticated || !holder) + src << "Only administrators may use this command." + return + + if(!gimmick_hat) + log_admin("[usr.key] has started Christmas!") + message_admins("[usr.key] has started Christmas!") + + // handle pre-existing hats + gimmick_hat = "santahat" + else + log_admin("[usr.key] has stopped Christmas!") + message_admins("[usr.key] has stopped Christmas!") + + // handle pre-existing hats + gimmick_hat = null diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 06f9fa3b394..1029a993577 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -31,10 +31,10 @@ usr << "\blue [src.name] has a \icon[src.wear_suit] [src.wear_suit.name] on." if (src.l_ear) - usr << "\blue [src.name] has a \icon[src.l_ear] [src.l_ear.name] by [t_his] mouth." + usr << "\blue [src.name] has a \icon[src.l_ear] [src.l_ear.name] on [t_his] left ear." if (src.r_ear) - usr << "\blue [src.name] has a \icon[src.r_ear] [src.r_ear.name] by [t_his] mouth." + usr << "\blue [src.name] has a \icon[src.r_ear] [src.r_ear.name] on [t_his] right ear." if (src.wear_mask) if (src.wear_mask.blood_DNA) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d5933f49833..4be9f247296 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1006,6 +1006,8 @@ if(istype(head,/obj/item/clothing/head/kitty)) head_icon = (( lying ) ? head:mob2 : head:mob) overlays += image("icon" = head_icon, "layer" = MOB_LAYER) + if(gimmick_hat) + overlays += image("icon" = icon('gimmick_head.dmi', "[gimmick_hat][!lying ? "" : "2"]"), "layer" = MOB_LAYER) if (head.blood_DNA) var/icon/stain_icon = icon('blood.dmi', "helmetblood[!lying ? "" : "2"]") overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) diff --git a/icons/mob/gimmick_head.dmi b/icons/mob/gimmick_head.dmi new file mode 100644 index 00000000000..5be570dfd1e Binary files /dev/null and b/icons/mob/gimmick_head.dmi differ diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index af9b7f5d126..7c737ebea74 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -1925,7 +1925,7 @@ "aLa" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aLb" = (/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) "aLc" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/bridge) -"aLd" = (/obj/structure/table/reinforced,/turf/simulated/floor,/area/bridge) +"aLd" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/recordsbox,/turf/simulated/floor,/area/bridge) "aLe" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor,/area/bridge) "aLf" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/bridge) "aLg" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/bridge) @@ -5512,7 +5512,7 @@ "cbZ" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) "cca" = (/turf/unsimulated/wall{icon = 'icons/misc/fullscreen.dmi'; icon_state = "title"; name = "Space Station 13"},/area/start) "ccb" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership) -"ccc" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership) +"ccc" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership) "ccd" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership) "cce" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) "ccf" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/shuttle/syndicate_elite/mothership) @@ -5584,8 +5584,8 @@ "cdt" = (/obj/structure/table,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "cdu" = (/turf/unsimulated/wall,/area/centcom) "cdv" = (/obj/effect/landmark{name = "Nuclear-Closet"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) -"cdw" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area) -"cdx" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) +"cdw" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area) +"cdx" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) "cdy" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom) "cdz" = (/turf/unsimulated/floor{name = "plating"},/area/centcom) "cdA" = (/obj/structure/stool/chair{dir = 4},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) @@ -5647,7 +5647,7 @@ "ceE" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom/suppy) "ceF" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/suppy) "ceG" = (/turf/unsimulated/floor{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/centcom/suppy) -"ceH" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) +"ceH" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) "ceI" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"; orient = "RIGHT"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) "ceJ" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) "ceK" = (/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) @@ -5664,7 +5664,7 @@ "ceV" = (/obj/structure/table,/obj/machinery/juicer{pixel_y = 6},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/living) "ceW" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) "ceX" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"ceY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/living) +"ceY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/living) "ceZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/supply/dock) "cfa" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/supply/dock) "cfb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/supply/dock) @@ -6036,7 +6036,7 @@ "cmd" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "cme" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cmf" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"cmg" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) +"cmg" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) "cmh" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom/ferry) "cmi" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "cmj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) @@ -6046,7 +6046,7 @@ "cmn" = (/obj/structure/stool/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) "cmo" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cmp" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"cmq" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/centcom/ferry) +"cmq" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/centcom/ferry) "cmr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/transport1/centcom) "cms" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/transport1/centcom) "cmt" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/transport1/centcom)