This commit is contained in:
Fordoxia
2024-05-25 14:55:18 +01:00
188 changed files with 2905 additions and 1850 deletions

View File

@@ -4462,7 +4462,7 @@
/area/centcom/specops)
"oQ" = (
/obj/machinery/door/poddoor/multi_tile/impassable/four_tile_ver{
name = "Jupiter Station Central Access"
name = "Trading Satellite Central Access"
},
/turf/simulated/floor/plating/airless,
/area/trader_station/sol)
@@ -5873,7 +5873,7 @@
dwidth = 4;
height = 11;
id = "trade_sol_base";
name = "docking bay 2 at Jupiter Station";
name = "docking bay at Trading Satellite";
width = 9
},
/obj/structure/fans/tiny,
@@ -12878,7 +12878,7 @@
/area/shuttle/transport)
"Tu" = (
/obj/machinery/door/airlock/centcom/glass{
name = "Jupiter Station Central Access"
name = "Trading Satellite Central Access"
},
/turf/simulated/floor/wood,
/area/trader_station/sol)

View File

@@ -679,7 +679,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_y = 30
},
/obj/machinery/economy/vending/secdrobe,
@@ -3149,7 +3148,6 @@
announcementConsole = 1;
department = "Head of Security's Desk";
departmentType = 5;
name = "Head of Security Requests Console";
pixel_x = 30
},
/obj/machinery/computer/brigcells{
@@ -4214,7 +4212,6 @@
/obj/machinery/requests_console{
department = "Warden";
departmentType = 7;
name = "Warden's Requests Console";
pixel_y = -30
},
/obj/item/radio/intercom/department/security{
@@ -6839,7 +6836,6 @@
/obj/structure/bookcase/sop,
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Internal Affairs Requests Console";
pixel_x = -30
},
/obj/machinery/light{
@@ -9694,8 +9690,7 @@
pixel_y = -28
},
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Magistrate Requests Console";
department = "Magistrate";
pixel_x = 30;
departmentType = 5
},
@@ -10030,8 +10025,7 @@
"aGu" = (
/obj/item/kirbyplants,
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Courtroom Requests Console";
department = "Courtroom";
pixel_x = 30
},
/turf/simulated/floor/wood,
@@ -10394,8 +10388,7 @@
icon_state = "1-2"
},
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Courtroom Gallery Requests Console";
department = "Courtroom";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -15139,7 +15132,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_y = 30
},
/obj/machinery/computer/secure_data,
@@ -15189,7 +15181,6 @@
},
/obj/machinery/requests_console{
department = "Tool Storage";
name = "Tool Storage Requests Console";
pixel_y = 30
},
/obj/item/assembly/igniter{
@@ -15989,9 +15980,8 @@
c_tag = "Medbay Paramedic"
},
/obj/machinery/requests_console{
department = "Medbay";
department = "Paramedic";
departmentType = 1;
name = "Paramedic Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel,
@@ -18024,7 +18014,6 @@
"bex" = (
/obj/machinery/requests_console{
department = "Arrival Shuttle";
name = "Arrival Shuttle Requests Console";
pixel_y = -30
},
/turf/simulated/floor/mineral/titanium/blue,
@@ -18291,7 +18280,6 @@
/obj/machinery/requests_console{
department = "Bar";
departmentType = 2;
name = "Bar Requests Console";
pixel_y = 30
},
/obj/structure/table/reinforced,
@@ -22961,8 +22949,7 @@
/area/station/service/bar)
"brI" = (
/obj/machinery/requests_console{
department = "Primary Tool Storage";
name = "Chapel Request Console";
department = "Chapel";
pixel_x = -30;
departmentType = 2
},
@@ -23976,7 +23963,6 @@
/obj/machinery/requests_console{
department = "Kitchen";
departmentType = 2;
name = "Kitchen Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -24787,7 +24773,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_x = 30
},
/obj/structure/table,
@@ -25167,7 +25152,6 @@
/obj/machinery/requests_console{
department = "Cargo Bay";
departmentType = 2;
name = "Cargo Requests Console";
pixel_y = 30
},
/obj/item/stack/tape_roll,
@@ -26929,7 +26913,6 @@
/obj/machinery/requests_console{
department = "Robotics";
departmentType = 2;
name = "Robotics Requests Console";
pixel_y = 30
},
/obj/structure/rack{
@@ -27579,7 +27562,6 @@
/obj/machinery/requests_console{
department = "Cargo Bay";
departmentType = 2;
name = "Cargo Requests Console";
pixel_y = 30
},
/obj/effect/turf_decal/delivery/hollow,
@@ -27928,7 +27910,6 @@
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
name = "Medbay Requests Console";
pixel_x = -30
},
/obj/structure/table,
@@ -29465,7 +29446,6 @@
announcementConsole = 1;
department = "Quartermaster's Desk";
departmentType = 5;
name = "Quartermaster Requests Console";
pixel_x = -30
},
/turf/simulated/floor/carpet,
@@ -30477,7 +30457,6 @@
/obj/machinery/requests_console{
department = "Cargo Bay";
departmentType = 2;
name = "Cargo Requests Console";
pixel_x = -30
},
/obj/machinery/camera{
@@ -30512,9 +30491,8 @@
dir = 4
},
/obj/machinery/requests_console{
department = "Medbay";
department = "Chemistry";
departmentType = 1;
name = "Chemistry Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -32850,7 +32828,6 @@
announcementConsole = 1;
department = "Chief Medical Officer's Desk";
departmentType = 5;
name = "Chief Medical Officer Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -33953,7 +33930,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -34960,7 +34936,6 @@
/obj/machinery/requests_console{
department = "Virology";
departmentType = 3;
name = "Virology Requests Console";
pixel_y = 30
},
/obj/machinery/newscaster{
@@ -36065,7 +36040,6 @@
announcementConsole = 1;
department = "Blueshield";
departmentType = 5;
name = "Blueshield Requests Console";
pixel_y = -30
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
@@ -39539,7 +39513,6 @@
"cAK" = (
/obj/machinery/requests_console{
department = "Tech Storage";
name = "Tech Storage Requests Console";
pixel_y = -32
},
/turf/simulated/floor/plating,
@@ -40038,7 +40011,6 @@
announcementConsole = 1;
department = "NT Representative";
departmentType = 5;
name = "NT Representative Requests Console";
pixel_y = 30
},
/obj/machinery/photocopier,
@@ -41501,7 +41473,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -42397,7 +42368,6 @@
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 3;
name = "Atmospherics Requests Console";
pixel_x = 30
},
/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
@@ -44056,7 +44026,6 @@
/obj/machinery/requests_console{
department = "Engineering";
departmentType = 3;
name = "Engineering Requests Console";
pixel_x = 30
},
/obj/item/stack/sheet/glass{
@@ -44509,9 +44478,8 @@
/area/station/engineering/atmos)
"cSf" = (
/obj/machinery/requests_console{
department = "Science";
department = "Xenobiology";
departmentType = 2;
name = "Science Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -45193,7 +45161,6 @@
/obj/machinery/requests_console{
department = "Engineering";
departmentType = 3;
name = "Engineering Requests Console";
pixel_y = 30
},
/obj/structure/table,
@@ -45741,7 +45708,6 @@
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 3;
name = "Atmospherics Requests Console";
pixel_y = -30
},
/obj/item/stack/sheet/glass{
@@ -46480,9 +46446,8 @@
/area/station/engineering/atmos)
"cZa" = (
/obj/machinery/requests_console{
department = "Bar";
department = "Expedition";
departmentType = 2;
name = "Expedition Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -46779,7 +46744,6 @@
/obj/item/book/manual/evaguide,
/obj/machinery/requests_console{
department = "EVA";
name = "EVA Requests Console";
pixel_x = -32
},
/obj/effect/turf_decal/delivery/white/hollow,
@@ -47411,12 +47375,6 @@
/area/station/engineering/break_room)
"dcF" = (
/obj/structure/closet/firecloset,
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 3;
name = "Atmospherics Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel,
/area/station/engineering/atmos)
"dcG" = (
@@ -48855,7 +48813,6 @@
"dig" = (
/obj/machinery/requests_console{
department = "Locker Room";
name = "Locker Room Requests Console";
pixel_x = -32
},
/turf/simulated/floor/plasteel,
@@ -50680,7 +50637,6 @@
/obj/machinery/requests_console{
department = "Hydroponics";
departmentType = 2;
name = "Hydroponics Requests Console";
pixel_y = 30
},
/obj/machinery/plantgenes,
@@ -51645,7 +51601,6 @@
/obj/machinery/requests_console{
department = "AI";
departmentType = 5;
name = "AI Requests Console";
pixel_x = 32;
pixel_y = -32
},
@@ -55080,8 +55035,7 @@
},
/obj/item/storage/briefcase,
/obj/machinery/requests_console{
department = "Medbay";
name = "Psych Requests Console";
department = "Psychiatrist";
pixel_x = -30;
departmentType = 2
},
@@ -59849,7 +59803,6 @@
announcementConsole = 1;
department = "Bridge";
departmentType = 5;
name = "Bridge Requests Console";
pixel_y = 30
},
/turf/simulated/floor/wood,
@@ -62147,7 +62100,6 @@
/obj/machinery/requests_console{
department = "Library";
departmentType = 2;
name = "Library Requests Console";
pixel_x = 30
},
/turf/simulated/floor/wood,
@@ -67018,8 +66970,7 @@
/area/station/security/permabrig)
"kFd" = (
/obj/machinery/requests_console{
department = "Primary Tool Storage";
name = "Chapel Office Request Console";
department = "Chapel";
departmentType = 2;
pixel_y = -30
},
@@ -68801,7 +68752,6 @@
/obj/item/camera_film,
/obj/item/camera/detective,
/obj/machinery/requests_console{
name = "Detective Requests Console";
pixel_y = -30;
department = "Detective";
departmentType = 5
@@ -70463,7 +70413,6 @@
announcementConsole = 1;
department = "Chief Engineer's Desk";
departmentType = 7;
name = "Chief Engineer Requests Console";
pixel_y = 32
},
/obj/machinery/light{
@@ -70917,7 +70866,6 @@
/obj/machinery/requests_console{
department = "Morgue";
departmentType = 5;
name = "Morgue Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -71655,7 +71603,6 @@
/obj/item/storage/firstaid/regular,
/obj/machinery/requests_console{
department = "Crew Quarters";
name = "Crew Quarters Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -74294,7 +74241,6 @@
announcementConsole = 1;
department = "Bridge";
departmentType = 5;
name = "Bridge Requests Console";
pixel_y = -30
},
/obj/structure/cable{
@@ -79830,7 +79776,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_x = 30
},
/obj/structure/disposalpipe/segment,
@@ -85470,7 +85415,6 @@
announcementConsole = 1;
department = "Head of Personnel's Desk";
departmentType = 5;
name = "Head of Personnel Requests Console";
pixel_y = -30
},
/obj/machinery/camera/autoname{
@@ -85494,7 +85438,6 @@
announcementConsole = 1;
department = "Research Director's Desk";
departmentType = 7;
name = "Research Director Requests Console";
pixel_x = -2;
pixel_y = 30
},
@@ -87782,9 +87725,8 @@
pixel_y = -30
},
/obj/machinery/requests_console{
department = "Medbay";
department = "Genetics";
departmentType = 1;
name = "Genetics Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -91819,9 +91761,8 @@
/area/station/maintenance/apmaint)
"wQa" = (
/obj/machinery/requests_console{
department = "Cargo Bay";
department = "Mining";
departmentType = 2;
name = "Cargo Requests Console";
pixel_x = -30
},
/obj/effect/landmark/start/shaft_miner,
@@ -92191,7 +92132,6 @@
/obj/machinery/requests_console{
department = "Janitorial";
departmentType = 1;
name = "Janitor Requests Console";
pixel_y = -29
},
/obj/effect/turf_decal/delivery/green/hollow,
@@ -93031,7 +92971,6 @@
announcementConsole = 1;
department = "Captain's Desk";
departmentType = 5;
name = "Captain Requests Console";
pixel_x = 30
},
/turf/simulated/floor/carpet/royalblue,

View File

@@ -3893,7 +3893,6 @@
announcementConsole = 1;
department = "Head of Security's Desk";
departmentType = 5;
name = "Head of Security Requests Console";
pixel_y = -30
},
/obj/machinery/computer/secure_data{
@@ -9904,7 +9903,6 @@
},
/obj/machinery/requests_console{
department = "EVA";
name = "EVA Requests Console";
pixel_x = -32
},
/turf/simulated/floor/plasteel{
@@ -16098,7 +16096,6 @@
},
/obj/machinery/requests_console{
department = "Virology";
name = "Virology Requests Console";
pixel_x = -32
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -24251,7 +24248,6 @@
},
/obj/machinery/requests_console{
department = "Crew Quarters";
name = "Crew Quarters Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -24493,9 +24489,8 @@
/area/space)
"cEm" = (
/obj/machinery/requests_console{
department = "Cargo Bay";
department = "Quartermaster's Desk";
departmentType = 5;
name = "Quartermaster Requests Console";
pixel_x = 30;
announcementConsole = 1
},
@@ -24581,7 +24576,6 @@
/obj/machinery/requests_console{
department = "Warden";
departmentType = 7;
name = "Warden's Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -27688,6 +27682,10 @@
/obj/item/paper_bin/nanotrasen,
/obj/item/stamp/magistrate,
/obj/item/pen/multi/gold,
/obj/machinery/requests_console{
department = "Magistrate";
pixel_x = 30
},
/turf/simulated/floor/carpet,
/area/station/legal/magistrate)
"cSQ" = (
@@ -28896,7 +28894,6 @@
},
/obj/machinery/requests_console{
department = "Tool Storage";
name = "Tool Storage Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -29344,7 +29341,6 @@
/obj/machinery/requests_console{
department = "Bar";
departmentType = 2;
name = "Bar Requests Console";
pixel_x = -30
},
/turf/simulated/floor/wood,
@@ -30509,7 +30505,6 @@
/area/station/science/hallway)
"dkb" = (
/obj/machinery/requests_console{
name = "Detective Requests Console";
pixel_y = -30;
department = "Detective";
departmentType = 5
@@ -33924,7 +33919,6 @@
/obj/item/multitool,
/obj/machinery/requests_console{
department = "Tech Storage";
name = "Tech Storage Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plating,
@@ -43068,7 +43062,6 @@
/obj/machinery/requests_console{
department = "Janitorial";
departmentType = 1;
name = "Janitor Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel,
@@ -44348,6 +44341,11 @@
/area/station/maintenance/storage)
"hkr" = (
/obj/item/kirbyplants,
/obj/machinery/requests_console{
department = "Chapel";
departmentType = 2;
pixel_y = 30
},
/turf/simulated/floor/carpet/black,
/area/station/service/chapel)
"hkt" = (
@@ -46618,6 +46616,16 @@
icon_state = "darkblue"
},
/area/station/medical/storage/secondary)
"hUK" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/requests_console{
department = "Mining";
departmentType = 5;
pixel_x = 30;
announcementConsole = 1
},
/turf/simulated/floor/plasteel,
/area/station/supply/miningdock)
"hUN" = (
/obj/machinery/atmospherics/unary/portables_connector{
dir = 4
@@ -49554,7 +49562,6 @@
announcementConsole = 1;
department = "Blueshield";
departmentType = 5;
name = "Blueshield Requests Console";
pixel_x = 30
},
/obj/structure/table/wood,
@@ -52798,6 +52805,14 @@
icon_state = "asteroidplating"
},
/area/station/maintenance/port)
"jMh" = (
/obj/item/kirbyplants,
/obj/machinery/requests_console{
department = "Psychiatrist";
pixel_x = -30
},
/turf/simulated/floor/carpet,
/area/station/medical/psych)
"jMr" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 8
@@ -53924,6 +53939,13 @@
/obj/machinery/atmospherics/portable/canister/air,
/turf/simulated/floor/plating,
/area/station/maintenance/starboard)
"kgy" = (
/obj/machinery/requests_console{
department = "Library";
pixel_x = -30
},
/turf/simulated/floor/wood,
/area/station/service/library)
"kgP" = (
/turf/simulated/floor/plasteel{
dir = 4;
@@ -54974,7 +54996,6 @@
announcementConsole = 1;
department = "NT Representative";
departmentType = 5;
name = "NT Representative Requests Console";
pixel_x = 30
},
/turf/simulated/floor/wood,
@@ -62366,7 +62387,6 @@
/obj/structure/closet/wardrobe/black,
/obj/machinery/requests_console{
department = "Arrival Shuttle";
name = "Arrival Shuttle Requests Console";
pixel_y = -30
},
/turf/simulated/floor/mineral/titanium/blue,
@@ -63470,7 +63490,6 @@
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
name = "Medbay Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -65774,6 +65793,16 @@
"nTa" = (
/turf/simulated/mineral/ancient,
/area/station/hallway/primary/central/east)
"nTo" = (
/obj/machinery/requests_console{
department = "Expedition";
departmentType = 2;
pixel_x = 30
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/area/station/service/expedition)
"nTJ" = (
/obj/structure/disposalpipe/segment/corner{
dir = 8
@@ -67759,7 +67788,6 @@
/obj/machinery/requests_console{
department = "Kitchen";
departmentType = 2;
name = "Kitchen Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -67866,7 +67894,6 @@
/obj/machinery/requests_console{
department = "Engineering";
departmentType = 3;
name = "Engineering Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -70284,6 +70311,17 @@
icon_state = "white"
},
/area/station/science/misc_lab)
"pqq" = (
/obj/machinery/requests_console{
announcementConsole = 1;
department = "Xenobiology";
departmentType = 5;
pixel_x = -30
},
/turf/simulated/floor/plasteel{
icon_state = "whitepurplefull"
},
/area/station/science/xenobiology)
"pqr" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 4
@@ -77273,7 +77311,6 @@
/obj/machinery/requests_console{
department = "Morgue";
departmentType = 5;
name = "Morgue Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -80554,7 +80591,6 @@
/obj/machinery/requests_console{
department = "Hydroponics";
departmentType = 2;
name = "Hydroponics Requests Console";
pixel_y = 30
},
/obj/machinery/hydroponics/constructable,
@@ -83266,7 +83302,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_x = -30
},
/obj/machinery/r_n_d/circuit_imprinter,
@@ -87017,6 +87052,14 @@
/obj/structure/falsewall/rock_ancient,
/turf/simulated/floor/plasteel,
/area/station/public/locker)
"uJE" = (
/obj/machinery/requests_console{
department = "Courtroom";
departmentType = 2;
pixel_x = 30
},
/turf/simulated/floor/carpet,
/area/station/legal/courtroom)
"uJT" = (
/turf/simulated/wall,
/area/station/maintenance/gambling_den)
@@ -87998,9 +88041,8 @@
/obj/item/storage/box/monkeycubes/stokcubes,
/obj/item/storage/box/monkeycubes/wolpincubes,
/obj/machinery/requests_console{
department = "Medbay";
department = "Genetics";
departmentType = 1;
name = "Genetics Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -88993,7 +89035,6 @@
/obj/item/pen/multi,
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Internal Affairs Requests Console";
pixel_x = -30
},
/obj/item/taperecorder,
@@ -93175,7 +93216,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_x = 30
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -93366,6 +93406,10 @@
},
/area/station/maintenance/gambling_den)
"wyn" = (
/obj/machinery/requests_console{
department = "Paramedic";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "whiteblue"
@@ -98146,7 +98190,6 @@
"xYV" = (
/obj/machinery/requests_console{
department = "Locker Room";
name = "Locker Room Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel,
@@ -112105,7 +112148,7 @@ xJa
gbb
xJa
gLH
xhk
uJE
bIR
xhk
xhk
@@ -113724,7 +113767,7 @@ aEe
aEe
aEe
bLH
bHZ
kgy
qKM
bRi
bPj
@@ -120723,7 +120766,7 @@ cGd
qqa
muT
uBC
uBC
pqq
uBC
cAh
pon
@@ -138883,7 +138926,7 @@ jVI
jVI
jVI
bzs
vId
nTo
hou
oVI
xbO
@@ -145816,7 +145859,7 @@ fMl
fMl
aZM
cMM
bcO
jMh
oFv
oWH
poU
@@ -153997,7 +154040,7 @@ uHx
aFb
byd
qbb
qbb
hUK
aJH
cbR
aIA

View File

@@ -398,6 +398,10 @@
/area/station/hallway/secondary/entry/east)
"aeF" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/requests_console{
department = "Psychiatrist";
pixel_x = -30
},
/turf/simulated/floor/wood,
/area/station/medical/psych)
"aeI" = (
@@ -6289,7 +6293,6 @@
/obj/machinery/requests_console{
department = "Janitorial";
departmentType = 1;
name = "Janitor Requests Console";
pixel_y = 29
},
/obj/effect/turf_decal/delivery/hollow,
@@ -9096,7 +9099,6 @@
/obj/machinery/requests_console{
department = "Bar";
departmentType = 2;
name = "Bar Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel/dark,
@@ -14497,7 +14499,6 @@
/obj/machinery/requests_console{
department = "Cargo Bay";
departmentType = 2;
name = "Cargo Requests Console";
pixel_y = 30
},
/obj/item/storage/firstaid/regular,
@@ -14655,7 +14656,6 @@
announcementConsole = 1;
department = "Quartermaster's Desk";
departmentType = 5;
name = "Quartermaster Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -18087,7 +18087,6 @@
/obj/machinery/requests_console{
department = "Kitchen";
departmentType = 2;
name = "Kitchen Requests Console";
pixel_x = 30
},
/obj/effect/turf_decal/delivery,
@@ -20495,7 +20494,6 @@
announcementConsole = 1;
department = "Head of Security's Desk";
departmentType = 5;
name = "Head of Security Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -24996,7 +24994,6 @@
/obj/machinery/requests_console{
department = "Hydroponics";
departmentType = 2;
name = "Hydroponics Requests Console";
pixel_x = 30
},
/obj/effect/turf_decal/delivery/hollow,
@@ -27048,7 +27045,6 @@
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 3;
name = "Atmospherics Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -27162,7 +27158,7 @@
dir = 4
},
/obj/machinery/requests_console{
department = "Primary Tool Storage";
department = "Tool Storage";
name = "Primary Tool Storage Console";
pixel_y = 30
},
@@ -27740,7 +27736,6 @@
/obj/machinery/requests_console{
department = "AI";
departmentType = 5;
name = "AI Requests Console";
pixel_x = 32;
pixel_y = 32
},
@@ -30227,7 +30222,6 @@
/obj/item/stack/sheet/glass,
/obj/machinery/requests_console{
department = "Tech Storage";
name = "Tech Storage Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel/dark,
@@ -31234,7 +31228,6 @@
dir = 8
},
/obj/machinery/requests_console{
name = "Detective Requests Console";
pixel_x = 30;
department = "Detective";
departmentType = 5
@@ -31576,7 +31569,6 @@
announcementConsole = 1;
department = "Chief Engineer's Desk";
departmentType = 7;
name = "Chief Engineer Requests Console";
pixel_x = -32
},
/turf/simulated/floor/plasteel/dark,
@@ -34130,7 +34122,6 @@
announcementConsole = 1;
department = "Captain's Desk";
departmentType = 5;
name = "Captain Requests Console";
pixel_x = -30
},
/turf/simulated/floor/carpet/black,
@@ -34994,7 +34985,6 @@
announcementConsole = 1;
department = "Head of Personnel's Desk";
departmentType = 5;
name = "Head of Personnel Requests Console";
pixel_y = 30
},
/turf/simulated/floor/wood,
@@ -36821,7 +36811,6 @@
announcementConsole = 1;
department = "NT Representative";
departmentType = 5;
name = "NT Representative Requests Console";
pixel_y = 30
},
/turf/simulated/floor/carpet/royalblack,
@@ -36864,7 +36853,6 @@
announcementConsole = 1;
department = "Blueshield";
departmentType = 5;
name = "Blueshield Requests Console";
pixel_y = 30
},
/turf/simulated/floor/wood,
@@ -39217,6 +39205,10 @@
/area/station/legal/magistrate)
"cgk" = (
/obj/item/kirbyplants,
/obj/machinery/requests_console{
department = "Magistrate";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
icon_state = "cult"
},
@@ -39665,7 +39657,7 @@
"chL" = (
/obj/structure/table/wood,
/obj/machinery/photocopier/faxmachine/longrange{
department = "IAA Office"
department = "Internal Affairs Office"
},
/turf/simulated/floor/wood,
/area/station/legal/lawoffice)
@@ -39693,7 +39685,6 @@
/obj/structure/filingcabinet/security,
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Internal Affairs Requests Console";
pixel_x = 30
},
/turf/simulated/floor/wood,
@@ -41501,7 +41492,6 @@
/obj/machinery/requests_console{
department = "Engineering";
departmentType = 3;
name = "Engineering Requests Console";
pixel_y = -30
},
/obj/effect/turf_decal/delivery,
@@ -42238,6 +42228,10 @@
pixel_x = 4;
pixel_y = 4
},
/obj/machinery/requests_console{
department = "Courtroom";
pixel_x = 30
},
/turf/simulated/floor/plasteel/dark,
/area/station/legal/courtroom)
"coQ" = (
@@ -42622,6 +42616,10 @@
/obj/structure/table/wood,
/obj/item/storage/bag/books,
/obj/item/taperecorder,
/obj/machinery/requests_console{
department = "Library";
pixel_x = 30
},
/turf/simulated/floor/plasteel/grimy,
/area/station/service/library)
"cpN" = (
@@ -46929,7 +46927,6 @@
},
/obj/machinery/requests_console{
department = "EVA";
name = "EVA Requests Console";
pixel_x = 32
},
/turf/simulated/floor/plasteel/dark,
@@ -51033,6 +51030,10 @@
d2 = 8;
icon_state = "2-8"
},
/obj/machinery/requests_console{
department = "Paramedic";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
dir = 6;
icon_state = "whiteblue"
@@ -53755,7 +53756,6 @@
/obj/structure/closet/wardrobe/yellow,
/obj/machinery/requests_console{
department = "Locker Room";
name = "Locker Room Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -54087,7 +54087,6 @@
/obj/machinery/requests_console{
department = "Xenobiology";
departmentType = 2;
name = "Xenobiology Requests Console";
pixel_x = 30
},
/obj/effect/turf_decal/delivery,
@@ -55183,7 +55182,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Research Request Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -57214,9 +57212,8 @@
name = "Chemistry Cleaner"
},
/obj/machinery/requests_console{
department = "Medbay";
department = "Chemistry";
departmentType = 1;
name = "Chemistry Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -57999,7 +57996,6 @@
announcementConsole = 1;
department = "Research Director's Desk";
departmentType = 7;
name = "Research Director Requests Console";
pixel_x = -30;
pixel_y = -2
},
@@ -58835,7 +58831,6 @@
/obj/machinery/requests_console{
department = "Robotics";
departmentType = 2;
name = "Robotics Requests Console";
pixel_y = 30
},
/obj/effect/turf_decal/delivery/hollow,
@@ -65227,9 +65222,8 @@
"dYd" = (
/obj/machinery/dna_scannernew,
/obj/machinery/requests_console{
department = "Medbay";
department = "Genetics";
departmentType = 1;
name = "Genetics Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -65479,7 +65473,6 @@
/obj/machinery/requests_console{
department = "Chapel";
departmentType = 2;
name = "Chapel Requests Console";
pixel_y = -30
},
/turf/simulated/floor/carpet,
@@ -68283,6 +68276,12 @@
icon_state = "redyellowfull"
},
/area/station/medical/break_room)
"fyq" = (
/obj/machinery/requests_console{
department = "Expedition"
},
/turf/simulated/floor/plasteel,
/area/station/service/expedition)
"fzd" = (
/obj/machinery/access_button{
autolink_id = "virolab_btn_int";
@@ -69545,7 +69544,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -73899,7 +73897,6 @@
announcementConsole = 1;
department = "Chief Medical Officer's Desk";
departmentType = 5;
name = "Chief Medical Officer Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -78176,7 +78173,6 @@
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
name = "Medbay Requests Console";
pixel_x = 30
},
/obj/structure/table,
@@ -81016,6 +81012,14 @@
icon_state = "bar"
},
/area/station/service/kitchen)
"nnV" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/requests_console{
department = "Mining";
pixel_y = -30
},
/turf/simulated/floor/plasteel,
/area/station/supply/miningdock)
"nnW" = (
/obj/machinery/door/airlock/security,
/obj/effect/mapping_helpers/airlock/autoname,
@@ -81829,7 +81833,6 @@
/obj/machinery/requests_console{
department = "Morgue";
departmentType = 5;
name = "Morgue Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -81960,7 +81963,6 @@
announcementConsole = 1;
department = "Bridge";
departmentType = 5;
name = "Bridge Requests Console";
pixel_y = -30;
dir = 1
},
@@ -82235,7 +82237,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -88978,6 +88979,10 @@
c_tag = "Rec Room Aft";
dir = 4
},
/obj/machinery/requests_console{
department = "Crew Quarters";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "neutralcorner"
@@ -92213,7 +92218,6 @@
/obj/machinery/requests_console{
department = "Warden";
departmentType = 7;
name = "Warden's Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -98690,7 +98694,6 @@
/obj/machinery/requests_console{
department = "Virology";
departmentType = 3;
name = "Virology Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -99146,7 +99149,6 @@
/obj/item/kirbyplants,
/obj/machinery/requests_console{
department = "Arrival Shuttle";
name = "Arrival Shuttle Requests Console";
pixel_x = 30
},
/turf/simulated/floor/mineral/titanium/blue,
@@ -141263,7 +141265,7 @@ bIX
csV
cxe
cvK
cCX
fyq
cyr
czW
cBw
@@ -144822,7 +144824,7 @@ hYQ
bgT
bih
bjL
boD
nnV
eNt
boE
eNt

View File

@@ -440,7 +440,6 @@
/area/station/legal/magistrate)
"afw" = (
/obj/machinery/requests_console{
name = "Detective Requests Console";
pixel_y = 30;
department = "Detective";
departmentType = 5
@@ -1336,7 +1335,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -5795,6 +5793,10 @@
"aFd" = (
/obj/structure/chair/comfy/brown,
/obj/effect/landmark/start/magistrate,
/obj/machinery/requests_console{
department = "Magistrate";
pixel_y = 30
},
/turf/simulated/floor/carpet,
/area/station/legal/magistrate)
"aFe" = (
@@ -7343,7 +7345,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -8903,7 +8904,6 @@
announcementConsole = 1;
department = "Quartermaster's Desk";
departmentType = 5;
name = "Quartermaster Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -12321,8 +12321,7 @@
/area/station/hallway/secondary/bridge)
"bad" = (
/obj/machinery/requests_console{
department = "Locker Room";
name = "Dorms Requests Console";
department = "Crew Quarters";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -13505,7 +13504,6 @@
},
/obj/machinery/requests_console{
department = "Tech Storage";
name = "Tech Storage Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -14286,7 +14284,6 @@
announcementConsole = 1;
department = "Chief Engineer's Desk";
departmentType = 7;
name = "Chief Engineer Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -15614,7 +15611,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -18009,7 +18005,6 @@
/obj/machinery/requests_console{
department = "Janitorial";
departmentType = 1;
name = "Janitor Requests Console";
pixel_x = -30
},
/obj/machinery/camera{
@@ -18800,7 +18795,6 @@
/obj/machinery/requests_console{
department = "AI";
departmentType = 5;
name = "AI Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -18933,7 +18927,7 @@
/area/shuttle/arrival/station)
"brt" = (
/obj/machinery/requests_console{
department = "Arrival shuttle";
department = "Arrival Shuttle";
pixel_y = -30
},
/obj/machinery/light,
@@ -20145,7 +20139,6 @@
announcementConsole = 1;
department = "Bridge";
departmentType = 5;
name = "Bridge Requests Console";
pixel_x = 30
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -21673,7 +21666,6 @@
announcementConsole = 1;
department = "Head of Personnel's Desk";
departmentType = 5;
name = "Head of Personnel Requests Console";
pixel_y = 30
},
/turf/simulated/floor/wood,
@@ -21793,7 +21785,6 @@
announcementConsole = 1;
department = "Captain's Desk";
departmentType = 5;
name = "Captain Requests Console";
pixel_x = 30
},
/turf/simulated/floor/wood,
@@ -24280,6 +24271,10 @@
"bHu" = (
/obj/structure/chair/comfy/black,
/obj/effect/landmark/start/assistant,
/obj/machinery/requests_console{
department = "Library";
pixel_y = 30
},
/turf/simulated/floor/wood,
/area/station/service/library)
"bHv" = (
@@ -24802,13 +24797,6 @@
},
/area/station/telecomms/computer)
"bJm" = (
/obj/machinery/requests_console{
announcementConsole = 1;
department = "Telecoms Admin";
departmentType = 5;
name = "Telecoms Request Console";
pixel_y = -30
},
/obj/machinery/firealarm{
dir = 4;
name = "east bump";
@@ -26778,7 +26766,6 @@
/obj/machinery/requests_console{
department = "Kitchen";
departmentType = 2;
name = "Kitchen Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -27303,6 +27290,10 @@
pixel_x = 7;
pixel_y = 4
},
/obj/machinery/requests_console{
department = "Expedition";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -28543,7 +28534,6 @@
announcementConsole = 1;
department = "Blueshield";
departmentType = 5;
name = "Blueshield Requests Console";
pixel_x = -30
},
/obj/item/paper_bin,
@@ -28839,7 +28829,6 @@
announcementConsole = 1;
department = "NT Representative";
departmentType = 5;
name = "NT Representative Requests Console";
pixel_x = -30
},
/turf/simulated/floor/carpet/royalblack,
@@ -30211,7 +30200,6 @@
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
name = "Medbay Requests Console";
pixel_y = 30
},
/obj/machinery/light{
@@ -30441,7 +30429,6 @@
/obj/machinery/requests_console{
department = "Hydroponics";
departmentType = 2;
name = "Hydroponics Requests Console";
pixel_x = -32
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -30475,7 +30462,6 @@
/obj/machinery/requests_console{
department = "Robotics";
departmentType = 2;
name = "Robotics Requests Console";
pixel_y = 30
},
/obj/item/stack/sheet/plasteel{
@@ -35503,7 +35489,6 @@
announcementConsole = 1;
department = "Research Director's Desk";
departmentType = 7;
name = "Research Director Requests Console";
pixel_x = 30
},
/obj/machinery/computer/aifixer{
@@ -36224,7 +36209,6 @@
announcementConsole = 1;
department = "Head of Security's Desk";
departmentType = 5;
name = "Head of Security Requests Console";
pixel_y = 30
},
/turf/simulated/floor/wood,
@@ -39084,6 +39068,11 @@
dir = 4
},
/obj/effect/landmark/start/geneticist,
/obj/machinery/requests_console{
department = "Genetics";
departmentType = 1;
pixel_y = -30
},
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -43323,9 +43312,8 @@
dir = 5
},
/obj/machinery/requests_console{
department = "Science";
department = "Xenobiology";
departmentType = 2;
name = "Science Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -43387,7 +43375,6 @@
/obj/machinery/requests_console{
department = "Security";
departmentType = 5;
name = "Security Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -43579,7 +43566,6 @@
/obj/machinery/requests_console{
department = "Chapel";
departmentType = 2;
name = "Chapel Requests Console";
pixel_y = 30
},
/obj/machinery/atmospherics/unary/vent_pump/on,
@@ -46396,7 +46382,6 @@
/obj/machinery/requests_console{
department = "Engineering";
departmentType = 3;
name = "Engineering Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -47234,7 +47219,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
@@ -55040,7 +55024,6 @@
"hHW" = (
/obj/machinery/requests_console{
department = "Internal Affairs Office";
name = "Internal Affairs Requests Console";
pixel_x = 30
},
/turf/simulated/floor/plasteel{
@@ -55860,7 +55843,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_y = 32
},
/turf/simulated/floor/plasteel{
@@ -59880,7 +59862,6 @@
/obj/machinery/requests_console{
department = "Robotics";
departmentType = 2;
name = "Robotics Requests Console";
pixel_x = -30
},
/obj/structure/disposalpipe/segment{
@@ -61796,7 +61777,6 @@
announcementConsole = 1;
department = "Chief Medical Officer's Desk";
departmentType = 5;
name = "Chief Medical Officer Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -62465,6 +62445,10 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
/obj/machinery/requests_console{
department = "Paramedic";
pixel_y = 30
},
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "whiteblue"
@@ -62573,6 +62557,11 @@
/area/station/maintenance/aft2)
"kQx" = (
/obj/item/kirbyplants/plant11,
/obj/machinery/requests_console{
department = "Courtroom";
departmentType = 1;
pixel_x = -30
},
/turf/simulated/floor/wood,
/area/station/legal/courtroom)
"kQB" = (
@@ -63242,9 +63231,8 @@
"lfd" = (
/obj/structure/table/glass,
/obj/machinery/requests_console{
department = "Medbay";
department = "Chemistry";
departmentType = 1;
name = "Chemistry Requests Console";
pixel_x = -30
},
/obj/machinery/reagentgrinder,
@@ -63604,9 +63592,7 @@
/obj/effect/mapping_helpers/airlock/windoor/access/any/security/armory{
dir = 1
},
/obj/machinery/door/window/classic/normal{
name = "Request Window"
},
/obj/machinery/door/window/classic/normal,
/obj/item/pen,
/obj/item/paper,
/obj/machinery/door/firedoor,
@@ -63700,7 +63686,6 @@
"llW" = (
/obj/machinery/requests_console{
department = "Locker Room";
name = "Dorms Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -64495,7 +64480,6 @@
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 3;
name = "Atmospherics Requests Console";
pixel_x = 30
},
/obj/structure/disposalpipe/segment,
@@ -66295,6 +66279,10 @@
/obj/structure/chair/comfy/beige{
dir = 8
},
/obj/machinery/requests_console{
department = "Psychiatrist";
pixel_x = 30
},
/turf/simulated/floor/carpet,
/area/station/medical/psych)
"moV" = (
@@ -68825,7 +68813,6 @@
/obj/machinery/requests_console{
department = "Bar";
departmentType = 2;
name = "Bar Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -74466,7 +74453,6 @@
/obj/machinery/requests_console{
department = "Cargo Bay";
departmentType = 2;
name = "Cargo Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel{
@@ -75012,7 +74998,6 @@
/obj/machinery/requests_console{
department = "Morgue";
departmentType = 5;
name = "Morgue Requests Console";
pixel_x = -30
},
/obj/machinery/light/small,
@@ -75564,7 +75549,6 @@
/obj/machinery/requests_console{
department = "Atmospherics";
departmentType = 3;
name = "Atmospherics Requests Console";
pixel_x = -30
},
/turf/simulated/floor/plasteel{
@@ -76988,7 +76972,6 @@
/obj/machinery/requests_console{
department = "Virology";
departmentType = 3;
name = "Virology Requests Console";
pixel_y = -30
},
/obj/item/stack/sheet/mineral/plasma,
@@ -79186,7 +79169,6 @@
/obj/machinery/requests_console{
department = "Warden";
departmentType = 7;
name = "Warden's Requests Console";
pixel_y = 30
},
/obj/structure/cable{
@@ -81820,7 +81802,6 @@
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
name = "Science Requests Console";
pixel_x = 30
},
/obj/effect/turf_decal/stripes/line{
@@ -82962,7 +82943,6 @@
/obj/machinery/requests_console{
department = "Engineering";
departmentType = 3;
name = "Engineering Requests Console";
pixel_y = -30
},
/turf/simulated/floor/plasteel,

View File

@@ -46,12 +46,14 @@
#define R_HOST ((1<<18)-1) //17 bit bitmask, update me if we ever add more admin permissions. Sum of all permissions to allow easy setting.
#define ADMIN_QUE(user,display) "<a href='byond://?_src_=holder;adminmoreinfo=[user.UID()]'>[display]</a>"
#define ADMIN_FLW(user,display) "<a href='byond://?_src_=holder;adminplayerobservefollow=[user.UID()]'>[display]</a>"
#define ADMIN_PP(user,display) "<a href='byond://?_src_=holder;adminplayeropts=[user.UID()]'>[display]</a>"
#define ADMIN_VV(atom,display) "<a href='byond://?_src_=vars;Vars=[atom.UID()]'>[display]</a>"
#define ADMIN_SM(user,display) "<a href='byond://?_src_=holder;subtlemessage=[user.UID()]'>[display]</a>"
#define ADMIN_TP(user,display) "<a href='byond://?_src_=holder;traitor=[user.UID()]'>[display]</a>"
#define ADMIN_OBS(user, display) "<a href='byond://?_src_=holder;adminobserve=[user.UID()]'>[display]</a>"
#define ADMIN_ALERT(user, display) "<a href='byond://?_src_=holder;adminalert=[user.UID()]'>[display]</a>"
#define ADMIN_BSA(user,display) "<a href='byond://?_src_=holder;BlueSpaceArtillery=[user.UID()]'>[display]</a>"
#define ADMIN_CENTCOM_REPLY(user,display) "<a href='byond://?_src_=holder;CentcommReply=[user.UID()]'>[display]</a>"

View File

@@ -0,0 +1,4 @@
#define BAD_INIT_QDEL_BEFORE (1<<0)
#define BAD_INIT_DIDNT_INIT (1<<1)
#define BAD_INIT_SLEPT (1<<2)
#define BAD_INIT_NO_HINT (1<<3)

View File

@@ -27,9 +27,9 @@
#define CAT_SPAGHETTI "Spaghettis"
#define CAT_ICE "Frozen"
#define RECIPE_MICROWAVE "Microwave"
#define RECIPE_OVEN "Oven"
#define RECIPE_GRILL "Grill"
#define RECIPE_CANDY "Candy"
#define RECIPE_MICROWAVE "microwave"
#define RECIPE_OVEN "oven"
#define RECIPE_GRILL "grill"
#define RECIPE_CANDY "candy machine"
#define RECIPE_FAIL null

View File

@@ -181,6 +181,8 @@
#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
///called when an atom stops orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop"
/// called on an atom who has stopped orbiting another atom (atom/orbiter, atom/formerly_orbited)
#define COMSIG_ATOM_ORBITER_STOP "atom_orbiter_stop"
///from base of atom/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
#define COMSIG_ATOM_HITBY "atom_hitby"
/// Called when an atom is sharpened or dulled.
@@ -945,11 +947,26 @@
///from base of datum/action/proc/Trigger(): (datum/action)
#define COMSIG_ACTION_TRIGGER "action_trigger"
#define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0)
/// From /datum/action/Grant(): (mob/grant_to)
#define COMSIG_ACTION_GRANTED "action_grant"
/// From /datum/action/Grant(): (datum/action)
#define COMSIG_MOB_GRANTED_ACTION "mob_action_grant"
/// From /datum/action/Remove(): (mob/removed_from)
#define COMSIG_ACTION_REMOVED "action_removed"
/// From /datum/action/Remove(): (datum/action)
#define COMSIG_MOB_REMOVED_ACTION "mob_action_removed"
// Note that this is only defined for actions because this could be a good bit expensive otherwise
/// From base of /atom/movable/screen/movable/action_button/MouseWheel(src, delta_x, delta_y, location, control, params)
#define COMSIG_ACTION_SCROLLED "action_scrolled"
// ghost signals
/// from observer_base/do_observe(): (mob/now_followed)
#define COMSIG_GHOST_START_OBSERVING "ghost_start_observing"
/// from observer_base/do_observe(): (mob/no_longer_following)
#define COMSIG_GHOST_STOP_OBSERVING "ghost_stop_observing"
//Xenobio hotkeys
///from slime CtrlClickOn(): (/mob)

View File

@@ -15,8 +15,8 @@
#define MECHA_SIDE_ARMOUR 2
#define MECHA_BACK_ARMOUR 3
#define MECHA_LOCKED 0
#define MECHA_SECURE_BOLTS 1
#define MECHA_LOOSE_BOLTS 2
#define MECHA_OPEN_HATCH 3
#define MECHA_UNSECURE_CELL 4
#define MECHA_MAINT_OFF 0
#define MECHA_MAINT_ON 1
#define MECHA_BOLTS_UP 2
#define MECHA_OPEN_HATCH 3
#define MECHA_BATTERY_UNSCREW 4

View File

@@ -400,6 +400,7 @@
#define INVESTIGATE_RENAME "renames"
#define INVESTIGATE_BOMB "bombs"
#define INVESTIGATE_HOTMIC "hotmic"
// The SQL version required by this version of the code
#define SQL_VERSION 56
@@ -702,3 +703,7 @@ do { \
/// A helper used by `restrict_file_types.py` to identify types to restrict in a file. Not used by byond at all.
#define RESTRICT_TYPE(type) // do nothing
#define INGREDIENT_CHECK_EXACT 1
#define INGREDIENT_CHECK_FAILURE 0
#define INGREDIENT_CHECK_SURPLUS -1

View File

@@ -164,6 +164,8 @@
if(sight_check && !isInSight(A, O))
continue
L |= M
for(var/mob/dead/observer/ghost in M.observers)
L |= ghost
//log_world("[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])")
if(isobj(A) || ismob(A))

View File

@@ -676,6 +676,7 @@
#define UNSETEMPTY(L) if(L && !length(L)) L = null
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } }
#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
/// Add an item to the list if not already present, if the list is null it will initialize it
#define LAZYOR(L, I) if(!L) { L = list(); } L |= I;
/// Adds I to L, initializing L if necessary, if I is not already in L
#define LAZYDISTINCTADD(L, I) if(!L) { L = list(); } L |= I;

View File

@@ -554,7 +554,7 @@ GLOBAL_LIST_EMPTY(do_after_once_tracker)
to_chat(user, "Name = <b>[M.name]</b>; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = <b>[M.key]</b>;")
to_chat(user, "Location = [location_description];")
to_chat(user, "[special_role_description]")
to_chat(user, "(<a href='byond://?src=[usr.UID()];priv_msg=[M.client?.ckey]'>PM</a>) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_TP(M,"TP")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")])")
to_chat(user, "(<a href='byond://?src=[usr.UID()];priv_msg=[M.client?.ckey]'>PM</a>) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_TP(M,"TP")]) ([ADMIN_SM(M,"SM")]) ([ADMIN_FLW(M,"FLW")]) ([ADMIN_OBS(M, "OBS")])")
// Gets the first mob contained in an atom, and warns the user if there's not exactly one
/proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr)

View File

@@ -233,6 +233,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_TABLE_LEAP "table_leap" // Lets bartender and chef mount tables faster
#define TRAIT_NEVER_MISSES_DISPOSALS "trait_never_misses_disposals" // For janitors landing disposal throws
#define TRAIT_SLEIGHT_OF_HAND "sleight_of_hand"
#define TRAIT_KNOWS_COOKING_RECIPES "knows_cooking_recipes"
/// used for dead mobs that are observing, but should not be afforded all the same platitudes as full ghosts.
/// This is a mind trait because ghosts can be frequently deleted and we want to be sure this sticks.
#define TRAIT_MENTOR_OBSERVING "mentor_observe"
//***** ITEM AND MOB TRAITS *****//
/// Show what machine/door wires do when held.
@@ -320,6 +325,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define HOLO_CIGAR "holo_cigar"
#define GLADIATOR "gladiator"
#define PULSEDEMON_TRAIT "pulse_demon"
/// Mentor observing
#define MENTOR_OBSERVING "mobserving"
//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"

View File

@@ -2082,3 +2082,18 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/is_color_dark(color, threshold = 25)
var/hsl = rgb2num(color, COLORSPACE_HSL)
return hsl[3] < threshold
/**
* This proc takes a list of types, and returns them in the format below.
* [type] = amount of type in list.
* Useful for recipes.
*/
/proc/type_list_to_counted_assoc_list(list/origin_list)
var/list/return_list = list()
for(var/datum/path as anything in origin_list)
if(isdatum(path))
path = path.type
if(!return_list[path])
return_list[path] = 0
return_list[path] += 1
return return_list

View File

@@ -47,5 +47,5 @@ GLOBAL_LIST_INIT(blocked_chems, list("polonium", "initropidril", "concentrated_i
"fungalspores", "jagged_crystals", "salmonella",
"lavaland_extract", "stable_mutagen", "beer2",
"curare", "gluttonytoxin", "smoke_powder", "stimulative_cling",
"teslium_paste"
"teslium_paste", "omnizine_no_addiction"
))

View File

@@ -81,7 +81,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY,
"TRAIT_CONTORTED_BODY" = TRAIT_CONTORTED_BODY,
"TRAIT_DEFLECTS_PROJECTILES" = TRAIT_DEFLECTS_PROJECTILES,
"TRAIT_TABLE_LEAP" = TRAIT_TABLE_LEAP,
"TRAIT_DODGE_ALL_THROWN_OBJECTS" = TRAIT_DODGE_ALL_OBJECTS,
"TRAIT_SUPERMATTER_IMMUNE" = TRAIT_SUPERMATTER_IMMUNE,
"TRAIT_BADASS" = TRAIT_BADASS,
@@ -98,7 +97,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HOLY" = TRAIT_HOLY,
"TRAIT_SLEIGHT_OF_HAND" = TRAIT_SLEIGHT_OF_HAND,
"TRAIT_TABLE_LEAP" = TRAIT_TABLE_LEAP,
"TRAIT_NEVER_MISSES_DISPOSALS" = TRAIT_NEVER_MISSES_DISPOSALS
"TRAIT_NEVER_MISSES_DISPOSALS" = TRAIT_NEVER_MISSES_DISPOSALS,
"TRAIT_KNOWS_COOKING_RECIPES" = TRAIT_KNOWS_COOKING_RECIPES
),
/obj = list(

View File

@@ -16,6 +16,8 @@
var/id
/// UID of the last thing we hovered over. Used for managing action button dragging.
var/last_hovered_ref
/// Whether or not this should be shown to observers
var/shown_to_observers = FALSE
/// Whether or not this button is locked, preventing it from being dragged.
var/locked = FALSE
@@ -32,8 +34,14 @@
return ..()
/atom/movable/screen/movable/action_button/proc/can_use(mob/user)
if(isobserver(user))
var/mob/dead/observer/dead_mob = user
if(dead_mob.mob_observed) // Observers can only click on action buttons if they're not observing something
return FALSE
if(!linked_action)
return TRUE
if(linked_action.owner != user)
return FALSE
return !isnull(linked_action.viewers[user.hud_used])
// Entered and Exited won't fire while you're dragging something, because you're still "holding" it
@@ -60,7 +68,8 @@
last_hovered.MouseExited(over_location, over_control, params)
closeToolTip(usr)
last_hovered_ref = UID(over_object)
over_object.MouseEntered(over_location, over_control, params)
if(!isnull(over_object))
over_object.MouseEntered(over_location, over_control, params)
/atom/movable/screen/movable/action_button/MouseDrop(over_object)
last_hovered_ref = null
@@ -113,6 +122,8 @@
animate(src, transform = matrix(), time = 0.4 SECONDS, alpha = 255)
/atom/movable/screen/movable/action_button/Click(location, control, params)
if(!can_use(usr))
return FALSE
var/list/modifiers = params2list(params)
if(modifiers["ctrl"] && modifiers["shift"])
INVOKE_ASYNC(src, PROC_REF(set_to_keybind), usr)
@@ -578,4 +589,47 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6,
button = action.viewers[src]
position_action(button, button.location)
/**
* Show (most) of the another mob's action buttons to this mob
*
* Used for observers viewing another mob's screen
*/
/mob/proc/show_other_mob_action_buttons(mob/take_from)
if(!hud_used || !client)
return
for(var/datum/action/action as anything in take_from.actions)
if(!action.show_to_observers)
continue
action.GiveAction(src)
RegisterSignal(take_from, COMSIG_MOB_GRANTED_ACTION, PROC_REF(on_observing_action_granted), override = TRUE)
RegisterSignal(take_from, COMSIG_MOB_REMOVED_ACTION, PROC_REF(on_observing_action_removed), override = TRUE)
/**
* Hide another mob's action buttons from this mob
*
* Used for observers viewing another mob's screen
*/
/mob/proc/hide_other_mob_action_buttons(mob/take_from)
for(var/datum/action/action as anything in take_from.actions)
action.HideFrom(src)
UnregisterSignal(take_from, list(COMSIG_MOB_GRANTED_ACTION, COMSIG_MOB_REMOVED_ACTION))
/// Signal proc for [COMSIG_MOB_GRANTED_ACTION] - If we're viewing another mob's action buttons,
/// we need to update with any newly added buttons granted to the mob.
/mob/proc/on_observing_action_granted(mob/living/source, datum/action/action)
SIGNAL_HANDLER // COMSIG_MOB_GRANTED_ACTION
if(!action.show_to_observers)
return
action.GiveAction(src)
/// Signal proc for [COMSIG_MOB_REMOVED_ACTION] - If we're viewing another mob's action buttons,
/// we need to update with any removed buttons from the mob.
/mob/proc/on_observing_action_removed(mob/living/source, datum/action/action)
SIGNAL_HANDLER // COMSIG_MOB_REMOVED_ACTION
action.HideFrom(src)
#undef AB_MAX_COLUMNS

View File

@@ -1,20 +1,27 @@
/atom/movable/screen/ai
icon = 'icons/mob/screen_ai.dmi'
/atom/movable/screen/ai/Click()
if(isobserver(usr) || usr.incapacitated())
return TRUE
/atom/movable/screen/ai/aicore
name = "AI core"
icon_state = "ai_core"
/atom/movable/screen/ai/aicore/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.view_core()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.view_core()
/atom/movable/screen/ai/camera_list
name = "Show Camera List"
icon_state = "camera"
/atom/movable/screen/ai/camera_list/Click()
if(..())
return
var/mob/living/silicon/ai/AI = usr
var/camera = tgui_input_list(AI, "Choose which camera you want to view", "Cameras", AI.get_camera_list())
AI.ai_camera_list(camera)
@@ -24,53 +31,60 @@
icon_state = "track"
/atom/movable/screen/ai/camera_track/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
var/target_name = tgui_input_list(AI, "Choose a target you want to track", "Tracking", AI.trackable_mobs())
if(target_name)
AI.ai_camera_track(target_name)
if(..())
return
var/mob/living/silicon/ai/AI = usr
var/target_name = tgui_input_list(AI, "Choose a target you want to track", "Tracking", AI.trackable_mobs())
if(target_name)
AI.ai_camera_track(target_name)
/atom/movable/screen/ai/camera_light
name = "Toggle Camera Light"
icon_state = "camera_light"
/atom/movable/screen/ai/camera_light/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.toggle_camera_light()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.toggle_camera_light()
/atom/movable/screen/ai/crew_monitor
name = "Crew Monitoring Console"
icon_state = "crew_monitor"
/atom/movable/screen/ai/crew_monitor/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.subsystem_crew_monitor()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.subsystem_crew_monitor()
/atom/movable/screen/ai/crew_manifest
name = "Crew Manifest"
icon_state = "manifest"
/atom/movable/screen/ai/crew_manifest/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.ai_roster()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.ai_roster()
/atom/movable/screen/ai/alerts
name = "Show Alerts"
icon_state = "alerts"
/atom/movable/screen/ai/alerts/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.ai_alerts()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.ai_alerts()
/atom/movable/screen/ai/announcement
name = "Make Announcement"
icon_state = "announcement"
/atom/movable/screen/ai/announcement/Click()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.announcement()
@@ -79,15 +93,18 @@
icon_state = "call_shuttle"
/atom/movable/screen/ai/call_shuttle/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.ai_call_shuttle()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.ai_call_shuttle()
/atom/movable/screen/ai/state_laws
name = "Law Manager"
icon_state = "state_laws"
/atom/movable/screen/ai/state_laws/Click()
if(..())
return
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.subsystem_law_manager()
@@ -97,42 +114,48 @@
icon_state = "pda_send"
/atom/movable/screen/ai/pda_msg_send/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.aiPDA.cmd_send_pdamesg()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.aiPDA.cmd_send_pdamesg()
/atom/movable/screen/ai/pda_msg_show
name = "PDA - Show Message Log"
icon_state = "pda_receive"
/atom/movable/screen/ai/pda_msg_show/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.aiPDA.cmd_show_message_log()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.aiPDA.cmd_show_message_log()
/atom/movable/screen/ai/image_take
name = "Take Image"
icon_state = "take_picture"
/atom/movable/screen/ai/image_take/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.aiCamera.toggle_camera_mode()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.aiCamera.toggle_camera_mode()
/atom/movable/screen/ai/image_view
name = "View Images"
icon_state = "view_images"
/atom/movable/screen/ai/image_view/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.aiCamera.viewpictures()
if(..())
return
var/mob/living/silicon/ai/AI = usr
AI.aiCamera.viewpictures()
/atom/movable/screen/ai/sensors
name = "Toggle Sensor Augmentation"
icon_state = "ai_sensor"
/atom/movable/screen/ai/sensors/Click()
if(..())
return
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.sensor_mode()

View File

@@ -48,6 +48,8 @@
if(override)
alert.timeout = null
alert.attach_owner(src)
if(icon_override)
alert.icon = icon_override
@@ -100,10 +102,50 @@
name = "Alert"
desc = "Something seems to have gone wrong with this alert, so report this bug please"
mouse_opacity = MOUSE_OPACITY_ICON
var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
/// How long before this alert automatically clears itself (in deciseconds). If zero, remains until cleared.
var/timeout = 0
/// Some alerts may have different icon states based on severity, this adjusts that.
var/severity = 0
/// Tool-tip for the alert.
var/alerttooltipstyle = ""
var/override_alerts = FALSE //If it is overriding other alerts of the same type
/// If true, this should override any other alerts of the same type thrown.
var/override_alerts = FALSE
/// The mob that this alert was originally thrown to.
var/mob/owner
/atom/movable/screen/alert/proc/attach_owner(mob/new_owner)
owner = new_owner
RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(remove_owner))
/atom/movable/screen/alert/proc/remove_owner(mob/source, force)
SIGNAL_HANDLER // COMSIG_PARENT_QDELETING
if(owner == source && !isnull(owner))
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
owner = null
/atom/movable/screen/alert/Destroy()
if(owner)
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
owner = null
severity = 0
master = null
screen_loc = ""
return ..()
/atom/movable/screen/alert/Click(location, control, params)
..()
if(!usr || !usr.client)
return FALSE
if(usr != owner)
to_chat(usr, "<span class='notice'>Only [owner] can use that!</span>")
return FALSE
var/paramslist = params2list(params)
if(paramslist["shift"]) // screen objects don't do the normal Click() stuff so we'll cheat
to_chat(usr, "<span class='boldnotice'>[name]</span> - <span class='info'>[desc]</span>")
return FALSE
if(master)
usr.client.Click(master, location, control, params)
return TRUE
/atom/movable/screen/alert/MouseEntered(location, control, params)
. = ..()
@@ -310,7 +352,7 @@ or something covering your eyes."
icon_state = "embeddedobject"
/atom/movable/screen/alert/embeddedobject/Click()
if(isliving(usr))
if(isliving(usr) && ..())
var/mob/living/carbon/human/M = usr
return M.help_shake_act(M)
@@ -333,7 +375,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "fire"
/atom/movable/screen/alert/fire/Click()
if(isliving(usr))
if(isliving(usr) && ..())
var/mob/living/L = usr
return L.resist()
@@ -343,7 +385,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "direction_lock"
/atom/movable/screen/alert/direction_lock/Click()
if(isliving(usr))
if(isliving(usr) && ..())
var/mob/living/L = usr
return L.clear_forced_look()
@@ -406,7 +448,7 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the
desc = "You have merged with a diona gestalt and are now part of it's biomass. You can still wiggle yourself free though."
/atom/movable/screen/alert/nymph/Click()
if(!usr || !usr.client)
if(!..())
return
if(isnymph(usr))
var/mob/living/simple_animal/diona/D = usr
@@ -417,7 +459,7 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the
desc = "You have merged with one or more diona nymphs. Click here to drop it (or one of them)."
/atom/movable/screen/alert/gestalt/Click()
if(!usr || !usr.client)
if(!..())
return
var/list/nymphs = list()
@@ -465,7 +507,7 @@ so as to remain in compliance with the most up-to-date laws."
return ..()
/atom/movable/screen/alert/hackingapc/Click()
if(!usr || !usr.client)
if(!..())
return
if(!target)
return
@@ -491,7 +533,7 @@ so as to remain in compliance with the most up-to-date laws."
return ..()
/atom/movable/screen/alert/mech_port_available/Click()
if(!usr || !usr.client)
if(!..())
return
if(!ismecha(usr.loc) || !target)
return
@@ -507,7 +549,7 @@ so as to remain in compliance with the most up-to-date laws."
icon_state = "mech_port_x"
/atom/movable/screen/alert/mech_port_disconnect/Click()
if(!usr || !usr.client)
if(!..())
return
if(!ismecha(usr.loc))
return
@@ -566,7 +608,7 @@ so as to remain in compliance with the most up-to-date laws."
timeout = 300
/atom/movable/screen/alert/notify_cloning/Click()
if(!usr || !usr.client)
if(!..())
return
var/mob/dead/observer/G = usr
G.reenter_corpse()
@@ -585,6 +627,8 @@ so as to remain in compliance with the most up-to-date laws."
overlays += I
/atom/movable/screen/alert/ghost/Click()
if(!..())
return
var/mob/living/carbon/human/infected_user = usr
if(!istype(infected_user) || infected_user.stat == DEAD)
infected_user.clear_alert("ghost_nest")
@@ -640,7 +684,7 @@ so as to remain in compliance with the most up-to-date laws."
return ..()
/atom/movable/screen/alert/notify_action/Click()
if(!usr || !usr.client)
if(!..())
return
var/mob/dead/observer/G = usr
@@ -721,7 +765,7 @@ so as to remain in compliance with the most up-to-date laws."
var/stoner = null
/atom/movable/screen/alert/notify_soulstone/Click()
if(!usr || !usr.client)
if(!..())
return
if(stone)
if(tgui_alert(usr, "Do you want to be captured by [stoner]'s soul stone? This will destroy your corpse and make it \
@@ -738,6 +782,7 @@ so as to remain in compliance with the most up-to-date laws."
icon_state = "map_vote"
/atom/movable/screen/alert/notify_mapvote/Click()
// ehh sure let observers click on it if they really want, who cares
usr.client.vote()
//OBJECT-BASED
@@ -756,11 +801,14 @@ so as to remain in compliance with the most up-to-date laws."
desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself."
/atom/movable/screen/alert/restrained/Click()
if(isliving(usr))
var/mob/living/L = usr
return L.resist()
if(!isliving(usr) || !..())
return
var/mob/living/L = usr
return L.resist()
/atom/movable/screen/alert/restrained/buckled/Click()
if(!isliving(usr) || !..())
return
var/mob/living/L = usr
if(!istype(L) || !L.can_resist())
return
@@ -770,20 +818,23 @@ so as to remain in compliance with the most up-to-date laws."
// PRIVATE = only edit, use, or override these if you're editing the system as a whole
// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there
/datum/hud/proc/reorganize_alerts()
/datum/hud/proc/reorganize_alerts(mob/viewmob)
var/mob/screenmob = viewmob || mymob
if(!screenmob.client)
return
var/list/alerts = mymob.alerts
if(!alerts)
return FALSE
var/icon_pref
if(!hud_shown)
for(var/i in 1 to length(alerts))
mymob.client.screen -= alerts[alerts[i]]
screenmob.client.screen -= alerts[alerts[i]]
return TRUE
for(var/i in 1 to length(alerts))
var/atom/movable/screen/alert/alert = alerts[alerts[i]]
if(alert.icon_state == "template")
if(!icon_pref)
icon_pref = ui_style2icon(mymob.client.prefs.UI_style)
icon_pref = ui_style2icon(screenmob.client.prefs.UI_style)
alert.icon = icon_pref
switch(i)
if(1)
@@ -799,24 +850,12 @@ so as to remain in compliance with the most up-to-date laws."
else
. = ""
alert.screen_loc = .
mymob.client.screen |= alert
screenmob.client.screen |= alert
if(!viewmob)
for(var/viewer in mymob.observers)
reorganize_alerts(viewer)
return TRUE
/atom/movable/screen/alert/Click(location, control, params)
if(!usr || !usr.client)
return
var/paramslist = params2list(params)
if(paramslist["shift"]) // screen objects don't do the normal Click() stuff so we'll cheat
to_chat(usr, "<span class='boldnotice'>[name]</span> - <span class='info'>[desc]</span>")
return
if(master)
return usr.client.Click(master, location, control, params)
/atom/movable/screen/alert/Destroy()
severity = 0
master = null
screen_loc = ""
return ..()
/// Gives the player the option to succumb while in critical condition
/atom/movable/screen/alert/succumb
@@ -825,7 +864,7 @@ so as to remain in compliance with the most up-to-date laws."
icon_state = "succumb"
/atom/movable/screen/alert/succumb/Click()
if(!usr || !usr.client)
if(!..())
return
var/mob/living/living_owner = usr
if(!istype(usr))

View File

@@ -146,19 +146,22 @@
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/alien/persistent_inventory_update()
/datum/hud/alien/persistent_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/carbon/alien/humanoid/H = mymob
var/mob/screenmob = viewer || H
if(hud_version != HUD_STYLE_NOHUD)
if(H.r_hand)
H.r_hand.screen_loc = ui_rhand
H.client.screen += H.r_hand
screenmob.client.screen += H.r_hand
if(H.l_hand)
H.l_hand.screen_loc = ui_lhand
H.client.screen += H.l_hand
screenmob.client.screen += H.l_hand
else
if(H.r_hand)
H.r_hand.screen_loc = null
screenmob.client.screen -= H.r_hand
if(H.l_hand)
H.l_hand.screen_loc = null
screenmob.client.screen -= H.l_hand

View File

@@ -49,16 +49,17 @@
for(var/category in screens)
clear_fullscreen(category)
/datum/hud/proc/reload_fullscreen()
if(mymob.client)
var/atom/movable/screen/fullscreen/screen
var/list/screens = mymob.screens
for(var/category in screens)
screen = screens[category]
if(screen.should_show_to(mymob))
mymob.client.screen |= screen
continue
mymob.client.screen -= screen
/mob/proc/reload_fullscreen()
if(!client)
return
var/atom/movable/screen/fullscreen/screen
for(var/category in screens)
screen = screens[category]
if(screen.should_show_to(src))
screen.update_for_view(client.view)
client.screen |= screen
else
client.screen -= screen
/atom/movable/screen/fullscreen
icon = 'icons/mob/screen_full.dmi'

View File

@@ -110,7 +110,24 @@
for(var/atom/movable/screen/S in (static_inventory + toggleable_inventory))
S.hud = src
/datum/hud/ghost/show_hud()
mymob.client.screen = list()
mymob.client.screen += static_inventory
..()
/datum/hud/ghost/show_hud(version = 0, mob/viewmob)
// don't show this HUD if observing; show the HUD of the observee
var/mob/dead/observer/O = mymob
if(istype(O) && O.mob_observed)
plane_masters_update()
return FALSE
. = ..()
if(!.)
return
var/mob/screenmob = viewmob || mymob
screenmob.client.screen += static_inventory
// We should only see observed mob alerts.
/datum/hud/ghost/reorganize_alerts(mob/viewmob)
var/mob/dead/observer/O = mymob
if(istype(O) && O.mob_observed)
return
return ..()

View File

@@ -11,7 +11,7 @@
var/hud_shown = TRUE
/// Current displayed version of the HUD
var/hud_version = 1
/// Whether or not their toggleable inventory
/// Whether or not their toggleable inventory (generally their contents on the left) is expanded
var/inventory_shown = TRUE
/// This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
var/hotkey_ui_hidden = FALSE
@@ -147,14 +147,22 @@
QDEL_NULL(screentip_text)
return ..()
/datum/hud/proc/show_hud(version = 0)
/**
* Shows this hud's hud to some mob
*
* Arguments
* * version - denotes which style should be displayed. blank or 0 means "next version"
* * viewmob - what mob to show the hud to. Can be this hud's mob, can be another mob, can be null (will use this hud's mob if so)
*/
/datum/hud/proc/show_hud(version = 0, mob/viewmob)
if(!ismob(mymob))
return FALSE
if(!mymob.client)
var/mob/screenmob = viewmob || mymob
if(!screenmob.client)
return FALSE
mymob.client.screen = list()
screenmob.client.clear_screen()
screenmob.client.apply_clickcatcher()
var/display_hud_version = version
if(!display_hud_version) //If 0 or blank, display the next hud version
@@ -166,15 +174,15 @@
if(HUD_STYLE_STANDARD) //Default HUD
hud_shown = TRUE //Governs behavior of other procs
if(length(static_inventory))
mymob.client.screen += static_inventory
if(length(toggleable_inventory) && inventory_shown)
mymob.client.screen += toggleable_inventory
if(length(hotkeybuttons) && !hotkey_ui_hidden)
mymob.client.screen += hotkeybuttons
screenmob.client.screen += static_inventory
if(length(toggleable_inventory) && screenmob.hud_used?.inventory_shown)
screenmob.client.screen += toggleable_inventory
if(length(hotkeybuttons) && !screenmob.hud_used?.hotkey_ui_hidden)
screenmob.client.screen += hotkeybuttons
if(length(infodisplay))
mymob.client.screen += infodisplay
screenmob.client.screen += infodisplay
mymob.client.screen += toggle_palette
screenmob.client.screen += toggle_palette
if(action_intent)
action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
@@ -182,33 +190,33 @@
if(HUD_STYLE_REDUCED) //Reduced HUD
hud_shown = FALSE //Governs behavior of other procs
if(length(static_inventory))
mymob.client.screen -= static_inventory
screenmob.client.screen -= static_inventory
if(length(toggleable_inventory))
mymob.client.screen -= toggleable_inventory
screenmob.client.screen -= toggleable_inventory
if(length(hotkeybuttons))
mymob.client.screen -= hotkeybuttons
screenmob.client.screen -= hotkeybuttons
if(length(infodisplay))
mymob.client.screen += infodisplay
screenmob.client.screen += infodisplay
//These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
if(inv_slots[SLOT_HUD_LEFT_HAND])
mymob.client.screen += inv_slots[SLOT_HUD_LEFT_HAND] //we want the hands to be visible
screenmob.client.screen += inv_slots[SLOT_HUD_LEFT_HAND] //we want the hands to be visible
if(inv_slots[SLOT_HUD_RIGHT_HAND])
mymob.client.screen += inv_slots[SLOT_HUD_RIGHT_HAND] //we want the hands to be visible
screenmob.client.screen += inv_slots[SLOT_HUD_RIGHT_HAND] //we want the hands to be visible
if(action_intent)
mymob.client.screen += action_intent //we want the intent switcher visible
screenmob.client.screen += action_intent //we want the intent switcher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
if(HUD_STYLE_NOHUD) //No HUD
hud_shown = FALSE //Governs behavior of other procs
if(length(static_inventory))
mymob.client.screen -= static_inventory
screenmob.client.screen -= static_inventory
if(length(toggleable_inventory))
mymob.client.screen -= toggleable_inventory
screenmob.client.screen -= toggleable_inventory
if(length(hotkeybuttons))
mymob.client.screen -= hotkeybuttons
screenmob.client.screen -= hotkeybuttons
if(length(infodisplay))
mymob.client.screen -= infodisplay
screenmob.client.screen -= infodisplay
if(HUD_STYLE_ACTIONHUD) //No HUD
hud_shown = TRUE //Governs behavior of other procs
@@ -220,36 +228,46 @@
mymob.client.screen -= infodisplay
hud_version = display_hud_version
persistent_inventory_update()
mymob.update_action_buttons(1)
reorganize_alerts()
reload_fullscreen()
update_parallax_pref(mymob)
persistent_inventory_update(screenmob)
screenmob.update_action_buttons(TRUE)
reorganize_alerts(screenmob)
screenmob.reload_fullscreen()
update_parallax_pref(screenmob)
if(!viewmob)
// working off of mymob
plane_masters_update()
for(var/M in mymob.observers)
show_hud(hud_version, M)
else if(viewmob.hud_used)
viewmob.hud_used.plane_masters_update()
viewmob.show_other_mob_action_buttons(mymob)
plane_masters_update()
return TRUE
/datum/hud/proc/plane_masters_update()
// Plane masters are always shown to OUR mob, never to observers
for(var/thing in plane_masters)
var/atom/movable/screen/plane_master/PM = plane_masters[thing]
PM.backdrop(mymob)
mymob.client.screen += PM
mymob.client?.screen += PM
/datum/hud/human/show_hud(version = 0)
/datum/hud/human/show_hud(version = 0, mob/viewmob)
. = ..()
if(!.)
return
hidden_inventory_update()
var/mob/screenmob = viewmob || mymob
hidden_inventory_update(screenmob)
/datum/hud/robot/show_hud(version = 0)
/datum/hud/robot/show_hud(version = 0, mob/viewmob)
. = ..()
if(!.)
return
update_robot_modules_display()
update_robot_modules_display(viewmob)
/datum/hud/proc/hidden_inventory_update()
/datum/hud/proc/hidden_inventory_update(mob/viewer)
return
/datum/hud/proc/persistent_inventory_update()
/datum/hud/proc/persistent_inventory_update(mob/viewer)
return
/mob/proc/hide_hud()

View File

@@ -6,14 +6,22 @@
icon_state = "toggle"
/atom/movable/screen/human/toggle/Click()
if(usr.hud_used.inventory_shown)
var/mob/targetmob = usr
if(isobserver(usr))
if(ishuman(usr.client.eye) && (usr.client.eye != usr))
var/mob/M = usr.client.eye
targetmob = M
if(usr.hud_used.inventory_shown && targetmob.hud_used)
usr.hud_used.inventory_shown = FALSE
usr.client.screen -= usr.hud_used.toggleable_inventory
usr.client.screen -= targetmob.hud_used.toggleable_inventory
else
usr.hud_used.inventory_shown = TRUE
usr.client.screen += usr.hud_used.toggleable_inventory
usr.client.screen += targetmob.hud_used.toggleable_inventory
usr.hud_used.hidden_inventory_update()
targetmob.hud_used.hidden_inventory_update(usr)
/atom/movable/screen/human/equip
name = "equip"
@@ -21,7 +29,7 @@
/atom/movable/screen/human/equip/Click()
if(ismecha(usr.loc)) // stops inventory actions in a mech
return 1
return TRUE
var/mob/living/carbon/human/H = usr
H.quick_equip()
@@ -33,6 +41,8 @@
screen_loc = ui_lingstingdisplay
/atom/movable/screen/ling/sting/Click()
if(isobserver(usr))
return
var/datum/antagonist/changeling/cling = usr.mind.has_antag_datum(/datum/antagonist/changeling)
cling?.chosen_sting?.unset_sting()
@@ -389,100 +399,118 @@
else
crafting.invisibility = initial(crafting.invisibility)
/datum/hud/human/hidden_inventory_update()
/datum/hud/human/hidden_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/carbon/human/H = mymob
if(inventory_shown && hud_version == HUD_STYLE_STANDARD)
var/mob/screenmob = viewer || H
if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown && screenmob.hud_used.hud_version == HUD_STYLE_STANDARD)
if(H.shoes)
H.shoes.screen_loc = ui_shoes
H.client.screen += H.shoes
screenmob.client.screen += H.shoes
if(H.gloves)
H.gloves.screen_loc = ui_gloves
H.client.screen += H.gloves
screenmob.client.screen += H.gloves
if(H.l_ear)
H.l_ear.screen_loc = ui_l_ear
H.client.screen += H.l_ear
screenmob.client.screen += H.l_ear
if(H.r_ear)
H.r_ear.screen_loc = ui_r_ear
H.client.screen += H.r_ear
screenmob.client.screen += H.r_ear
if(H.glasses)
H.glasses.screen_loc = ui_glasses
H.client.screen += H.glasses
screenmob.client.screen += H.glasses
if(H.w_uniform)
H.w_uniform.screen_loc = ui_iclothing
H.client.screen += H.w_uniform
screenmob.client.screen += H.w_uniform
if(H.wear_suit)
H.wear_suit.screen_loc = ui_oclothing
H.client.screen += H.wear_suit
screenmob.client.screen += H.wear_suit
if(H.wear_mask)
H.wear_mask.screen_loc = ui_mask
H.client.screen += H.wear_mask
screenmob.client.screen += H.wear_mask
if(H.head)
H.head.screen_loc = ui_head
H.client.screen += H.head
screenmob.client.screen += H.head
else
if(H.shoes) H.shoes.screen_loc = null
if(H.gloves) H.gloves.screen_loc = null
if(H.l_ear) H.l_ear.screen_loc = null
if(H.r_ear) H.r_ear.screen_loc = null
if(H.glasses) H.glasses.screen_loc = null
if(H.w_uniform) H.w_uniform.screen_loc = null
if(H.wear_suit) H.wear_suit.screen_loc = null
if(H.wear_mask) H.wear_mask.screen_loc = null
if(H.head) H.head.screen_loc = null
if(H.shoes)
screenmob.client.screen -= H.shoes
if(H.gloves)
screenmob.client.screen -= H.gloves
if(H.l_ear)
screenmob.client.screen -= H.l_ear
if(H.r_ear)
screenmob.client.screen -= H.r_ear
if(H.glasses)
screenmob.client.screen -= H.glasses
if(H.w_uniform)
screenmob.client.screen -= H.w_uniform
if(H.wear_suit)
screenmob.client.screen -= H.wear_suit
if(H.wear_mask)
screenmob.client.screen -= H.wear_mask
if(H.head)
screenmob.client.screen -= H.head
/datum/hud/human/persistent_inventory_update()
/datum/hud/human/persistent_inventory_update(mob/viewer)
if(!mymob)
return
..()
var/mob/living/carbon/human/H = mymob
if(hud_version == HUD_STYLE_STANDARD)
if(H.s_store)
H.s_store.screen_loc = ui_sstore1
H.client.screen += H.s_store
if(H.wear_id)
H.wear_id.screen_loc = ui_id
H.client.screen += H.wear_id
if(H.wear_pda)
H.wear_pda.screen_loc = ui_pda
H.client.screen += H.wear_pda
if(H.belt)
H.belt.screen_loc = ui_belt
H.client.screen += H.belt
if(H.back)
H.back.screen_loc = ui_back
H.client.screen += H.back
if(H.l_store)
H.l_store.screen_loc = ui_storage1
H.client.screen += H.l_store
if(H.r_store)
H.r_store.screen_loc = ui_storage2
H.client.screen += H.r_store
else
if(H.s_store)
H.s_store.screen_loc = null
if(H.wear_id)
H.wear_id.screen_loc = null
if(H.wear_pda)
H.wear_pda.screen_loc = null
if(H.belt)
H.belt.screen_loc = null
if(H.back)
H.back.screen_loc = null
if(H.l_store)
H.l_store.screen_loc = null
if(H.r_store)
H.r_store.screen_loc = null
var/mob/screenmob = viewer || H
if(screenmob.hud_used)
if(screenmob.hud_used.hud_shown && screenmob.hud_used.hud_version == HUD_STYLE_STANDARD)
if(H.s_store)
H.s_store.screen_loc = ui_sstore1
screenmob.client.screen += H.s_store
if(H.wear_id)
H.wear_id.screen_loc = ui_id
screenmob.client.screen += H.wear_id
if(H.wear_pda)
H.wear_pda.screen_loc = ui_pda
screenmob.client.screen += H.wear_pda
if(H.belt)
H.belt.screen_loc = ui_belt
screenmob.client.screen += H.belt
if(H.back)
H.back.screen_loc = ui_back
screenmob.client.screen += H.back
if(H.l_store)
H.l_store.screen_loc = ui_storage1
screenmob.client.screen += H.l_store
if(H.r_store)
H.r_store.screen_loc = ui_storage2
screenmob.client.screen += H.r_store
else
if(H.s_store)
screenmob.client.screen -= H.s_store
if(H.wear_id)
screenmob.client.screen -= H.wear_id
if(H.wear_pda)
screenmob.client.screen -= H.wear_pda
if(H.belt)
screenmob.client.screen -= H.belt
if(H.back)
screenmob.client.screen -= H.back
if(H.l_store)
screenmob.client.screen -= H.l_store
if(H.r_store)
screenmob.client.screen -= H.r_store
if(hud_version != HUD_STYLE_NOHUD)
if(H.r_hand)
H.r_hand.screen_loc = ui_rhand
H.client.screen += H.r_hand
screenmob.client.screen += H.r_hand
if(H.l_hand)
H.l_hand.screen_loc = ui_lhand
H.client.screen += H.l_hand
screenmob.client.screen += H.l_hand
else
if(H.r_hand)
H.r_hand.screen_loc = null
screenmob.r_hand.screen_loc = null
screenmob.client.screen -= H.r_hand
if(H.l_hand)
H.l_hand.screen_loc = null
screenmob.l_hand.screen_loc = null
screenmob.client.screen -= H.l_hand

View File

@@ -1,6 +1,9 @@
/datum/hud/proc/create_parallax()
var/client/C = mymob.client
if(!apply_parallax_pref())
/datum/hud/proc/create_parallax(mob/viewmob)
var/mob/screenmob = viewmob || mymob
if(!screenmob.client)
return
var/client/C = screenmob.client
if(!apply_parallax_pref(screenmob))
return
// this is needed so it blends properly with the space plane and blackness plane.
var/atom/movable/screen/plane_master/space/S = plane_masters["[PLANE_SPACE]"]
@@ -34,16 +37,20 @@
C.screen |= (C.parallax_layers + C.parallax_static_layers_tail)
/datum/hud/proc/remove_parallax()
var/client/C = mymob.client
/datum/hud/proc/remove_parallax(mob/viewmob)
var/mob/screenmob = viewmob || mymob
var/client/C = screenmob.client
C.screen -= (C.parallax_layers_cached + C.parallax_static_layers_tail)
C.parallax_layers = null
var/atom/movable/screen/plane_master/space/S = plane_masters["[PLANE_SPACE]"]
S.color = null
S.appearance_flags &= ~NO_CLIENT_COLOR
/datum/hud/proc/apply_parallax_pref()
var/client/C = mymob.client
/datum/hud/proc/apply_parallax_pref(mob/viewmob)
var/mob/screen_mob = viewmob || mymob
var/client/C = screen_mob.client
if(!istype(C))
return FALSE
if(C.prefs)
var/pref = C.prefs.parallax
if(isnull(pref))
@@ -72,16 +79,22 @@
C.parallax_layers_max = 4
return TRUE
/datum/hud/proc/update_parallax_pref()
remove_parallax()
create_parallax()
update_parallax()
/datum/hud/proc/update_parallax_pref(mob/viewmob)
var/mob/screen_mob = viewmob || mymob
if(!screen_mob.client)
return
remove_parallax(screen_mob)
create_parallax(screen_mob)
update_parallax(screen_mob)
// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation)
// Well, it would if our shuttle code had dynamic areas
/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups)
/datum/hud/proc/set_parallax_movedir(mob/viewmob, new_parallax_movedir, skip_windups)
. = FALSE
var/client/C = mymob.client
var/mob/screen_mob = viewmob || mymob
var/client/C = screen_mob.client
if(!istype(C))
return
if(new_parallax_movedir == C.parallax_movedir)
return
var/animatedir = new_parallax_movedir
@@ -157,8 +170,9 @@
animate(L, transform = L.transform, time = 0, loop = -1, flags = ANIMATION_END_NOW)
animate(transform = matrix(), time = T)
/datum/hud/proc/update_parallax()
var/client/C = mymob.client
/datum/hud/proc/update_parallax(mob/viewmob)
var/mob/screenmob = viewmob || mymob
var/client/C = screenmob.client
var/turf/posobj = get_turf(C.eye)
if(!posobj)
return
@@ -167,9 +181,9 @@
// Update the movement direction of the parallax if necessary (for shuttles)
var/area/shuttle/SA = areaobj
if(!SA || !SA.moving)
set_parallax_movedir(0)
set_parallax_movedir(screenmob, 0)
else
set_parallax_movedir(SA.parallax_move_direction)
set_parallax_movedir(screenmob, SA.parallax_move_direction)
var/force
if(!C.previous_turf || (C.previous_turf.z != posobj.z))
@@ -193,7 +207,7 @@
for(var/thing in C.parallax_layers)
var/atom/movable/screen/parallax_layer/L = thing
L.update_status(mymob)
L.update_status(screenmob)
if(L.view_sized != C.view)
L.update_o(C.view)

View File

@@ -1,23 +1,34 @@
/atom/movable/screen/robot
icon = 'icons/mob/screen_robot.dmi'
/atom/movable/screen/robot/Click()
. = ..()
if(isobserver(usr))
return TRUE
/atom/movable/screen/robot/module
name = "cyborg module"
icon_state = "nomod"
/atom/movable/screen/robot/module/Click()
if(isrobot(usr))
if(isrobot(usr) && !..())
var/mob/living/silicon/robot/R = usr
if(R.module)
R.hud_used.toggle_show_robot_modules()
return 1
R.pick_module()
if(!R.module)
R.pick_module()
return
// we can let ghosts mess with this one
usr.hud_used.toggle_show_robot_modules(usr)
return TRUE
/atom/movable/screen/robot/module1
name = "module1"
icon_state = "inv1"
/atom/movable/screen/robot/module1/Click()
if(..())
return
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.toggle_module(1)
@@ -27,6 +38,8 @@
icon_state = "inv2"
/atom/movable/screen/robot/module2/Click()
if(..())
return
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.toggle_module(2)
@@ -36,6 +49,8 @@
icon_state = "inv3"
/atom/movable/screen/robot/module3/Click()
if(..())
return
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.toggle_module(3)
@@ -46,6 +61,8 @@
icon_state = "radio"
/atom/movable/screen/robot/radio/Click()
if(..())
return
if(issilicon(usr))
var/mob/living/silicon/robot/R = usr
R.radio_menu()
@@ -55,6 +72,8 @@
icon_state = "store"
/atom/movable/screen/robot/store/Click()
if(..())
return
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.uneq_active()
@@ -66,6 +85,8 @@
screen_loc = ui_borg_lamp
/atom/movable/screen/robot/lamp/Click()
if(..())
return
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.control_headlamp()
@@ -75,6 +96,8 @@
icon_state = "ionpulse0"
/atom/movable/screen/robot/thrusters/Click()
if(..())
return
var/mob/living/silicon/robot/R = usr
R.toggle_ionpulse()
@@ -83,11 +106,23 @@
icon_state = "running"
/atom/movable/screen/robot/mov_intent/Click()
if(..())
return
usr.toggle_move_intent()
/datum/hud/robot
var/shown_robot_modules = FALSE // Used to determine whether they have the module menu shown or not
var/atom/movable/screen/robot_modules_background
/datum/hud/robot/New(mob/user)
..()
robot_modules_background = new()
robot_modules_background.icon_state = "block"
robot_modules_background.layer = HUD_LAYER // Objects that appear on screen are on layer 20, UI should be just below it.
robot_modules_background.plane = HUD_PLANE
var/atom/movable/screen/using
var/mob/living/silicon/robot/mymobR = mymob
@@ -184,41 +219,51 @@
return ..()
/datum/hud/proc/toggle_show_robot_modules()
/datum/hud/proc/toggle_show_robot_modules(mob/viewmob)
return
/datum/hud/robot/toggle_show_robot_modules(mob/viewmob)
var/mob/screenmob = viewmob || mymob
if(istype(viewmob.hud_used, /datum/hud/robot))
var/datum/hud/robot/robohud = screenmob.hud_used
robohud.shown_robot_modules = !robohud.shown_robot_modules
update_robot_modules_display(viewmob)
/datum/hud/proc/update_robot_modules_display(mob/viewer)
return
/datum/hud/robot/update_robot_modules_display(mob/viewer)
if(!isrobot(mymob))
return
var/mob/living/silicon/robot/R = mymob
R.shown_robot_modules = !R.shown_robot_modules
update_robot_modules_display()
/datum/hud/proc/update_robot_modules_display()
if(!isrobot(mymob))
return
var/mob/living/silicon/robot/R = mymob
var/mob/screenmob = viewer || R
if(!R.client)
return
if(!R.module)
shown_robot_modules = FALSE
screenmob.client.screen -= robot_modules_background
screenmob.client?.screen -= screenmob.hud_used.module_store_icon
return
if(R.shown_robot_modules && hud_version == HUD_STYLE_STANDARD)
if(shown_robot_modules && hud_shown && hud_version == HUD_STYLE_STANDARD)
//Modules display is shown
R.client.screen += module_store_icon //"store" icon
screenmob.client.screen += module_store_icon //"store" icon
if(!R.module.modules)
to_chat(usr, "<span class='danger'>Selected module has no modules to select.</span>")
return
if(!R.robot_modules_background)
if(!robot_modules_background)
return
var/display_rows = CEILING(length(R.module.modules) / 8, 1)
R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
R.client.screen += R.robot_modules_background
robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
screenmob.client.screen += robot_modules_background
var/x = -4 //Start at CENTER-4,SOUTH+1
var/y = 1
@@ -226,7 +271,7 @@
for(var/atom/movable/A in R.module.modules)
if((A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3))
//Module is not currently active
R.client.screen += A
screenmob.client.screen += A
if(x < 0)
A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
else
@@ -241,11 +286,39 @@
else
//Modules display is hidden
R.client.screen -= module_store_icon
screenmob.client.screen -= module_store_icon
for(var/atom/A in R.module.modules)
if((A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3))
//Module is not currently active
R.client.screen -= A
R.shown_robot_modules = FALSE
R.client.screen -= R.robot_modules_background
screenmob.client.screen -= A
shown_robot_modules = FALSE
screenmob.client.screen -= robot_modules_background
/datum/hud/robot/persistent_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/silicon/robot/R = mymob
var/mob/screenmob = viewer || R
var/held_items = list(R.module_state_1, R.module_state_2, R.module_state_3)
if(!screenmob.hud_used)
return
if(screenmob.hud_used.hud_shown)
for(var/i in 1 to length(held_items))
var/obj/item/I = held_items[i]
if(I)
switch(i)
if(1)
I.screen_loc = ui_inv1
if(2)
I.screen_loc = ui_inv2
if(3)
I.screen_loc = ui_inv3
else
return
screenmob.client.screen += I
else
for(var/obj/item/I in held_items)
screenmob.client.screen -= I

View File

@@ -367,6 +367,8 @@
screen_loc = ui_crafting
/atom/movable/screen/craft/Click()
if(!isliving(usr))
return
var/mob/living/M = usr
M.OpenCraftingMenu()
@@ -396,24 +398,26 @@
object_overlays.Cut()
/atom/movable/screen/inventory/proc/add_overlays()
var/mob/user = hud.mymob
var/mob/user = hud?.mymob
if(hud && user && slot_id)
var/obj/item/holding = user.get_active_hand()
if(!user || !slot_id || user != usr)
return
if(!holding || user.get_item_by_slot(slot_id))
return
var/obj/item/holding = user.get_active_hand()
var/image/item_overlay = image(holding)
item_overlay.alpha = 92
if(!holding || user.get_item_by_slot(slot_id))
return
if(!user.can_equip(holding, slot_id, disable_warning = TRUE))
item_overlay.color = "#ff0000"
else
item_overlay.color = "#00ff00"
var/image/item_overlay = image(holding)
item_overlay.alpha = 92
object_overlays += item_overlay
add_overlay(object_overlays)
if(!user.can_equip(holding, slot_id, TRUE))
item_overlay.color = "#ff0000"
else
item_overlay.color = "#00ff00"
object_overlays += item_overlay
add_overlay(object_overlays)
/atom/movable/screen/inventory/MouseDrop(atom/over)
cut_overlay(object_overlays)

View File

@@ -80,6 +80,8 @@
/atom/proc/attack_ghost(mob/dead/observer/user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
if(!istype(user)) // Make sure user is actually an observer. Revenents also use attack_ghost, but do not have the health_scan var.
return FALSE
if(user.client)
if(user.gas_scan && atmos_scan(user=user, target=src, silent=TRUE))
return TRUE

View File

@@ -1,8 +1,3 @@
#define BAD_INIT_QDEL_BEFORE (1<<0)
#define BAD_INIT_DIDNT_INIT (1<<1)
#define BAD_INIT_SLEPT (1<<2)
#define BAD_INIT_NO_HINT (1<<3)
SUBSYSTEM_DEF(atoms)
name = "Atoms"
init_order = INIT_ORDER_ATOMS
@@ -123,7 +118,25 @@ SUBSYSTEM_DEF(atoms)
old_initialized = SSatoms.old_initialized
BadInitializeCalls = SSatoms.BadInitializeCalls
#undef BAD_INIT_QDEL_BEFORE
#undef BAD_INIT_DIDNT_INIT
#undef BAD_INIT_SLEPT
#undef BAD_INIT_NO_HINT
/client/proc/debug_atom_init()
set name = "Atom Init Log"
set category = "Debug"
set desc = "Shows what failed to init this round"
if(!check_rights(R_DEBUG | R_VIEWRUNTIMES))
return
var/list/html_data = list()
html_data += "<h1>Bad Initialize() Calls</h1><table border='1'><tr><th scope='col'>Type</th><th scope='col'>Qdeleted before init</th><th scope='col'>Did not init</th><th scope='col'>Slept during init</th><th scope='col'>No init hint</th></tr>"
for(var/typepath in SSatoms.BadInitializeCalls)
var/val = SSatoms.BadInitializeCalls[typepath]
html_data += "<tr><td>[typepath]</td><td>[val & BAD_INIT_QDEL_BEFORE ? "X" : "&nbsp;"]</td><td>[val & BAD_INIT_DIDNT_INIT ? "X" : "&nbsp;"]</td><td>[val & BAD_INIT_SLEPT ? "X" : "&nbsp;"]</td><td>[val & BAD_INIT_NO_HINT ? "X" : "&nbsp;"]</td></tr>"
html_data += "</table>"
usr << browse(html_data.Join(), "window=initdebug")

View File

@@ -8,10 +8,32 @@ SUBSYSTEM_DEF(late_mapping)
flags = SS_NO_FIRE
/// List of all maze generators to process
var/list/obj/effect/mazegen/generator/maze_generators = list()
/// List of all bridge spawners to process
var/list/obj/effect/spawner/bridge/bridge_spawners = list()
/datum/controller/subsystem/late_mapping/Initialize()
if(length(maze_generators))
var/watch = start_watch()
log_startup_progress("Generating mazes...")
for(var/i in maze_generators)
var/obj/effect/mazegen/generator/MG = i
MG.run_generator()
var/list/mgcount = length(maze_generators) // Keeping track of this here because we wipe it next line down
QDEL_LIST_CONTENTS(maze_generators)
var/duration = stop_watch(watch)
log_startup_progress("Generated [mgcount] mazes in [duration]s")
if(length(bridge_spawners))
var/watch = start_watch()
log_startup_progress("Spawning bridges...")
for(var/i in bridge_spawners)
var/obj/effect/spawner/bridge/BS = i
BS.generate_bridge()
var/list/bscount = length(bridge_spawners) // Keeping track of this here because we wipe it next line down
QDEL_LIST_CONTENTS(bridge_spawners)
var/duration = stop_watch(watch)
log_startup_progress("Spawned [bscount] bridges in [duration]s")

View File

@@ -37,6 +37,9 @@ SUBSYSTEM_DEF(tickets)
// Autoresponse keys, in sorted order.
var/sorted_responses
/// Who has what tickets open? Maps client -> open ticket number.
var/list/open_detail_uis = list()
/datum/controller/subsystem/tickets/get_metrics()
. = ..()
var/list/cust = list()
@@ -79,7 +82,7 @@ SUBSYSTEM_DEF(tickets)
var/report
for(var/num in stales)
report += "[num], "
message_staff("<span class='[span_class]'>Tickets [report] have been open for over [TICKET_TIMEOUT / 600] minutes. Changing status to stale.</span>")
message_staff("<span class='[span_class]'>Tickets [report] have been open for over [TICKET_TIMEOUT / (60 SECONDS)] minutes. Changing status to stale.</span>")
/datum/controller/subsystem/tickets/get_stat_details()
return "Tickets: [LAZYLEN(allTickets)]"
@@ -206,11 +209,18 @@ SUBSYSTEM_DEF(tickets)
to_chat_safe(returnClient(N), "<span class='[span_class]'>Your [ticket_name] has now been resolved.</span>")
return TRUE
/datum/controller/subsystem/tickets/proc/refresh_tickets(list/tickets)
for(var/datum/ticket/T in tickets)
for(var/client/client in open_detail_uis)
if(client && open_detail_uis[client] == T.ticketNum)
showDetailUI(client.mob, T.ticketNum)
/datum/controller/subsystem/tickets/proc/addResponse(list/tickets, who, message)
var/list/ticket_numbers = list()
for(var/datum/ticket/T in tickets)
ticket_numbers += T.ticketNum
T.addResponse(who, message)
refresh_tickets(tickets)
if(length(ticket_numbers) == 1)
for(var/datum/ticket/only_ticket in tickets)
@@ -532,9 +542,11 @@ UI STUFF
/datum/controller/subsystem/tickets/proc/showUI(mob/user, tab)
var/dat = null
dat = returnUI(tab)
var/datum/browser/popup = new(user, ticket_system_name, ticket_system_name, 1400, 600)
var/datum/browser/popup = new(user, ticket_system_name, ticket_system_name, 1400, 800)
popup.set_content(dat)
popup.open()
// This isn't the detail tab, stop listening for the user's typing.
open_detail_uis -= user.client
/datum/controller/subsystem/tickets/proc/showDetailUI(mob/user, ticketID)
var/datum/ticket/T = allTickets[ticketID]
@@ -548,7 +560,8 @@ UI STUFF
dat += "<h3>[T.client_ckey] / [T.mobControlled] opened this [ticket_name] at [T.ingame_time_opened] at location [T.locationSent]</h3>"
dat += "<h4>Ticket Status: [status]"
dat += "<table style='width:950px; border: 3px solid;'>"
dat += "<div id='msgs' style='width:950px; border: 3px solid; overflow-y: scroll; height: 350px;'>"
dat += "<table style='width:100%;'>"
dat += "<tr><td>[makeUrlMessage(T, one_line = TRUE)]</td></tr>"
if(length(T.ticket_responses) > 1)
@@ -556,7 +569,31 @@ UI STUFF
var/datum/ticket_response/TR = T.ticket_responses[i]
dat += "<tr><td>[TR.to_string()]</td></tr>"
dat += "</table><br /><br />"
dat += "</table></div>"
var/client/C = get_client_by_ckey(T.client_ckey)
for(var/key in C?.pm_tracker.pms)
var/datum/pm_convo/convo = C.pm_tracker.pms[key]
if(convo.typing)
dat += "<i><span class='typing'>[key] is typing</span></i><br />"
var/found_typing = FALSE
for(var/client/X in GLOB.admins)
if(ckey(X.ckey) == ckey(T.client_ckey))
continue
if(!check_rights_for(X, rights_needed))
continue
for(var/key in X.pm_tracker.pms)
if(ckey(key) != ckey(T.client_ckey))
continue
var/datum/pm_convo/convo = X.pm_tracker.pms[key]
if(convo.typing)
dat += "<i><span class='typing'>[key] is typing</span></i><br />"
found_typing = TRUE
break
if(found_typing)
break
dat += "<br />"
dat += "<a href='byond://?src=[UID()];detailreopen=[T.ticketNum]'>Re-Open</a>[check_rights(rights_needed, 0) ? "<a href='byond://?src=[UID()];autorespond=[T.ticketNum]'>Auto</a>": ""]<a href='byond://?src=[UID()];detailresolve=[T.ticketNum]'>Resolve</a><br /><br />"
if(!T.staffAssigned)
@@ -574,9 +611,19 @@ UI STUFF
dat += "<a href='byond://?src=[UID()];detailclose=[T.ticketNum]'>Close Ticket</a>"
dat += "<a href='byond://?src=[UID()];convert_ticket=[T.ticketNum]'>Convert Ticket</a>"
var/datum/browser/popup = new(user, "[ticket_system_name]detail", "[ticket_system_name] #[T.ticketNum]", 1000, 600)
var/datum/browser/popup = new(user, "[ticket_system_name]detail", "[ticket_system_name] #[T.ticketNum]", 1000, 800, src)
popup.add_head_content(@{"<script type='text/javascript'>
window.onload = function () {
var msgs = document.getElementById('msgs');
msgs.scrollTop = msgs.scrollHeight;
}
</script>"})
popup.set_content(dat)
popup.open()
open_detail_uis[user.client] = T.ticketNum
/datum/controller/subsystem/tickets/proc/onCloseDetailUI(mob/user)
open_detail_uis -= user.client
/datum/controller/subsystem/tickets/proc/userDetailUI(mob/user)
//dat
@@ -591,7 +638,7 @@ UI STUFF
dat += "<tr><td>[TR.to_string()]</td></tr>"
dat += "</table>"
var/datum/browser/popup = new(user, "[ticket_system_name]userticketsdetail", ticket_system_name, 1000, 600)
var/datum/browser/popup = new(user, "[ticket_system_name]userticketsdetail", ticket_system_name, 1000, 800)
popup.set_content(dat)
popup.open()
@@ -697,6 +744,9 @@ UI STUFF
else
usr.client.resolveAllAdminTickets()
if(href_list["close"])
onCloseDetailUI(usr)
/datum/controller/subsystem/tickets/proc/takeTicket(index)
if(assignStaffToTicket(usr.client, index))
if(span_class == "mentorhelp")

View File

@@ -16,6 +16,8 @@
var/default_button_position = SCRN_OBJ_IN_LIST
/// Map of huds viewing a button with our action -> their button
var/list/viewers = list()
/// Whether or not this will be shown to observers
var/show_to_observers = TRUE
/datum/action/New(Target)
@@ -49,6 +51,8 @@
Remove(owner)
owner = M
RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(clear_ref), override = TRUE)
SEND_SIGNAL(src, COMSIG_ACTION_GRANTED, owner)
SEND_SIGNAL(owner, COMSIG_MOB_GRANTED_ACTION, src)
GiveAction(M)
/datum/action/proc/Remove(mob/remove_from)
@@ -64,6 +68,9 @@
if(isnull(owner))
return
SEND_SIGNAL(src, COMSIG_ACTION_REMOVED, owner)
SEND_SIGNAL(owner, COMSIG_MOB_REMOVED_ACTION, src)
if(target == owner)
RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(clear_ref), override = TRUE)
if(owner == remove_from)

View File

@@ -163,6 +163,7 @@
orbiter.animate_movement = SLIDE_STEPS
if(!QDELETED(parent))
SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_STOP, orbiter)
SEND_SIGNAL(orbiter, COMSIG_ATOM_ORBITER_STOP, parent)
orbiter.transform = get_cached_transform(orbiter)
orbiter.layer = get_orbiter_layer(orbiter)

View File

@@ -515,7 +515,7 @@
alert("Not before round-start!", "Alert")
return
var/list/out = list("<meta charset='UTF-8'><b>[name]</b>[(current && (current.real_name != name))?" (as [current.real_name])" : ""]")
var/list/out = list("<html><meta charset='UTF-8'><head><title>[name]</title></head><body><b>[name]</b>[(current && (current.real_name != name))?" (as [current.real_name])" : ""]")
out.Add("Mind currently owned by key: [key] [active ? "(synced)" : "(not synced)"]")
out.Add("Assigned role: [assigned_role]. <a href='byond://?src=[UID()];role_edit=1'>Edit</a>")
out.Add("Factions and special roles:")
@@ -592,6 +592,7 @@
out.Add(gen_objective_text(admin = TRUE))
out.Add("<a href='byond://?src=[UID()];obj_add=1'>Add objective</a><br>")
out.Add("<a href='byond://?src=[UID()];obj_announce=1'>Announce objectives</a><br>")
out.Add("</body></html>")
usr << browse(out.Join("<br>"), "window=edit_memory[src];size=500x500")
/datum/mind/Topic(href, href_list)

View File

@@ -42,26 +42,49 @@
var/duplicate = TRUE
var/byproduct // example: = /obj/item/kitchen/mould // byproduct to return, such as a mould or trash
/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
. = 1
/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents)
. = INGREDIENT_CHECK_EXACT
for(var/r_r in reagents)
var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
if(!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
if(aval_r_amnt>reagents[r_r])
. = -1
. = INGREDIENT_CHECK_SURPLUS
else
return 0
if((reagents?(length(reagents)):(0)) < length(avail_reagents.reagent_list))
return -1
return INGREDIENT_CHECK_FAILURE
if((reagents ? length(reagents) : 0) < length(avail_reagents.reagent_list))
return INGREDIENT_CHECK_SURPLUS
/**
* Similarly to the function above, this checks for reagents, except instead of being passed a reagent holder, we're passed
* [reagent_id] = amount as num.
* Returns INGREDIENT_CHECK_EXACT if we have the precise amount thats requested.
* Returns INGREDIENT_CHECK_FAILURE if we do not have enough.
* Returns INGREDIENT_CHECK_SURPLUS if we have MORE than requested.
*/
/datum/recipe/proc/check_reagents_assoc_list(list/avail_reagents)
. = INGREDIENT_CHECK_EXACT
for(var/required_reagent_id in reagents)
var/provided_reagent_amount = avail_reagents[required_reagent_id]
if(!provided_reagent_amount)
return INGREDIENT_CHECK_FAILURE
if(abs(provided_reagent_amount - reagents[required_reagent_id]) >= 0.5) // If amount is outside of the 0.5 unit tolerance
if(provided_reagent_amount > reagents[required_reagent_id]) // we have more than necessary
. = INGREDIENT_CHECK_SURPLUS
else
return INGREDIENT_CHECK_FAILURE // we don't have enough
if(length(reagents) < length(avail_reagents))
return INGREDIENT_CHECK_SURPLUS
/datum/recipe/proc/check_items(obj/container, list/ignored_items = null) //1=precisely, 0=insufficiently, -1=superfluous
. = 1
. = INGREDIENT_CHECK_EXACT
var/list/checklist = items ? items.Copy() : list()
for(var/obj/O in container)
if(ignored_items && is_type_in_list(O, ignored_items)) //skip if this is something we are ignoring
continue
if(!items)
return -1
return INGREDIENT_CHECK_SURPLUS
var/found = 0
for(var/type in checklist)
if(istype(O,type))
@@ -69,9 +92,32 @@
found = 1
break
if(!found)
. = -1
. = INGREDIENT_CHECK_SURPLUS
if(length(checklist))
return 0
return INGREDIENT_CHECK_FAILURE
/**
* Similarly to the function above, this checks for items, except instead of being passed a reagent holder, we're passed
* [type_path] = amount as num.
* Returns INGREDIENT_CHECK_EXACT if we have the precise amount thats requested.
* Returns INGREDIENT_CHECK_FAILURE if we do not have enough.
* Returns INGREDIENT_CHECK_SURPLUS if we have MORE than requested.
*/
/datum/recipe/proc/check_items_assoc_list(list/given_objects)
. = INGREDIENT_CHECK_EXACT
var/list/checklist = items ? items.Copy() : list()
for(var/obj/item/I as anything in given_objects) // path
var/amount_given = given_objects[I]
if(!length(checklist))
return INGREDIENT_CHECK_SURPLUS
for(var/i in 1 to amount_given)
if(I in checklist)
checklist -= I
else if(I in items) // make sure the recipe requires this item before declaring it surplus
. = INGREDIENT_CHECK_SURPLUS
if(length(checklist)) // we didnt get everything
return INGREDIENT_CHECK_FAILURE
//general version
/datum/recipe/proc/make(obj/container)
@@ -94,7 +140,7 @@
container.reagents.clear_reagents()
return result_obj
/proc/select_recipe(list/datum/recipe/available_recipes, obj/obj, exact = 1 as num, list/ignored_items = null)
/proc/select_recipe(list/datum/recipe/available_recipes, obj/obj, exact = INGREDIENT_CHECK_EXACT, list/ignored_items = null)
if(!exact)
exact = -1
var/list/datum/recipe/possible_recipes = new

View File

@@ -62,7 +62,13 @@
/obj/effect/spawner/bridge/Initialize(mapload)
. = ..()
SSlate_mapping.bridge_spawners += src
/obj/effect/spawner/bridge/Destroy()
SSlate_mapping.bridge_spawners -= src
return ..()
/obj/effect/spawner/bridge/proc/generate_bridge()
var/turf/east = locate(x + 3, y, z)
var/turf/west = locate(x - 3, y, z)
var/turf/north = locate(x, y + 3, z)
@@ -79,4 +85,3 @@
else if((ismineralturf(north) || istype(north, /turf/simulated/floor/plating/asteroid)) && (ismineralturf(south) || istype(south, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(e1) || istype(e1, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(w1) || istype(w1, /turf/simulated/floor/plating/asteroid)))
template = GLOB.bridge_vertical_templates[pick("lavaland_bridge_vertical_1.dmm", "lavaland_bridge_vertical_2.dmm", "lavaland_bridge_vertical_3.dmm", "lavaland_bridge_vertical_4.dmm", "lavaland_bridge_vertical_5.dmm", "lavaland_bridge_vertical_6.dmm")]
template.load(loc, centered = TRUE)
qdel(src) //Don't turn to hint qdel, it won't work well at all sadly.

View File

@@ -0,0 +1,17 @@
/datum/spell/chef/expert_chef
name = "Expert Chef Knowledge"
desc = "Find things you can cook with the items in reach."
school = "chef"
clothes_req = FALSE
base_cooldown = 5 SECONDS
human_req = TRUE
action_icon_state = "chef"
action_background_icon_state = "bg_default"
still_recharging_msg = "All this thinking makes your head hurt, wait a bit longer."
/datum/spell/chef/expert_chef/cast(list/targets, mob/user = usr)
var/mob/living/carbon/human/H = targets[1]
H.expert_chef_knowledge()
/datum/spell/chef/expert_chef/create_new_targeting()
return new /datum/spell_targeting/self

View File

@@ -596,12 +596,14 @@
H.physiology.brute_mod *= 0.8
H.physiology.burn_mod *= 0.8
H.physiology.stamina_mod *= 0.8
owner.status_flags &= ~CANPUSH
add_attack_logs(owner, owner, "gained chainsaw stun immunity", ATKLOG_ALL)
owner.add_stun_absorption("chainsaw", INFINITY, 4)
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, TRUE, use_reverb = FALSE)
/datum/status_effect/chainsaw_slaying/on_remove()
add_attack_logs(owner, owner, "lost chainsaw stun immunity", ATKLOG_ALL)
owner.status_flags |= CANPUSH
if(islist(owner.stun_absorption) && owner.stun_absorption["chainsaw"])
owner.remove_stun_absorption("chainsaw")
if(ishuman(owner))

View File

@@ -760,7 +760,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pinpointer that tracks any specified coordinates, DNA string, high value item or the nuclear authentication disk."
reference = "ADVP"
item = /obj/item/pinpointer/advpinpointer
cost = 20
cost = 10
can_discount = FALSE
/datum/uplink_item/device_tools/ai_detector
name = "Artificial Intelligence Detector" // changed name in case newfriends thought it detected disguised ai's

View File

@@ -530,6 +530,8 @@
INVOKE_ASYNC(temp_airlock, TYPE_PROC_REF(/obj/machinery/door/airlock, prison_open))
for(var/obj/machinery/door/window/temp_windoor in src)
INVOKE_ASYNC(temp_windoor, TYPE_PROC_REF(/obj/machinery/door, open))
for(var/obj/machinery/door/poddoor/temp_poddoor in src)
INVOKE_ASYNC(temp_poddoor, TYPE_PROC_REF(/obj/machinery/door, open))
/area/AllowDrop()
CRASH("Bad op: area/AllowDrop() called")

View File

@@ -135,7 +135,7 @@
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
/area/trader_station/sol
name = "Jupiter Station 6"
name = "Trading Satellite"
/area/ghost_bar
name = "Ghost Bar"

View File

@@ -562,11 +562,13 @@
for(var/atom/movable/hit_thing in turf_to_check)
if(isliving(hit_thing))
var/mob/living/hit_mob = hit_thing
return hit_mob.density
if(hit_mob.density)
return hit_mob
if(isobj(hit_thing))
var/obj/hit_obj = hit_thing
return hit_obj.density
if(hit_obj.density)
return hit_obj
return FALSE

View File

@@ -223,9 +223,7 @@
playsound(src, 'sound/effects/screech.ogg', 100, 1)
visible_message("<span class='warning'>[src] lets out a waning screech as violet mist swirls around its dissolving body!</span>")
icon_state = "revenant_draining"
for(var/i = alpha, i > 0, i -= 10)
sleep(0.1)
alpha = i
animate(src, alpha = 0, time = 3 SECONDS)
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
new /obj/item/ectoplasm/revenant(get_turf(src))
ghostize()

View File

@@ -244,7 +244,9 @@
var/datum/martial_art/cqc/under_siege/justacook = new
justacook.teach(H) // requires mind
ADD_TRAIT(H.mind, TRAIT_TABLE_LEAP, ROUNDSTART_TRAIT)
ADD_TRAIT(H.mind, TRAIT_KNOWS_COOKING_RECIPES, ROUNDSTART_TRAIT)
if(H.mind)
H.mind.AddSpell(new /datum/spell/chef/expert_chef)
/datum/job/hydro
title = "Botanist"

View File

@@ -62,8 +62,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/list/opened_positions = list()
/obj/machinery/computer/card/Initialize()
..()
/obj/machinery/computer/card/Initialize(mapload)
. = ..()
Radio = new /obj/item/radio(src)
Radio.listening = FALSE
Radio.config(list("Command" = 0))

View File

@@ -28,7 +28,7 @@
light_color = LIGHT_COLOR_DARKBLUE
/obj/machinery/computer/med_data/Initialize()
..()
. = ..()
field_edit_questions = list(
// General
"sex" = "Please select new sex:",

View File

@@ -9,7 +9,7 @@
var/dye_color = "#FFFFFF"
/obj/machinery/dye_generator/Initialize()
..()
. = ..()
power_change()
/obj/machinery/dye_generator/deconstruct(disassembled = TRUE)

View File

@@ -212,7 +212,6 @@
return INITIALIZE_HINT_LATELOAD
/obj/machinery/magnetic_controller/LateInitialize()
..()
if(autolink)
// GLOB.machines is populated in /machinery/Initialize
// so linkage gets delayed until that one finished.

View File

@@ -68,7 +68,7 @@
return ..()
/obj/machinery/turretid/Initialize()
..()
. = ..()
if(!control_area)
control_area = get_area(src)
else if(istext(control_area))

View File

@@ -1,5 +1,5 @@
/obj/mecha/combat/durand
desc = "It's time to light some fires and kick some tires."
desc = "A heavily armored exosuit designed for front-line combat."
name = "Durand Mk. II"
icon_state = "durand"
initial_icon = "durand"
@@ -28,9 +28,18 @@
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
ME.attach(src)
/obj/mecha/combat/durand/examine_more(mob/user)
. = ..()
. += "<i>A durable heavyweight combat mech designed and produced by Defiance Arms. \
The Durand is an outdated design among Defiance's line of battlemechs and was initially created to fulfill the role of a combat spearhead, breaking into enemy combat formations. \
Supplanted by newer, more advanced models, these old machines found themselves on the open market and are popular among corporations, private security firms, and planetary militia.</i>"
. += ""
. += "<i>Able to bear a wide array of heavy weapons and defensive tools, Nanotrasen found a use for the Durand as a machine to counter biohazards and hostile alien lifeforms, using it to secure new research installations or to fend off hostile fauna and bioforms. \
As with all station-side mechs, Nanotrasen has purchased the license to produce the Durand in their facilities.</i>"
/obj/mecha/combat/durand/old
desc = "A retired, third-generation combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
name = "Durand"
desc = "A retired, third-generation combat exosuit designed by Defiance Arms. Originally developed to combat hostile alien lifeforms"
name = "Old Durand"
icon_state = "old_durand"
initial_icon = "old_durand"
step_in = 4
@@ -42,3 +51,12 @@
infra_luminosity = 8
force = 40
wreckage = /obj/structure/mecha_wreckage/durand/old
/obj/mecha/combat/durand/old/examine_more(mob/user)
..()
. = list()
. += "<i>A relic of a mech, once produced by Defiance Arms in the decade of 2470. \
It is now sought after by collectors and museums alike and has found its way into the hands of many a black market over the decades since its later versions replaced it.</i>"
. += ""
. += "<i>Built initially to break into and destroy Xenomorph infestations, bigger and better war machines exist. \
But many still uphold this version of the Durand as an unstoppable classic, and finding one intact and functional has become increasingly rare.</i>"

View File

@@ -1,5 +1,5 @@
/obj/mecha/combat/gygax
desc = "A lightweight, security exosuit. Popular among private and corporate security."
desc = "A lightweight security exosuit. Popular among private and corporate security."
name = "Gygax"
icon_state = "gygax"
initial_icon = "gygax"
@@ -33,6 +33,16 @@
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
/obj/mecha/combat/gygax/examine_more(mob/user)
. = ..()
. += "<i>A light, fast and cheap combat mech designed and produced by Shellguard Munitions. \
Originally developed as a mobile flanker for open combat scenarios, a substantial flaw in the mech's Leg Overdrive systems caused poor sales. \
When using this system, the legs of the Gygax are prone to overheating and damaging the rest of the machine, leading overzealous pilots to harm themselves more than the enemy.</i>"
. += ""
. += "<i>Despite this flaw, Shellguard was able to reconsider the use of the mech and instead marketed it as a civil defence and policing mech. \
Popularity soared, especially among corporations like Nanotrasen, who were seeking a light, fast, cheap design to use to equip their security teams. \
As with all station-side mechs, Nanotrasen has purchased the license to produce the Gygax in their facilities.</i>"
/obj/mecha/combat/gygax/dark
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
name = "Dark Gygax"
@@ -68,3 +78,12 @@
/obj/mecha/combat/gygax/dark/add_cell()
cell = new /obj/item/stock_parts/cell/bluespace(src)
/obj/mecha/combat/gygax/dark/examine_more(mob/user)
..()
. = list()
. += "<i>A light, fast and cheap combat mech designed and produced by Shellguard Munitions, though this one appears to be modified. \
With minor alterations to the loadout, armor, and a slick black paint job, this variant strikes a menacing silhouette, its owner clearly being someone you should not mess with.</i>"
. += ""
. += "<i>Despite the flaws of the base model, this modified Gygax has no trouble being a speedy, dangerous killing machine. \
Alterations such as this are common amongst fringe users and outlaw groups, and the upgrades are most certainly illegal. Don't cut yourself.</i>"

View File

@@ -135,3 +135,11 @@
if("sadtrombone")
playsound(src, 'sound/misc/sadtrombone.ogg', 50)
return
/obj/mecha/combat/honker/examine_more(mob/user)
. = ..()
. += "<i>A cheerful, colorful modification of a Durand chassis, the Honk mech is designed as heavy laughterfield support for producing mass honking casualties. \
Built and perfected by some of the most skilled Clowns ever known to the galaxy, with materials and labor provided by Donk Co, the Honk has somehow managed to have its design smuggled aboard almost ever Nanotrasen station, to the imminent laughter (screams) and joy (despair) of it's crew!</i>"
. += ""
. += "<i>Equipped with a massive HoNkER BlAsT 5000 horn and long range mortars capable of firing both slippery banana peels and dangerous mousetraps, the Honk is well equipped to provide a Clown with everything they need to 'entertain' a station's crew, and to draw the ire of any nearby Security. \
Honk!</i>"

View File

@@ -1,5 +1,5 @@
/obj/mecha/combat/marauder
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
desc = "Heavy-duty combat exosuit, developed after the Durand model. Rarely found among civilian populations."
name = "Marauder"
icon_state = "marauder"
initial_icon = "marauder"
@@ -48,9 +48,17 @@
/obj/mecha/combat/marauder/add_cell()
cell = new /obj/item/stock_parts/cell/bluespace(src)
/obj/mecha/combat/marauder/examine_more(mob/user)
. = ..()
. += "<i>The newest combat mech developed by Defiance Arms, the Marauder is now their mainline offering in the galactic arms market. \
Based on the earlier Durand chassis, the Marauder is a high-tech weapon of war and destruction, fulfilling the spearhead role of Defiance's earlier design while supporting more firepower than ever before.</i>"
. += ""
. += "<i>The Marauder is rarely seen in civilian hands; instead, it is marketed towards military and mercenary forces. \
Recently, Defiance has opened sales to more customers; This includes Nanotrasen, who uses it to equip their ERT dvision.</i>"
/obj/mecha/combat/marauder/ares
name = "Ares"
desc = "Heavy-duty, combat exosuit, adapted from rejected early versions of the Marauder to serve as a biohazard containment exosuit. This model, albeit rare, can be found among civilian populations."
desc = "Heavy-duty combat exosuit, adapted from rejected early versions of the Marauder to serve as a biohazard containment exosuit. This model, albeit rare, can be found among civilian populations."
icon_state = "ares"
initial_icon = "ares"
operation_req_access = list(ACCESS_SECURITY)
@@ -75,8 +83,17 @@
ME = new /obj/item/mecha_parts/mecha_equipment/thrusters
ME.attach(src)
/obj/mecha/combat/marauder/ares/examine_more(mob/user)
..()
. = list()
. += "<i>Developed from earlier Durand prototypes that never saw production, the Ares is produced by Defiance Arms and marketed as the final word in biohazard containment and protection. \
Heavily armed and armored, and perhaps a little out of date, the Ares is built from the ground up to destroy biological incursions, whatever those may be.</i>"
. += ""
. += "<i>Defiance does not sell the license for the Ares to be produced, and as such, it is rarer than most combat mechs, but is more commonly seen among civilian markets compared to their mainline Marauder chassis. \
Nanotrases supports a small stable of Ares battlemechs to be used in times of dire emergency.</i>"
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
desc = "Heavy-duty command-type exosuit. This is a custom model, utilized only by high-ranking personnel."
name = "Seraph"
icon_state = "seraph"
initial_icon = "seraph"
@@ -110,8 +127,17 @@
ME = new /obj/item/mecha_parts/mecha_equipment/thrusters
ME.attach(src)
/obj/mecha/combat/marauder/seraph/examine_more(mob/user)
..()
. = list()
. += "<i>In the field, Nanotrasen teams often needed a command and control unit that could assist where comms failed, and thus, they created a retrofit of the Marauder. \
This new Seraph variant would serve as a command model, with enhanced comms and command capabilities, but would otherwise be incredibly rare.</i>"
. += ""
. += "<i>Due to the rarity of the Seraph, it can be assumed that things are well and truly fucked if one is seen operating. \
Deployed only in the direst of emergencies, it will inevitably be the lynchpin of any defense or assault.</i>"
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
desc = "Heavy-duty combat exosuit, modified with illegal technology and weapons."
name = "Mauler"
icon_state = "mauler"
initial_icon = "mauler"
@@ -137,3 +163,12 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/thrusters
ME.attach(src)
/obj/mecha/combat/marauder/mauler/examine_more(mob/user)
..()
. = list()
. += "<i>A bulky, brutish combat mech painted a deep, matte black, highlighted with a menacing red; the Mauler is an illegal retrofit of Defiance's Marauder chassis. \
Armed to the teeth with various weapons and armored more thickly than some main battle tanks, this mechanical monstrosity is incredibly rare, and little is known about who makes them or why they exist.</i>"
. += ""
. += "<i>The few confirmed sightings have recently been in the hands of the Gorlex Marauders, a group of hostile pirates with suspected ties to the Syndicate. \
The Mauler poses a severe threat to any force and should never be taken lightly.</i>"

View File

@@ -1,5 +1,5 @@
/obj/mecha/combat/phazon
desc = "An exosuit which can only be described as 'WTF?'."
desc = "An experimental, phase-shifting exosuit developed by Nanotrasen's research division"
name = "Phazon"
icon_state = "phazon"
initial_icon = "phazon"
@@ -47,3 +47,13 @@
"}
output += ..()
return output
/obj/mecha/combat/phazon/examine_more(mob/user)
. = ..()
. += "<i>The Phazon is an experimental Nanotrasen combat design, using a Bluespace Anomaly Core as its heart. \
This odd crystal allows the mech to phase part way out of reality, allowing it to pass through walls, floors, and other structures as if they never existed in the first place. \
Designed by an NT research team, the design has recently been distributed to their science stations for testing and preliminary production.</i>"
. += ""
. += "<i>Due to the nature of finding Anomaly Cores, Phazons are exceedingly rare. \
It seems to hum with stored energy, the edges of its chassis blurry in the eyes of others, even at rest. \
Early test pilots report strange hallucinations and “visions” after extensive use of the phasing ability.</i>"

View File

@@ -26,3 +26,12 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/mimercd //HAHA IT MAKES WALLS GET IT
ME.attach(src)
/obj/mecha/combat/reticence/examine_more(mob/user)
. = ..()
. += "<i>A dour, colorless modification of a Gygax chassis, the Reticence is a sight to behold…or not behold. \
It utilizes a mysterious dampening field, added by a cabal of nearly unheard-of mimes, to be entirely silent as it moves over any terrain, making it a favored weapon of this supposed conspiracy and the assassins they may, or may not, employ.</i>"
. += ""
. += "<i>Armed with an S.H.H. “Quietus” Carbine, an utterly silent weapon that can drain the stamina of targets unfortunate enough to be shot by it, it can ensure swift getaways. \
As a secondary tool, it comes equipped with a mime R.C.D., a device capable of replicating a mime's mysterious ability to create impenetrable, invisible walls. \
Strangely, the design for the Reticence seems to be present aboard every Nanotrasen station, though to what ends, no one knows.</i>"

View File

@@ -254,7 +254,7 @@
qdel(target)
playsound(target, usesound, 50, 1)
if(MECH_RCD_MODE_WALL_OR_FLOOR)
if(isspaceturf(target))
if(isspaceturf(target) || ischasm(target))
var/turf/space/S = target
occupant_message("Building Floor...")
if(do_after_cooldown(S))

View File

@@ -29,8 +29,8 @@
var/overload_step_energy_drain_min = 100
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
var/obj/item/stock_parts/cell/cell
var/state = 0
var/list/log = new
var/state = MECHA_MAINT_OFF
var/list/log = list()
var/last_message = 0
var/add_req_access = 1
var/maint_access = 1
@@ -84,7 +84,7 @@
var/destruction_sleep_duration = 2 SECONDS //Time that mech pilot is put to sleep for if mech is destroyed
var/melee_cooldown = 10
var/melee_can_hit = 1
var/melee_can_hit = TRUE
/// How many ion thrusters we got on this bad boy
var/thruster_count = 0
@@ -247,9 +247,9 @@
if(!melee_can_hit || !isatom(target))
return
target.mech_melee_attack(src)
melee_can_hit = 0
melee_can_hit = FALSE
spawn(melee_cooldown)
melee_can_hit = 1
melee_can_hit = TRUE
/obj/mecha/proc/mech_toxin_damage(mob/living/target)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
@@ -270,11 +270,11 @@
/obj/mecha/Process_Spacemove(movement_dir = 0)
. = ..()
if(.)
return 1
return TRUE
if(thrusters_active && movement_dir && use_power(step_energy_drain))
step_in = initial(step_in) / thruster_count
new /obj/effect/particle_effect/ion_trails(get_turf(src), dir)
return 1
return TRUE
var/atom/movable/backup = get_spacemove_backup()
if(backup)
@@ -282,7 +282,7 @@
if(backup.newtonian_move(turn(movement_dir, 180)))
if(occupant)
to_chat(occupant, "<span class='info'>You push off of [backup] to propel yourself.</span>")
return 1
return TRUE
/obj/mecha/relaymove(mob/user, direction)
if(!direction || frozen)
@@ -290,12 +290,12 @@
if(user != occupant) //While not "realistic", this piece is player friendly.
user.forceMove(get_turf(src))
to_chat(user, "<span class='notice'>You climb out from [src].</span>")
return 0
return FALSE
if(connected_port)
if(world.time - last_message > 20)
occupant_message("<span class='warning'>Unable to move while connected to the air system port!</span>")
last_message = world.time
return 0
return FALSE
if(state)
occupant_message("<span class='danger'>Maintenance protocols in effect.</span>")
return
@@ -303,21 +303,21 @@
/obj/mecha/proc/domove(direction)
if(can_move >= world.time)
return 0
return FALSE
if(!Process_Spacemove(direction))
return 0
return FALSE
if(!has_charge(step_energy_drain))
return 0
return FALSE
if(defence_mode)
if(world.time - last_message > 20)
occupant_message("<span class='danger'>Unable to move while in defence mode.</span>")
last_message = world.time
return 0
return FALSE
if(zoom_mode)
if(world.time - last_message > 20)
occupant_message("<span class='danger'>Unable to move while in zoom mode.</span>")
last_message = world.time
return 0
return FALSE
if(thrusters_active && has_gravity(src))
thrusters_active = FALSE
@@ -364,7 +364,7 @@
dir = direction
if(turnsound)
playsound(src,turnsound,40,1)
return 1
return TRUE
/obj/mecha/proc/mechstep(direction)
. = step(src, direction)
@@ -387,25 +387,25 @@
/obj/mecha/Bump(atom/obstacle, bump_allowed)
if(throwing) //high velocity mechas in your face!
var/breakthrough = 0
var/breakthrough = FALSE
if(istype(obstacle, /obj/structure/window))
qdel(obstacle)
breakthrough = 1
breakthrough = TRUE
else if(istype(obstacle, /obj/structure/grille/))
var/obj/structure/grille/G = obstacle
G.obj_break()
breakthrough = 1
breakthrough = TRUE
else if(istype(obstacle, /obj/structure/table))
var/obj/structure/table/T = obstacle
qdel(T)
breakthrough = 1
breakthrough = TRUE
else if(istype(obstacle, /obj/structure/rack))
new /obj/item/rack_parts(obstacle.loc)
qdel(obstacle)
breakthrough = 1
breakthrough = TRUE
else if(istype(obstacle, /obj/structure/reagent_dispensers/fueltank))
obstacle.ex_act(1)
@@ -421,7 +421,7 @@
L.Weaken(10 SECONDS)
L.apply_effect(STUTTER, 10 SECONDS)
playsound(src, pick(hit_sound), 50, 0, 0)
breakthrough = 1
breakthrough = TRUE
else
if(throwing)
@@ -524,7 +524,7 @@
/obj/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
. = ..()
if(!damage_amount)
return 0
return FALSE
var/booster_deflection_modifier = 1
var/booster_damage_modifier = 1
if(damage_flag == BULLET || damage_flag == LASER || damage_flag == ENERGY)
@@ -547,7 +547,7 @@
if(prob(deflect_chance * booster_deflection_modifier))
visible_message("<span class='danger'>[src]'s armour deflects the attack!</span>")
log_message("Armor saved.")
return 0
return FALSE
if(.)
. *= booster_damage_modifier
@@ -729,7 +729,7 @@
to_chat(user, "<span class='warning'>Maintenance protocols disabled by operator.</span>")
else if(istype(W, /obj/item/stack/cable_coil))
if(state == 3 && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
if(state == MECHA_OPEN_HATCH && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
var/obj/item/stack/cable_coil/CC = W
if(CC.get_amount() > 1)
CC.use(2)
@@ -740,7 +740,7 @@
return
else if(istype(W, /obj/item/stock_parts/cell))
if(state==4)
if(state == MECHA_BATTERY_UNSCREW)
if(!cell)
if(!user.drop_item())
return
@@ -819,16 +819,16 @@
/obj/mecha/crowbar_act(mob/user, obj/item/I)
if(state != 2 && state != 3 && !(state == 4 && pilot_is_mmi()))
if(state != MECHA_BOLTS_UP && state != MECHA_OPEN_HATCH && !(state == MECHA_BATTERY_UNSCREW && pilot_is_mmi()))
return
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(state == 2)
state = 3
if(state == MECHA_BOLTS_UP)
state = MECHA_OPEN_HATCH
to_chat(user, "You open the hatch to the power unit")
else if(state == 3)
state = 2
else if(state == MECHA_OPEN_HATCH)
state = MECHA_BOLTS_UP
to_chat(user, "You close the hatch to the power unit")
else
// Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech
@@ -841,7 +841,7 @@
/obj/mecha/screwdriver_act(mob/user, obj/item/I)
if(user.a_intent == INTENT_HARM)
return
if(!(state==3 && cell) && !(state==4 && cell))
if(!(state == MECHA_OPEN_HATCH && cell) && !(state == MECHA_BATTERY_UNSCREW && cell))
return
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
@@ -849,27 +849,27 @@
if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
to_chat(user, "<span class='notice'>You repair the damaged temperature controller.</span>")
else if(state==3 && cell)
else if(state == MECHA_OPEN_HATCH && cell)
cell.forceMove(loc)
cell = null
state = 4
state = MECHA_BATTERY_UNSCREW
to_chat(user, "<span class='notice'>You unscrew and pry out the powercell.</span>")
log_message("Powercell removed")
else if(state==4 && cell)
state=3
else if(state == MECHA_BATTERY_UNSCREW && cell)
state = MECHA_OPEN_HATCH
to_chat(user, "<span class='notice'>You screw the cell in place.</span>")
/obj/mecha/wrench_act(mob/user, obj/item/I)
if(state != 1 && state != 2)
if(state != MECHA_MAINT_ON && state != MECHA_BOLTS_UP)
return
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(state==1)
state = 2
if(state == MECHA_MAINT_ON)
state = MECHA_BOLTS_UP
to_chat(user, "You undo the securing bolts.")
else
state = 1
state = MECHA_MAINT_ON
to_chat(user, "You tighten the securing bolts.")
/obj/mecha/welder_act(mob/user, obj/item/I)
@@ -884,7 +884,7 @@
if(repairing)
to_chat(user, "<span class='notice'>[src] is currently being repaired!</span>")
return
if(state == 0) // If maint protocols are not active, the state is zero
if(state == MECHA_MAINT_OFF) // If maint protocols are not active, the state is zero
to_chat(user, "<span class='warning'>[src] can not be repaired without maintenance protocols active!</span>")
return
WELDER_ATTEMPT_REPAIR_MESSAGE
@@ -902,7 +902,7 @@
/obj/mecha/mech_melee_attack(obj/mecha/M)
if(!has_charge(melee_energy_drain))
return 0
return FALSE
use_power(melee_energy_drain)
if(M.damtype == BRUTE || M.damtype == BURN)
add_attack_logs(M.occupant, src, "Mecha-attacked with [M] ([uppertext(M.occupant.a_intent)]) ([uppertext(M.damtype)])")
@@ -1068,11 +1068,11 @@
/obj/mecha/proc/connect(obj/machinery/atmospherics/unary/portables_connector/new_port)
//Make sure not already connected to something else
if(connected_port || !istype(new_port) || new_port.connected_device)
return 0
return FALSE
//Make sure are close enough for a valid connection
if(new_port.loc != loc)
return 0
return FALSE
//Perform the connection
connected_port = new_port
@@ -1088,14 +1088,14 @@
/obj/mecha/proc/disconnect()
if(!connected_port)
return 0
return FALSE
connected_port.connected_device = null
connected_port = null
log_message("Disconnected from gas port.")
if(occupant)
occupant.clear_alert("mechaport_d")
return 1
return TRUE
/obj/mecha/portableConnectorReturnAir()
return internal_tank.return_air()
@@ -1137,9 +1137,9 @@
if(dna)
if(ishuman(user))
if(user.dna.unique_enzymes == dna)
passed = 1
passed = TRUE
else if(operation_allowed(user))
passed = 1
passed = TRUE
if(!passed)
to_chat(user, "<span class='warning'>Access denied.</span>")
log_append_to_last("Permission denied.")
@@ -1213,7 +1213,7 @@
to_chat(user, "<span class='warning'>Access denied. [name] is secured with an ID lock.</span>")
return FALSE
if(do_after(user, 40, target = src))
if(do_after(user, 4 SECONDS, target = src))
if(!occupant)
return mmi_moved_inside(mmi_as_oc,user)
else
@@ -1261,8 +1261,8 @@
var/mob/living/brain/brain = occupant
mob_container = brain.container
if(istype(mob_container, /obj/item/mmi))
return 1
return 0
return TRUE
return FALSE
/obj/mecha/proc/pilot_mmi_hud(mob/living/brain/pilot)
return
@@ -1349,34 +1349,34 @@
return 0
for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt, H.wear_pda))
if(check_access(ID, operation_req_access))
return 1
return 0
return TRUE
return FALSE
/obj/mecha/proc/internals_access_allowed(mob/living/carbon/human/H)
for(var/atom/ID in list(H.get_active_hand(), H.wear_id, H.belt, H.wear_pda))
if(check_access(ID, internals_req_access))
return 1
return 0
return TRUE
return FALSE
/obj/mecha/check_access(obj/item/card/id/I, list/access_list)
if(!istype(access_list))
return 1
return TRUE
if(!length(access_list)) //no requirements
return 1
return TRUE
I = I?.GetID()
if(!istype(I) || !I.access) //not ID or no access
return 0
return FALSE
if(access_list==operation_req_access)
for(var/req in access_list)
if(!(req in I.access)) //doesn't have this access
return 0
return FALSE
else if(access_list==internals_req_access)
for(var/req in access_list)
if(req in I.access)
return 1
return 1
return TRUE
return TRUE
///////////////////////
///// MARK: Power stuff
@@ -1398,16 +1398,16 @@
cell.use(amount)
if(occupant)
update_cell()
return 1
return 0
return TRUE
return FALSE
/obj/mecha/proc/give_power(amount)
if(!isnull(get_charge()))
cell.give(amount)
if(occupant)
update_cell()
return 1
return 0
return TRUE
return FALSE
/obj/mecha/proc/update_cell()
if(cell)

View File

@@ -327,19 +327,19 @@
if(!in_range(src, usr)) return
var/mob/user = afilter.getMob("user")
if(user)
if(state==0)
state = 1
if(state == MECHA_MAINT_OFF)
state = MECHA_MAINT_ON
to_chat(user, "The securing bolts are now exposed.")
if(occupant)
occupant.throw_alert("locked", /atom/movable/screen/alert/mech_maintenance)
else if(state==1)
state = 0
else if(state == MECHA_MAINT_ON)
state = MECHA_MAINT_OFF
to_chat(user, "The securing bolts are now hidden.")
if(occupant)
occupant.clear_alert("locked")
output_maintenance_dialog(afilter.getObj("id_card"),user)
return
if(href_list["set_internal_tank_valve"] && state >=1)
if(href_list["set_internal_tank_valve"] && state >= MECHA_MAINT_ON)
if(!in_range(src, usr)) return
var/mob/user = afilter.getMob("user")
if(user)

View File

@@ -1,5 +1,5 @@
/obj/mecha/medical/odysseus
desc = "These exosuits are developed and produced by Vey-Med. (&copy; All rights reserved)."
desc = "These exosuits are developed and produced by DeForest Medical Corporation, for rescue operations."
name = "Odysseus"
icon_state = "odysseus"
initial_icon = "odysseus"
@@ -44,3 +44,12 @@
builtin_hud_user = 0
. = ..()
/obj/mecha/medical/odysseus/examine_more(mob/user)
. = ..()
. += "<i>The Odysseus is a relatively fast, lightweight, and easy-to-maintain exosuit developed by DeForest Medical Corporation. \
Initially designed for patient rescue and care within hostile environments, it has seen semi-widespread use throughout the sector, usually by larger corporations and military groups who value its ability to get in and out of even the most rugged disaster zones.</i>"
. += ""
. += "<i>DeForest has seen modest success from the Odysseus, with only minor complaints arising from its sluggish pace and lack of armor or defensive capabilities. \
Despite these flaws, it has found a home amid Nanotrasen medical teams, where Paramedics find solid uses for it and its varied equipment loadout. \
As with all station-side mechs, Nanotrasen has purchased the license to produce the Odysseus in their facilities.</i>"

View File

@@ -120,6 +120,16 @@
else if(drake_hides == DRAKE_HIDES_COVERED_SLIGHT)
. += occupant ? "ripley-d" : "ripley-d-open"
/obj/mecha/working/ripley/examine_more(mob/user)
. = ..()
. += "<i>The Ripley is a robust, venerable utility exosuit originally produced by Hephaestus Industries. \
It now sees widespread use in and around the Orion sector, being one of the most pervasive mechs ever produced. \
Shortly after initial production, Hephaestus licensed production rights for the Ripley to other corporations, earning royalties as the exosuit grew more popular.</i>"
. += ""
. += "<i>Depending on the configuration, the Ripley can be used for many purposes, including mining, construction, and even goods transport. \
To this day, it remains one of the most valuable mechs ever produced, and Hephaestus enjoys a substantial profit from sales of this aging but rugged design. \
As with all station-side mechs, Nanotrasen has purchased the license to make the Ripley in their facilities.</i>"
/obj/mecha/working/ripley/firefighter
desc = "A standard APLU chassis that was refitted with additional thermal protection and a cistern."
name = "APLU \"Firefighter\""
@@ -133,6 +143,15 @@
max_equip = 5 // More armor, less tools
wreckage = /obj/structure/mecha_wreckage/ripley/firefighter
/obj/mecha/working/ripley/firefighter/examine_more(mob/user)
..()
. = list()
. += "<i>Based on the venerable Ripley chassis, designed initially by Hephaestus Industries, the Firefighter is a retrofit created by Nanotrasen as their mining operations expanded, and a robust, fireproof exosuit was needed. \
Adapted to fit heat-resistant shielding, the Firefighter became a popular mech for mining teams in dangerous environments.</i>"
. += ""
. += "<i>Since Nanotrasen's expansion into Epsilon Eridani and their mining operations on Lavaland, the Firefighter has grown more popular among seasoned miners looking for a safer, armored way to mine in even the hottest of biomes. \
Additionally, it has seen some use among atmospherics crews and is admired for its ability to control even the toughest of plasmafires while protecting its pilot.</i>"
/obj/mecha/working/ripley/deathripley
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
name = "DEATH-RIPLEY"
@@ -155,6 +174,16 @@
ME.attach(src)
return
/obj/mecha/working/ripley/deathripley/examine_more(mob/user)
..()
. = list()
. += "<i>A functioning, well-made collectable for the popular Nanotrasen-Funded holovid show, 'Deathsquad'. \
A retrofitted and repainted Ripley chassis, the Death Ripley was created and used by the leader of the Deathsquad, Master Sergeant Killjoy, during the climactic battle with the Spider Queen “Xerxes” at the end of Season 4. \
The mech bears the signature mark of the team's engineer, Corporal Ironhead, who assisted Killjoy in its construction.</i>"
. += ""
. += "<i>Replicas such as this are sought-after collectibles among the biggest fans of Deathsquad. \
An altercation even occurred where an individual dressed in a poorly-made Killjoy costume attempted to kill a collector to gain a Death Ripley, who was later sent to a mental institution after screaming, “THE DEATHSQUAD IS REAL.</i>"
/obj/mecha/working/ripley/mining
desc = "An old, dusty mining ripley."
name = "APLU \"Miner\""

View File

@@ -177,7 +177,7 @@
var/metal = MFOAM_ALUMINUM
/obj/structure/foamedmetal/Initialize()
..()
. = ..()
air_update_turf(1)
/obj/structure/foamedmetal/Destroy()

View File

@@ -253,8 +253,8 @@
blocks_emissive = FALSE
/obj/item/flashlight/flare/glowstick/Initialize()
. = ..()
light_color = color
..()
/obj/item/flashlight/flare/glowstick/update_icon_state()
if(!fuel)

View File

@@ -26,8 +26,8 @@
..()
internal_channels.Cut()
/obj/item/radio/headset/Initialize()
..()
/obj/item/radio/headset/Initialize(mapload)
. = ..()
if(ks1type)
keyslot1 = new ks1type(src)

View File

@@ -174,6 +174,11 @@
else
return ..()
/obj/item/radio/intercom/AltClick(mob/user)
. = ..()
if(broadcasting)
investigate_log("had its hotmic toggled on via hotkey by [key_name(user)].", INVESTIGATE_HOTMIC) ///Allows us to track who spams all these on if they do.
/obj/item/radio/intercom/crowbar_act(mob/user, obj/item/I)
if(buildstage != 1)
return
@@ -245,7 +250,7 @@
underlays += emissive_appearance(icon, "intercom_lightmask")
/obj/item/radio/intercom/proc/update_operating_status(on = TRUE)
if(!loc) // We init a few radios in nullspace to prevent them from needing power.
if(!loc) // We init a few radios in nullspace to prevent them from needing power.
return
var/area/current_area = get_area(src)
if(on)

View File

@@ -107,9 +107,8 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
follow_target = null
return ..()
/obj/item/radio/Initialize()
..()
/obj/item/radio/Initialize(mapload)
. = ..()
if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ)
frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
set_frequency(frequency)
@@ -131,6 +130,14 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
return
ui_interact(user)
/obj/item/radio/AltClick(mob/user)
if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !istype(user))
return
ToggleBroadcast()
to_chat(user, "<span class='notice'>You <b>[broadcasting ? "enable" : "disable"]</b> [src]'s hotmic!</span>")
add_fingerprint(user)
/obj/item/radio/ui_state(mob/user)
return GLOB.default_state
@@ -252,6 +259,8 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
/obj/item/radio/proc/ToggleBroadcast()
broadcasting = !broadcasting && !(wires.is_cut(WIRE_RADIO_TRANSMIT) || wires.is_cut(WIRE_RADIO_SIGNAL))
if(broadcasting)
playsound(src, 'sound/items/radio_common.ogg', rand(4, 16) * 5, SOUND_RANGE_SET(3))
/obj/item/radio/proc/ToggleReception()
listening = !listening && !(wires.is_cut(WIRE_RADIO_RECEIVER) || wires.is_cut(WIRE_RADIO_SIGNAL))
@@ -534,6 +543,7 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems)
/obj/item/radio/examine(mob/user)
. = ..()
. += "<span class='notice'><b>Alt-Click</b> to toggle [src]'s hotmic!</span>"
if(in_range(src, user) || loc == user)
if(b_stat)
. += "<span class='notice'>\the [src] can be attached and modified!</span>"

View File

@@ -208,10 +208,10 @@ SLIME SCANNER
continue
msgs += "<span class='notice'><font color='red'><b>Warning: [D.form] detected</b>\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</font></span>"
if(H.undergoing_cardiac_arrest())
var/obj/item/organ/internal/heart/heart = H.get_int_organ(/obj/item/organ/internal/heart)
if(heart && !(heart.status & ORGAN_DEAD))
var/datum/organ/heart/heart = H.get_int_organ_datum(ORGAN_DATUM_HEART)
if(heart && !(heart.linked_organ.status & ORGAN_DEAD))
msgs += "<span class='notice'><font color='red'><b>The patient's heart has stopped.</b>\nPossible Cure: Electric Shock</font>"
else if(heart && (heart.status & ORGAN_DEAD))
else if(heart && (heart.linked_organ.status & ORGAN_DEAD))
msgs += "<span class='notice'><font color='red'><b>Subject's heart is necrotic.</b></font>"
else if(!heart)
msgs += "<span class='notice'><font color='red'><b>Subject has no heart.</b></font>"

View File

@@ -18,7 +18,7 @@
if(R.getBruteLoss() || R.getFireLoss())
R.heal_overall_damage(15, 15)
use(1)
user.visible_message("<span class='notice'>\The [user] applied some [src] at [R]'s damaged areas.</span>",\
user.visible_message("<span class='notice'>[user] applies some [src] at [R]'s damaged areas.</span>",\
"<span class='notice'>You apply some [src] at [R]'s damaged areas.</span>")
else
to_chat(user, "<span class='notice'>All [R]'s systems are nominal.</span>")
@@ -32,6 +32,28 @@
else
to_chat(user, "<span class='notice'>[src] won't work on that.</span>")
/obj/item/stack/nanopaste/afterattack(atom/A, mob/user, proximity_flag)
if(!ismecha(A) || user.a_intent == INTENT_HARM || !proximity_flag)
return
var/obj/mecha/mecha = A
if((mecha.obj_integrity >= mecha.max_integrity) && !mecha.internal_damage)
to_chat(user, "<span class='notice'>[mecha] is at full integrity!</span>")
return
if(mecha.state == MECHA_MAINT_OFF)
to_chat(user, "<span class='warning'>[mecha] cannot be repaired without maintenance protocols active!</span>")
return
if(mecha.repairing)
to_chat(user, "<span class='notice'>[mecha] is currently being repaired!</span>")
return
if(mecha.internal_damage & MECHA_INT_TANK_BREACH)
mecha.clearInternalDamage(MECHA_INT_TANK_BREACH)
user.visible_message("<span class='notice'>[user] repairs the damaged air tank.</span>", "<span class='notice'>You repair the damaged air tank.</span>")
else if(mecha.obj_integrity < mecha.max_integrity)
mecha.obj_integrity += min(20, mecha.max_integrity - mecha.obj_integrity)
use(1)
user.visible_message("<span class='notice'>[user] applies some [src] to [mecha]'s damaged areas.</span>",\
"<span class='notice'>You apply some [src] to [mecha]'s damaged areas.</span>")
/obj/item/stack/nanopaste/proc/robotic_limb_repair(mob/user, obj/item/organ/external/external_limb, mob/living/carbon/human/H)
if(!external_limb.get_damage())
to_chat(user, "<span class='notice'>Nothing to fix here.</span>")

View File

@@ -35,7 +35,7 @@
var/progress_flash_divisor = 10 //Length of time between each "eye flash"
/obj/item/weldingtool/Initialize(mapload)
..()
. = ..()
create_reagents(maximum_fuel)
reagents.add_reagent("fuel", maximum_fuel)
update_icon()
@@ -149,7 +149,7 @@
/obj/item/weldingtool/attack(mob/living/carbon/M, mob/living/carbon/user)
// For lighting other people's cigarettes.
var/obj/item/clothing/mask/cigarette/cig = M?.wear_mask
if(!istype(cig) || user.zone_selected != "mouth" || !tool_enabled)
if(!istype(cig) || user.zone_selected != "mouth" || !tool_enabled)
return ..()
if(M == user)

View File

@@ -38,8 +38,9 @@
icon_state = "twimsts"
/obj/item/trash/popcorn
name = "Popcorn"
name = "popcorn"
icon_state = "popcorn"
gender = PLURAL
/obj/item/trash/sosjerky
name = "Scaredy's Private Reserve Beef Jerky"

View File

@@ -204,6 +204,13 @@
for(var/obj/structure/grille/grill_to_destroy in act_on)
qdel(grill_to_destroy)
/datum/rcd_act/remove_user
mode = MODE_DECON
cost = 5
start_message = "Deconstructing user..."
delay = 5 SECONDS
start_effect_type = /obj/effect/temp_visual/rcd_effect/reverse
/obj/item/rcd
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build and deconstruct walls, floors and airlocks."
@@ -243,6 +250,7 @@
var/door_name = "Airlock"
/// If the glass airlock is polarized.
var/electrochromic = FALSE
/// If the airlock will be created with glass so it can be seen through.
var/airlock_glass = FALSE
/// If this is TRUE, any airlocks that gets built will require only ONE of the checked accesses. If FALSE, it will require ALL of them.
var/one_access = TRUE
@@ -331,6 +339,32 @@
GLOB.rcd_list -= src
return ..()
/obj/item/rcd/suicide_act(mob/living/user)
user.Immobilize(10 SECONDS) // You cannot move.
flags |= NODROP // You cannot drop. You commit to die.
var/turf/suicide_tile = get_turf(src)
if(mode == MODE_DECON)
user.visible_message("<span class='suicide'>[user] points [src] at [user.p_their()] chest and pulls the trigger. It looks like [user.p_theyre()] trying to commit suicide!</span>")
var/datum/rcd_act/remove_user/act = new()
if(!act.try_act(suicide_tile, src, user))
flags &= ~NODROP
return SHAME
user.visible_message("<span class='suicide'>[user] deconstructs [user.p_themselves()] with [src]!</span>")
for(var/obj/item/W in user) // Do not delete all their stuff.
user.unEquip(W) // Dump everything on the floor instead.
flags &= ~NODROP // NODROP must be removed so the RCD doesn't get dusted along with them. Having this come after the unequipping puts the RCD on top of the pile of stuff.
user.dust() // (held items fall to the floor when dusting).
return OBLITERATION
user.visible_message("<span class='suicide'>[user] puts the barrel of [src] into [user.p_their()] mouth and pulls the trigger. It looks like [user.p_theyre()] trying to commit suicide!</span>")
if(!afterattack(suicide_tile, user, TRUE))
flags &= ~NODROP
return SHAME
user.visible_message("<span class='suicide'>[user] explodes as [src] builds a structure inside [user.p_them()]!</span>")
flags &= ~NODROP
user.gib()
return OBLITERATION
/**
* Creates and returns a base64 icon of the given `airlock_type`.
*

View File

@@ -19,7 +19,7 @@
SEND_SIGNAL(imp_in, COMSIG_LIVING_CLEAR_STUNS)
imp_in.reagents.add_reagent("synaptizine", 10)
imp_in.reagents.add_reagent("omnizine", 10)
imp_in.reagents.add_reagent("omnizine_no_addiction", 10)
imp_in.reagents.add_reagent("stimulative_agent", 10)
if(!uses)
qdel(src)

View File

@@ -1034,7 +1034,7 @@
name = "Free Golem ID"
desc = "A card used to claim mining points and buy gear. Use it to mark it as yours."
icon_state = "research"
access = list(ACCESS_FREE_GOLEMS, ACCESS_ROBOTICS, ACCESS_CLOWN, ACCESS_MIME) //access to robots/mechs
access = list(ACCESS_FREE_GOLEMS, ACCESS_ROBOTICS, ACCESS_CLOWN, ACCESS_MIME, ACCESS_XENOBIOLOGY) //access to robots/mechs
var/registered = FALSE
/obj/item/card/id/golem/attack_self(mob/user as mob)

View File

@@ -1,3 +1,5 @@
#define REAGENT_TIME_RATIO 2.5
/*
CONTAINS:
CIGARETTES
@@ -502,7 +504,7 @@ LIGHTERS ARE IN LIGHTERS.DM
return
smoke()
/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user) //Refills the pipe. Can be changed to an attackby later, if loose tobacco is added to vendors or something.
/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user) // Extinguishes the pipe.
if(lit)
user.visible_message("<span class='notice'>[user] puts out [src].</span>")
lit = FALSE
@@ -510,17 +512,27 @@ LIGHTERS ARE IN LIGHTERS.DM
item_state = icon_off
STOP_PROCESSING(SSobj, src)
return
if(smoketime <= 0)
to_chat(user, "<span class='notice'>You refill the pipe with tobacco.</span>")
reagents.add_reagent("nicotine", chem_volume)
smoketime = initial(smoketime)
first_puff = TRUE
/obj/item/clothing/mask/cigarette/pipe/try_light(obj/item/cigar, obj/item/lighting_item)
if(can_light_fancy(lighting_item))
return ..()
// Refill or light the pipe
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/food/snacks/grown))
var/obj/item/food/snacks/grown/O = I
if(O.dry)
if(reagents.total_volume == reagents.maximum_volume)
to_chat(user, "<span class='warning'>[src] is full!</span>")
return
O.reagents.trans_to(src, chem_volume)
to_chat(user, "<span class='notice'>You stuff the [O.name] into the pipe.</span>")
smoketime = max(reagents.total_volume * REAGENT_TIME_RATIO, smoketime)
qdel(O)
else
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
return
if(!is_type_in_typecache(I, things_that_light))
return
if(can_light_fancy(I))
@@ -535,8 +547,9 @@ LIGHTERS ARE IN LIGHTERS.DM
item_state = "cobpipeoff"
icon_on = "cobpipeon" //Note - these are in masks.dmi
icon_off = "cobpipeoff"
smoketime = 800
chem_volume = 40
smoketime = 0 //there is nothing to smoke initially
chem_volume = 160
list_reagents = list()
///////////
//ROLLING//
@@ -569,3 +582,5 @@ LIGHTERS ARE IN LIGHTERS.DM
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
else
..()
#undef REAGENT_TIME_RATIO

View File

@@ -20,8 +20,13 @@
var/value = 0
var/forcedmutation = FALSE //Will it give the mutation, guaranteed?
/obj/item/dnainjector/Initialize()
/obj/item/dnainjector/Initialize(mapload)
. = ..()
var/init_block = GetInitBlock()
if(init_block)
block = init_block
if(datatype && block)
buf = new
buf.dna = new
@@ -29,6 +34,10 @@
buf.dna.ResetSE()
SetValue(value)
// Override this with a var reference to do setup
/obj/item/dnainjector/proc/GetInitBlock()
return null
/obj/item/dnainjector/Destroy()
QDEL_NULL(buf)
return ..()
@@ -157,9 +166,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/hulkmut/Initialize()
block = GLOB.hulkblock
..()
/obj/item/dnainjector/hulkmut/GetInitBlock()
return GLOB.hulkblock
/obj/item/dnainjector/antihulk
name = "DNA-Injector (Anti-Hulk)"
@@ -168,9 +176,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antihulk/Initialize()
block = GLOB.hulkblock
..()
/obj/item/dnainjector/antihulk/GetInitBlock()
return GLOB.hulkblock
/obj/item/dnainjector/firemut
name = "DNA-Injector (Fire)"
@@ -179,9 +186,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/firemut/Initialize()
block = GLOB.fireblock
..()
/obj/item/dnainjector/firemut/GetInitBlock()
return GLOB.fireblock
/obj/item/dnainjector/antifire
name = "DNA-Injector (Anti-Fire)"
@@ -190,9 +196,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antifire/Initialize()
block = GLOB.fireblock
..()
/obj/item/dnainjector/antifire/GetInitBlock()
return GLOB.fireblock
/obj/item/dnainjector/telemut
name = "DNA-Injector (Tele.)"
@@ -201,9 +206,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/telemut/Initialize()
block = GLOB.teleblock
..()
/obj/item/dnainjector/telemut/GetInitBlock()
return GLOB.teleblock
/obj/item/dnainjector/telemut/darkbundle
name = "DNA injector"
@@ -216,9 +220,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antitele/Initialize()
block = GLOB.teleblock
..()
/obj/item/dnainjector/antitele/GetInitBlock()
return GLOB.teleblock
/obj/item/dnainjector/nobreath
name = "DNA-Injector (Breathless)"
@@ -227,9 +230,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/nobreath/Initialize()
block = GLOB.breathlessblock
..()
/obj/item/dnainjector/nobreath/GetInitBlock()
return GLOB.breathlessblock
/obj/item/dnainjector/antinobreath
name = "DNA-Injector (Anti-Breathless)"
@@ -238,9 +240,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antinobreath/Initialize()
block = GLOB.breathlessblock
..()
/obj/item/dnainjector/antinobreath/GetInitBlock()
return GLOB.breathlessblock
/obj/item/dnainjector/remoteview
name = "DNA-Injector (Remote View)"
@@ -249,9 +250,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/remoteview/Initialize()
block = GLOB.remoteviewblock
..()
/obj/item/dnainjector/remoteview/GetInitBlock()
return GLOB.remoteviewblock
/obj/item/dnainjector/antiremoteview
name = "DNA-Injector (Anti-Remote View)"
@@ -260,9 +260,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antiremoteview/Initialize()
block = GLOB.remoteviewblock
..()
/obj/item/dnainjector/antiremoteview/GetInitBlock()
return GLOB.remoteviewblock
/obj/item/dnainjector/regenerate
name = "DNA-Injector (Regeneration)"
@@ -271,9 +270,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/regenerate/Initialize()
block = GLOB.regenerateblock
..()
/obj/item/dnainjector/regenerate/GetInitBlock()
return GLOB.regenerateblock
/obj/item/dnainjector/antiregenerate
name = "DNA-Injector (Anti-Regeneration)"
@@ -282,9 +280,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antiregenerate/Initialize()
block = GLOB.regenerateblock
..()
/obj/item/dnainjector/antiregenerate/GetInitBlock()
return GLOB.regenerateblock
/obj/item/dnainjector/morph
name = "DNA-Injector (Morph)"
@@ -293,9 +290,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/morph/Initialize()
block = GLOB.morphblock
..()
/obj/item/dnainjector/morph/GetInitBlock()
return GLOB.morphblock
/obj/item/dnainjector/antimorph
name = "DNA-Injector (Anti-Morph)"
@@ -304,9 +300,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antimorph/Initialize()
block = GLOB.morphblock
..()
/obj/item/dnainjector/antimorph/GetInitBlock()
return GLOB.morphblock
/obj/item/dnainjector/noprints
name = "DNA-Injector (No Prints)"
@@ -315,9 +310,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/noprints/Initialize()
block = GLOB.noprintsblock
..()
/obj/item/dnainjector/noprints/GetInitBlock()
return GLOB.noprintsblock
/obj/item/dnainjector/antinoprints
name = "DNA-Injector (Anti-No Prints)"
@@ -326,9 +320,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antinoprints/Initialize()
block = GLOB.noprintsblock
..()
/obj/item/dnainjector/antinoprints/GetInitBlock()
return GLOB.noprintsblock
/obj/item/dnainjector/insulation
name = "DNA-Injector (Shock Immunity)"
@@ -337,9 +330,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/insulation/Initialize()
block = GLOB.shockimmunityblock
..()
/obj/item/dnainjector/insulation/GetInitBlock()
return GLOB.shockimmunityblock
/obj/item/dnainjector/antiinsulation
name = "DNA-Injector (Anti-Shock Immunity)"
@@ -348,9 +340,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antiinsulation/Initialize()
block = GLOB.shockimmunityblock
..()
/obj/item/dnainjector/antiinsulation/GetInitBlock()
return GLOB.shockimmunityblock
/obj/item/dnainjector/midgit
name = "DNA-Injector (Small Size)"
@@ -359,9 +350,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/midgit/Initialize()
block = GLOB.smallsizeblock
..()
/obj/item/dnainjector/midgit/GetInitBlock()
return GLOB.smallsizeblock
/obj/item/dnainjector/antimidgit
name = "DNA-Injector (Anti-Small Size)"
@@ -370,9 +360,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antimidgit/Initialize()
block = GLOB.smallsizeblock
..()
/obj/item/dnainjector/antimidgit/GetInitBlock()
return GLOB.smallsizeblock
/obj/item/dnainjector/eatmut
name = "DNA-Injector (Matter Eater)"
@@ -381,9 +370,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/eatmut/Initialize()
block = GLOB.eatblock
return ..()
/obj/item/dnainjector/eatmut/GetInitBlock()
return GLOB.eatblock
/obj/item/dnainjector/antieat
name = "DNA-Injector (Anti-Matter Eater)"
@@ -392,9 +380,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antieat/Initialize()
block = GLOB.eatblock
return ..()
/obj/item/dnainjector/antieat/GetInitBlock()
return GLOB.eatblock
/////////////////////////////////////
/obj/item/dnainjector/antiglasses
@@ -404,9 +391,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antiglasses/Initialize()
block = GLOB.glassesblock
..()
/obj/item/dnainjector/antiglasses/GetInitBlock()
return GLOB.glassesblock
/obj/item/dnainjector/glassesmut
name = "DNA-Injector (Glasses)"
@@ -415,9 +401,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/glassesmut/Initialize()
block = GLOB.glassesblock
..()
/obj/item/dnainjector/glassesmut/GetInitBlock()
return GLOB.glassesblock
/obj/item/dnainjector/epimut
name = "DNA-Injector (Epi.)"
@@ -426,9 +411,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/epimut/Initialize()
block = GLOB.epilepsyblock
..()
/obj/item/dnainjector/epimut/GetInitBlock()
return GLOB.epilepsyblock
/obj/item/dnainjector/antiepi
name = "DNA-Injector (Anti-Epi.)"
@@ -437,9 +421,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antiepi/Initialize()
block = GLOB.epilepsyblock
..()
/obj/item/dnainjector/antiepi/GetInitBlock()
return GLOB.epilepsyblock
/obj/item/dnainjector/anticough
name = "DNA-Injector (Anti-Cough)"
@@ -448,9 +431,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/anticough/Initialize()
block = GLOB.coughblock
..()
/obj/item/dnainjector/anticough/GetInitBlock()
return GLOB.coughblock
/obj/item/dnainjector/coughmut
name = "DNA-Injector (Cough)"
@@ -459,9 +441,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/coughmut/Initialize()
block = GLOB.coughblock
..()
/obj/item/dnainjector/coughmut/GetInitBlock()
return GLOB.coughblock
/obj/item/dnainjector/clumsymut
name = "DNA-Injector (Clumsy)"
@@ -470,9 +451,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/clumsymut/Initialize()
block = GLOB.clumsyblock
..()
/obj/item/dnainjector/clumsymut/GetInitBlock()
return GLOB.clumsyblock
/obj/item/dnainjector/anticlumsy
name = "DNA-Injector (Anti-Clumy)"
@@ -481,9 +461,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/anticlumsy/Initialize()
block = GLOB.clumsyblock
..()
/obj/item/dnainjector/anticlumsy/GetInitBlock()
return GLOB.clumsyblock
/obj/item/dnainjector/antitour
name = "DNA-Injector (Anti-Tour.)"
@@ -492,9 +471,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antitour/Initialize()
block = GLOB.twitchblock
..()
/obj/item/dnainjector/antitour/GetInitBlock()
return GLOB.twitchblock
/obj/item/dnainjector/tourmut
name = "DNA-Injector (Tour.)"
@@ -503,9 +481,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/tourmut/Initialize()
block = GLOB.twitchblock
..()
/obj/item/dnainjector/tourmut/GetInitBlock()
return GLOB.twitchblock
/obj/item/dnainjector/stuttmut
name = "DNA-Injector (Stutt.)"
@@ -514,9 +491,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/stuttmut/Initialize()
block = GLOB.nervousblock
..()
/obj/item/dnainjector/stuttmut/GetInitBlock()
return GLOB.nervousblock
/obj/item/dnainjector/antistutt
@@ -526,9 +502,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antistutt/Initialize()
block = GLOB.nervousblock
..()
/obj/item/dnainjector/antistutt/GetInitBlock()
return GLOB.nervousblock
/obj/item/dnainjector/blindmut
name = "DNA-Injector (Blind)"
@@ -537,9 +512,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/blindmut/Initialize()
block = GLOB.blindblock
..()
/obj/item/dnainjector/blindmut/GetInitBlock()
return GLOB.blindblock
/obj/item/dnainjector/antiblind
name = "DNA-Injector (Anti-Blind)"
@@ -548,9 +522,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antiblind/Initialize()
block = GLOB.blindblock
..()
/obj/item/dnainjector/antiblind/GetInitBlock()
return GLOB.blindblock
/obj/item/dnainjector/deafmut
name = "DNA-Injector (Deaf)"
@@ -559,9 +532,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/deafmut/Initialize()
block = GLOB.deafblock
..()
/obj/item/dnainjector/deafmut/GetInitBlock()
return GLOB.deafblock
/obj/item/dnainjector/antideaf
name = "DNA-Injector (Anti-Deaf)"
@@ -570,9 +542,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antideaf/Initialize()
block = GLOB.deafblock
..()
/obj/item/dnainjector/antideaf/GetInitBlock()
return GLOB.deafblock
/obj/item/dnainjector/hallucination
name = "DNA-Injector (Halluctination)"
@@ -581,9 +552,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/hallucination/Initialize()
block = GLOB.hallucinationblock
..()
/obj/item/dnainjector/hallucination/GetInitBlock()
return GLOB.hallucinationblock
/obj/item/dnainjector/antihallucination
name = "DNA-Injector (Anti-Hallucination)"
@@ -592,9 +562,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/antihallucination/Initialize()
block = GLOB.hallucinationblock
..()
/obj/item/dnainjector/antihallucination/GetInitBlock()
return GLOB.hallucinationblock
/obj/item/dnainjector/h2m
name = "DNA-Injector (Human > Monkey)"
@@ -603,9 +572,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/h2m/Initialize()
block = GLOB.monkeyblock
..()
/obj/item/dnainjector/h2m/GetInitBlock()
return GLOB.monkeyblock
/obj/item/dnainjector/m2h
name = "DNA-Injector (Monkey > Human)"
@@ -614,9 +582,8 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/m2h/Initialize()
block = GLOB.monkeyblock
..()
/obj/item/dnainjector/m2h/GetInitBlock()
return GLOB.monkeyblock
/obj/item/dnainjector/comic
@@ -626,9 +593,8 @@
value = 0xFFF
forcedmutation = TRUE
/obj/item/dnainjector/comic/Initialize()
block = GLOB.comicblock
..()
/obj/item/dnainjector/comic/GetInitBlock()
return GLOB.comicblock
/obj/item/dnainjector/anticomic
name = "DNA-Injector (Ant-Comic)"
@@ -637,6 +603,5 @@
value = 0x001
forcedmutation = TRUE
/obj/item/dnainjector/anticomic/Initialize()
block = GLOB.comicblock
..()
/obj/item/dnainjector/anticomic/GetInitBlock()
return GLOB.comicblock

View File

@@ -199,12 +199,9 @@
orient2hud(user) // this only needs to happen to make .contents show properly as screen objects.
if(user.s_active)
user.s_active.hide_from(user) // If there's already an interface open, close it.
user.client.screen -= boxes
user.client.screen -= closer
user.client.screen -= contents
user.client.screen += boxes
user.client.screen += closer
user.client.screen += contents
user.client.screen |= boxes
user.client.screen |= closer
user.client.screen |= contents
user.s_active = src
LAZYDISTINCTADD(mobs_viewing, user)
@@ -245,6 +242,9 @@
update_viewers()
/obj/item/storage/proc/open(mob/user)
if(isobserver(user))
show_to(user)
return
if(use_sound && isliving(user))
playsound(loc, use_sound, 50, TRUE, -5)
@@ -459,6 +459,10 @@
if(user)
if(user.client && user.s_active != src)
user.client.screen -= I
if(length(user.observers))
for(var/mob/observer in user.observers)
if(observer.client && observer.s_active != src)
observer.client.screen -= I
I.dropped(user, TRUE)
add_fingerprint(user)

View File

@@ -565,7 +565,7 @@
origin_tech = "combat=4;bluespace=4;plasmatech=7"
/obj/item/singularityhammer/Initialize(mapload)
..()
. = ..()
AddComponent(/datum/component/two_handed, \
force_wielded = 40, \
force_unwielded = force, \
@@ -634,7 +634,7 @@
origin_tech = "combat=4;powerstorage=7"
/obj/item/mjollnir/Initialize(mapload)
..()
. = ..()
AddComponent(/datum/component/two_handed, \
force_wielded = 25, \
force_unwielded = force, \

View File

@@ -237,7 +237,7 @@
/obj/structure/flora/ausbushes/ppflowers/Initialize(mapload)
. = ..()
icon_state = "ppflowers_[rand(1, 4)]"
icon_state = "ppflowers_[rand(1, 3)]"
/obj/structure/flora/ausbushes/sparsegrass
icon_state = "sparsegrass_1"

View File

@@ -8,7 +8,7 @@
w_class = WEIGHT_CLASS_BULKY
/obj/item/mounted/noticeboard/do_build(turf/on_wall, mob/user)
new /obj/structure/noticeboard(get_turf(user), get_dir(on_wall, user), building = TRUE)
new /obj/structure/noticeboard(get_turf(user), get_dir(on_wall, user), TRUE)
qdel(src)
/obj/structure/noticeboard
@@ -21,21 +21,21 @@
max_integrity = 150
var/notices = 0
/obj/structure/noticeboard/New(turf/loc, direction, building = FALSE)
/obj/structure/noticeboard/Initialize(mapload, direction, building = FALSE)
. = ..()
if(building)
setDir(direction)
set_pixel_offsets_from_dir(-32, 32, -30, 30)
update_icon(UPDATE_ICON_STATE)
/obj/structure/noticeboard/Initialize()
. = ..()
for(var/obj/item/paper in loc)
if(notices >= MAX_NOTICES)
break
if(istype(paper, /obj/item/paper))
paper.loc = src
notices++
update_icon(UPDATE_ICON_STATE)
/obj/structure/noticeboard/update_icon_state()

View File

@@ -100,8 +100,8 @@
desc = "Heavy duty, airtight, plastic flaps."
/obj/structure/plasticflaps/mining/Initialize()
. = ..()
air_update_turf(TRUE)
..()
/obj/structure/plasticflaps/mining/Destroy()
var/turf/T = get_turf(src)

View File

@@ -192,8 +192,10 @@
return
if(!. && isliving(A))
sleep(2 DECISECONDS)
new /obj/effect/temp_visual/ratvar/floor(src)
addtimer(CALLBACK(src, PROC_REF(spawn_visual)), 0.2 SECONDS, TIMER_DELETE_ME)
/turf/simulated/floor/clockwork/proc/spawn_visual()
new /obj/effect/temp_visual/ratvar/floor(src)
/turf/simulated/floor/clockwork/Destroy()
if(uses_overlay && realappearence)

View File

@@ -246,8 +246,10 @@
return
if(!. && isliving(A))
sleep(2 DECISECONDS)
new /obj/effect/temp_visual/cult/turf/open/floor(src)
addtimer(CALLBACK(src, PROC_REF(spawn_visual)), 0.2 SECONDS, TIMER_DELETE_ME)
/turf/simulated/floor/engine/cult/proc/spawn_visual()
new /obj/effect/temp_visual/cult/turf/open/floor(src)
/turf/simulated/floor/engine/cult/narsie_act()
return

View File

@@ -581,27 +581,6 @@
/turf/AllowDrop()
return TRUE
/**
* Returns adjacent turfs to this turf that are reachable, in all cardinal directions
*
* Arguments:
* * caller: The movable, if one exists, being used for mobility checks to see what tiles it can reach
* * ID: An ID card that decides if we can gain access to doors that would otherwise block a turf
* * simulated_only: Do we only worry about turfs with simulated atmos, most notably things that aren't space?
* * no_id: When true, doors with public access will count as impassible
*/
/turf/proc/reachableAdjacentTurfs(caller, ID, simulated_only, no_id = FALSE)
var/static/space_type_cache = typecacheof(/turf/space)
. = list()
for(var/iter_dir in GLOB.cardinal)
var/turf/turf_to_check = get_step(src, iter_dir)
if(!turf_to_check || (simulated_only && space_type_cache[turf_to_check.type]))
continue
if(turf_to_check.density || LinkBlockedWithAccess(turf_to_check, caller, ID, no_id = no_id))
continue
. += turf_to_check
// Makes an image of up to 20 things on a turf + the turf
/turf/proc/photograph(limit = 20)
var/image/I = new()

View File

@@ -12,6 +12,8 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
/datum/admins/proc/announce, /*priority announce something to all clients.*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/admin_observe, /*allows us to freely observe mobs */
/client/proc/admin_observe_target, /*and gives it to us on right click*/
/client/proc/toggle_view_range, /*changes how far we can see*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
@@ -170,7 +172,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list(
/client/proc/force_verb_bypass,
/client/proc/show_gc_queues,
/client/proc/debug_global_variables,
/client/proc/profile_code
/client/proc/profile_code,
/client/proc/debug_atom_init
))
GLOBAL_LIST_INIT(admin_verbs_possess, list(
/proc/possess,
@@ -196,13 +199,17 @@ GLOBAL_LIST_INIT(admin_verbs_mod, list(
/client/proc/dsay,
/datum/admins/proc/show_player_panel,
/client/proc/ban_panel,
/client/proc/debug_variables /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
/client/proc/admin_observe,
/client/proc/admin_observe_target,
))
GLOBAL_LIST_INIT(admin_verbs_mentor, list(
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
/client/proc/openMentorTicketUI,
/client/proc/admin_observe, /* Allow mentors to observe as well, though they face some limitations */
/client/proc/admin_observe_target,
/client/proc/cmd_mentor_say /* mentor say*/
// cmd_mentor_say is added/removed by the toggle_mentor_chat verb
))
@@ -339,13 +346,22 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list(
to_chat(src, "<span class='interface'>All of your adminverbs are now visible.</span>")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Admin Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_ghost()
set category = "Admin"
set name = "Aghost"
/client/proc/mentor_ghost()
var/is_mentor = check_rights(R_MENTOR, FALSE)
var/is_full_admin = check_rights(R_ADMIN|R_MOD, FALSE)
if(!check_rights(R_ADMIN|R_MOD))
if(!is_mentor && !is_full_admin)
to_chat(src, "<span class='warning'>You aren't allowed to use this!</span>")
return
// mentors are allowed only if they have the observe trait, which is given on observe.
// they should also not be given this proc.
if(!is_full_admin && (is_mentor && !HAS_MIND_TRAIT(mob, TRAIT_MENTOR_OBSERVING) || !is_mentor))
return
do_aghost()
/client/proc/do_aghost()
if(isobserver(mob))
//re-enter
var/mob/dead/observer/ghost = mob
@@ -372,6 +388,134 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list(
// TODO: SStgui.on_transfer() to move windows from old and new
SSblackbox.record_feedback("tally", "admin_verb", 1, "Aghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_ghost()
set category = "Admin"
set name = "Aghost"
if(!check_rights(R_ADMIN|R_MOD))
return
do_aghost()
/// Allow an admin to observe someone.
/// mentors are allowed to use this verb while living, but with some stipulations:
/// if they attempt to do anything that would stop their orbit, they will immediately be returned to their body.
/client/proc/admin_observe()
set name = "Aobserve"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR))
return
if(isnewplayer(mob))
to_chat(src, "<span class='warning'>You cannot aobserve while in the lobby. Please join or observe first.</span>")
return
var/mob/target
target = tgui_input_list(mob, "Select a mob to observe", "Aobserve", GLOB.player_list)
if(isnull(target))
return
if(target == src)
to_chat(src, "<span class='warning'>You can't observe yourself!</span>")
return
if(isobserver(target))
to_chat(src, "<span class='warning'>[target] is a ghost, and cannot be observed.</span>")
return
if(isnewplayer(target))
to_chat(src, "<span class='warning'>[target] is in the lobby, and cannot be observed.</span>")
return
admin_observe_target(target)
/client/proc/cleanup_admin_observe(mob/dead/observer/ghost)
if(!istype(ghost) || !ghost.mob_observed)
return FALSE
// un-follow them
ghost.cleanup_observe()
// if it's a mentor, make sure they go back to their body.
if(HAS_TRAIT(mob.mind, TRAIT_MENTOR_OBSERVING))
// handler will handle removing the trait
mob.stop_orbit()
log_admin("[key_name(src)] has de-activated Aobserve")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Aobserve")
return TRUE
/// targeted form of admin_observe: this should only appear in the right-click menu.
/client/proc/admin_observe_target(mob/target as mob in GLOB.mob_list)
set name = "\[Admin\] Aobserve"
set category = null
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR, mob))
return
var/full_admin = check_rights(R_ADMIN|R_MOD, FALSE, mob)
if(isnewplayer(mob))
to_chat(src, "<span class='warning'>You cannot aobserve while in the lobby. Please join or observe first.</span>")
return
if(isnewplayer(target))
to_chat(src, "<span class='warning'>[target] is currently in the lobby.</span>")
return
if(isobserver(target))
to_chat(src, "<span class='warning'>You can't observe a ghost.</span>")
return
if(cleanup_admin_observe(mob))
return
if(isnull(target) || target == src)
// let the default one find the target if there isn't one
admin_observe()
return
// observers don't need to ghost, so we don't need to worry about adding any traits
if(isobserver(mob))
var/mob/dead/observer/ghost = mob
SSblackbox.record_feedback("tally", "admin_verb", 1, "Aobserve")
ghost.do_observe(target)
return
log_admin("[key_name(src)] has Aobserved out of their body to follow [target]")
do_aghost()
var/mob/dead/observer/ghost = mob
if(!full_admin)
// if they're a me and they're alive, add the MENTOR_OBSERVINGtrait to ensure that they can only go back to their body.
// we need to handle this here because when you aghost, your mob gets set to the ghost. Oops!
ADD_TRAIT(mob.mind, TRAIT_MENTOR_OBSERVING, MENTOR_OBSERVING)
RegisterSignal(ghost, COMSIG_ATOM_ORBITER_STOP, PROC_REF(on_mentor_observe_end), override = TRUE)
to_chat(src, "<span class='notice'>You have temporarily observed [target], either move or observe again to un-observe.</span>")
log_admin("[key_name(src)] has mobserved out of their body to follow [target].")
else
log_admin("[key_name(src)] is aobserving [target].")
ghost.do_observe(target)
/client/proc/on_mentor_observe_end(atom/movable/us, atom/movable/orbited)
SIGNAL_HANDLER // COMSIG_ATOM_ORBITER_STOP
if(!isobserver(mob))
log_and_message_admins("A mentor somehow managed to end observing while not being a ghost. Please investigate and notify coders.")
return
var/mob/dead/observer/ghost = mob
// just to be safe
ghost.cleanup_observe()
REMOVE_TRAIT(mob.mind, TRAIT_MENTOR_OBSERVING, MENTOR_OBSERVING)
UnregisterSignal(mob, COMSIG_ATOM_ORBITER_STOP)
if(!ghost.reenter_corpse())
// tell everyone since this is kinda nasty.
log_debug("Mentor [key_name_mentor(src)] was unable to re-enter their body after mentor observing.")
log_and_message_admins("[key_name_mentor(src)] was unable to re-enter their body after mentor observing.")
to_chat(src, "<span class='userdanger'>Unable to return you to your body after mentor ghosting. If your body still exists, please contact a coder, and you should probably ahelp.</span>")
/client/proc/invisimin()
set name = "Invisimin"
set category = "Admin"

View File

@@ -86,7 +86,8 @@
body += "<a href='byond://?src=[usr.UID()];priv_msg="+client_ckey+"'>PM</a> - "
body += "<a href='byond://?src=[UID()];subtlemessage="+mobUID+"'>SM</a> - "
body += "<a href='byond://?src=[UID()];adminplayerobservefollow="+mobUID+"'>FLW</a> - "
body += "<a href='byond://?src=[UID()];adminalert="+mobUID+"'>ALERT</a>"
body += "<a href='byond://?src=[UID()];adminalert="+mobUID+"'>ALERT</a> - "
body += "<a href='byond://?src=[UID()];adminobserve="+mobUID+"'>OBS</a>"
if(eyeUID)
body += "|<a href='byond://?src=[UID()];adminplayerobservefollow="+eyeUID+"'>EYE</a>"
body += "<br>"

View File

@@ -1613,6 +1613,17 @@
show_player_panel(H)
//H.regenerate_icons()
else if(href_list["adminobserve"])
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR))
return
var/client/C = usr.client
var/mob/M = locateUID(href_list["adminobserve"])
if(!ismob(M))
to_chat(usr, "<span class='warning'>This can only be used on instances of type /mob</span>")
return
C.admin_observe_target(M)
else if(href_list["adminplayeropts"])
var/mob/M = locateUID(href_list["adminplayeropts"])
@@ -3586,3 +3597,5 @@
var/mob/dead/observer/O = target
if(O.mind && O.mind.current)
. += "|[ADMIN_FLW(O.mind.current,"BDY")]"
else if(ismob(target))
. += "|[ADMIN_OBS(target, "OBS")]"

View File

@@ -86,28 +86,6 @@
if(alert("That player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]","Simultaneous PMs warning","Continue","Cancel") == "Cancel")
return*/
//get message text, limit it's length.and clean/escape html
if(!msg)
set_typing(C, TRUE)
msg = clean_input("Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]", null, src)
set_typing(C, FALSE)
if(!msg)
return
if(!C)
if(holder)
to_chat(src, "<span class='danger'>Error: Admin-PM: Client not found.</span>")
else
adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
return
if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN))
return
// Let high-rank admins use advanced pencode.
if(check_rights(R_SERVER|R_DEBUG, 0))
msg = admin_pencode_to_html(msg)
var/send_span
var/receive_span
var/send_pm_type = " "
@@ -127,6 +105,41 @@
message_type = MESSAGE_TYPE_ADMINPM
tickets_system = SStickets
//Check if the mob being PM'd has any open tickets.
var/list/tickets = tickets_system.checkForTicket(C, ticket_id)
if(!length(tickets))
// If we didn't find a specific ticket by the target mob, we check for
// tickets by the source mob.
if(message_type == MESSAGE_TYPE_MENTORPM)
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob))
tickets = SSmentor_tickets.checkForTicket(src)
else
if(check_rights(R_ADMIN|R_MOD, 0, C.mob))
tickets = SStickets.checkForTicket(src)
//get message text, limit it's length.and clean/escape html
if(!msg)
set_typing(C, TRUE)
tickets_system.refresh_tickets(tickets)
msg = clean_input("Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]", null, src)
set_typing(C, FALSE)
if(!msg)
tickets_system.refresh_tickets(tickets)
return
if(!C)
if(holder)
to_chat(src, "<span class='danger'>Error: Admin-PM: Client not found.</span>")
else
adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
return
if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN))
return
// Let high-rank admins use advanced pencode.
if(check_rights(R_SERVER|R_DEBUG, 0))
msg = admin_pencode_to_html(msg)
if(holder)
//PMs sent from admins and mods display their rank
@@ -165,6 +178,7 @@
var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(<a href='byond://?src=[pm_tracker.UID()];ping=[C.key]'>PING</a>)" : ""
var/ticket_link
var/alert_link = check_rights(R_ADMIN, FALSE, mob) ? "(<a href='byond://?src=[pm_tracker.UID()];adminalert=[C.mob.UID()]'>ALERT</a>)" : ""
var/observe_link = check_rights(R_MENTOR, FALSE, mob) ? "([ADMIN_OBS(C, "OBS")])" : ""
if(ticket_id != -1)
if(message_type == MESSAGE_TYPE_MENTORPM)
ticket_link = "(<a href='byond://?_src_=holder;openticket=[ticket_id];is_mhelp=1'>TICKET</a>)"
@@ -177,7 +191,7 @@
receive_window_link = ticket_link
else if(message_type == MESSAGE_TYPE_ADMINPM && check_rights(R_ADMIN, 0, C.mob))
receive_window_link = ticket_link
receive_message = "<span class='[receive_span]'>[type] from-<b>[receive_pm_type] [C.holder ? key_name(src, TRUE, type, ticket_id = ticket_id) : key_name_hidden(src, TRUE, type, ticket_id = ticket_id)]</b>:<br><br>[emoji_msg][C.holder ? "<br>[ping_link] [receive_window_link] [alert_link]" : ""]</span>"
receive_message = "<span class='[receive_span]'>[type] from-<b>[receive_pm_type] [C.holder ? key_name(src, TRUE, type, ticket_id = ticket_id) : key_name_hidden(src, TRUE, type, ticket_id = ticket_id)]</b>:<br><br>[emoji_msg][C.holder ? "<br>[ping_link] [receive_window_link] [alert_link] [observe_link]" : ""]</span>"
if(message_type == MESSAGE_TYPE_MENTORPM)
receive_message = chat_box_mhelp(receive_message)
else
@@ -189,7 +203,7 @@
send_window_link = ticket_link
else if(message_type == MESSAGE_TYPE_ADMINPM && check_rights(R_ADMIN, 0, mob))
send_window_link = ticket_link
var/send_message = "<span class='[send_span]'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type, ticket_id = ticket_id) : key_name_hidden(C, TRUE, type, ticket_id = ticket_id)]</b>:<br><br>[emoji_msg]</span><br>[ping_link] [send_window_link] [alert_link]"
var/send_message = "<span class='[send_span]'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type, ticket_id = ticket_id) : key_name_hidden(C, TRUE, type, ticket_id = ticket_id)]</b>:<br><br>[emoji_msg]</span><br>[ping_link] [send_window_link] [alert_link] [observe_link]"
if(message_type == MESSAGE_TYPE_MENTORPM)
send_message = chat_box_mhelp(send_message)
else
@@ -198,9 +212,9 @@
var/third_party_message
if(message_type == MESSAGE_TYPE_MENTORPM)
third_party_message = chat_box_mhelp("<span class='mentorhelp'>[type]: [key_name(src, TRUE, type, ticket_id = ticket_id)]-&gt;[key_name(C, TRUE, type, ticket_id = ticket_id)]:<br><br>[emoji_msg]<br>[ping_link] [ticket_link] [alert_link]</span>")
third_party_message = chat_box_mhelp("<span class='mentorhelp'>[type]: [key_name(src, TRUE, type, ticket_id = ticket_id)]-&gt;[key_name(C, TRUE, type, ticket_id = ticket_id)]:<br><br>[emoji_msg]<br>[ping_link] [ticket_link] [alert_link] [observe_link]</span>")
else
third_party_message = chat_box_ahelp("<span class='adminhelp'>[type]: [key_name(src, TRUE, type, ticket_id = ticket_id)]-&gt;[key_name(C, TRUE, type, ticket_id = ticket_id)]:<br><br>[emoji_msg]<br>[ping_link] [ticket_link] [alert_link]</span>")
third_party_message = chat_box_ahelp("<span class='adminhelp'>[type]: [key_name(src, TRUE, type, ticket_id = ticket_id)]-&gt;[key_name(C, TRUE, type, ticket_id = ticket_id)]:<br><br>[emoji_msg]<br>[ping_link] [ticket_link] [alert_link] [observe_link]</span>")
//play the recieving admin the adminhelp sound (if they have them enabled)
//non-admins always hear the sound, as they cannot toggle it
@@ -224,22 +238,6 @@
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
to_chat(X, third_party_message, MESSAGE_TYPE_ADMINPM)
//Check if the mob being PM'd has any open tickets.
var/list/tickets = tickets_system.checkForTicket(C, ticket_id)
if(length(tickets))
tickets_system.addResponse(tickets, src, msg)
return
// If we didn't find a specific ticket by the target mob, we check for
// tickets by the source mob.
if(message_type == MESSAGE_TYPE_MENTORPM)
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob))
tickets = SSmentor_tickets.checkForTicket(src)
else
if(check_rights(R_ADMIN|R_MOD, 0, C.mob))
tickets = SStickets.checkForTicket(src)
if(length(tickets))
tickets_system.addResponse(tickets, src, msg)
@@ -288,7 +286,8 @@
return
var/datum/pm_convo/convo = target.pm_tracker.pms[key]
if(!convo)
return
convo = new /datum/pm_convo(src)
target.pm_tracker.pms[key] = convo
convo.typing = value
if(target.pm_tracker.open && target.pm_tracker.current_title == key)
target.pm_tracker.show_ui(target.mob)

