mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 07:08:00 +01:00
Merge branch 'master' into breathe-into-me
This commit is contained in:
+2
-2
@@ -16,14 +16,12 @@
|
||||
# Cyberboss
|
||||
|
||||
/code/__DATASTRUCTURES/globals.dm @Cyberboss
|
||||
/code/__DEFINES/components.dm @Cyberboss
|
||||
/code/__DEFINES/server_tools.config.dm @Cyberboss
|
||||
/code/__DEFINES/server_tools.dm @Cyberboss
|
||||
/code/controllers/subsystem/atoms.dm @Cyberboss
|
||||
/code/controllers/subsystem/mapping.dm @Cyberboss
|
||||
/code/controllers/globals.dm @Cyberboss
|
||||
/code/datums/helper_datums/getrev.dm @Cyberboss
|
||||
/code/datums/components/ @Cyberboss
|
||||
/code/datums/map_config.dm @Cyberboss
|
||||
/code/datums/forced_movement.dm @Cyberboss
|
||||
/code/datums/holocall.dm @Cyberboss
|
||||
@@ -67,4 +65,6 @@
|
||||
|
||||
# Multiple Owners
|
||||
|
||||
/code/__DEFINES/components.dm @Cyberboss @ninjanomnom
|
||||
/code/controllers/subsystem/air.dm @duncathan @MrStonedOne
|
||||
/code/datums/components/ @Cyberboss @ninjanomnom
|
||||
+5
-2
@@ -1,5 +1,7 @@
|
||||
language: generic
|
||||
dist: trusty
|
||||
sudo: false
|
||||
dist: xenial
|
||||
branches:
|
||||
except:
|
||||
- ___TGS3TempBranch
|
||||
@@ -14,6 +16,7 @@ matrix:
|
||||
packages:
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
cache:
|
||||
directories:
|
||||
- tgui/node_modules
|
||||
@@ -43,7 +46,8 @@ matrix:
|
||||
- gcc-multilib
|
||||
- g++-7
|
||||
- g++-7-multilib
|
||||
- libmariadbclient-dev:i386
|
||||
- libmariadb-client-lgpl-dev:i386
|
||||
- libmariadbd-dev
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cargo
|
||||
@@ -67,4 +71,3 @@ script:
|
||||
- tools/travis/build_tools.sh || travis_terminate 1
|
||||
- tools/travis/build_dependencies.sh || travis_terminate 1
|
||||
- tools/travis/build_byond.sh
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"g" = (
|
||||
/obj/structure/reagent_dispensers/water_cooler{
|
||||
name = "punch cooler";
|
||||
reagent_id = "bacchus_blessing"
|
||||
reagent_id = /datum/reagent/consumable/ethanol/bacchus_blessing
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/wood{
|
||||
|
||||
@@ -3372,7 +3372,7 @@
|
||||
"lq" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/reagent_containers/glass/beaker{
|
||||
list_reagents = list("sacid" = 50)
|
||||
list_reagents = list(/datum/reagent/toxin/acid = 50)
|
||||
},
|
||||
/obj/item/paper/crumpled/bloody/ruins/thederelict/unfinished,
|
||||
/obj/item/pen,
|
||||
|
||||
@@ -912,6 +912,10 @@
|
||||
},
|
||||
/turf/open/indestructible/paper,
|
||||
/area/ruin/powered)
|
||||
"Ns" = (
|
||||
/obj/item/paper/secretrecipe,
|
||||
/turf/open/indestructible/paper,
|
||||
/area/ruin/powered)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
@@ -2246,7 +2250,7 @@ ap
|
||||
az
|
||||
af
|
||||
al
|
||||
aA
|
||||
Ns
|
||||
bW
|
||||
ca
|
||||
af
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -64671,7 +64671,7 @@
|
||||
/turf/open/floor/plasteel/dark/telecomms,
|
||||
/area/tcommsat/server)
|
||||
"cex" = (
|
||||
/obj/machinery/telecomms/message_server,
|
||||
/obj/machinery/telecomms/message_server/preset,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
|
||||
@@ -18289,7 +18289,7 @@
|
||||
},
|
||||
/obj/machinery/requests_console{
|
||||
department = "Atmospherics";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Atmos RC";
|
||||
pixel_x = -30
|
||||
},
|
||||
@@ -20075,7 +20075,7 @@
|
||||
/obj/machinery/requests_console{
|
||||
announcementConsole = 1;
|
||||
department = "Chief Engineer's Desk";
|
||||
departmentType = 3;
|
||||
departmentType = 4;
|
||||
name = "Chief Engineer RC";
|
||||
pixel_y = -32
|
||||
},
|
||||
@@ -30380,7 +30380,7 @@
|
||||
/obj/item/multitool,
|
||||
/obj/machinery/requests_console{
|
||||
department = "Atmospherics";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Atmos RC";
|
||||
pixel_x = -30
|
||||
},
|
||||
@@ -34441,7 +34441,7 @@
|
||||
},
|
||||
/obj/machinery/requests_console{
|
||||
department = "Atmospherics";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Atmos RC";
|
||||
pixel_x = 30
|
||||
},
|
||||
|
||||
@@ -331,6 +331,22 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/prison)
|
||||
"aaU" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/disposal/bin,
|
||||
/obj/structure/disposalpipe/trunk,
|
||||
/obj/structure/sign/warning/deathsposal{
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"aaV" = (
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
@@ -338,6 +354,11 @@
|
||||
/area/janitor)
|
||||
"aaW" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/structure/sign/warning/nosmoking{
|
||||
pixel_x = -28
|
||||
},
|
||||
/obj/structure/closet/radiation,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"aaX" = (
|
||||
@@ -2238,6 +2259,13 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/crew_quarters/fitness/recreation)
|
||||
"aeD" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"aeE" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
@@ -4472,7 +4500,7 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal)
|
||||
"aij" = (
|
||||
/obj/machinery/pipedispenser/disposal,
|
||||
/obj/item/vending_refill/coffee,
|
||||
/turf/open/floor/plating{
|
||||
icon_state = "platingdmg2"
|
||||
},
|
||||
@@ -4849,6 +4877,11 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/crew_quarters/fitness/recreation)
|
||||
"aiT" = (
|
||||
/obj/effect/landmark/start/atmospheric_technician,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"aiU" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -6454,7 +6487,6 @@
|
||||
dir = 9
|
||||
},
|
||||
/obj/item/bot_assembly/cleanbot,
|
||||
/obj/item/vending_refill/coffee,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port/fore)
|
||||
"alI" = (
|
||||
@@ -7641,7 +7673,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/fitness/recreation)
|
||||
"anM" = (
|
||||
/obj/machinery/pipedispenser,
|
||||
/obj/machinery/space_heater,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard)
|
||||
"anN" = (
|
||||
@@ -8796,6 +8828,13 @@
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/main)
|
||||
"apX" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/item/storage/toolbox/emergency,
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"apY" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/folder/red,
|
||||
@@ -11279,6 +11318,17 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port/fore)
|
||||
"auQ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
name = "Incinerator Access";
|
||||
req_access_txt = "24"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard)
|
||||
"auU" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 6
|
||||
@@ -24375,7 +24425,7 @@
|
||||
/obj/machinery/requests_console{
|
||||
announcementConsole = 0;
|
||||
department = "Engineering";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Engineering RC"
|
||||
},
|
||||
/turf/closed/wall,
|
||||
@@ -25117,7 +25167,7 @@
|
||||
/obj/machinery/requests_console{
|
||||
announcementConsole = 1;
|
||||
department = "Chief Engineer's Desk";
|
||||
departmentType = 3;
|
||||
departmentType = 4;
|
||||
name = "Chief Engineer RC";
|
||||
pixel_y = 32
|
||||
},
|
||||
@@ -40987,7 +41037,7 @@
|
||||
},
|
||||
/obj/machinery/requests_console{
|
||||
department = "Atmospherics";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Atmos RC";
|
||||
pixel_x = 30
|
||||
},
|
||||
@@ -45142,7 +45192,7 @@
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/space/nearstation)
|
||||
"bJg" = (
|
||||
/obj/machinery/telecomms/message_server,
|
||||
/obj/machinery/telecomms/message_server/preset,
|
||||
/turf/open/floor/circuit/telecomms/mainframe,
|
||||
/area/tcommsat/server)
|
||||
"bJh" = (
|
||||
@@ -48213,10 +48263,10 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bPr" = (
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/closet/radiation,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bPs" = (
|
||||
@@ -50015,7 +50065,7 @@
|
||||
"bTj" = (
|
||||
/obj/machinery/requests_console{
|
||||
department = "Atmospherics";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Atmos RC";
|
||||
pixel_x = 30
|
||||
},
|
||||
@@ -50658,10 +50708,10 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/engine/atmos)
|
||||
"bUA" = (
|
||||
/obj/machinery/pipedispenser,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 10
|
||||
},
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bUB" = (
|
||||
@@ -50671,19 +50721,19 @@
|
||||
/obj/machinery/light_switch{
|
||||
pixel_y = 28
|
||||
},
|
||||
/obj/machinery/pipedispenser/disposal,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bUC" = (
|
||||
/obj/item/radio/intercom{
|
||||
pixel_y = 28
|
||||
},
|
||||
/obj/machinery/pipedispenser/disposal/transit_tube,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 6
|
||||
},
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bUD" = (
|
||||
@@ -51137,15 +51187,15 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"bVx" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 10
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"bVy" = (
|
||||
@@ -51252,7 +51302,6 @@
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/closet/radiation,
|
||||
/turf/open/floor/plasteel/dark/corner{
|
||||
dir = 1
|
||||
},
|
||||
@@ -52506,6 +52555,7 @@
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"bYl" = (
|
||||
@@ -53159,17 +53209,6 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"bZD" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
name = "Incinerator Access";
|
||||
req_access_txt = "12"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard)
|
||||
"bZE" = (
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
@@ -53983,18 +54022,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"caZ" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/disposal/bin,
|
||||
/obj/structure/disposalpipe/trunk,
|
||||
/obj/structure/sign/warning/deathsposal{
|
||||
pixel_y = 32
|
||||
},
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cba" = (
|
||||
/obj/machinery/power/smes{
|
||||
capacity = 9e+006;
|
||||
@@ -54859,6 +54886,9 @@
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"ccA" = (
|
||||
@@ -54874,14 +54904,12 @@
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/watertank,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 5
|
||||
},
|
||||
/obj/item/grenade/chem_grenade/antiweed,
|
||||
/obj/structure/table/glass,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"ccB" = (
|
||||
@@ -56800,13 +56828,6 @@
|
||||
icon_state = "platingdmg2"
|
||||
},
|
||||
/area/maintenance/starboard/aft)
|
||||
"cgu" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/item/storage/toolbox/emergency,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cgv" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible{
|
||||
@@ -78107,6 +78128,9 @@
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/table,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 5
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"dbF" = (
|
||||
@@ -82837,9 +82861,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/misc_lab/range)
|
||||
"etr" = (
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/fitness/recreation)
|
||||
"eFN" = (
|
||||
/obj/structure/bodycontainer/crematorium{
|
||||
id = "crematoriumChapel";
|
||||
@@ -83155,11 +83176,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/science/research)
|
||||
"ieW" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"ifN" = (
|
||||
/obj/effect/turf_decal/stripes/corner{
|
||||
dir = 1
|
||||
@@ -83263,6 +83279,12 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/solars/port/aft)
|
||||
"jHw" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall,
|
||||
/area/hydroponics)
|
||||
"jKK" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
req_access_txt = "13"
|
||||
@@ -83420,6 +83442,19 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/misc_lab/range)
|
||||
"lkf" = (
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green,
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 10
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"lnO" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 10
|
||||
@@ -83760,6 +83795,18 @@
|
||||
"pcn" = (
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/misc_lab/range)
|
||||
"pgY" = (
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"pmZ" = (
|
||||
/obj/structure/sign/poster/official/random{
|
||||
pixel_y = 32
|
||||
@@ -83885,16 +83932,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/science/misc_lab/range)
|
||||
"qbK" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/portable_atmospherics/canister,
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/sign/warning/nosmoking{
|
||||
pixel_x = -28
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"qcZ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/yellow{
|
||||
@@ -83927,6 +83964,14 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/misc_lab/range)
|
||||
"qkD" = (
|
||||
/obj/effect/turf_decal/tile/green,
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"qom" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
@@ -84200,6 +84245,23 @@
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/locker)
|
||||
"tQN" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green,
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hydroponics)
|
||||
"tVY" = (
|
||||
/obj/structure/closet/crate,
|
||||
/obj/item/target/alien,
|
||||
@@ -84325,12 +84387,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/department/science)
|
||||
"vlx" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/fitness/recreation)
|
||||
"vwi" = (
|
||||
/obj/structure/girder,
|
||||
/obj/structure/grille,
|
||||
@@ -119956,7 +120012,7 @@ bKe
|
||||
bRW
|
||||
bST
|
||||
bUm
|
||||
bVu
|
||||
pgY
|
||||
bWT
|
||||
bYj
|
||||
bWT
|
||||
@@ -120213,11 +120269,11 @@ bQI
|
||||
bRX
|
||||
bST
|
||||
bUn
|
||||
bVt
|
||||
bWQ
|
||||
lkf
|
||||
qkD
|
||||
bYk
|
||||
bWQ
|
||||
caL
|
||||
qkD
|
||||
tQN
|
||||
dbE
|
||||
bST
|
||||
diB
|
||||
@@ -120732,7 +120788,7 @@ bST
|
||||
bST
|
||||
bST
|
||||
caQ
|
||||
bST
|
||||
jHw
|
||||
bST
|
||||
cfg
|
||||
pCp
|
||||
@@ -121692,9 +121748,9 @@ acP
|
||||
afz
|
||||
agz
|
||||
dBY
|
||||
vlx
|
||||
vlx
|
||||
etr
|
||||
ahl
|
||||
ahl
|
||||
ahg
|
||||
alk
|
||||
alk
|
||||
anK
|
||||
@@ -123560,9 +123616,9 @@ bYr
|
||||
avs
|
||||
bZE
|
||||
mKO
|
||||
qbK
|
||||
ieW
|
||||
cgu
|
||||
aaW
|
||||
aeD
|
||||
apX
|
||||
amV
|
||||
bZC
|
||||
arF
|
||||
@@ -124328,11 +124384,11 @@ alq
|
||||
alq
|
||||
bXb
|
||||
bYu
|
||||
bZD
|
||||
auQ
|
||||
caY
|
||||
ccI
|
||||
ced
|
||||
aaW
|
||||
aiT
|
||||
aju
|
||||
apP
|
||||
ciZ
|
||||
@@ -124586,7 +124642,7 @@ aut
|
||||
bXc
|
||||
apc
|
||||
bZE
|
||||
caZ
|
||||
aaU
|
||||
ccJ
|
||||
cee
|
||||
cgx
|
||||
@@ -128180,7 +128236,7 @@ bPu
|
||||
bPu
|
||||
bTl
|
||||
bUF
|
||||
bKD
|
||||
bCi
|
||||
bXo
|
||||
bMj
|
||||
bZI
|
||||
|
||||
@@ -2691,7 +2691,7 @@
|
||||
area_type = /area/lavaland/surface/outdoors;
|
||||
dir = 8;
|
||||
dwidth = 2;
|
||||
height = 10;
|
||||
height = 5;
|
||||
id = "laborcamp_away";
|
||||
name = "labor camp";
|
||||
width = 9
|
||||
@@ -4102,7 +4102,7 @@
|
||||
area_type = /area/lavaland/surface/outdoors;
|
||||
dir = 8;
|
||||
dwidth = 3;
|
||||
height = 5;
|
||||
height = 10;
|
||||
id = "mining_away";
|
||||
name = "lavaland mine";
|
||||
width = 7
|
||||
|
||||
@@ -6,12 +6,33 @@
|
||||
/obj/effect/mapping_helpers/dead_body_placer,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/medical/morgue)
|
||||
"aac" = (
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/closet/radiation,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"aad" = (
|
||||
/obj/effect/spawner/lootdrop/maintenance,
|
||||
/turf/open/floor/plating{
|
||||
icon_state = "platingdmg3"
|
||||
},
|
||||
/area/maintenance/department/science)
|
||||
"aae" = (
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow,
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"abf" = (
|
||||
/obj/structure/bed,
|
||||
/turf/open/floor/plating,
|
||||
@@ -41382,10 +41403,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bQH" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/obj/machinery/pipedispenser,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bQI" = (
|
||||
@@ -41393,10 +41411,10 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bQJ" = (
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/closet/radiation,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bQK" = (
|
||||
@@ -41747,7 +41765,7 @@
|
||||
"bRu" = (
|
||||
/obj/machinery/requests_console{
|
||||
department = "Atmospherics";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Atmos RC";
|
||||
pixel_x = 30
|
||||
},
|
||||
@@ -41764,6 +41782,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bRv" = (
|
||||
/obj/machinery/pipedispenser/disposal,
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
@@ -41771,10 +41790,6 @@
|
||||
c_tag = "Atmospherics Central";
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/closet/secure_closet/atmospherics,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bRw" = (
|
||||
@@ -42097,6 +42112,10 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bSe" = (
|
||||
/obj/machinery/pipedispenser/disposal/transit_tube,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"bSf" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/general/visible{
|
||||
dir = 4
|
||||
@@ -43253,7 +43272,7 @@
|
||||
/obj/machinery/requests_console{
|
||||
announcementConsole = 1;
|
||||
department = "Chief Engineer's Desk";
|
||||
departmentType = 3;
|
||||
departmentType = 4;
|
||||
name = "Chief Engineer RC";
|
||||
pixel_x = -32
|
||||
},
|
||||
@@ -43640,7 +43659,6 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/pipedispenser,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/engine)
|
||||
"bVv" = (
|
||||
@@ -46149,17 +46167,6 @@
|
||||
"cby" = (
|
||||
/turf/open/floor/engine/air,
|
||||
/area/engine/atmos)
|
||||
"cbz" = (
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow,
|
||||
/obj/structure/closet/radiation,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cbA" = (
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
@@ -46563,17 +46570,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/engineering)
|
||||
"cdg" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/storage/toolbox/emergency,
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/yellow{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"cdk" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 4
|
||||
@@ -49228,7 +49224,7 @@
|
||||
/turf/open/floor/circuit/telecomms/mainframe,
|
||||
/area/tcommsat/server)
|
||||
"cmH" = (
|
||||
/obj/machinery/telecomms/message_server,
|
||||
/obj/machinery/telecomms/message_server/preset,
|
||||
/turf/open/floor/circuit/telecomms/mainframe,
|
||||
/area/tcommsat/server)
|
||||
"cmK" = (
|
||||
@@ -55869,7 +55865,7 @@
|
||||
/obj/machinery/requests_console{
|
||||
announcementConsole = 0;
|
||||
department = "Engineering";
|
||||
departmentType = 4;
|
||||
departmentType = 3;
|
||||
name = "Engineering RC";
|
||||
pixel_x = -32
|
||||
},
|
||||
@@ -59793,7 +59789,9 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal)
|
||||
"srZ" = (
|
||||
/obj/machinery/pipedispenser/disposal,
|
||||
/obj/structure/closet/crate{
|
||||
icon_state = "crateopen"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/disposal)
|
||||
"ssx" = (
|
||||
@@ -97947,7 +97945,7 @@ bOS
|
||||
bPQ
|
||||
bQH
|
||||
bRv
|
||||
bQH
|
||||
bSe
|
||||
bPQ
|
||||
bTL
|
||||
uRj
|
||||
@@ -100531,8 +100529,8 @@ bZO
|
||||
caI
|
||||
cbA
|
||||
ccp
|
||||
cdg
|
||||
cbz
|
||||
aac
|
||||
aae
|
||||
hMa
|
||||
aaa
|
||||
aby
|
||||
|
||||
@@ -8316,7 +8316,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/syndicate_mothership/control)
|
||||
"si" = (
|
||||
/obj/machinery/computer/telecrystals/uplinker,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 9
|
||||
},
|
||||
@@ -8827,7 +8826,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/syndicate_mothership/control)
|
||||
"tg" = (
|
||||
/obj/machinery/computer/telecrystals/uplinker,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
@@ -9522,7 +9520,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/syndicate_mothership/control)
|
||||
"uM" = (
|
||||
/obj/machinery/computer/telecrystals/uplinker,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 10
|
||||
},
|
||||
@@ -9951,7 +9948,7 @@
|
||||
name = "Hanger Bay Shutters";
|
||||
pixel_x = -8;
|
||||
pixel_y = 24;
|
||||
req_access_txt = "2"
|
||||
req_access_txt = "101"
|
||||
},
|
||||
/obj/machinery/button/door/indestructible{
|
||||
id = "XCCsec3";
|
||||
@@ -10313,7 +10310,7 @@
|
||||
id = "XCCFerry";
|
||||
name = "Hanger Bay Shutters";
|
||||
pixel_y = 24;
|
||||
req_access_txt = "2"
|
||||
req_access_txt = "101"
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 5
|
||||
@@ -10497,9 +10494,6 @@
|
||||
/turf/open/floor/carpet,
|
||||
/area/wizard_station)
|
||||
"wV" = (
|
||||
/obj/machinery/computer/telecrystals/boss{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 5
|
||||
},
|
||||
|
||||
@@ -1,176 +0,0 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"bY" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"hB" = (
|
||||
/obj/structure/shuttle/engine/propulsion{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/hunter)
|
||||
"hJ" = (
|
||||
/obj/structure/window/shuttle,
|
||||
/obj/structure/grille,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"hU" = (
|
||||
/obj/structure/closet/crate,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ku" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/hunter)
|
||||
"lp" = (
|
||||
/obj/machinery/fugitive_capture,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"qH" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "Interpolship";
|
||||
pixel_y = 26
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"rR" = (
|
||||
/obj/machinery/door/airlock/titanium,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"te" = (
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/poddoor/shutters{
|
||||
id = "Interpolship"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"An" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"Pq" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"RA" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"RO" = (
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"WY" = (
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
|
||||
(1,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
te
|
||||
te
|
||||
te
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
qH
|
||||
RO
|
||||
RO
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
bY
|
||||
RO
|
||||
RO
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
hB
|
||||
ku
|
||||
bY
|
||||
RO
|
||||
RO
|
||||
ku
|
||||
hB
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
Pq
|
||||
hJ
|
||||
bY
|
||||
RO
|
||||
RO
|
||||
hJ
|
||||
Pq
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
RO
|
||||
RO
|
||||
RO
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
RA
|
||||
RO
|
||||
hU
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
lp
|
||||
RO
|
||||
hU
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
ku
|
||||
rR
|
||||
ku
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
hB
|
||||
ku
|
||||
RO
|
||||
RO
|
||||
RO
|
||||
ku
|
||||
hB
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
Pq
|
||||
An
|
||||
RA
|
||||
WY
|
||||
RO
|
||||
An
|
||||
Pq
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
An
|
||||
An
|
||||
An
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
@@ -1,23 +1,17 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
"a" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/turf/closed/wall,
|
||||
/area/shuttle/hunter)
|
||||
"ab" = (
|
||||
/obj/machinery/power/smes,
|
||||
/turf/open/floor/plating,
|
||||
"c" = (
|
||||
/obj/structure/shuttle/engine/propulsion{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"ac" = (
|
||||
/obj/machinery/portable_atmospherics/scrubber/huge,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ad" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ae" = (
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"af" = (
|
||||
"d" = (
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
icon_state = "heater";
|
||||
dir = 8
|
||||
@@ -27,65 +21,46 @@
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"ag" = (
|
||||
/obj/structure/mirror{
|
||||
pixel_y = 28
|
||||
},
|
||||
"e" = (
|
||||
/obj/machinery/portable_atmospherics/scrubber/huge,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ah" = (
|
||||
"f" = (
|
||||
/obj/machinery/power/smes,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"g" = (
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"h" = (
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/turf/open/floor/plating,
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"ai" = (
|
||||
/obj/structure/chair{
|
||||
icon_state = "chair";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aj" = (
|
||||
/obj/structure/shuttle/engine/large{
|
||||
icon_state = "large_engine";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ak" = (
|
||||
/obj/structure/chair{
|
||||
icon_state = "chair";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"al" = (
|
||||
/obj/structure/closet/crate/bin,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"am" = (
|
||||
"i" = (
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"an" = (
|
||||
"j" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ao" = (
|
||||
"k" = (
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"l" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ap" = (
|
||||
"m" = (
|
||||
/obj/structure/reagent_dispensers/fueltank,
|
||||
/obj/item/weldingtool/largetank,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"aq" = (
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"ar" = (
|
||||
"n" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/structure/reagent_dispensers/watertank,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
@@ -95,7 +70,13 @@
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"as" = (
|
||||
"o" = (
|
||||
/obj/effect/mob_spawn/human/fugitive/russian{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"p" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/closet/crate{
|
||||
@@ -103,21 +84,24 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"at" = (
|
||||
"q" = (
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"au" = (
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
"r" = (
|
||||
/obj/effect/turf_decal/arrows{
|
||||
icon_state = "arrows";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"av" = (
|
||||
"s" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/storage/fancy/cigarettes/cigars/cohiba{
|
||||
pixel_y = 6
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"aw" = (
|
||||
"t" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/closet/crate/large{
|
||||
@@ -125,58 +109,66 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ax" = (
|
||||
/turf/open/space/basic,
|
||||
/area/shuttle/hunter)
|
||||
"ay" = (
|
||||
"u" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"az" = (
|
||||
/turf/open/floor/plating/airless,
|
||||
"v" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aA" = (
|
||||
"w" = (
|
||||
/obj/machinery/fugitive_capture,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"x" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aB" = (
|
||||
"y" = (
|
||||
/turf/template_noop,
|
||||
/area/shuttle/hunter)
|
||||
"z" = (
|
||||
/obj/structure/chair{
|
||||
icon_state = "chair";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"aC" = (
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker{
|
||||
"A" = (
|
||||
/obj/machinery/computer/shuttle/pirate/hunter{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"aD" = (
|
||||
/obj/structure/shuttle/engine/large{
|
||||
icon_state = "large_engine";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"aE" = (
|
||||
"B" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/structure/closet/crate{
|
||||
icon_state = "crateopen"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aF" = (
|
||||
"C" = (
|
||||
/obj/machinery/computer/camera_advanced{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"aG" = (
|
||||
/obj/machinery/fugitive_capture,
|
||||
"D" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"E" = (
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{
|
||||
dir = 8;
|
||||
jumpto_ports = list("huntership_home" = 1);
|
||||
view_range = 12;
|
||||
x_offset = 0;
|
||||
y_offset = 3
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"aH" = (
|
||||
"F" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/closet/crate/engineering{
|
||||
@@ -184,321 +176,325 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aI" = (
|
||||
"G" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/vodka,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"aJ" = (
|
||||
"H" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/structure/closet/crate/coffin{
|
||||
icon_state = "coffinopen"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aK" = (
|
||||
"I" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/mecha/working/ripley,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aL" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aM" = (
|
||||
"J" = (
|
||||
/obj/machinery/portable_atmospherics/canister/oxygen,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/hunter)
|
||||
"aN" = (
|
||||
"K" = (
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/docking_port/stationary{
|
||||
dir = 1;
|
||||
dwidth = 11;
|
||||
height = 16;
|
||||
id = "pirateship_home";
|
||||
name = "Deep Space";
|
||||
width = 17
|
||||
},
|
||||
/obj/docking_port/mobile{
|
||||
dheight = 3;
|
||||
dir = 1;
|
||||
dwidth = 3;
|
||||
height = 13;
|
||||
id = "huntership";
|
||||
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
|
||||
name = "hunter shuttle";
|
||||
rechargeTime = 1800;
|
||||
width = 15
|
||||
},
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/shuttle/hunter)
|
||||
"aO" = (
|
||||
/obj/structure/shuttle/engine/propulsion{
|
||||
dir = 8
|
||||
"L" = (
|
||||
/obj/effect/mob_spawn/human/fugitive/russian{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"aP" = (
|
||||
/obj/structure/shuttle/engine/heater{
|
||||
icon_state = "heater";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/hunter)
|
||||
"Pq" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
|
||||
(1,1,1) = {"
|
||||
Pq
|
||||
Pq
|
||||
ae
|
||||
aj
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
az
|
||||
aD
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ae
|
||||
ae
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
aa
|
||||
az
|
||||
az
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
c
|
||||
c
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
af
|
||||
af
|
||||
aa
|
||||
Pq
|
||||
aa
|
||||
aa
|
||||
af
|
||||
af
|
||||
aa
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
a
|
||||
c
|
||||
c
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
d
|
||||
d
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
c
|
||||
c
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ae
|
||||
ak
|
||||
aa
|
||||
aa
|
||||
as
|
||||
aw
|
||||
aA
|
||||
aE
|
||||
aE
|
||||
aH
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
b
|
||||
d
|
||||
d
|
||||
b
|
||||
b
|
||||
p
|
||||
t
|
||||
x
|
||||
B
|
||||
B
|
||||
F
|
||||
b
|
||||
b
|
||||
d
|
||||
d
|
||||
b
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ag
|
||||
ak
|
||||
aa
|
||||
an
|
||||
at
|
||||
ay
|
||||
at
|
||||
at
|
||||
ay
|
||||
ay
|
||||
aJ
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
b
|
||||
e
|
||||
g
|
||||
b
|
||||
j
|
||||
q
|
||||
u
|
||||
q
|
||||
q
|
||||
u
|
||||
u
|
||||
H
|
||||
b
|
||||
g
|
||||
L
|
||||
b
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ae
|
||||
ak
|
||||
aa
|
||||
an
|
||||
at
|
||||
at
|
||||
at
|
||||
at
|
||||
ay
|
||||
at
|
||||
aK
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
b
|
||||
e
|
||||
g
|
||||
h
|
||||
k
|
||||
k
|
||||
k
|
||||
k
|
||||
k
|
||||
D
|
||||
k
|
||||
k
|
||||
h
|
||||
g
|
||||
L
|
||||
b
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ae
|
||||
ak
|
||||
aa
|
||||
ao
|
||||
at
|
||||
ay
|
||||
ay
|
||||
at
|
||||
ay
|
||||
at
|
||||
aL
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
b
|
||||
f
|
||||
g
|
||||
b
|
||||
l
|
||||
k
|
||||
u
|
||||
u
|
||||
q
|
||||
u
|
||||
k
|
||||
I
|
||||
b
|
||||
g
|
||||
L
|
||||
b
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ah
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
am
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
am
|
||||
aa
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
h
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
h
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ae
|
||||
al
|
||||
aa
|
||||
ap
|
||||
aq
|
||||
aa
|
||||
ax
|
||||
ax
|
||||
aa
|
||||
aq
|
||||
at
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
a
|
||||
b
|
||||
b
|
||||
b
|
||||
m
|
||||
k
|
||||
b
|
||||
y
|
||||
y
|
||||
b
|
||||
k
|
||||
q
|
||||
b
|
||||
b
|
||||
b
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
Pq
|
||||
aa
|
||||
ae
|
||||
ae
|
||||
am
|
||||
aq
|
||||
aq
|
||||
aa
|
||||
ax
|
||||
ax
|
||||
aa
|
||||
aq
|
||||
aq
|
||||
aN
|
||||
Pq
|
||||
Pq
|
||||
a
|
||||
a
|
||||
a
|
||||
i
|
||||
k
|
||||
k
|
||||
v
|
||||
y
|
||||
y
|
||||
v
|
||||
k
|
||||
k
|
||||
K
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ae
|
||||
ae
|
||||
aa
|
||||
ar
|
||||
aq
|
||||
aa
|
||||
ax
|
||||
ax
|
||||
aa
|
||||
aq
|
||||
aM
|
||||
aa
|
||||
aO
|
||||
aO
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
n
|
||||
r
|
||||
b
|
||||
y
|
||||
y
|
||||
b
|
||||
r
|
||||
J
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
aa
|
||||
ab
|
||||
ai
|
||||
ai
|
||||
aa
|
||||
aa
|
||||
au
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
au
|
||||
aa
|
||||
aa
|
||||
aP
|
||||
aP
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
h
|
||||
b
|
||||
b
|
||||
b
|
||||
b
|
||||
h
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
aa
|
||||
ac
|
||||
ae
|
||||
ae
|
||||
aa
|
||||
aq
|
||||
aq
|
||||
aq
|
||||
aB
|
||||
aB
|
||||
aq
|
||||
aq
|
||||
aq
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
o
|
||||
k
|
||||
r
|
||||
z
|
||||
z
|
||||
k
|
||||
k
|
||||
o
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
aa
|
||||
ad
|
||||
ad
|
||||
ad
|
||||
aa
|
||||
aa
|
||||
av
|
||||
at
|
||||
aC
|
||||
aF
|
||||
aG
|
||||
aI
|
||||
aa
|
||||
aa
|
||||
aa
|
||||
Pq
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
s
|
||||
w
|
||||
A
|
||||
C
|
||||
E
|
||||
G
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
aa
|
||||
ad
|
||||
ad
|
||||
ad
|
||||
ad
|
||||
aa
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
Pq
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
b
|
||||
b
|
||||
v
|
||||
v
|
||||
v
|
||||
v
|
||||
b
|
||||
b
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -0,0 +1,263 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{
|
||||
dir = 8;
|
||||
jumpto_ports = list("huntership_home" = 1);
|
||||
view_range = 7;
|
||||
x_offset = 6
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ab" = (
|
||||
/obj/machinery/computer/shuttle/pirate/hunter{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ac" = (
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/docking_port/stationary{
|
||||
dir = 4;
|
||||
dwidth = 3;
|
||||
height = 12;
|
||||
id = "huntership_home";
|
||||
name = "Deep Space";
|
||||
width = 7
|
||||
},
|
||||
/obj/docking_port/mobile{
|
||||
dheight = 0;
|
||||
dir = 4;
|
||||
dwidth = 3;
|
||||
height = 12;
|
||||
id = "huntership";
|
||||
name = "hunter shuttle";
|
||||
rechargeTime = 1800;
|
||||
width = 7
|
||||
},
|
||||
/obj/machinery/door/poddoor/shutters{
|
||||
id = "Interpolship"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ae" = (
|
||||
/obj/machinery/button/door{
|
||||
id = "Interpolship";
|
||||
pixel_y = 26
|
||||
},
|
||||
/obj/effect/turf_decal/stripes{
|
||||
icon_state = "warningline";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"af" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
icon_state = "warningline";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ag" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ah" = (
|
||||
/obj/effect/turf_decal/loading_area{
|
||||
icon_state = "loadingarea";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"aj" = (
|
||||
/obj/structure/closet/crate,
|
||||
/obj/effect/turf_decal/box,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"ak" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
icon_state = "shuttle_chair";
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/mob_spawn/human/fugitive/spacepol{
|
||||
icon_state = "sleeper";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"al" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
icon_state = "warningline";
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/caution{
|
||||
icon_state = "caution";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"bY" = (
|
||||
/obj/structure/chair/comfy/shuttle,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"gi" = (
|
||||
/obj/structure/table,
|
||||
/obj/effect/mob_spawn/human/fugitive/spacepol{
|
||||
dir = 8;
|
||||
icon_state = "sleeper"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"hB" = (
|
||||
/obj/structure/shuttle/engine/propulsion{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/hunter)
|
||||
"hJ" = (
|
||||
/obj/structure/window/shuttle,
|
||||
/obj/structure/grille,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"ku" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/hunter)
|
||||
"lp" = (
|
||||
/obj/machinery/fugitive_capture,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"rR" = (
|
||||
/obj/machinery/door/airlock/titanium,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"te" = (
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/poddoor/shutters{
|
||||
id = "Interpolship"
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"An" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/hunter)
|
||||
"Pq" = (
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
"Rz" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
"RO" = (
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/hunter)
|
||||
|
||||
(1,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
te
|
||||
ac
|
||||
te
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
ae
|
||||
al
|
||||
af
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
bY
|
||||
RO
|
||||
ak
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
hB
|
||||
ku
|
||||
bY
|
||||
RO
|
||||
ak
|
||||
ku
|
||||
hB
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
ku
|
||||
ku
|
||||
bY
|
||||
RO
|
||||
ak
|
||||
ku
|
||||
ku
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
Pq
|
||||
hJ
|
||||
ag
|
||||
RO
|
||||
RO
|
||||
hJ
|
||||
Pq
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
Pq
|
||||
hJ
|
||||
ah
|
||||
RO
|
||||
aj
|
||||
hJ
|
||||
Pq
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
lp
|
||||
RO
|
||||
aj
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
hB
|
||||
ku
|
||||
ku
|
||||
rR
|
||||
ku
|
||||
ku
|
||||
hB
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
ku
|
||||
ku
|
||||
RO
|
||||
Rz
|
||||
RO
|
||||
ku
|
||||
ku
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
Pq
|
||||
An
|
||||
aa
|
||||
gi
|
||||
ab
|
||||
An
|
||||
Pq
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
Pq
|
||||
ku
|
||||
An
|
||||
An
|
||||
An
|
||||
ku
|
||||
Pq
|
||||
"}
|
||||
@@ -93,6 +93,8 @@
|
||||
#define TR_KEEPSE (1<<5) // changelings shouldn't edit the DNA's SE when turning into a monkey
|
||||
#define TR_DEFAULTMSG (1<<6)
|
||||
#define TR_KEEPORGANS (1<<8)
|
||||
#define TR_KEEPSTUNS (1<<9)
|
||||
#define TR_KEEPREAGENTS (1<<10)
|
||||
|
||||
|
||||
#define CLONER_FRESH_CLONE "fresh"
|
||||
|
||||
@@ -59,4 +59,4 @@
|
||||
#define TRACKER_MINDSHIELD_TIME 1200
|
||||
#define TRACKER_AWAKENED_TIME 3000
|
||||
#define TRACKER_BONUS_LARGE 300
|
||||
#define TRACKER_BONUS_SMALL 100
|
||||
#define TRACKER_BONUS_SMALL 100
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component)
|
||||
#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
|
||||
#define COMSIG_PARENT_QDELETED "parent_qdeleted" //after a datum's Destroy() is called: (force, qdel_hint), at this point none of the other components chose to interrupt qdel and Destroy has been called
|
||||
#define COMSIG_TOPIC "handle_topic" //generic topic handler (usr, href_list)
|
||||
|
||||
// /atom signals
|
||||
#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params)
|
||||
@@ -110,6 +111,7 @@
|
||||
|
||||
// /atom/movable signals
|
||||
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom)
|
||||
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1
|
||||
#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir)
|
||||
#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable)
|
||||
#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable)
|
||||
@@ -134,7 +136,7 @@
|
||||
#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params)
|
||||
#define COMSIG_MOB_CANCEL_CLICKON 1
|
||||
#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
|
||||
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, major, self, protection_sources)
|
||||
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
|
||||
#define COMPONENT_BLOCK_MAGIC 1
|
||||
#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): ()
|
||||
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of
|
||||
@@ -163,6 +165,10 @@
|
||||
// /mob/living/carbon signals
|
||||
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
|
||||
|
||||
// /mob/living/simple_animal/hostile signals
|
||||
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
|
||||
#define COMPONENT_HOSTILE_NO_ATTACK 1
|
||||
|
||||
// /obj signals
|
||||
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
|
||||
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
|
||||
@@ -202,6 +208,8 @@
|
||||
// /obj/item/pda signals
|
||||
#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
|
||||
#define COMPONENT_STOP_RINGTONE_CHANGE 1
|
||||
#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate"
|
||||
#define COMPONENT_PDA_NO_DETONATE 1
|
||||
|
||||
// /obj/item/radio signals
|
||||
#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args)
|
||||
@@ -209,6 +217,10 @@
|
||||
// /obj/item/pen signals
|
||||
#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
|
||||
|
||||
// /obj/item/projectile signals (sent to the firer)
|
||||
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
|
||||
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target)
|
||||
|
||||
|
||||
// /mob/living/carbon/human signals
|
||||
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target)
|
||||
@@ -245,6 +257,7 @@
|
||||
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount
|
||||
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount
|
||||
#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob.
|
||||
#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob.
|
||||
#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
|
||||
#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
|
||||
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
|
||||
@@ -253,19 +266,19 @@
|
||||
#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
|
||||
|
||||
// /datum/component/storage signals
|
||||
#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool.
|
||||
#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool.
|
||||
#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool
|
||||
#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate)
|
||||
#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
|
||||
#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
|
||||
#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items.
|
||||
#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location.
|
||||
#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool.
|
||||
#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool.
|
||||
#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool
|
||||
#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate)
|
||||
#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
|
||||
#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
|
||||
#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items.
|
||||
#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location.
|
||||
#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
|
||||
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool
|
||||
|
||||
// /datum/action signals
|
||||
#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action)
|
||||
|
||||
@@ -41,4 +41,4 @@
|
||||
#define BANISH_FUNERAL_GARB "funeral"
|
||||
|
||||
#define LORE 1
|
||||
#define LAW 2
|
||||
#define LAW 2
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
#define AFFIX_PREFIX (1 << 0)
|
||||
#define AFFIX_SUFFIX (1 << 1)
|
||||
|
||||
#define AFFIX_GOOD (1 << 0)
|
||||
#define AFFIX_EVIL (1 << 1)
|
||||
@@ -11,8 +11,10 @@
|
||||
#define GROSS (1<<10)
|
||||
#define TOXIC (1<<11)
|
||||
#define PINEAPPLE (1<<12)
|
||||
#define CLOTH (1<<14)
|
||||
|
||||
#define DRINK_NICE 1
|
||||
#define DRINK_GOOD 2
|
||||
#define DRINK_VERYGOOD 3
|
||||
#define DRINK_FANTASTIC 4
|
||||
#define FOOD_AMAZING 5
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA))
|
||||
#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions))
|
||||
#define HAS_BLOOD_DNA(thing) (length(thing.GetComponent(/datum/component/forensics)?.blood_DNA))
|
||||
|
||||
@@ -4,3 +4,8 @@
|
||||
#define HUD_STYLE_NOHUD 3 //No hud (for screenshots)
|
||||
|
||||
#define HUD_VERSIONS 3 //Used in show_hud(); Please ensure this is the same as the maximum index.
|
||||
|
||||
//1:1 HUD layout stuff
|
||||
#define UI_BOXCRAFT "EAST-4:22,SOUTH+1:6"
|
||||
#define UI_BOXAREA "EAST-4:6,SOUTH+1:6"
|
||||
#define UI_BOXLANG "EAST-5:22,SOUTH+1:6"
|
||||
|
||||
@@ -225,6 +225,10 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
|
||||
|
||||
#define isbodypart(A) (istype(A, /obj/item/bodypart))
|
||||
|
||||
#define isprojectile(A) (istype(A, /obj/item/projectile))
|
||||
|
||||
#define isgun(A) (istype(A, /obj/item/gun))
|
||||
|
||||
//Assemblies
|
||||
#define isassembly(O) (istype(O, /obj/item/assembly))
|
||||
|
||||
|
||||
@@ -175,6 +175,9 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
|
||||
//Gets the turf this atom inhabits
|
||||
#define get_turf(A) (get_step(A, 0))
|
||||
|
||||
//Same as above except gets the area instead
|
||||
#define get_area(A) (isarea(A) ? A : get_step(A, 0)?.loc)
|
||||
|
||||
//Ghost orbit types:
|
||||
#define GHOST_ORBIT_CIRCLE "circle"
|
||||
#define GHOST_ORBIT_TRIANGLE "triangle"
|
||||
|
||||
@@ -71,6 +71,8 @@
|
||||
#define HUMAN_MAX_OXYLOSS 3
|
||||
#define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30)
|
||||
|
||||
#define STAMINA_REGEN_BLOCK_TIME (10 SECONDS)
|
||||
|
||||
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
#define MOVESPEED_ID_SLIME_STATUS "SLIME_STATUS"
|
||||
|
||||
#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB"
|
||||
|
||||
#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
|
||||
|
||||
#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
|
||||
@@ -61,4 +63,4 @@
|
||||
#define MOVESPEED_ID_SLAUGHTER "SLAUGHTER"
|
||||
#define MOVESPEED_ID_DIE_OF_FATE "DIE_OF_FATE"
|
||||
|
||||
#define MOVESPEED_ID_SHOVE "SHOVE"
|
||||
#define MOVESPEED_ID_SHOVE "SHOVE"
|
||||
|
||||
@@ -103,3 +103,13 @@
|
||||
#define RADIO_MAGNETS "magnets"
|
||||
|
||||
#define DEFAULT_SIGNALER_CODE 30
|
||||
|
||||
//Requests Console
|
||||
#define REQ_NO_NEW_MESSAGE 0
|
||||
#define REQ_NORMAL_MESSAGE_PRIORITY 1
|
||||
#define REQ_HIGH_MESSAGE_PRIORITY 2
|
||||
#define REQ_EXTREME_MESSAGE_PRIORITY 3
|
||||
|
||||
#define REQ_DEP_TYPE_ASSISTANCE (1<<0)
|
||||
#define REQ_DEP_TYPE_SUPPLIES (1<<1)
|
||||
#define REQ_DEP_TYPE_INFORMATION (1<<2)
|
||||
|
||||
@@ -122,3 +122,7 @@
|
||||
|
||||
#define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic
|
||||
#define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor
|
||||
|
||||
// Stasis helpers
|
||||
|
||||
#define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS))
|
||||
|
||||
@@ -136,6 +136,7 @@
|
||||
#define TRAIT_BOOZE_SLIDER "booze-slider"
|
||||
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
|
||||
#define TRAIT_UNSTABLE "unstable"
|
||||
#define TRAIT_OIL_FRIED "oil_fried"
|
||||
|
||||
//non-mob traits
|
||||
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
|
||||
|
||||
@@ -8,12 +8,6 @@
|
||||
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))
|
||||
#define CULT_POLL_WAIT 2400
|
||||
|
||||
/proc/get_area(atom/A)
|
||||
if(isarea(A))
|
||||
return A
|
||||
var/turf/T = get_turf(A)
|
||||
return T ? T.loc : null
|
||||
|
||||
/proc/get_area_name(atom/X, format_text = FALSE)
|
||||
var/area/A = isarea(X) ? X : get_area(X)
|
||||
if(!A)
|
||||
|
||||
@@ -157,6 +157,10 @@ GLOBAL_VAR(command_name)
|
||||
GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors.
|
||||
GLOBAL_VAR(syndicate_code_response) //Code response for traitors.
|
||||
|
||||
//Cached regex search - for checking if codewords are used.
|
||||
GLOBAL_DATUM(syndicate_code_phrase_regex, /regex)
|
||||
GLOBAL_DATUM(syndicate_code_response_regex, /regex)
|
||||
|
||||
/*
|
||||
Should be expanded.
|
||||
How this works:
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
/proc/chem_recipes_do_conflict(datum/chemical_reaction/r1, datum/chemical_reaction/r2)
|
||||
//do the non-list tests first, because they are cheaper
|
||||
if(r1.required_container != r2.required_container)
|
||||
return FALSE
|
||||
if(r1.is_cold_recipe == r2.is_cold_recipe)
|
||||
if(r1.required_temp != r2.required_temp)
|
||||
//one reaction requires a more extreme temperature than the other, so there is no conflict
|
||||
return FALSE
|
||||
else
|
||||
var/datum/chemical_reaction/cold_one = r1.is_cold_recipe ? r1 : r2
|
||||
var/datum/chemical_reaction/warm_one = r1.is_cold_recipe ? r2 : r1
|
||||
if(cold_one.required_temp < warm_one.required_temp)
|
||||
//the range of temperatures does not overlap, so there is no conflict
|
||||
return FALSE
|
||||
|
||||
//find the reactions with the shorter and longer required_reagents list
|
||||
var/datum/chemical_reaction/long_req
|
||||
var/datum/chemical_reaction/short_req
|
||||
if(r1.required_reagents.len > r2.required_reagents.len)
|
||||
long_req = r1
|
||||
short_req = r2
|
||||
else if(r1.required_reagents.len < r2.required_reagents.len)
|
||||
long_req = r2
|
||||
short_req = r1
|
||||
else
|
||||
//if they are the same length, sort instead by the length of the catalyst list
|
||||
//this is important if the required_reagents lists are the same
|
||||
if(r1.required_catalysts.len > r2.required_catalysts.len)
|
||||
long_req = r1
|
||||
short_req = r2
|
||||
else
|
||||
long_req = r2
|
||||
short_req = r1
|
||||
|
||||
|
||||
//check if the shorter reaction list is a subset of the longer one
|
||||
var/list/overlap = r1.required_reagents & r2.required_reagents
|
||||
if(overlap.len != short_req.required_reagents.len)
|
||||
//there is at least one reagent in the short list that is not in the long list, so there is no conflict
|
||||
return FALSE
|
||||
|
||||
//check to see if the shorter reaction's catalyst list is also a subset of the longer reaction's catalyst list
|
||||
//if the longer reaction's catalyst list is a subset of the shorter ones, that is fine
|
||||
//if the reaction lists are the same, the short reaction will have the shorter required_catalysts list, so it will register as a conflict
|
||||
var/list/short_minus_long_catalysts = short_req.required_catalysts - long_req.required_catalysts
|
||||
if(short_minus_long_catalysts.len)
|
||||
//there is at least one unique catalyst for the short reaction, so there is no conflict
|
||||
return FALSE
|
||||
|
||||
//if we got this far, the longer reaction will be impossible to create if the shorter one is earlier in GLOB.chemical_reactions_list, and will require the reagents to be added in a particular order otherwise
|
||||
return TRUE
|
||||
|
||||
/proc/get_chemical_reaction(id)
|
||||
if(!GLOB.chemical_reactions_list)
|
||||
return
|
||||
for(var/reagent in GLOB.chemical_reactions_list)
|
||||
for(var/datum/chemical_reaction/R in GLOB.chemical_reactions_list[reagent])
|
||||
if(R.id == id)
|
||||
return R
|
||||
|
||||
/proc/remove_chemical_reaction(datum/chemical_reaction/R)
|
||||
if(!GLOB.chemical_reactions_list || !R)
|
||||
return
|
||||
for(var/rid in R.required_reagents)
|
||||
GLOB.chemical_reactions_list[rid] -= R
|
||||
|
||||
//see build_chemical_reactions_list in holder.dm for explanations
|
||||
/proc/add_chemical_reaction(datum/chemical_reaction/R)
|
||||
if(!GLOB.chemical_reactions_list || !R.id || !R.required_reagents || !R.required_reagents.len)
|
||||
return
|
||||
var/primary_reagent = R.required_reagents[1]
|
||||
if(!GLOB.chemical_reactions_list[primary_reagent])
|
||||
GLOB.chemical_reactions_list[primary_reagent] = list()
|
||||
GLOB.chemical_reactions_list[primary_reagent] += R
|
||||
@@ -89,3 +89,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
|
||||
if(hour)
|
||||
hourT = " and [hour] hour[(hour != 1)? "s":""]"
|
||||
return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]"
|
||||
|
||||
|
||||
/proc/daysSince(realtimev)
|
||||
return round((world.realtime - realtimev) / (24 HOURS))
|
||||
|
||||
@@ -1129,6 +1129,27 @@ B --><-- A
|
||||
/proc/get_random_station_turf()
|
||||
return safepick(get_area_turfs(pick(GLOB.the_station_areas)))
|
||||
|
||||
/proc/get_safe_random_station_turf()
|
||||
for (var/i in 1 to 5)
|
||||
var/list/L = get_area_turfs(pick(GLOB.the_station_areas))
|
||||
var/turf/target
|
||||
while (L.len && !target)
|
||||
var/I = rand(1, L.len)
|
||||
var/turf/T = L[I]
|
||||
if(!T.density)
|
||||
var/clear = TRUE
|
||||
for(var/obj/O in T)
|
||||
if(O.density)
|
||||
clear = FALSE
|
||||
break
|
||||
if(clear)
|
||||
target = T
|
||||
if (!target)
|
||||
L.Cut(I,I+1)
|
||||
if (target)
|
||||
return target
|
||||
|
||||
|
||||
/proc/get_closest_atom(type, list, source)
|
||||
var/closest_atom
|
||||
var/closest_distance
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
#define POLL_IGNORE_SWARMER "swarmer"
|
||||
#define POLL_IGNORE_DRONE "drone"
|
||||
#define POLL_IGNORE_FUGITIVE "fugitive"
|
||||
#define POLL_IGNORE_DEFECTIVECLONE "defective_clone"
|
||||
#define POLL_IGNORE_PYROSLIME "slime"
|
||||
#define POLL_IGNORE_SHADE "shade"
|
||||
#define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend"
|
||||
#define POLL_IGNORE_SPLITPERSONALITY "split_personality"
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(poll_ignore_desc, list(
|
||||
POLL_IGNORE_SENTIENCE_POTION = "Sentience potion",
|
||||
@@ -30,6 +36,11 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
|
||||
POLL_IGNORE_SWARMER = "Swarmer shells",
|
||||
POLL_IGNORE_DRONE = "Drone shells",
|
||||
POLL_IGNORE_FUGITIVE = "Fugitive Hunter",
|
||||
POLL_IGNORE_DEFECTIVECLONE = "Defective clone",
|
||||
POLL_IGNORE_PYROSLIME = "Slime",
|
||||
POLL_IGNORE_SHADE = "Shade",
|
||||
POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend",
|
||||
POLL_IGNORE_SPLITPERSONALITY = "Split Personality",
|
||||
))
|
||||
GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore())
|
||||
|
||||
|
||||
@@ -18,3 +18,12 @@ GLOBAL_LIST_EMPTY(powernets)
|
||||
GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes
|
||||
|
||||
GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details
|
||||
|
||||
// All religion stuff
|
||||
GLOBAL_VAR(religion)
|
||||
GLOBAL_VAR(deity)
|
||||
GLOBAL_VAR(bible_name)
|
||||
GLOBAL_VAR(bible_icon_state)
|
||||
GLOBAL_VAR(bible_item_state)
|
||||
GLOBAL_VAR(holy_weapon_type)
|
||||
GLOBAL_VAR(holy_armor_type)
|
||||
|
||||
@@ -102,20 +102,6 @@
|
||||
/obj/screen/click_catcher/IsAutoclickable()
|
||||
. = 1
|
||||
|
||||
//Please don't roast me too hard
|
||||
/client/MouseMove(object,location,control,params)
|
||||
mouseParams = params
|
||||
mouseLocation = location
|
||||
mouseObject = object
|
||||
mouseControlObject = control
|
||||
if(mob && LAZYLEN(mob.mousemove_intercept_objects))
|
||||
for(var/datum/D in mob.mousemove_intercept_objects)
|
||||
D.onMouseMove(object, location, control, params)
|
||||
..()
|
||||
|
||||
/datum/proc/onMouseMove(object, location, control, params)
|
||||
return
|
||||
|
||||
/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
|
||||
var/list/L = params2list(params)
|
||||
if (L["middle"])
|
||||
@@ -143,4 +129,4 @@
|
||||
if (middragatom == src_object)
|
||||
middragtime = 0
|
||||
middragatom = null
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -146,6 +146,11 @@
|
||||
#define ui_pai_rest "SOUTH:6,WEST+3"
|
||||
#define ui_pai_light "SOUTH:6,WEST+4"
|
||||
#define ui_pai_newscaster "SOUTH:6,WEST+5"
|
||||
#define ui_pai_host_monitor "SOUTH:6,WEST+6"
|
||||
#define ui_pai_crew_manifest "SOUTH:6,WEST+7"
|
||||
#define ui_pai_state_laws "SOUTH:6,WEST+8"
|
||||
#define ui_pai_pda_send "SOUTH:6,WEST+9"
|
||||
#define ui_pai_pda_log "SOUTH:6,WEST+10"
|
||||
#define ui_pai_take_picture "SOUTH:6,WEST+12"
|
||||
#define ui_pai_view_images "SOUTH:6,WEST+13"
|
||||
|
||||
|
||||
@@ -93,8 +93,8 @@
|
||||
|
||||
/obj/screen/blob/ReadaptStrain
|
||||
icon_state = "ui_chemswap"
|
||||
name = "Readapt Chemical (40)"
|
||||
desc = "Randomly rerolls your chemical for 40 resources."
|
||||
name = "Readapt Strain (40)"
|
||||
desc = "Allows you to choose a new strain from 4 random choices for 40 resources."
|
||||
|
||||
/obj/screen/blob/ReadaptStrain/MouseEntered(location,control,params)
|
||||
if(hud && hud.mymob && isovermind(hud.mymob))
|
||||
|
||||
@@ -84,19 +84,29 @@
|
||||
..()
|
||||
owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
|
||||
|
||||
var/widescreen_layout = FALSE
|
||||
if(owner.client?.prefs?.widescreenpref)
|
||||
widescreen_layout = TRUE
|
||||
|
||||
var/obj/screen/using
|
||||
var/obj/screen/inventory/inv_box
|
||||
|
||||
using = new /obj/screen/craft
|
||||
using.icon = ui_style
|
||||
if(!widescreen_layout)
|
||||
using.screen_loc = UI_BOXCRAFT
|
||||
static_inventory += using
|
||||
|
||||
using = new/obj/screen/language_menu
|
||||
using.icon = ui_style
|
||||
if(!widescreen_layout)
|
||||
using.screen_loc = UI_BOXLANG
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/area_creator
|
||||
using.icon = ui_style
|
||||
if(!widescreen_layout)
|
||||
using.screen_loc = UI_BOXAREA
|
||||
static_inventory += using
|
||||
|
||||
action_intent = new /obj/screen/act_intent/segmented
|
||||
|
||||
+143
-19
@@ -1,17 +1,25 @@
|
||||
#define PAI_MISSING_SOFTWARE_MESSAGE "<span class='warning'>You must download the required software to use this.</span>"
|
||||
|
||||
/obj/screen/pai
|
||||
icon = 'icons/mob/screen_pai.dmi'
|
||||
var/required_software
|
||||
|
||||
/obj/screen/pai/Click()
|
||||
if(isobserver(usr) || usr.incapacitated())
|
||||
return TRUE
|
||||
return FALSE
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
if(required_software && !pAI.software.Find(required_software))
|
||||
to_chat(pAI, PAI_MISSING_SOFTWARE_MESSAGE)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/screen/pai/software
|
||||
name = "Software Interface"
|
||||
icon_state = "pai"
|
||||
|
||||
|
||||
/obj/screen/pai/software/Click()
|
||||
..()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.paiInterface()
|
||||
|
||||
@@ -20,7 +28,8 @@
|
||||
icon_state = "pai_holoform"
|
||||
|
||||
/obj/screen/pai/shell/Click()
|
||||
..()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
if(pAI.holoform)
|
||||
pAI.fold_in(0)
|
||||
@@ -32,7 +41,8 @@
|
||||
icon_state = "pai_chassis"
|
||||
|
||||
/obj/screen/pai/chassis/Click()
|
||||
..()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.choose_chassis()
|
||||
|
||||
@@ -41,7 +51,8 @@
|
||||
icon_state = "pai_rest"
|
||||
|
||||
/obj/screen/pai/rest/Click()
|
||||
..()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.lay_down()
|
||||
|
||||
@@ -50,41 +61,114 @@
|
||||
icon_state = "light"
|
||||
|
||||
/obj/screen/pai/light/Click()
|
||||
..()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.toggle_integrated_light()
|
||||
|
||||
/obj/screen/pai/newscaster
|
||||
name = "pAI Newscaster"
|
||||
icon_state = "newscaster"
|
||||
required_software = "newscaster"
|
||||
|
||||
/obj/screen/pai/newscaster/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.newscaster.ui_interact(usr)
|
||||
|
||||
/obj/screen/pai/host_monitor
|
||||
name = "Host Health Scan"
|
||||
icon_state = "host_monitor"
|
||||
required_software = "host scan"
|
||||
|
||||
/obj/screen/pai/host_monitor/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
if(iscarbon(pAI.card.loc))
|
||||
pAI.hostscan.attack(pAI.card.loc, pAI)
|
||||
else
|
||||
to_chat(src, "You are not being carried by anyone!")
|
||||
return 0
|
||||
|
||||
/obj/screen/pai/crew_manifest
|
||||
name = "Crew Manifest"
|
||||
icon_state = "manifest"
|
||||
required_software = "crew manifest"
|
||||
|
||||
/obj/screen/pai/crew_manifest/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.ai_roster()
|
||||
|
||||
/obj/screen/pai/state_laws
|
||||
name = "State Laws"
|
||||
icon_state = "state_laws"
|
||||
|
||||
/obj/screen/pai/state_laws/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.checklaws()
|
||||
|
||||
/obj/screen/pai/pda_msg_send
|
||||
name = "PDA - Send Message"
|
||||
icon_state = "pda_send"
|
||||
required_software = "digital messenger"
|
||||
|
||||
/obj/screen/pai/pda_msg_send/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.cmd_send_pdamesg(usr)
|
||||
|
||||
/obj/screen/pai/pda_msg_show
|
||||
name = "PDA - Show Message Log"
|
||||
icon_state = "pda_receive"
|
||||
required_software = "digital messenger"
|
||||
|
||||
/obj/screen/pai/pda_msg_show/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.cmd_show_message_log(usr)
|
||||
|
||||
/obj/screen/pai/image_take
|
||||
name = "Take Image"
|
||||
icon_state = "take_picture"
|
||||
required_software = "photography module"
|
||||
|
||||
/obj/screen/pai/image_take/Click()
|
||||
if(..())
|
||||
if(!..())
|
||||
return
|
||||
if(issilicon(usr))
|
||||
var/mob/living/silicon/ai/pAI = usr
|
||||
pAI.aicamera.toggle_camera_mode(usr)
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.aicamera.toggle_camera_mode(usr)
|
||||
|
||||
/obj/screen/pai/image_view
|
||||
name = "View Images"
|
||||
icon_state = "view_images"
|
||||
required_software = "photography module"
|
||||
|
||||
/obj/screen/pai/image_view/Click()
|
||||
if(..())
|
||||
if(!..())
|
||||
return
|
||||
if(issilicon(usr))
|
||||
var/mob/living/silicon/ai/pAI = usr
|
||||
pAI.aicamera.viewpictures(usr)
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.aicamera.viewpictures(usr)
|
||||
|
||||
/datum/hud/pai/New(mob/owner)
|
||||
/obj/screen/pai/radio
|
||||
name = "radio"
|
||||
icon = 'icons/mob/screen_cyborg.dmi'
|
||||
icon_state = "radio"
|
||||
|
||||
/obj/screen/pai/radio/Click()
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/silicon/pai/pAI = usr
|
||||
pAI.radio.interact(usr)
|
||||
|
||||
/datum/hud/pai/New(mob/living/silicon/pai/owner)
|
||||
..()
|
||||
var/obj/screen/using
|
||||
|
||||
@@ -123,12 +207,52 @@
|
||||
using.screen_loc = ui_borg_language_menu
|
||||
static_inventory += using
|
||||
|
||||
//Take image
|
||||
// Host Monitor
|
||||
using = new /obj/screen/pai/host_monitor()
|
||||
using.screen_loc = ui_pai_host_monitor
|
||||
static_inventory += using
|
||||
|
||||
// Crew Manifest
|
||||
using = new /obj/screen/pai/crew_manifest()
|
||||
using.screen_loc = ui_pai_crew_manifest
|
||||
static_inventory += using
|
||||
|
||||
// Laws
|
||||
using = new /obj/screen/pai/state_laws()
|
||||
using.screen_loc = ui_pai_state_laws
|
||||
static_inventory += using
|
||||
|
||||
// PDA message
|
||||
using = new /obj/screen/pai/pda_msg_send()
|
||||
using.screen_loc = ui_pai_pda_send
|
||||
static_inventory += using
|
||||
|
||||
// PDA log
|
||||
using = new /obj/screen/pai/pda_msg_show()
|
||||
using.screen_loc = ui_pai_pda_log
|
||||
static_inventory += using
|
||||
|
||||
// Take image
|
||||
using = new /obj/screen/pai/image_take()
|
||||
using.screen_loc = ui_pai_take_picture
|
||||
static_inventory += using
|
||||
|
||||
//View images
|
||||
// View images
|
||||
using = new /obj/screen/pai/image_view()
|
||||
using.screen_loc = ui_pai_view_images
|
||||
static_inventory += using
|
||||
static_inventory += using
|
||||
|
||||
// Radio
|
||||
using = new /obj/screen/pai/radio()
|
||||
using.screen_loc = ui_borg_radio
|
||||
static_inventory += using
|
||||
|
||||
update_software_buttons()
|
||||
|
||||
/datum/hud/pai/proc/update_software_buttons()
|
||||
var/mob/living/silicon/pai/owner = mymob
|
||||
for(var/obj/screen/pai/button in static_inventory)
|
||||
if(button.required_software)
|
||||
button.color = owner.software.Find(button.required_software) ? null : "#808080"
|
||||
|
||||
#undef PAI_MISSING_SOFTWARE_MESSAGE
|
||||
|
||||
@@ -213,7 +213,6 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
choices_icons.Cut()
|
||||
choices_values.Cut()
|
||||
current_page = 1
|
||||
QDEL_NULL(custom_check_callback)
|
||||
|
||||
/datum/radial_menu/proc/element_chosen(choice_id,mob/user)
|
||||
selected_choice = choices_values[choice_id]
|
||||
@@ -278,7 +277,9 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
/datum/radial_menu/Destroy()
|
||||
Reset()
|
||||
hide()
|
||||
QDEL_NULL(custom_check_callback)
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen)
|
||||
Choices should be a list where list keys are movables or text used for element names and return value
|
||||
@@ -307,4 +308,4 @@ GLOBAL_LIST_EMPTY(radial_menus)
|
||||
var/answer = menu.selected_choice
|
||||
qdel(menu)
|
||||
GLOB.radial_menus -= uniqueid
|
||||
return answer
|
||||
return answer
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked
|
||||
*/
|
||||
|
||||
/obj/screen/radial/persistent/center
|
||||
name = "Close Menu"
|
||||
icon_state = "radial_center"
|
||||
|
||||
/obj/screen/radial/persistent/center/Click(location, control, params)
|
||||
if(usr.client == parent.current_user)
|
||||
parent.element_chosen(null,usr)
|
||||
|
||||
/obj/screen/radial/persistent/center/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_center_focus"
|
||||
|
||||
/obj/screen/radial/persistent/center/MouseExited(location, control, params)
|
||||
. = ..()
|
||||
icon_state = "radial_center"
|
||||
|
||||
|
||||
|
||||
/datum/radial_menu/persistent
|
||||
var/uniqueid
|
||||
var/datum/callback/select_proc_callback
|
||||
|
||||
/datum/radial_menu/persistent/New()
|
||||
close_button = new /obj/screen/radial/persistent/center
|
||||
close_button.parent = src
|
||||
|
||||
|
||||
/datum/radial_menu/persistent/element_chosen(choice_id,mob/user)
|
||||
select_proc_callback.Invoke(choices_values[choice_id])
|
||||
|
||||
|
||||
/datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips)
|
||||
if(!newchoices.len)
|
||||
return
|
||||
Reset()
|
||||
set_choices(newchoices,tooltips)
|
||||
|
||||
/datum/radial_menu/persistent/Destroy()
|
||||
QDEL_NULL(select_proc_callback)
|
||||
GLOB.radial_menus -= uniqueid
|
||||
Reset()
|
||||
hide()
|
||||
. = ..()
|
||||
|
||||
/*
|
||||
Creates a persistent radial menu and shows it to the user, anchored to anchor (or user if the anchor is currently in users screen).
|
||||
Choices should be a list where list keys are movables or text used for element names and return value
|
||||
and list values are movables/icons/images used for element icons
|
||||
Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument
|
||||
Clicking the center button will return a choice of null
|
||||
*/
|
||||
/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE)
|
||||
if(!user || !anchor || !length(choices) || !select_proc)
|
||||
return
|
||||
if(!uniqueid)
|
||||
uniqueid = "defmenu_[REF(user)]_[REF(anchor)]"
|
||||
|
||||
if(GLOB.radial_menus[uniqueid])
|
||||
return
|
||||
|
||||
var/datum/radial_menu/persistent/menu = new
|
||||
menu.uniqueid = uniqueid
|
||||
GLOB.radial_menus[uniqueid] = menu
|
||||
if(radius)
|
||||
menu.radius = radius
|
||||
menu.select_proc_callback = select_proc
|
||||
menu.anchor = anchor
|
||||
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
|
||||
menu.set_choices(choices, tooltips)
|
||||
menu.show_to(user)
|
||||
return menu
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
/mob/dead/observer/DblClickOn(var/atom/A, var/params)
|
||||
/mob/dead/observer/DblClickOn(atom/A, params)
|
||||
if(check_click_intercept(params, A))
|
||||
return
|
||||
|
||||
if(can_reenter_corpse && mind && mind.current)
|
||||
if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it
|
||||
reenter_corpse() // (cloning scanner, body bag, closet, mech, etc)
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
..()
|
||||
if(aicamera.in_camera_mode) //pAI picture taking
|
||||
aicamera.camera_mode_off()
|
||||
aicamera.captureimage(A, usr)
|
||||
aicamera.captureimage(A, usr, null, aicamera.picture_size_x, aicamera.picture_size_y)
|
||||
return
|
||||
|
||||
@@ -462,6 +462,9 @@
|
||||
/datum/config_entry/string/default_view
|
||||
config_entry_value = "15x15"
|
||||
|
||||
/datum/config_entry/string/default_view_square
|
||||
config_entry_value = "15x15"
|
||||
|
||||
/datum/config_entry/flag/log_pictures
|
||||
|
||||
/datum/config_entry/flag/picture_logging_camera
|
||||
|
||||
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(dbcore)
|
||||
wait = 1 MINUTES
|
||||
init_order = INIT_ORDER_DBCORE
|
||||
var/const/FAILED_DB_CONNECTION_CUTOFF = 5
|
||||
var/failed_connection_timeout = 0
|
||||
|
||||
var/schema_mismatch = 0
|
||||
var/db_minor = 0
|
||||
@@ -64,7 +65,11 @@ SUBSYSTEM_DEF(dbcore)
|
||||
if(IsConnected())
|
||||
return TRUE
|
||||
|
||||
if(failed_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect anymore.
|
||||
if(failed_connection_timeout <= world.time) //it's been more than 5 seconds since we failed to connect, reset the counter
|
||||
failed_connections = 0
|
||||
|
||||
if(failed_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect for 5 seconds.
|
||||
failed_connection_timeout = world.time + 50
|
||||
return FALSE
|
||||
|
||||
if(!CONFIG_GET(flag/sql_enabled))
|
||||
@@ -323,13 +328,15 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table
|
||||
if(!async)
|
||||
start_time = REALTIMEOFDAY
|
||||
Close()
|
||||
query = connection.BeginQuery(sql)
|
||||
if(!async)
|
||||
timed_out = !query.WaitForCompletion()
|
||||
else
|
||||
in_progress = TRUE
|
||||
UNTIL(query.IsComplete())
|
||||
in_progress = FALSE
|
||||
timed_out = run_query(async)
|
||||
if(query.GetErrorCode() == 2006) //2006 is the return code for "MySQL server has gone away" time-out error, meaning the connection has been lost to the server (if it's still alive)
|
||||
log_sql("Executing query encountered returned a lost database connection (2006).")
|
||||
SSdbcore.Disconnect()
|
||||
if(SSdbcore.Connect()) //connection was restablished, reattempt the query
|
||||
log_sql("Connection restablished")
|
||||
timed_out = run_query(async)
|
||||
else
|
||||
log_sql("Executing query failed to restablish database connection.")
|
||||
skip_next_is_complete = TRUE
|
||||
var/error = QDELETED(query) ? "Query object deleted!" : query.GetError()
|
||||
last_error = error
|
||||
@@ -343,6 +350,15 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table
|
||||
log_query_debug("Query used: [sql]")
|
||||
slow_query_check()
|
||||
|
||||
/datum/DBQuery/proc/run_query(async)
|
||||
query = connection.BeginQuery(sql)
|
||||
if(!async)
|
||||
. = !query.WaitForCompletion()
|
||||
else
|
||||
in_progress = TRUE
|
||||
UNTIL(query.IsComplete())
|
||||
in_progress = FALSE
|
||||
|
||||
/datum/DBQuery/proc/slow_query_check()
|
||||
message_admins("HEY! A database query timed out. Did the server just hang? <a href='?_src_=holder;[HrefToken()];slowquery=yes'>\[YES\]</a>|<a href='?_src_=holder;[HrefToken()];slowquery=no'>\[NO\]</a>")
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ SUBSYSTEM_DEF(economy)
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/economy/fire(resumed = 0)
|
||||
boring_eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows.
|
||||
boring_eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows.
|
||||
boring_sci_payout() // Payout based on slimes.
|
||||
boring_secmedsrv_payout() // Payout based on crew safety, health, and mood.
|
||||
boring_civ_payout() // Payout based on ??? Profit
|
||||
|
||||
@@ -228,7 +228,7 @@ SUBSYSTEM_DEF(job)
|
||||
* fills var "assigned_role" for all ready players.
|
||||
* This proc must not have any side effect besides of modifying "assigned_role".
|
||||
**/
|
||||
/datum/controller/subsystem/job/proc/DivideOccupations()
|
||||
/datum/controller/subsystem/job/proc/DivideOccupations(list/required_jobs)
|
||||
//Setup new player list and get the jobs list
|
||||
JobDebug("Running DO")
|
||||
|
||||
@@ -241,14 +241,14 @@ SUBSYSTEM_DEF(job)
|
||||
|
||||
//Get the players who are ready
|
||||
for(var/mob/dead/new_player/player in GLOB.player_list)
|
||||
if(player.ready == PLAYER_READY_TO_PLAY && player.mind && !player.mind.assigned_role)
|
||||
if(player.ready == PLAYER_READY_TO_PLAY && player.has_valid_preferences() && player.mind && !player.mind.assigned_role)
|
||||
unassigned += player
|
||||
|
||||
initial_players_to_assign = unassigned.len
|
||||
|
||||
JobDebug("DO, Len: [unassigned.len]")
|
||||
if(unassigned.len == 0)
|
||||
return TRUE
|
||||
return validate_required_jobs(required_jobs)
|
||||
|
||||
//Scale number of open security officer slots to population
|
||||
setup_officer_positions()
|
||||
@@ -269,7 +269,7 @@ SUBSYSTEM_DEF(job)
|
||||
//People who wants to be the overflow role, sure, go on.
|
||||
JobDebug("DO, Running Overflow Check 1")
|
||||
var/datum/job/overflow = GetJob(SSjob.overflow_role)
|
||||
var/list/overflow_candidates = FindOccupationCandidates(overflow, 3)
|
||||
var/list/overflow_candidates = FindOccupationCandidates(overflow, JP_LOW)
|
||||
JobDebug("AC1, Candidates: [overflow_candidates.len]")
|
||||
for(var/mob/dead/new_player/player in overflow_candidates)
|
||||
JobDebug("AC1 pass, Player: [player]")
|
||||
@@ -354,7 +354,26 @@ SUBSYSTEM_DEF(job)
|
||||
if(!GiveRandomJob(player))
|
||||
if(!AssignRole(player, SSjob.overflow_role)) //If everything is already filled, make them an assistant
|
||||
return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll
|
||||
return TRUE
|
||||
|
||||
return validate_required_jobs(required_jobs)
|
||||
|
||||
/datum/controller/subsystem/job/proc/validate_required_jobs(list/required_jobs)
|
||||
if(!required_jobs.len)
|
||||
return TRUE
|
||||
for(var/required_group in required_jobs)
|
||||
var/group_ok = TRUE
|
||||
for(var/rank in required_group)
|
||||
var/datum/job/J = GetJob(rank)
|
||||
if(!J)
|
||||
SSticker.mode.setup_error = "Invalid job [rank] in gamemode required jobs."
|
||||
return FALSE
|
||||
if(J.current_positions < required_group[rank])
|
||||
group_ok = FALSE
|
||||
break
|
||||
if(group_ok)
|
||||
return TRUE
|
||||
SSticker.mode.setup_error = "Required jobs not present."
|
||||
return FALSE
|
||||
|
||||
//We couldn't find a job from prefs for this guy.
|
||||
/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player)
|
||||
|
||||
@@ -23,6 +23,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
LoadPhotoPersistence()
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
LoadAntagReputation()
|
||||
LoadRandomizedRecipes()
|
||||
return ..()
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadPoly()
|
||||
@@ -146,6 +147,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
if(CONFIG_GET(flag/use_antag_rep))
|
||||
CollectAntagReputation()
|
||||
SaveRandomizedRecipes()
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/GetPhotoAlbums()
|
||||
var/album_path = file("data/photo_albums.json")
|
||||
@@ -282,3 +284,46 @@ SUBSYSTEM_DEF(persistence)
|
||||
fdel(FILE_ANTAG_REP)
|
||||
text2file(json_encode(antag_rep), FILE_ANTAG_REP)
|
||||
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRandomizedRecipes()
|
||||
var/json_file = file("data/RandomizedChemRecipes.json")
|
||||
var/json
|
||||
if(fexists(json_file))
|
||||
json = json_decode(file2text(json_file))
|
||||
|
||||
for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized))
|
||||
var/datum/chemical_reaction/randomized/R = new randomized_type
|
||||
var/loaded = FALSE
|
||||
if(R.persistent && json)
|
||||
var/list/recipe_data = json[R.id]
|
||||
if(recipe_data)
|
||||
var/creation_time = text2num(recipe_data["timestamp"])
|
||||
if((daysSince(creation_time) <= R.persistence_period) && R.LoadOldRecipe(recipe_data))
|
||||
loaded = TRUE
|
||||
if(!loaded) //We do not have information for whatever reason, just generate new one
|
||||
R.GenerateRecipe()
|
||||
|
||||
if(!R.HasConflicts()) //Might want to try again if conflicts happened in the future.
|
||||
add_chemical_reaction(R)
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/SaveRandomizedRecipes()
|
||||
var/json_file = file("data/RandomizedChemRecipes.json")
|
||||
var/list/file_data = list()
|
||||
|
||||
//asert globchems done
|
||||
for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized))
|
||||
var/datum/chemical_reaction/randomized/R = randomized_type
|
||||
R = get_chemical_reaction(initial(R.id)) //ew, would be nice to add some simple tracking
|
||||
if(R && R.persistent && R.id)
|
||||
var/recipe_data = list()
|
||||
recipe_data["timestamp"] = world.realtime
|
||||
recipe_data["required_reagents"] = R.required_reagents
|
||||
recipe_data["required_catalysts"] = R.required_catalysts
|
||||
recipe_data["required_temp"] = R.required_temp
|
||||
recipe_data["is_cold_recipe"] = R.is_cold_recipe
|
||||
recipe_data["results"] = R.results
|
||||
recipe_data["required_container"] = "[R.required_container]"
|
||||
file_data["[R.id]"] = recipe_data
|
||||
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
@@ -1,11 +0,0 @@
|
||||
SUBSYSTEM_DEF(religion)
|
||||
name = "Religion"
|
||||
flags = SS_NO_FIRE|SS_NO_INIT
|
||||
|
||||
var/religion
|
||||
var/deity
|
||||
var/bible_name
|
||||
var/bible_icon_state
|
||||
var/bible_item_state
|
||||
var/holy_weapon_type
|
||||
var/holy_armor_type
|
||||
@@ -37,7 +37,7 @@ SUBSYSTEM_DEF(server_maint)
|
||||
var/cmob = C.mob
|
||||
if (!isnewplayer(cmob) || !SSticker.queued_players.Find(cmob))
|
||||
log_access("AFK: [key_name(C)]")
|
||||
to_chat(C, "<span class='userdanger'>You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.</span><br><span class='danger'You may reconnect via the button in the file menu or by <b><u><a href='byond://winset?command=.reconnect'>clicking here to reconnect</a></b></u></span>")
|
||||
to_chat(C, "<span class='userdanger'>You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.</span><br><span class='danger'>You may reconnect via the button in the file menu or by <b><u><a href='byond://winset?command=.reconnect'>clicking here to reconnect</a></u></b>.</span>")
|
||||
QDEL_IN(C, 1) //to ensure they get our message before getting disconnected
|
||||
continue
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@ SUBSYSTEM_DEF(throwing)
|
||||
/datum/thrownthing/proc/hitcheck()
|
||||
for (var/thing in get_turf(thrownthing))
|
||||
var/atom/movable/AM = thing
|
||||
if (AM == thrownthing)
|
||||
if (AM == thrownthing || (AM == thrower && !ismob(thrownthing)))
|
||||
continue
|
||||
if (AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1))
|
||||
finalize(hit=TRUE, target=AM)
|
||||
|
||||
@@ -117,9 +117,20 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
|
||||
if(!GLOB.syndicate_code_phrase)
|
||||
GLOB.syndicate_code_phrase = generate_code_phrase()
|
||||
GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE)
|
||||
|
||||
var/codewords = jointext(GLOB.syndicate_code_phrase, "|")
|
||||
var/regex/codeword_match = new("([codewords])", "ig")
|
||||
|
||||
GLOB.syndicate_code_phrase_regex = codeword_match
|
||||
|
||||
if(!GLOB.syndicate_code_response)
|
||||
GLOB.syndicate_code_response = generate_code_phrase()
|
||||
GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE)
|
||||
|
||||
var/codewords = jointext(GLOB.syndicate_code_response, "|")
|
||||
var/regex/codeword_match = new("([codewords])", "ig")
|
||||
|
||||
GLOB.syndicate_code_response_regex = codeword_match
|
||||
|
||||
start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10)
|
||||
if(CONFIG_GET(flag/randomize_shift_time))
|
||||
@@ -230,7 +241,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
var/can_continue = 0
|
||||
can_continue = src.mode.pre_setup() //Choose antagonists
|
||||
CHECK_TICK
|
||||
can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs
|
||||
can_continue = can_continue && SSjob.DivideOccupations(mode.required_jobs) //Distribute jobs
|
||||
CHECK_TICK
|
||||
|
||||
if(!GLOB.Debug2)
|
||||
@@ -412,7 +423,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
queued_players.len = 0
|
||||
queue_delay = 0
|
||||
return
|
||||
|
||||
|
||||
queue_delay++
|
||||
var/mob/dead/new_player/next_in_line = queued_players[1]
|
||||
|
||||
|
||||
@@ -199,11 +199,16 @@
|
||||
/datum/action/item_action/toggle_firemode
|
||||
name = "Toggle Firemode"
|
||||
|
||||
/datum/action/item_action/rcl
|
||||
/datum/action/item_action/rcl_col
|
||||
name = "Change Cable Color"
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
button_icon_state = "rcl_rainbow"
|
||||
|
||||
/datum/action/item_action/rcl_gui
|
||||
name = "Toggle Fast Wiring Gui"
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
button_icon_state = "rcl_gui"
|
||||
|
||||
/datum/action/item_action/startchainsaw
|
||||
name = "Pull The Starting Cord"
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
/datum/brain_trauma/special/imaginary_friend/proc/get_ghost()
|
||||
set waitfor = FALSE
|
||||
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend)
|
||||
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND)
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
friend.key = C.key
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
/datum/brain_trauma/severe/split_personality/proc/get_ghost()
|
||||
set waitfor = FALSE
|
||||
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat)
|
||||
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY)
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
stranger_backseat.key = C.key
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
/datum/component/anti_magic
|
||||
var/magic = FALSE
|
||||
var/holy = FALSE
|
||||
var/psychic = FALSE
|
||||
var/allowed_slots = ITEM_SLOT_BACK|ITEM_SLOT_MASK|ITEM_SLOT_NECK|ITEM_SLOT_BELT|ITEM_SLOT_ID|ITEM_SLOT_EARS|ITEM_SLOT_EYES|ITEM_SLOT_GLOVES|ITEM_SLOT_HEAD|ITEM_SLOT_FEET|ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING|ITEM_SLOT_POCKET
|
||||
var/charges = INFINITY
|
||||
var/blocks_self = TRUE
|
||||
var/datum/callback/reaction
|
||||
var/datum/callback/expire
|
||||
|
||||
/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire)
|
||||
/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _psychic = FALSE, _allowed_slots, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire)
|
||||
if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
|
||||
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
|
||||
@@ -17,6 +19,9 @@
|
||||
|
||||
magic = _magic
|
||||
holy = _holy
|
||||
psychic = _psychic
|
||||
if(_allowed_slots)
|
||||
allowed_slots = _allowed_slots
|
||||
if(!isnull(_charges))
|
||||
charges = _charges
|
||||
blocks_self = _blocks_self
|
||||
@@ -24,7 +29,7 @@
|
||||
expire = _expire
|
||||
|
||||
/datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot)
|
||||
if(slot == SLOT_IN_BACKPACK)
|
||||
if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot)))
|
||||
UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC)
|
||||
return
|
||||
RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE)
|
||||
@@ -32,13 +37,12 @@
|
||||
/datum/component/anti_magic/proc/on_drop(datum/source, mob/user)
|
||||
UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC)
|
||||
|
||||
/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, major, self, list/protection_sources)
|
||||
if(((_magic && magic) || (_holy && holy)) && (!self || blocks_self))
|
||||
/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, _psychic, chargecost, self, list/protection_sources)
|
||||
if(((_magic && magic) || (_holy && holy) || (_psychic && psychic)) && (!self || blocks_self))
|
||||
protection_sources += parent
|
||||
reaction?.Invoke(user, major)
|
||||
if(major)
|
||||
charges--
|
||||
if(charges <= 0)
|
||||
expire?.Invoke(user)
|
||||
reaction?.Invoke(user, chargecost)
|
||||
charges -= chargecost
|
||||
if(charges <= 0)
|
||||
expire?.Invoke(user)
|
||||
return COMPONENT_BLOCK_MAGIC
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/datum/component/bane
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
|
||||
var/mobtype
|
||||
var/speciestype
|
||||
var/damage_multiplier
|
||||
|
||||
/datum/component/bane/Initialize(mobtype, damage_multiplier=1)
|
||||
if(!isitem(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
if(ispath(mobtype, /mob/living))
|
||||
src.mobtype = mobtype
|
||||
else if(ispath(mobtype, /datum/species))
|
||||
speciestype = mobtype
|
||||
else
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.damage_multiplier = damage_multiplier
|
||||
|
||||
/datum/component/bane/RegisterWithParent()
|
||||
if(speciestype)
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/speciesCheck)
|
||||
else
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/mobCheck)
|
||||
|
||||
/datum/component/bane/UnregisterFromParent()
|
||||
UnregisterSignal(parent, COMSIG_ITEM_AFTERATTACK)
|
||||
|
||||
/datum/component/bane/proc/speciesCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!is_species(target, speciestype))
|
||||
return
|
||||
activate(source, target, user)
|
||||
|
||||
/datum/component/bane/proc/mobCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!istype(target, mobtype))
|
||||
return
|
||||
activate(source, target, user)
|
||||
|
||||
/datum/component/bane/proc/activate(obj/item/source, mob/living/target, mob/attacker)
|
||||
if(attacker.a_intent != INTENT_HARM)
|
||||
return
|
||||
|
||||
var/extra_damage = max(0, source.force * damage_multiplier)
|
||||
target.apply_damage(extra_damage, source.damtype, attacker.zone_selected)
|
||||
@@ -0,0 +1,140 @@
|
||||
/datum/component/fantasy
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
|
||||
var/quality
|
||||
|
||||
var/canFail
|
||||
var/announce
|
||||
|
||||
var/originalName
|
||||
var/list/affixes
|
||||
var/list/appliedComponents
|
||||
|
||||
var/static/list/affixListing
|
||||
|
||||
/datum/component/fantasy/Initialize(quality, list/affixes = list(), canFail=FALSE, announce=FALSE)
|
||||
if(!isitem(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.quality = quality || randomQuality()
|
||||
src.canFail = canFail
|
||||
src.announce = announce
|
||||
|
||||
src.affixes = affixes
|
||||
appliedComponents = list()
|
||||
randomAffixes()
|
||||
|
||||
/datum/component/fantasy/Destroy()
|
||||
unmodify()
|
||||
affixes = null
|
||||
return ..()
|
||||
|
||||
/datum/component/fantasy/RegisterWithParent()
|
||||
var/obj/item/master = parent
|
||||
originalName = master.name
|
||||
modify()
|
||||
|
||||
/datum/component/fantasy/UnregisterFromParent()
|
||||
unmodify()
|
||||
|
||||
/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments)
|
||||
unmodify()
|
||||
if(newComp)
|
||||
quality += newComp.quality
|
||||
canFail = newComp.canFail
|
||||
announce = newComp.announce
|
||||
else
|
||||
arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given
|
||||
quality += arguments[1]
|
||||
canFail = arguments[4] || canFail
|
||||
announce = arguments[5] || announce
|
||||
modify()
|
||||
|
||||
/datum/component/fantasy/proc/randomQuality()
|
||||
var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
|
||||
if(prob(50))
|
||||
quality = -quality
|
||||
return quality
|
||||
|
||||
/datum/component/fantasy/proc/randomAffixes(force)
|
||||
if(!affixListing)
|
||||
affixListing = list()
|
||||
for(var/T in subtypesof(/datum/fantasy_affix))
|
||||
var/datum/fantasy_affix/affix = new T
|
||||
affixListing[affix] = affix.weight
|
||||
|
||||
if(length(affixes))
|
||||
if(!force)
|
||||
return
|
||||
affixes = list()
|
||||
|
||||
var/alignment
|
||||
if(quality >= 0)
|
||||
alignment |= AFFIX_GOOD
|
||||
if(quality <= 0)
|
||||
alignment |= AFFIX_EVIL
|
||||
|
||||
var/usedSlots = NONE
|
||||
for(var/i in 1 to max(1, abs(quality))) // We want at least 1 affix applied
|
||||
var/datum/fantasy_affix/affix = pickweight(affixListing)
|
||||
if(affix.placement & usedSlots)
|
||||
continue
|
||||
if(!(affix.alignment & alignment))
|
||||
continue
|
||||
if(!affix.validate(src))
|
||||
continue
|
||||
affixes += affix
|
||||
usedSlots |= affix.placement
|
||||
|
||||
/datum/component/fantasy/proc/modify()
|
||||
var/obj/item/master = parent
|
||||
|
||||
master.force = max(0, master.force + quality)
|
||||
master.throwforce = max(0, master.throwforce + quality)
|
||||
master.armor = master.armor.modifyAllRatings(quality)
|
||||
|
||||
var/newName = originalName
|
||||
for(var/i in affixes)
|
||||
var/datum/fantasy_affix/affix = i
|
||||
newName = affix.apply(src, newName)
|
||||
|
||||
if(quality != 0)
|
||||
newName = "[newName] [quality > 0 ? "+" : ""][quality]"
|
||||
|
||||
if(canFail && prob((quality - 9)*10))
|
||||
var/turf/place = get_turf(parent)
|
||||
place.visible_message("<span class='danger'>[parent] <span class='inathneq_large'>violently glows blue</span> for a while, then evaporates.</span>")
|
||||
master.burn()
|
||||
return
|
||||
else if(announce)
|
||||
announce()
|
||||
|
||||
master.name = newName
|
||||
|
||||
/datum/component/fantasy/proc/unmodify()
|
||||
var/obj/item/master = parent
|
||||
|
||||
for(var/i in affixes)
|
||||
var/datum/fantasy_affix/affix = i
|
||||
affix.remove(src)
|
||||
for(var/i in appliedComponents)
|
||||
qdel(i)
|
||||
|
||||
master.force = max(0, master.force - quality)
|
||||
master.throwforce = max(0, master.throwforce - quality)
|
||||
master.armor = master.armor.modifyAllRatings(-quality)
|
||||
|
||||
master.name = originalName
|
||||
|
||||
/datum/component/fantasy/proc/announce()
|
||||
var/turf/location = get_turf(parent)
|
||||
var/span
|
||||
var/effect_description
|
||||
if(quality >= 0)
|
||||
span = "<span class='notice'>"
|
||||
effect_description = "<span class='heavy_brass'>shimmering golden glow</span>"
|
||||
else
|
||||
span = "<span class='danger'>"
|
||||
effect_description = "<span class='umbra_emphasis'>mottled black glow</span>"
|
||||
|
||||
location.visible_message("[span][originalName] is covered by a [effect_description] and then transforms into [parent]!</span>")
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/fantasy_affix
|
||||
var/placement // A bitflag of "slots" this affix takes up, for example pre/suffix
|
||||
var/alignment
|
||||
var/weight = 10
|
||||
|
||||
// For those occasional affixes which only make sense in certain circumstances
|
||||
/datum/fantasy_affix/proc/validate(datum/component/fantasy/comp)
|
||||
return TRUE
|
||||
|
||||
/datum/fantasy_affix/proc/apply(datum/component/fantasy/comp, newName)
|
||||
return newName
|
||||
|
||||
/datum/fantasy_affix/proc/remove(datum/component/fantasy/comp)
|
||||
@@ -0,0 +1,68 @@
|
||||
/datum/fantasy_affix/cosmetic_prefixes
|
||||
placement = AFFIX_PREFIX
|
||||
alignment = AFFIX_GOOD | AFFIX_EVIL
|
||||
|
||||
var/list/goodPrefixes
|
||||
var/list/badPrefixes
|
||||
|
||||
/datum/fantasy_affix/cosmetic_prefixes/New()
|
||||
goodPrefixes = list(
|
||||
"greater",
|
||||
"major",
|
||||
"blessed",
|
||||
"superior",
|
||||
"empowered",
|
||||
"honed",
|
||||
"true",
|
||||
"glorious",
|
||||
"robust",
|
||||
)
|
||||
badPrefixes = list(
|
||||
"lesser",
|
||||
"minor",
|
||||
"blighted",
|
||||
"inferior",
|
||||
"enfeebled",
|
||||
"rusted",
|
||||
"unsteady",
|
||||
"tragic",
|
||||
"gimped",
|
||||
"cursed",
|
||||
)
|
||||
|
||||
weight = (length(goodPrefixes) + length(badPrefixes)) * 10
|
||||
|
||||
/datum/fantasy_affix/cosmetic_prefixes/apply(datum/component/fantasy/comp, newName)
|
||||
if(comp.quality > 0 || (comp.quality == 0 && prob(50)))
|
||||
return "[pick(goodPrefixes)] [newName]"
|
||||
else
|
||||
return "[pick(badPrefixes)] [newName]"
|
||||
|
||||
/datum/fantasy_affix/tactical
|
||||
placement = AFFIX_PREFIX
|
||||
alignment = AFFIX_GOOD
|
||||
weight = 1 // Very powerful, no one should have such power
|
||||
|
||||
/datum/fantasy_affix/tactical/apply(datum/component/fantasy/comp, newName)
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/tactical)
|
||||
return "tactical [newName]"
|
||||
|
||||
/datum/fantasy_affix/pyromantic
|
||||
placement = AFFIX_PREFIX
|
||||
alignment = AFFIX_GOOD
|
||||
|
||||
/datum/fantasy_affix/pyromantic/apply(datum/component/fantasy/comp, newName)
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/igniter, CLAMP(comp.quality, 1, 10))
|
||||
return "pyromantic [newName]"
|
||||
|
||||
/datum/fantasy_affix/vampiric
|
||||
placement = AFFIX_PREFIX
|
||||
alignment = AFFIX_GOOD
|
||||
weight = 5
|
||||
|
||||
/datum/fantasy_affix/vampiric/apply(datum/component/fantasy/comp, newName)
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/lifesteal, comp.quality)
|
||||
return "vampiric [newName]"
|
||||
@@ -0,0 +1,169 @@
|
||||
/datum/fantasy_affix/cosmetic_suffixes
|
||||
placement = AFFIX_SUFFIX
|
||||
alignment = AFFIX_GOOD | AFFIX_EVIL
|
||||
|
||||
var/list/goodSuffixes
|
||||
var/list/badSuffixes
|
||||
|
||||
/datum/fantasy_affix/cosmetic_suffixes/New()
|
||||
goodSuffixes = list(
|
||||
"dexterity",
|
||||
"constitution",
|
||||
"intelligence",
|
||||
"wisdom",
|
||||
"charisma",
|
||||
"the forest",
|
||||
"the hills",
|
||||
"the plains",
|
||||
"the sea",
|
||||
"the sun",
|
||||
"the moon",
|
||||
"the void",
|
||||
"the world",
|
||||
"many secrets",
|
||||
"many tales",
|
||||
"many colors",
|
||||
"rending",
|
||||
"sundering",
|
||||
"the night",
|
||||
"the day",
|
||||
)
|
||||
badSuffixes = list(
|
||||
"draining",
|
||||
"burden",
|
||||
"discomfort",
|
||||
"awkwardness",
|
||||
"poor hygiene",
|
||||
"timidity",
|
||||
)
|
||||
|
||||
weight = (length(goodSuffixes) + length(badSuffixes)) * 10
|
||||
|
||||
/datum/fantasy_affix/cosmetic_suffixes/apply(datum/component/fantasy/comp, newName)
|
||||
if(comp.quality > 0 || (comp.quality == 0 && prob(50)))
|
||||
return "[newName] of [pick(goodSuffixes)]"
|
||||
else
|
||||
return "[newName] of [pick(badSuffixes)]"
|
||||
|
||||
//////////// Good suffixes
|
||||
/datum/fantasy_affix/bane
|
||||
placement = AFFIX_SUFFIX
|
||||
alignment = AFFIX_GOOD
|
||||
|
||||
/datum/fantasy_affix/bane/apply(datum/component/fantasy/comp, newName)
|
||||
. = ..()
|
||||
// This is set up to be easy to add to these lists as I expect it will need modifications
|
||||
var/static/list/possible_mobtypes
|
||||
if(!possible_mobtypes)
|
||||
// The base list of allowed mob/species types
|
||||
possible_mobtypes = typecacheof(list(
|
||||
/mob/living/simple_animal,
|
||||
/mob/living/carbon,
|
||||
/datum/species,
|
||||
))
|
||||
// Some particular types to disallow if they're too broad/abstract
|
||||
possible_mobtypes -= list(
|
||||
/mob/living/simple_animal/hostile,
|
||||
)
|
||||
// Some types to remove them and their subtypes
|
||||
possible_mobtypes -= typecacheof(list(
|
||||
/mob/living/carbon/human/species,
|
||||
))
|
||||
|
||||
var/mob/picked_mobtype = pick(possible_mobtypes)
|
||||
// This works even with the species picks since we're only accessing the name
|
||||
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/bane, picked_mobtype)
|
||||
return "[newName] of [initial(picked_mobtype.name)] slaying"
|
||||
|
||||
/datum/fantasy_affix/summoning
|
||||
placement = AFFIX_SUFFIX
|
||||
alignment = AFFIX_GOOD
|
||||
weight = 5
|
||||
|
||||
/datum/fantasy_affix/summoning/apply(datum/component/fantasy/comp, newName)
|
||||
. = ..()
|
||||
// This is set up to be easy to add to these lists as I expect it will need modifications
|
||||
var/static/list/possible_mobtypes
|
||||
if(!possible_mobtypes)
|
||||
// The base list of allowed mob/species types
|
||||
possible_mobtypes = typecacheof(list(
|
||||
/mob/living/simple_animal,
|
||||
/mob/living/carbon,
|
||||
/datum/species,
|
||||
))
|
||||
// Some particular types to disallow if they're too broad/abstract
|
||||
possible_mobtypes -= list(
|
||||
/mob/living/simple_animal/hostile,
|
||||
)
|
||||
// Some types to remove them and their subtypes
|
||||
possible_mobtypes -= typecacheof(list(
|
||||
/mob/living/carbon/human/species,
|
||||
/mob/living/simple_animal/hostile/megafauna,
|
||||
))
|
||||
|
||||
var/mob/picked_mobtype = pick(possible_mobtypes)
|
||||
// This works even with the species picks since we're only accessing the name
|
||||
|
||||
var/obj/item/master = comp.parent
|
||||
var/max_mobs = max(CEILING(comp.quality/2, 1), 1)
|
||||
var/spawn_delay = 300 - 30 * comp.quality
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/summoning, list(picked_mobtype), 100, max_mobs, spawn_delay)
|
||||
return "[newName] of [initial(picked_mobtype.name)] summoning"
|
||||
|
||||
/datum/fantasy_affix/shrapnel
|
||||
placement = AFFIX_SUFFIX
|
||||
alignment = AFFIX_GOOD
|
||||
|
||||
/datum/fantasy_affix/shrapnel/validate(datum/component/fantasy/comp)
|
||||
if(isgun(comp.parent))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/fantasy_affix/shrapnel/apply(datum/component/fantasy/comp, newName)
|
||||
. = ..()
|
||||
// higher means more likely
|
||||
var/list/weighted_projectile_types = list(/obj/item/projectile/meteor = 1,
|
||||
/obj/item/projectile/energy/nuclear_particle = 1,
|
||||
/obj/item/projectile/beam/pulse = 1,
|
||||
/obj/item/projectile/bullet/honker = 15,
|
||||
/obj/item/projectile/temp = 15,
|
||||
/obj/item/projectile/ion = 15,
|
||||
/obj/item/projectile/magic/door = 15,
|
||||
/obj/item/projectile/magic/locker = 15,
|
||||
/obj/item/projectile/magic/fetch = 15,
|
||||
/obj/item/projectile/beam/emitter = 15,
|
||||
/obj/item/projectile/magic/flying = 15,
|
||||
/obj/item/projectile/energy/net = 15,
|
||||
/obj/item/projectile/bullet/incendiary/c9mm = 15,
|
||||
/obj/item/projectile/temp/hot = 15,
|
||||
/obj/item/projectile/beam/disabler = 15)
|
||||
|
||||
var/obj/item/projectile/picked_projectiletype = pickweight(weighted_projectile_types)
|
||||
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/shrapnel, picked_projectiletype)
|
||||
return "[newName] of [initial(picked_projectiletype.name)] shrapnel"
|
||||
|
||||
/datum/fantasy_affix/strength
|
||||
placement = AFFIX_SUFFIX
|
||||
alignment = AFFIX_GOOD
|
||||
|
||||
/datum/fantasy_affix/strength/apply(datum/component/fantasy/comp, newName)
|
||||
. = ..()
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/knockback, CEILING(comp.quality/2, 1), FLOOR(comp.quality/10, 1))
|
||||
return "[newName] of strength"
|
||||
|
||||
//////////// Bad suffixes
|
||||
|
||||
/datum/fantasy_affix/fool
|
||||
placement = AFFIX_SUFFIX
|
||||
alignment = AFFIX_EVIL
|
||||
|
||||
/datum/fantasy_affix/fool/apply(datum/component/fantasy/comp, newName)
|
||||
. = ..()
|
||||
var/obj/item/master = comp.parent
|
||||
comp.appliedComponents += master.AddComponent(/datum/component/squeak/bikehorn)
|
||||
return "[newName] of the fool"
|
||||
@@ -0,0 +1,36 @@
|
||||
/datum/component/igniter
|
||||
var/fire_stacks
|
||||
|
||||
/datum/component/igniter/Initialize(fire_stacks=1)
|
||||
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.fire_stacks = fire_stacks
|
||||
|
||||
/datum/component/igniter/RegisterWithParent()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
|
||||
else if(ishostile(parent))
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/igniter/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/igniter/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!proximity_flag)
|
||||
return
|
||||
do_igniter(target)
|
||||
|
||||
/datum/component/igniter/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
|
||||
do_igniter(target)
|
||||
|
||||
/datum/component/igniter/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
||||
do_igniter(target)
|
||||
|
||||
/datum/component/igniter/proc/do_igniter(atom/target)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
L.adjust_fire_stacks(fire_stacks)
|
||||
L.IgniteMob()
|
||||
@@ -0,0 +1,44 @@
|
||||
/datum/component/knockback
|
||||
var/throw_distance
|
||||
var/throw_anchored
|
||||
|
||||
/datum/component/knockback/Initialize(throw_distance=1, throw_anchored=FALSE)
|
||||
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.throw_distance = throw_distance
|
||||
src.throw_anchored = throw_anchored
|
||||
|
||||
/datum/component/knockback/RegisterWithParent()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
|
||||
else if(ishostile(parent))
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/knockback/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!proximity_flag)
|
||||
return
|
||||
do_knockback(target, user, get_dir(source, target))
|
||||
|
||||
/datum/component/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
|
||||
do_knockback(target, attacker, get_dir(attacker, target))
|
||||
|
||||
/datum/component/knockback/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
||||
do_knockback(target, null, angle2dir(Angle))
|
||||
|
||||
/datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir)
|
||||
if(!ismovableatom(target) || throw_dir == null)
|
||||
return
|
||||
var/atom/movable/throwee = target
|
||||
if(throwee.anchored && !throw_anchored)
|
||||
return
|
||||
if(throw_distance < 0)
|
||||
throw_dir = turn(throw_dir, 180)
|
||||
throw_distance *= -1
|
||||
var/atom/throw_target = get_edge_target_turf(throwee, throw_dir)
|
||||
throwee.safe_throw_at(throw_target, throw_distance, 1, thrower)
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/component/lifesteal
|
||||
var/flat_heal // heals a constant amount every time a hit occurs
|
||||
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
|
||||
|
||||
/datum/component/lifesteal/Initialize(flat_heal=0)
|
||||
if(!isitem(parent) && !ishostile(parent) && !isgun(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.flat_heal = flat_heal
|
||||
|
||||
/datum/component/lifesteal/RegisterWithParent()
|
||||
if(isgun(parent))
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
|
||||
else if(ishostile(parent))
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/lifesteal/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/lifesteal/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!proximity_flag)
|
||||
return
|
||||
do_lifesteal(user, target)
|
||||
|
||||
/datum/component/lifesteal/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
|
||||
do_lifesteal(attacker, target)
|
||||
|
||||
/datum/component/lifesteal/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
||||
do_lifesteal(firer, target)
|
||||
|
||||
/datum/component/lifesteal/proc/do_lifesteal(atom/heal_target, atom/damage_target)
|
||||
if(isliving(heal_target) && isliving(damage_target))
|
||||
var/mob/living/healing = heal_target
|
||||
var/mob/living/damaging = damage_target
|
||||
if(damaging.stat != DEAD)
|
||||
healing.heal_ordered_damage(flat_heal, damage_heal_order)
|
||||
@@ -47,14 +47,10 @@
|
||||
if(icon_state)
|
||||
lock_icon_state = icon_state
|
||||
generate_lock_visuals()
|
||||
var/mob/M = parent
|
||||
LAZYOR(M.mousemove_intercept_objects, src)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/datum/component/lockon_aiming/Destroy()
|
||||
var/mob/M = parent
|
||||
clear_visuals()
|
||||
LAZYREMOVE(M.mousemove_intercept_objects, src)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
return ..()
|
||||
|
||||
@@ -120,27 +116,6 @@
|
||||
return
|
||||
LAZYREMOVE(immune_weakrefs, A.weak_reference)
|
||||
|
||||
/datum/component/lockon_aiming/onMouseMove(object,location,control,params)
|
||||
var/mob/M = parent
|
||||
if(!istype(M) || !M.client)
|
||||
return
|
||||
var/datum/position/P = mouse_absolute_datum_map_position_from_client(M.client)
|
||||
if(!P)
|
||||
return
|
||||
var/turf/T = P.return_turf()
|
||||
LAZYINITLIST(last_location)
|
||||
if(length(last_location) == 3 && last_location[1] == T.x && last_location[2] == T.y && last_location[3] == T.z)
|
||||
return //Same turf, don't bother.
|
||||
if(last_location)
|
||||
last_location.Cut()
|
||||
else
|
||||
last_location = list()
|
||||
last_location.len = 3
|
||||
last_location[1] = T.x
|
||||
last_location[2] = T.y
|
||||
last_location[3] = T.z
|
||||
autolock()
|
||||
|
||||
/datum/component/lockon_aiming/process()
|
||||
if(update_disabled)
|
||||
return
|
||||
|
||||
@@ -249,6 +249,8 @@
|
||||
|
||||
/datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger.
|
||||
var/datum/mood_event/the_event
|
||||
if(!istext(category))
|
||||
category = REF(category)
|
||||
if(mood_events[category])
|
||||
the_event = mood_events[category]
|
||||
if(the_event.type != type)
|
||||
@@ -267,6 +269,8 @@
|
||||
addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||
|
||||
/datum/component/mood/proc/clear_event(datum/source, category)
|
||||
if(!istext(category))
|
||||
category = REF(category)
|
||||
var/datum/mood_event/event = mood_events[category]
|
||||
if(!event)
|
||||
return 0
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_HEAR, .proc/on_hear)
|
||||
RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype)
|
||||
RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal)
|
||||
RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal)
|
||||
|
||||
/datum/component/nanites/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_HAS_NANITES,
|
||||
@@ -77,7 +78,8 @@
|
||||
COMSIG_LIVING_MINOR_SHOCK,
|
||||
COMSIG_MOVABLE_HEAR,
|
||||
COMSIG_SPECIES_GAIN,
|
||||
COMSIG_NANITE_SIGNAL))
|
||||
COMSIG_NANITE_SIGNAL,
|
||||
COMSIG_NANITE_COMM_SIGNAL))
|
||||
|
||||
/datum/component/nanites/Destroy()
|
||||
STOP_PROCESSING(SSnanites, src)
|
||||
@@ -205,6 +207,12 @@
|
||||
var/datum/nanite_program/NP = X
|
||||
NP.receive_signal(code, source)
|
||||
|
||||
/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source")
|
||||
for(var/X in programs)
|
||||
if(istype(X, /datum/nanite_program/triggered/comm))
|
||||
var/datum/nanite_program/triggered/comm/NP = X
|
||||
NP.receive_comm_signal(comm_code, comm_message, comm_source)
|
||||
|
||||
/datum/component/nanites/proc/check_viable_biotype()
|
||||
if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes))
|
||||
qdel(src) //bodytype no longer sustains nanites
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
return
|
||||
|
||||
// No decay if formaldehyde in corpse or when the corpse is charred
|
||||
if(C.reagents.has_reagent("formaldehyde", 15) || HAS_TRAIT(C, TRAIT_HUSK))
|
||||
if(C.reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 15) || HAS_TRAIT(C, TRAIT_HUSK))
|
||||
return
|
||||
|
||||
// Also no decay if corpse chilled or not organic/undead
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/component/shrapnel
|
||||
var/projectile_type
|
||||
var/radius // shoots a projectile for every turf on this radius from the hit target
|
||||
var/override_projectile_range
|
||||
|
||||
/datum/component/shrapnel/Initialize(projectile_type, radius=1, override_projectile_range)
|
||||
if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.projectile_type = projectile_type
|
||||
src.radius = radius
|
||||
src.override_projectile_range = override_projectile_range
|
||||
|
||||
/datum/component/shrapnel/RegisterWithParent()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
|
||||
/datum/component/shrapnel/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/shrapnel/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
||||
do_shrapnel(firer, target)
|
||||
|
||||
/datum/component/shrapnel/proc/do_shrapnel(mob/firer, atom/target)
|
||||
if(radius < 1)
|
||||
return
|
||||
var/turf/target_turf = get_turf(target)
|
||||
for(var/turf/shootat_turf in RANGE_TURFS(radius, target) - RANGE_TURFS(radius-1, target))
|
||||
var/obj/item/projectile/P = new projectile_type(target_turf)
|
||||
|
||||
//Shooting Code:
|
||||
P.range = radius+1
|
||||
if(override_projectile_range)
|
||||
P.range = override_projectile_range
|
||||
P.preparePixelProjectile(shootat_turf, target)
|
||||
P.firer = firer // don't hit ourself that would be really annoying
|
||||
P.permutated += target // don't hit the target we hit already with the flak
|
||||
P.fire()
|
||||
@@ -6,7 +6,7 @@
|
||||
var/max_mobs = 5
|
||||
var/spawn_text = "emerges from"
|
||||
var/list/faction = list("mining")
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs)
|
||||
@@ -20,13 +20,13 @@
|
||||
spawn_text=_spawn_text
|
||||
if(_max_mobs)
|
||||
max_mobs=_max_mobs
|
||||
|
||||
|
||||
RegisterSignal(parent, list(COMSIG_PARENT_QDELETED), .proc/stop_spawning)
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/datum/component/spawner/process()
|
||||
try_spawn_mob()
|
||||
|
||||
|
||||
|
||||
/datum/component/spawner/proc/stop_spawning(force, hint)
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
@@ -36,7 +36,7 @@
|
||||
spawned_mobs = null
|
||||
|
||||
/datum/component/spawner/proc/try_spawn_mob()
|
||||
var/atom/P = parent
|
||||
var/atom/P = parent
|
||||
if(spawned_mobs.len >= max_mobs)
|
||||
return 0
|
||||
if(spawn_delay > world.time)
|
||||
@@ -44,7 +44,7 @@
|
||||
spawn_delay = world.time + spawn_time
|
||||
var/chosen_mob_type = pick(mob_types)
|
||||
var/mob/living/simple_animal/L = new chosen_mob_type(P.loc)
|
||||
L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1)
|
||||
L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1)
|
||||
spawned_mobs += L
|
||||
L.nest = src
|
||||
L.faction = src.faction
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
else
|
||||
steps++
|
||||
|
||||
/datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM)
|
||||
/datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM)
|
||||
if(isitem(AM))
|
||||
var/obj/item/I = AM
|
||||
if(I.item_flags & ABSTRACT)
|
||||
|
||||
@@ -56,13 +56,16 @@
|
||||
|
||||
/datum/component/stationloving/proc/in_bounds()
|
||||
var/static/list/allowed_shuttles = typecacheof(list(/area/shuttle/syndicate, /area/shuttle/escape, /area/shuttle/pod_1, /area/shuttle/pod_2, /area/shuttle/pod_3, /area/shuttle/pod_4))
|
||||
var/static/list/disallowed_centcom_areas = typecacheof(list(/area/abductor_ship, /area/fabric_of_reality, /area/awaymission/errorroom))
|
||||
var/turf/T = get_turf(parent)
|
||||
if (!T)
|
||||
return FALSE
|
||||
var/area/A = T.loc
|
||||
if(istype(A, /area/fabric_of_reality)) // Obviously terrible, just for test merging
|
||||
return FALSE
|
||||
if (is_station_level(T.z) || is_centcom_level(T.z))
|
||||
if (is_station_level(T.z))
|
||||
return TRUE
|
||||
if (is_centcom_level(T.z))
|
||||
if (is_type_in_typecache(A, disallowed_centcom_areas))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if (is_reserved_level(T.z))
|
||||
if (is_type_in_typecache(A, allowed_shuttles))
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/datum/component/storage/concrete/implant/Initialize()
|
||||
. = ..()
|
||||
cant_hold = typecacheof(list(/obj/item/disk/nuclear))
|
||||
set_holdable(null, list(/obj/item/disk/nuclear))
|
||||
|
||||
/datum/component/storage/concrete/implant/InheritComponent(datum/component/storage/concrete/implant/I, original)
|
||||
if(!istype(I))
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
/datum/component/storage/concrete/pockets/small
|
||||
max_items = 1
|
||||
max_w_class = WEIGHT_CLASS_SMALL
|
||||
attack_hand_interact = FALSE
|
||||
|
||||
/datum/component/storage/concrete/pockets/tiny
|
||||
@@ -24,7 +25,15 @@
|
||||
max_w_class = WEIGHT_CLASS_TINY
|
||||
attack_hand_interact = FALSE
|
||||
|
||||
/datum/component/storage/concrete/pockets/small/detective
|
||||
/datum/component/storage/concrete/pockets/small/fedora/Initialize()
|
||||
. = ..()
|
||||
var/static/list/exception_cache = typecacheof(list(
|
||||
/obj/item/katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana,
|
||||
/obj/item/energy_katana, /obj/item/gun/ballistic/automatic/tommygun
|
||||
))
|
||||
exception_hold = exception_cache
|
||||
|
||||
/datum/component/storage/concrete/pockets/small/fedora/detective
|
||||
attack_hand_interact = TRUE // so the detectives would discover pockets in their hats
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes
|
||||
@@ -34,24 +43,26 @@
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/Initialize()
|
||||
. = ..()
|
||||
cant_hold = typecacheof(list(/obj/item/screwdriver/power)) //Must be specifically called out since normal screwdrivers can fit but not the wrench form of the drill
|
||||
can_hold = typecacheof(list(
|
||||
set_holdable(list(
|
||||
/obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen,
|
||||
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
|
||||
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
|
||||
/obj/item/firing_pin
|
||||
))
|
||||
),
|
||||
list(/obj/item/screwdriver/power)
|
||||
)
|
||||
|
||||
/datum/component/storage/concrete/pockets/shoes/clown/Initialize()
|
||||
. = ..()
|
||||
cant_hold = typecacheof(list(/obj/item/screwdriver/power)) //Must be specifically called out since normal screwdrivers can fit but not the wrench form of the drill
|
||||
can_hold = typecacheof(list(
|
||||
set_holdable(list(
|
||||
/obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen,
|
||||
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
|
||||
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
|
||||
/obj/item/firing_pin, /obj/item/bikehorn))
|
||||
/obj/item/firing_pin, /obj/item/bikehorn),
|
||||
list(/obj/item/screwdriver/power)
|
||||
)
|
||||
|
||||
/datum/component/storage/concrete/pockets/pocketprotector
|
||||
max_items = 3
|
||||
@@ -61,12 +72,13 @@
|
||||
/datum/component/storage/concrete/pockets/pocketprotector/Initialize()
|
||||
original_parent = parent
|
||||
. = ..()
|
||||
can_hold = typecacheof(list( //Same items as a PDA
|
||||
set_holdable(list( //Same items as a PDA
|
||||
/obj/item/pen,
|
||||
/obj/item/toy/crayon,
|
||||
/obj/item/lipstick,
|
||||
/obj/item/flashlight/pen,
|
||||
/obj/item/clothing/mask/cigarette))
|
||||
/obj/item/clothing/mask/cigarette)
|
||||
)
|
||||
|
||||
/datum/component/storage/concrete/pockets/pocketprotector/real_location()
|
||||
// if the component is reparented to a jumpsuit, the items still go in the protector
|
||||
@@ -78,5 +90,5 @@
|
||||
|
||||
/datum/component/storage/concrete/pockets/small/helmet/Initialize()
|
||||
. = ..()
|
||||
can_hold = typecacheof(list(/obj/item/reagent_containers/glass/bottle,
|
||||
/obj/item/ammo_box/a762))
|
||||
set_holdable(list(/obj/item/reagent_containers/glass/bottle,
|
||||
/obj/item/ammo_box/a762))
|
||||
|
||||
@@ -14,8 +14,11 @@
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||
var/datum/component/storage/concrete/master //If not null, all actions act on master and this is just an access point.
|
||||
|
||||
var/list/can_hold //if this is set, only things in this typecache will fit.
|
||||
var/list/cant_hold //if this is set, anything in this typecache will not be able to fit.
|
||||
var/list/can_hold //if this is set, only items, and their children, will fit
|
||||
var/list/cant_hold //if this is set, items, and their children, won't fit
|
||||
var/list/exception_hold //if set, these items will be the exception to the max size of object that can fit.
|
||||
|
||||
var/can_hold_description
|
||||
|
||||
var/list/mob/is_using //lazy list of mobs looking at the contents of this storage.
|
||||
|
||||
@@ -81,6 +84,8 @@
|
||||
RegisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_ALL, .proc/close_all)
|
||||
RegisterSignal(parent, COMSIG_TRY_STORAGE_RETURN_INVENTORY, .proc/signal_return_inv)
|
||||
|
||||
RegisterSignal(parent, COMSIG_TOPIC, .proc/topic_handle)
|
||||
|
||||
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby)
|
||||
|
||||
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
|
||||
@@ -114,6 +119,24 @@
|
||||
/datum/component/storage/PreTransfer()
|
||||
update_actions()
|
||||
|
||||
/datum/component/storage/proc/set_holdable(can_hold_list, cant_hold_list)
|
||||
can_hold_description = generate_hold_desc(can_hold_list)
|
||||
|
||||
if (can_hold_list != null)
|
||||
can_hold = typecacheof(can_hold_list)
|
||||
|
||||
if (cant_hold_list != null)
|
||||
cant_hold = typecacheof(cant_hold_list)
|
||||
|
||||
/datum/component/storage/proc/generate_hold_desc(can_hold_list)
|
||||
var/list/desc = list()
|
||||
|
||||
for(var/valid_type in can_hold_list)
|
||||
var/obj/item/valid_item = valid_type
|
||||
desc += "\a [initial(valid_item.name)]"
|
||||
|
||||
return "\n\t<span class='notice'>[desc.Join("\n\t")]</span>"
|
||||
|
||||
/datum/component/storage/proc/update_actions()
|
||||
QDEL_NULL(modeswitch_action)
|
||||
if(!isitem(parent) || !allow_quick_gather)
|
||||
@@ -501,6 +524,13 @@
|
||||
interface |= return_inv(recursive)
|
||||
return TRUE
|
||||
|
||||
/datum/component/storage/proc/topic_handle(datum/source, user, href_list)
|
||||
if(href_list["show_valid_pocket_items"])
|
||||
handle_show_valid_items(source, user)
|
||||
|
||||
/datum/component/storage/proc/handle_show_valid_items(datum/source, user)
|
||||
to_chat(user, "<span class='notice'>[source] can hold: [can_hold_description]</span>")
|
||||
|
||||
/datum/component/storage/proc/mousedrop_onto(datum/source, atom/over_object, mob/M)
|
||||
set waitfor = FALSE
|
||||
. = COMPONENT_NO_MOUSEDROP
|
||||
@@ -576,7 +606,7 @@
|
||||
if(!stop_messages)
|
||||
to_chat(M, "<span class='warning'>[host] cannot hold [I]!</span>")
|
||||
return FALSE
|
||||
if(I.w_class > max_w_class)
|
||||
if(I.w_class > max_w_class && !is_type_in_typecache(I, exception_hold))
|
||||
if(!stop_messages)
|
||||
to_chat(M, "<span class='warning'>[I] is too big for [host]!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
/datum/component/summoning
|
||||
var/list/mob_types = list()
|
||||
var/spawn_chance // chance for the mob to spawn on hit in percent
|
||||
var/max_mobs
|
||||
var/spawn_delay // delay in spawning between mobs (deciseconds)
|
||||
var/spawn_text
|
||||
var/spawn_sound
|
||||
var/list/faction
|
||||
|
||||
var/last_spawned_time = 0
|
||||
var/list/spawned_mobs = list()
|
||||
|
||||
/datum/component/summoning/Initialize(mob_types, spawn_chance=100, max_mobs=3, spawn_delay=100, spawn_text="appears out of nowhere", spawn_sound='sound/magic/summon_magic.ogg', faction)
|
||||
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.mob_types = mob_types
|
||||
src.spawn_chance = spawn_chance
|
||||
src.max_mobs = max_mobs
|
||||
src.spawn_delay = spawn_delay
|
||||
src.spawn_text = spawn_text
|
||||
src.spawn_sound = spawn_sound
|
||||
src.faction = faction
|
||||
|
||||
/datum/component/summoning/RegisterWithParent()
|
||||
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
|
||||
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
|
||||
else if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
|
||||
else if(ishostile(parent))
|
||||
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
|
||||
|
||||
/datum/component/summoning/UnregisterFromParent()
|
||||
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
|
||||
|
||||
/datum/component/summoning/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!proximity_flag)
|
||||
return
|
||||
do_spawn_mob(get_turf(target), user)
|
||||
|
||||
/datum/component/summoning/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
|
||||
do_spawn_mob(get_turf(target), attacker)
|
||||
|
||||
/datum/component/summoning/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
|
||||
do_spawn_mob(get_turf(target), firer)
|
||||
|
||||
/datum/component/summoning/proc/do_spawn_mob(atom/spawn_location, summoner)
|
||||
if(spawned_mobs.len >= max_mobs)
|
||||
return 0
|
||||
if(last_spawned_time > world.time)
|
||||
return 0
|
||||
if(!prob(spawn_chance))
|
||||
return 0
|
||||
last_spawned_time = world.time + spawn_delay
|
||||
var/chosen_mob_type = pick(mob_types)
|
||||
var/mob/living/simple_animal/L = new chosen_mob_type(spawn_location)
|
||||
if(ishostile(L))
|
||||
var/mob/living/simple_animal/hostile/H = L
|
||||
H.friends += summoner // do not attack our summon boy
|
||||
spawned_mobs += L
|
||||
if(faction != null)
|
||||
L.faction = faction
|
||||
RegisterSignal(L, COMSIG_MOB_DEATH, .proc/on_spawned_death) // so we can remove them from the list, etc (for mobs with corpses)
|
||||
playsound(spawn_location,spawn_sound, 50, 1)
|
||||
spawn_location.visible_message("<span class='danger'>[L] [spawn_text].</span>")
|
||||
|
||||
/datum/component/summoning/proc/on_spawned_death(mob/killed, gibbed)
|
||||
spawned_mobs -= killed
|
||||
@@ -0,0 +1,34 @@
|
||||
/datum/component/tactical
|
||||
var/allowed_slot
|
||||
|
||||
/datum/component/tactical/Initialize(allowed_slot)
|
||||
if(!isitem(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.allowed_slot = allowed_slot
|
||||
|
||||
/datum/component/tactical/RegisterWithParent()
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/modify)
|
||||
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/unmodify)
|
||||
|
||||
/datum/component/tactical/UnregisterFromParent()
|
||||
unmodify()
|
||||
|
||||
/datum/component/fantasy/Destroy()
|
||||
unmodify()
|
||||
return ..()
|
||||
|
||||
/datum/component/tactical/proc/modify(obj/item/source, mob/user, slot)
|
||||
if(allowed_slot && slot != allowed_slot)
|
||||
unmodify()
|
||||
return
|
||||
|
||||
var/obj/item/master = parent
|
||||
var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user)
|
||||
I.copy_overlays(master)
|
||||
I.override = TRUE
|
||||
source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I)
|
||||
I.layer = ABOVE_MOB_LAYER
|
||||
|
||||
/datum/component/tactical/proc/unmodify(obj/item/source, mob/user)
|
||||
user.remove_alt_appearance("sneaking_mission")
|
||||
@@ -0,0 +1,37 @@
|
||||
/datum/component/tether
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||
var/atom/tether_target
|
||||
var/max_dist
|
||||
var/tether_name
|
||||
|
||||
/datum/component/tether/Initialize(atom/tether_target, max_dist = 4, tether_name)
|
||||
if(!isliving(parent) || !istype(tether_target) || !tether_target.loc)
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
src.tether_target = tether_target
|
||||
src.max_dist = max_dist
|
||||
if (ispath(tether_name, /atom))
|
||||
var/atom/tmp = tether_name
|
||||
src.tether_name = initial(tmp.name)
|
||||
else
|
||||
src.tether_name = tether_name
|
||||
RegisterSignal(parent, list(COMSIG_MOVABLE_PRE_MOVE), .proc/checkTether)
|
||||
|
||||
/datum/component/tether/proc/checkTether(mob/mover, newloc)
|
||||
if (get_dist(mover,newloc) > max_dist)
|
||||
to_chat(mover, "<span class='userdanger'>The [tether_name] runs out of slack and prevents you from moving!</span>")
|
||||
return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
|
||||
|
||||
var/atom/blocker
|
||||
out:
|
||||
for(var/turf/T in getline(tether_target,newloc))
|
||||
if (T.density)
|
||||
blocker = T
|
||||
break out
|
||||
for(var/a in T)
|
||||
var/atom/A = a
|
||||
if(A.density && A != mover && A != tether_target)
|
||||
blocker = A
|
||||
break out
|
||||
if (blocker)
|
||||
to_chat(mover, "<span class='userdanger'>The [tether_name] catches on [blocker] and prevents you from moving!</span>")
|
||||
return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
|
||||
@@ -78,4 +78,4 @@
|
||||
|
||||
/datum/component/thermite/proc/attackby_react(datum/source, obj/item/thing, mob/user, params)
|
||||
if(thing.is_hot())
|
||||
thermite_melt(user)
|
||||
thermite_melt(user)
|
||||
|
||||
@@ -43,13 +43,14 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
RegisterSignal(parent, COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant)
|
||||
else if(istype(parent, /obj/item/pda))
|
||||
RegisterSignal(parent, COMSIG_PDA_CHANGE_RINGTONE, .proc/new_ringtone)
|
||||
RegisterSignal(parent, COMSIG_PDA_CHECK_DETONATE, .proc/check_detonate)
|
||||
else if(istype(parent, /obj/item/radio))
|
||||
RegisterSignal(parent, COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency)
|
||||
else if(istype(parent, /obj/item/pen))
|
||||
RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation)
|
||||
|
||||
GLOB.uplinks += src
|
||||
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
|
||||
uplink_items = get_uplink_items(_gamemode, TRUE, allow_restricted)
|
||||
|
||||
if(_owner)
|
||||
owner = _owner
|
||||
@@ -251,6 +252,9 @@ GLOBAL_LIST_EMPTY(uplinks)
|
||||
master.mode = 0
|
||||
return COMPONENT_STOP_RINGTONE_CHANGE
|
||||
|
||||
/datum/component/uplink/proc/check_detonate()
|
||||
return COMPONENT_PDA_NO_DETONATE
|
||||
|
||||
// Radio signal responses
|
||||
|
||||
/datum/component/uplink/proc/new_frequency(datum/source, list/arguments)
|
||||
|
||||
@@ -105,7 +105,6 @@
|
||||
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
|
||||
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
|
||||
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
|
||||
.manifest td:first-child {text-align:right}
|
||||
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
|
||||
</style></head>
|
||||
<table class="manifest" width='350px'>
|
||||
@@ -255,7 +254,7 @@
|
||||
M.fields["alg_d"] = "No allergies have been detected in this patient."
|
||||
M.fields["cdi"] = "None"
|
||||
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
|
||||
M.fields["notes"] = "No notes."
|
||||
M.fields["notes"] = H.get_trait_string(medical)
|
||||
medical += M
|
||||
|
||||
//Security Record
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
var/list/cached_vars
|
||||
#endif
|
||||
|
||||
/datum/Topic(href, href_list[])
|
||||
..()
|
||||
SEND_SIGNAL(src, COMSIG_TOPIC, usr, href_list)
|
||||
|
||||
// Default implementation of clean-up code.
|
||||
// This should be overridden to remove all references pointing to the object being destroyed.
|
||||
// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
|
||||
@@ -158,4 +162,4 @@
|
||||
if(!istype(returned, /datum))
|
||||
qdel(D)
|
||||
else
|
||||
return returned
|
||||
return returned
|
||||
|
||||
+14
-11
@@ -935,21 +935,25 @@
|
||||
|
||||
if(A.reagents)
|
||||
var/chosen_id
|
||||
var/list/reagent_options = sortList(GLOB.chemical_reagents_list)
|
||||
switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID"))
|
||||
if("Enter ID")
|
||||
switch(alert(usr, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky"))
|
||||
if("Search")
|
||||
var/valid_id
|
||||
while(!valid_id)
|
||||
chosen_id = stripped_input(usr, "Enter the ID of the reagent you want to add.")
|
||||
if(!chosen_id) //Get me out of here!
|
||||
chosen_id = input(usr, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text
|
||||
if(isnull(chosen_id)) //Get me out of here!
|
||||
break
|
||||
for(var/ID in reagent_options)
|
||||
if(ID == chosen_id)
|
||||
valid_id = 1
|
||||
if (!ispath(text2path(chosen_id)))
|
||||
chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent)))
|
||||
if (ispath(chosen_id))
|
||||
valid_id = TRUE
|
||||
else
|
||||
valid_id = TRUE
|
||||
if(!valid_id)
|
||||
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
|
||||
if("Choose ID")
|
||||
chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in reagent_options
|
||||
if("Choose from a list")
|
||||
chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent)
|
||||
if("I'm feeling lucky")
|
||||
chosen_id = pick(subtypesof(/datum/reagent))
|
||||
if(chosen_id)
|
||||
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num
|
||||
if(amount)
|
||||
@@ -1402,4 +1406,3 @@
|
||||
H.remove_quirk(T)
|
||||
else
|
||||
H.add_quirk(T,TRUE)
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread)
|
||||
return
|
||||
|
||||
if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
|
||||
if(affected_mob.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
|
||||
return
|
||||
|
||||
var/spread_range = 2
|
||||
|
||||
@@ -34,10 +34,10 @@
|
||||
|
||||
// The order goes from easy to cure to hard to cure.
|
||||
var/static/list/advance_cures = list(
|
||||
"sodiumchloride", "sugar", "orangejuice",
|
||||
"spaceacillin", "salglu_solution", "ethanol",
|
||||
"leporazine", "synaptizine", "lipolicide",
|
||||
"silver", "gold"
|
||||
/datum/reagent/consumable/sodiumchloride, /datum/reagent/consumable/sugar, /datum/reagent/consumable/orangejuice,
|
||||
/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/consumable/ethanol,
|
||||
/datum/reagent/medicine/leporazine, /datum/reagent/medicine/synaptizine, /datum/reagent/toxin/lipolicide,
|
||||
/datum/reagent/silver, /datum/reagent/gold
|
||||
)
|
||||
|
||||
/*
|
||||
|
||||
@@ -138,7 +138,7 @@ Bonus
|
||||
var/get_damage = rand(15,21) * power
|
||||
M.adjustOxyLoss(get_damage)
|
||||
if(paralysis)
|
||||
M.reagents.add_reagent_list(list("pancuronium" = 3, "sodium_thiopental" = 3))
|
||||
M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3))
|
||||
return 1
|
||||
|
||||
/datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A)
|
||||
|
||||
@@ -156,7 +156,7 @@ Bonus
|
||||
M.adjust_fire_stacks(get_stacks)
|
||||
M.take_overall_damage(burn = get_stacks / 2, required_status = BODYPART_ORGANIC)
|
||||
if(chems)
|
||||
M.reagents.add_reagent("clf3", 2 * power)
|
||||
M.reagents.add_reagent(/datum/reagent/clf3, 2 * power)
|
||||
return 1
|
||||
|
||||
/datum/symptom/alkali/proc/Alkali_fire_stage_5(mob/living/M, datum/disease/advance/A)
|
||||
@@ -164,5 +164,5 @@ Bonus
|
||||
M.adjust_fire_stacks(get_stacks)
|
||||
M.take_overall_damage(burn = get_stacks, required_status = BODYPART_ORGANIC)
|
||||
if(chems)
|
||||
M.reagents.add_reagent_list(list("napalm" = 4 * power, "clf3" = 4 * power))
|
||||
M.reagents.add_reagent_list(list(/datum/reagent/napalm = 4 * power, /datum/reagent/clf3 = 4 * power))
|
||||
return 1
|
||||
|
||||
@@ -57,7 +57,7 @@ Bonus
|
||||
var/get_damage = rand(15,25) * power
|
||||
M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC)
|
||||
if(pain)
|
||||
M.adjustStaminaLoss(get_damage)
|
||||
M.adjustStaminaLoss(get_damage * 2)
|
||||
if(bleed)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
@@ -124,7 +124,7 @@ Bonus
|
||||
var/get_damage = rand(6,10)
|
||||
M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC)
|
||||
if(chems)
|
||||
M.reagents.add_reagent_list(list("heparin" = 2, "lipolicide" = 2))
|
||||
M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2))
|
||||
if(zombie)
|
||||
M.reagents.add_reagent("romerol", 1)
|
||||
return 1
|
||||
M.reagents.add_reagent(/datum/reagent/romerol, 1)
|
||||
return 1
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
|
||||
for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
|
||||
M.reagents.remove_reagent(R.id, actual_power)
|
||||
M.reagents.remove_reagent(R.type, actual_power)
|
||||
if(food_conversion)
|
||||
M.adjust_nutrition(0.3)
|
||||
if(prob(2))
|
||||
@@ -311,11 +311,11 @@
|
||||
if(M.fire_stacks < 0)
|
||||
M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0)
|
||||
. += power
|
||||
if(M.reagents.has_reagent("holywater"))
|
||||
M.reagents.remove_reagent("holywater", 0.5 * absorption_coeff)
|
||||
if(M.reagents.has_reagent(/datum/reagent/water/holywater))
|
||||
M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff)
|
||||
. += power * 0.75
|
||||
else if(M.reagents.has_reagent("water"))
|
||||
M.reagents.remove_reagent("water", 0.5 * absorption_coeff)
|
||||
else if(M.reagents.has_reagent(/datum/reagent/water))
|
||||
M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff)
|
||||
. += power * 0.5
|
||||
|
||||
/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
|
||||
@@ -374,7 +374,7 @@
|
||||
gases = environment.gases
|
||||
if(gases["plasma"] && gases["plasma"][MOLES] > gases["plasma"][GAS_META][META_GAS_MOLES_VISIBLE]) //if there's enough plasma in the air to see
|
||||
. += power * 0.5
|
||||
if(M.reagents.has_reagent("plasma"))
|
||||
if(M.reagents.has_reagent(/datum/reagent/toxin/plasma))
|
||||
. += power * 0.75
|
||||
|
||||
/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
|
||||
|
||||
@@ -44,10 +44,10 @@
|
||||
|
||||
if(A.stage >= 4)
|
||||
M.drowsyness = max(0, M.drowsyness - 2)
|
||||
if(M.reagents.has_reagent("mindbreaker"))
|
||||
M.reagents.remove_reagent("mindbreaker", 5)
|
||||
if(M.reagents.has_reagent("histamine"))
|
||||
M.reagents.remove_reagent("histamine", 5)
|
||||
if(M.reagents.has_reagent(/datum/reagent/toxin/mindbreaker))
|
||||
M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
|
||||
if(M.reagents.has_reagent(/datum/reagent/toxin/histamine))
|
||||
M.reagents.remove_reagent(/datum/reagent/toxin/histamine, 5)
|
||||
M.hallucination = max(0, M.hallucination - 10)
|
||||
|
||||
if(A.stage >= 5)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
|
||||
cure_text = "Ethanol"
|
||||
cures = list("ethanol")
|
||||
cures = list(/datum/reagent/consumable/ethanol)
|
||||
agent = "Excess Lepidopticides"
|
||||
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
desc = "If left untreated subject will regurgitate butterflies."
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
|
||||
cure_text = "Sugar"
|
||||
cures = list("sugar")
|
||||
cures = list(/datum/reagent/consumable/sugar)
|
||||
agent = "Apidae Infection"
|
||||
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
desc = "If left untreated subject will regurgitate bees."
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
|
||||
cure_text = "Mannitol"
|
||||
cures = list("mannitol")
|
||||
cures = list(/datum/reagent/medicine/mannitol)
|
||||
agent = "Cryptococcus Cosmosis"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
cure_chance = 15//higher chance to cure, since two reagents are required
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "The Cold"
|
||||
max_stages = 3
|
||||
cure_text = "Rest & Spaceacillin"
|
||||
cures = list("spaceacillin")
|
||||
cures = list(/datum/reagent/medicine/spaceacillin)
|
||||
agent = "XY-rhinovirus"
|
||||
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
|
||||
permeability_mod = 0.5
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
|
||||
cure_text = "Common Cold Anti-bodies & Spaceacillin"
|
||||
cures = list("spaceacillin")
|
||||
cures = list(/datum/reagent/medicine/spaceacillin)
|
||||
agent = "ICE9-rhinovirus"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
desc = "If left untreated the subject will slow, as if partly frozen."
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
desc = @"If left untreated the subject will [REDACTED]!"
|
||||
severity = "Dangerous!"
|
||||
cures = list("rezadone")
|
||||
cures = list(/datum/reagent/medicine/rezadone)
|
||||
disease_flags = CAN_CARRY|CAN_RESIST
|
||||
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
||||
process_dead = TRUE
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
spread_text = "On contact"
|
||||
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
|
||||
cure_text = "Mutadone"
|
||||
cures = list("mutadone")
|
||||
cures = list(/datum/reagent/medicine/mutadone)
|
||||
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
|
||||
agent = "S4E1 retrovirus"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user