Merge branch 'master' into breathe-into-me

This commit is contained in:
moo
2019-06-02 20:26:53 -04:00
committed by GitHub
730 changed files with 10950 additions and 8167 deletions
+2 -2
View File
@@ -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
View File
@@ -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{
+1 -1
View File
@@ -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
},
+145 -89
View File
@@ -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
+2 -2
View File
@@ -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
+38 -40
View File
@@ -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
+2 -8
View File
@@ -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
"}
+263
View File
@@ -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
"}
+2
View File
@@ -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"
+1 -1
View File
@@ -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
+26 -13
View File
@@ -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)
+1 -1
View File
@@ -41,4 +41,4 @@
#define BANISH_FUNERAL_GARB "funeral"
#define LORE 1
#define LAW 2
#define LAW 2
+5
View File
@@ -0,0 +1,5 @@
#define AFFIX_PREFIX (1 << 0)
#define AFFIX_SUFFIX (1 << 1)
#define AFFIX_GOOD (1 << 0)
#define AFFIX_EVIL (1 << 1)
+2
View File
@@ -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
View File
@@ -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))
+5
View File
@@ -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"
+4
View File
@@ -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))
+3
View File
@@ -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"
+2
View File
@@ -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
+3 -1
View File
@@ -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"
+10
View File
@@ -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)
+4
View File
@@ -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))
+1
View File
@@ -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
-6
View File
@@ -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)
+4
View File
@@ -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:
+74
View File
@@ -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
+4
View File
@@ -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))
+21
View File
@@ -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
+11
View File
@@ -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())
+9
View File
@@ -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)
+1 -15
View File
@@ -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
..()
..()
+5
View File
@@ -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"
+2 -2
View File
@@ -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))
+10
View File
@@ -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
View File
@@ -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
+3 -2
View File
@@ -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
+76
View File
@@ -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
+4 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+24 -8
View File
@@ -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>")
+1 -1
View File
@@ -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
+24 -5
View File
@@ -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)
+45
View File
@@ -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))
-11
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+15 -4
View File
@@ -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]
+6 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+13 -9
View File
@@ -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
+45
View File
@@ -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)
+140
View File
@@ -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>")
+13
View File
@@ -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]"
+169
View File
@@ -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"
+36
View File
@@ -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()
+44
View File
@@ -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)
+38
View File
@@ -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)
-25
View File
@@ -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
+4
View File
@@ -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
+9 -1
View File
@@ -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
+1 -1
View File
@@ -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
+38
View File
@@ -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()
+5 -5
View File
@@ -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
+1 -1
View File
@@ -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)
+6 -3
View File
@@ -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))
+33 -3
View File
@@ -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
+68
View File
@@ -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
+34
View File
@@ -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")
+37
View File
@@ -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
+1 -1
View File
@@ -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)
+5 -1
View File
@@ -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)
+1 -2
View File
@@ -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
+5 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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."
+1 -1
View File
@@ -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."
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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."
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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