View File

@@ -928,7 +928,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
return
to_chat(src, "<span class='info'>You can now right click to use inspect on browsers.</span>")
winset(src, "", "browser-options=find,devtools")
winset(src, "", "browser-options=byondstorage,find,devtools")
/client/proc/visualise_active_turfs()
set category = "Debug"

View File

@@ -8,20 +8,27 @@
category = /datum/changeling_power_category/utility
/datum/action/changeling/contort_body/Remove(mob/M)
REMOVE_TRAIT(M, TRAIT_CONTORTED_BODY, CHANGELING_TRAIT)
deactivate()
..()
/datum/action/changeling/contort_body/sting_action(mob/living/user)
if(HAS_TRAIT_FROM(user, TRAIT_CONTORTED_BODY, CHANGELING_TRAIT))
REMOVE_TRAIT(user, TRAIT_CONTORTED_BODY, CHANGELING_TRAIT)
to_chat(user, "<span class='notice'>Our body stiffens and returns to form.</span>")
if(IS_HORIZONTAL(user))
user.layer = initial(user.layer)
else
ADD_TRAIT(user, TRAIT_CONTORTED_BODY, CHANGELING_TRAIT)
to_chat(user, "<span class='notice'>We contort our form to allow us to fit in and under things we normally wouldn't be able to.</span>")
if(IS_HORIZONTAL(user))
user.layer = TURF_LAYER + 0.2
deactivate(user)
return TRUE
ADD_TRAIT(user, TRAIT_CONTORTED_BODY, CHANGELING_TRAIT)
RegisterSignal(user, COMSIG_MOB_DEATH, PROC_REF(deactivate))
to_chat(user, "<span class='notice'>We contort our form to allow us to fit in and under things we normally wouldn't be able to.</span>")
if(IS_HORIZONTAL(user))
user.layer = TURF_LAYER + 0.2
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]"))
return TRUE
/datum/action/changeling/contort_body/proc/deactivate(mob/living/user)
REMOVE_TRAIT(user, TRAIT_CONTORTED_BODY, CHANGELING_TRAIT)
UnregisterSignal(user, COMSIG_MOB_DEATH)
if(IS_HORIZONTAL(user))
user.layer = initial(user.layer)
to_chat(user, "<span class='notice'>Our body stiffens and returns to form.</span>")
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]"))

