mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-04-25 17:41:42 +01:00
Merge branch 'master' of https://github.com/Fordoxia/CRUNCHParadise
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>"
|
||||
|
||||
4
code/__DEFINES/atom_states.dm
Normal file
4
code/__DEFINES/atom_states.dm
Normal 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)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
))
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" : " "]</td><td>[val & BAD_INIT_DIDNT_INIT ? "X" : " "]</td><td>[val & BAD_INIT_SLEPT ? "X" : " "]</td><td>[val & BAD_INIT_NO_HINT ? "X" : " "]</td></tr>"
|
||||
|
||||
html_data += "</table>"
|
||||
|
||||
usr << browse(html_data.Join(), "window=initdebug")
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
17
code/datums/spells/chef.dm
Normal file
17
code/datums/spells/chef.dm
Normal 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
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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:",
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/dye_color = "#FFFFFF"
|
||||
|
||||
/obj/machinery/dye_generator/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
power_change()
|
||||
|
||||
/obj/machinery/dye_generator/deconstruct(disassembled = TRUE)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/turretid/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
if(!control_area)
|
||||
control_area = get_area(src)
|
||||
else if(istext(control_area))
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/mecha/medical/odysseus
|
||||
desc = "These exosuits are developed and produced by Vey-Med. (© 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>"
|
||||
|
||||
@@ -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\""
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
var/metal = MFOAM_ALUMINUM
|
||||
|
||||
/obj/structure/foamedmetal/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/foamedmetal/Destroy()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
..()
|
||||
internal_channels.Cut()
|
||||
|
||||
/obj/item/radio/headset/Initialize()
|
||||
..()
|
||||
/obj/item/radio/headset/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
if(ks1type)
|
||||
keyslot1 = new ks1type(src)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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`.
|
||||
*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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, \
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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")]"
|
||||
|
||||
@@ -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)]->[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)]->[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)]->[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)]->[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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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]"))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
add_underlay(T, node2, dir)
|
||||
|
||||
/obj/machinery/atmospherics/binary/passive_gate/process_atmos()
|
||||
..()
|
||||
if(!on)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -94,7 +94,6 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/trinary/filter/process_atmos()
|
||||
..()
|
||||
if(!on)
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -79,7 +79,6 @@
|
||||
air3.volume = 300
|
||||
|
||||
/obj/machinery/atmospherics/trinary/mixer/process_atmos()
|
||||
..()
|
||||
if(!on)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -178,7 +178,6 @@
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/process_atmos()
|
||||
..()
|
||||
if(!node || !on)
|
||||
return
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user