View File

@@ -5,18 +5,17 @@
/datum/action/changeling/spiders
name = "Spread Infestation"
desc = "Our form divides, creating an aggressive arachnid which will regard us as a friend. Costs 45 chemicals."
helptext = "The spiders are thoughtless creatures, but will not attack their creators. Requires at least 7 stored DNA. Their orders can be changed via remote hivemind (Alt+Shift click)."
desc = "Our form divides, creating an aggressive arachnid which will regard us as a friend. Costs 30 chemicals."
helptext = "The spiders are thoughtless creatures, but will not attack their creators. Their orders can be changed via remote hivemind (Alt+Shift click)."
button_icon_state = "spread_infestation"
chemical_cost = 45
chemical_cost = 30
dna_cost = 4
req_dna = 7
/// This var keeps track of the changeling's spider count
var/spider_counter = 0
/// Checks if changeling is already spawning a spider
var/is_operating = FALSE
power_type = CHANGELING_PURCHASABLE_POWER
category = /datum/changeling_power_category/utility
category = /datum/changeling_power_category/offence
/// Makes a spider. Good for setting traps and combat.
/datum/action/changeling/spiders/sting_action(mob/user)

View File

@@ -153,7 +153,3 @@
to_release.merge(air2.remove(shared_loss))
T.assume_air(to_release)
air_update_turf(1)
/obj/machinery/atmospherics/binary/process_atmos()
..()
return parent1 && parent2

View File

@@ -39,7 +39,6 @@
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/passive_gate/process_atmos()
..()
if(!on)
return 0

View File

@@ -72,7 +72,6 @@ Thus, the two variables affect pump operation are set in New():
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/pump/process_atmos()
..()
if((stat & (NOPOWER|BROKEN)) || !on)
return 0

View File

@@ -68,7 +68,6 @@ Thus, the two variables affect pump operation are set in New():
add_underlay(T, node2, dir)
/obj/machinery/atmospherics/binary/volume_pump/process_atmos()
..()
if((stat & (NOPOWER|BROKEN)) || !on)
return 0

View File

@@ -94,7 +94,6 @@
update_icon()
/obj/machinery/atmospherics/trinary/filter/process_atmos()
..()
if(!on)
return FALSE

View File

@@ -79,7 +79,6 @@
air3.volume = 300
/obj/machinery/atmospherics/trinary/mixer/process_atmos()
..()
if(!on)
return 0

View File

@@ -210,7 +210,3 @@
to_release.merge(air3.remove(shared_loss))
T.assume_air(to_release)
air_update_turf(1)
/obj/machinery/atmospherics/trinary/process_atmos()
..()
return parent1 && parent2 && parent3

View File

@@ -178,7 +178,6 @@
return TRUE
/obj/machinery/atmospherics/unary/cryo_cell/process_atmos()
..()
if(!node || !on)
return

View File

@@ -29,7 +29,6 @@
..()
/obj/machinery/atmospherics/unary/heat_exchanger/process_atmos()
..()
if(!partner)
return 0

Some files were not shown because too many files have changed in this diff Show More