Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into crewobjectivesandmiscreants
This commit is contained in:
@@ -198,6 +198,7 @@
|
||||
/obj/structure/stone_tile{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"aC" = (
|
||||
@@ -287,6 +288,7 @@
|
||||
/obj/structure/stone_tile/cracked{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"aN" = (
|
||||
@@ -305,6 +307,7 @@
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"aP" = (
|
||||
/obj/structure/stone_tile,
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"aQ" = (
|
||||
@@ -379,6 +382,7 @@
|
||||
/obj/structure/stone_tile/cracked{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/indestructible/boss,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"aZ" = (
|
||||
@@ -401,6 +405,7 @@
|
||||
/obj/structure/stone_tile{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"bb" = (
|
||||
@@ -489,6 +494,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/storage/bag/plants/portaseeder,
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/indestructible/boss,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"bk" = (
|
||||
@@ -509,6 +515,7 @@
|
||||
/obj/structure/stone_tile/cracked{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"bm" = (
|
||||
@@ -568,6 +575,7 @@
|
||||
/obj/structure/stone_tile{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/indestructible/boss/air,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"br" = (
|
||||
@@ -897,6 +905,7 @@
|
||||
/obj/structure/stone_tile/surrounding_tile/cracked{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"ci" = (
|
||||
@@ -1042,6 +1051,7 @@
|
||||
icon_state = "cracked_slab1";
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/ruin/unpowered/ash_walkers)
|
||||
"cB" = (
|
||||
@@ -1475,6 +1485,26 @@
|
||||
/obj/structure/stone_tile,
|
||||
/turf/closed/mineral/volcanic,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"dG" = (
|
||||
/obj/structure/stone_tile/slab,
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"dH" = (
|
||||
/obj/structure/stone_tile/block/cracked,
|
||||
/obj/structure/stone_tile/block{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
"dI" = (
|
||||
/obj/structure/stone_tile{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/dildo/custom,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors)
|
||||
|
||||
(1,1,1) = {"
|
||||
aa
|
||||
@@ -1597,7 +1627,7 @@ aO
|
||||
bl
|
||||
bx
|
||||
bD
|
||||
bS
|
||||
dG
|
||||
de
|
||||
bV
|
||||
dg
|
||||
@@ -1625,7 +1655,7 @@ ci
|
||||
bA
|
||||
ct
|
||||
bN
|
||||
bL
|
||||
dI
|
||||
cI
|
||||
ah
|
||||
ah
|
||||
@@ -1732,7 +1762,7 @@ ak
|
||||
bP
|
||||
bL
|
||||
bX
|
||||
dh
|
||||
dH
|
||||
do
|
||||
du
|
||||
dz
|
||||
|
||||
@@ -24665,7 +24665,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"bgp" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||
/turf/open/floor/plasteel/white,
|
||||
@@ -26862,7 +26862,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"blh" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/door/window/eastright{
|
||||
@@ -26940,7 +26940,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"blp" = (
|
||||
/obj/machinery/power/apc{
|
||||
dir = 8;
|
||||
@@ -26974,7 +26974,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"blr" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||
dir = 4
|
||||
@@ -29030,7 +29030,7 @@
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"bpR" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/disposalpipe/segment{
|
||||
@@ -60163,7 +60163,7 @@
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/aft)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cHE" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
name = "Mech Bay Maintenance";
|
||||
@@ -63862,6 +63862,167 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/starboard/aft)
|
||||
"cTJ" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
req_access_txt = "12"
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTK" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTL" = (
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
d1 = 2;
|
||||
d2 = 4;
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/turf/open/floor/plasteel/black,
|
||||
/area/medical/morgue)
|
||||
"cTM" = (
|
||||
/obj/machinery/power/apc{
|
||||
dir = 4;
|
||||
name = "Morgue Maintenance APC";
|
||||
areastring = "/area/maintenance/department/medical/morgue";
|
||||
pixel_x = 26
|
||||
},
|
||||
/obj/structure/cable{
|
||||
d2 = 8;
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/turf/open/floor/plasteel/black,
|
||||
/area/medical/morgue)
|
||||
"cTN" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTO" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTP" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTQ" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTR" = (
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTS" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTT" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTU" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"cTV" = (
|
||||
/obj/machinery/door/airlock/maintenance{
|
||||
req_access_txt = "12"
|
||||
},
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/structure/cable{
|
||||
d1 = 1;
|
||||
d2 = 2;
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaa
|
||||
@@ -103574,7 +103735,7 @@ bfL
|
||||
bhp
|
||||
biB
|
||||
biB
|
||||
biB
|
||||
cTL
|
||||
bkU
|
||||
bmX
|
||||
bpE
|
||||
@@ -103831,7 +103992,7 @@ bfL
|
||||
bhq
|
||||
bhm
|
||||
bkb
|
||||
bhm
|
||||
cTM
|
||||
bla
|
||||
bmZ
|
||||
bpH
|
||||
@@ -104346,7 +104507,7 @@ bfS
|
||||
biC
|
||||
bkd
|
||||
bfS
|
||||
bKH
|
||||
cTO
|
||||
bmZ
|
||||
bpJ
|
||||
brc
|
||||
@@ -104860,7 +105021,7 @@ bfS
|
||||
biE
|
||||
bkf
|
||||
bfS
|
||||
bKH
|
||||
cTP
|
||||
bmZ
|
||||
bpL
|
||||
bre
|
||||
@@ -105117,7 +105278,7 @@ bfS
|
||||
biD
|
||||
bke
|
||||
bfS
|
||||
bKH
|
||||
cTQ
|
||||
bmZ
|
||||
bpK
|
||||
brd
|
||||
@@ -105374,7 +105535,7 @@ bfS
|
||||
bfS
|
||||
bfS
|
||||
bfS
|
||||
bKH
|
||||
cTR
|
||||
bmZ
|
||||
bon
|
||||
bon
|
||||
@@ -105626,17 +105787,17 @@ aYV
|
||||
baR
|
||||
bcb
|
||||
bdl
|
||||
bdO
|
||||
cTJ
|
||||
cHD
|
||||
bgo
|
||||
bPv
|
||||
bPv
|
||||
cTK
|
||||
cTN
|
||||
blq
|
||||
bna
|
||||
bPv
|
||||
cTS
|
||||
cTT
|
||||
bpQ
|
||||
bPv
|
||||
bdO
|
||||
cTU
|
||||
cTV
|
||||
btm
|
||||
buy
|
||||
bvz
|
||||
|
||||
@@ -91795,7 +91795,7 @@
|
||||
"dwO" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/closed/wall,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dwP" = (
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/structure/cable/white{
|
||||
@@ -91815,7 +91815,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dwQ" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/clipboard,
|
||||
@@ -92448,7 +92448,7 @@
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dyb" = (
|
||||
/obj/structure/bed/roller,
|
||||
/obj/machinery/iv_drip,
|
||||
@@ -92456,12 +92456,12 @@
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dyc" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dyd" = (
|
||||
/obj/structure/cable/white{
|
||||
d1 = 1;
|
||||
@@ -92470,7 +92470,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dye" = (
|
||||
/obj/structure/table/glass,
|
||||
/obj/item/folder/white,
|
||||
@@ -92923,12 +92923,12 @@
|
||||
"dzf" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel/neutral,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dzg" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dzh" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/cable/white{
|
||||
@@ -92938,14 +92938,14 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dzi" = (
|
||||
/obj/structure/table,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/item/storage/backpack/duffelbag/med,
|
||||
/obj/item/device/flashlight/pen,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dzj" = (
|
||||
/turf/closed/wall,
|
||||
/area/crew_quarters/heads/cmo)
|
||||
@@ -93674,7 +93674,7 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dAw" = (
|
||||
/obj/structure/cable/white{
|
||||
d1 = 4;
|
||||
@@ -93687,7 +93687,7 @@
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dAx" = (
|
||||
/obj/structure/cable/white{
|
||||
d1 = 4;
|
||||
@@ -93699,7 +93699,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dAy" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/cable/white{
|
||||
@@ -93712,7 +93712,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dAz" = (
|
||||
/obj/structure/cable/white{
|
||||
d1 = 1;
|
||||
@@ -93733,14 +93733,14 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/neutral,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dAA" = (
|
||||
/obj/structure/table,
|
||||
/obj/item/clothing/gloves/color/latex/nitrile,
|
||||
/obj/item/clothing/suit/apron/surgical,
|
||||
/obj/item/clothing/mask/breath/medical,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dAB" = (
|
||||
/obj/structure/closet/secure_closet/CMO,
|
||||
/obj/item/clothing/under/rank/nursesuit,
|
||||
@@ -94324,7 +94324,7 @@
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dBP" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||
@@ -94334,13 +94334,13 @@
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/neutral,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dBQ" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dBR" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/cable/white{
|
||||
@@ -94350,7 +94350,7 @@
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/open/floor/plasteel/neutral,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dBS" = (
|
||||
/obj/structure/rack,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
@@ -94359,7 +94359,7 @@
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dBT" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
@@ -95032,15 +95032,15 @@
|
||||
/obj/structure/closet/secure_closet/medical3,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dDe" = (
|
||||
/obj/structure/closet/wardrobe/white/medical,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dDf" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/open/floor/plating,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dDg" = (
|
||||
/obj/structure/cable/white{
|
||||
d1 = 1;
|
||||
@@ -95048,10 +95048,15 @@
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/cable/white{
|
||||
d1 = 2;
|
||||
d2 = 4;
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dDh" = (
|
||||
/obj/machinery/suit_storage_unit/cmo,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
@@ -95603,7 +95608,7 @@
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/medical/morgue)
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"dEn" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/closed/wall,
|
||||
@@ -113090,6 +113095,50 @@
|
||||
/obj/structure/ore_box,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/auxillary_base)
|
||||
"esz" = (
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esA" = (
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esB" = (
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esC" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esD" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esE" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/power/apc{
|
||||
dir = 2;
|
||||
name = "Morgue Maintenance APC";
|
||||
areastring = "/area/maintenance/department/medical/morgue";
|
||||
pixel_y = -26
|
||||
},
|
||||
/obj/structure/cable/white{
|
||||
d2 = 8;
|
||||
icon_state = "0-8"
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esF" = (
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esG" = (
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
"esH" = (
|
||||
/turf/closed/wall,
|
||||
/area/maintenance/department/medical/morgue)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaa
|
||||
@@ -155932,13 +155981,13 @@ drr
|
||||
dsR
|
||||
dur
|
||||
dvw
|
||||
dwN
|
||||
esz
|
||||
dya
|
||||
dyY
|
||||
esD
|
||||
dAw
|
||||
dBO
|
||||
dDd
|
||||
dwK
|
||||
esF
|
||||
dFd
|
||||
dGE
|
||||
dHP
|
||||
@@ -156189,13 +156238,13 @@ drs
|
||||
dsS
|
||||
drs
|
||||
dvx
|
||||
dwN
|
||||
esA
|
||||
dyb
|
||||
dzf
|
||||
dAx
|
||||
dBP
|
||||
dDe
|
||||
dwK
|
||||
esG
|
||||
dFe
|
||||
dGF
|
||||
dHP
|
||||
@@ -156960,13 +157009,13 @@ drv
|
||||
dlO
|
||||
dus
|
||||
dvA
|
||||
dwK
|
||||
dxS
|
||||
esB
|
||||
esC
|
||||
dzi
|
||||
dAA
|
||||
dBS
|
||||
dxS
|
||||
dwK
|
||||
esE
|
||||
esH
|
||||
dEY
|
||||
dGA
|
||||
dHP
|
||||
|
||||
@@ -4354,13 +4354,6 @@
|
||||
/obj/structure/closet{
|
||||
name = "Evidence Closet 1"
|
||||
},
|
||||
/obj/item/storage/backpack{
|
||||
name = "Evidence Bag 1"
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 2;
|
||||
name = "2maintenance loot spawner"
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 1
|
||||
},
|
||||
@@ -4387,11 +4380,6 @@
|
||||
/area/security/warden)
|
||||
"aiz" = (
|
||||
/obj/structure/closet/secure_closet/evidence,
|
||||
/obj/item/storage/secure/briefcase{
|
||||
name = "Secure Evidence Briefcase";
|
||||
pixel_x = 3;
|
||||
pixel_y = -3
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 4
|
||||
},
|
||||
@@ -4758,17 +4746,10 @@
|
||||
/obj/structure/closet{
|
||||
name = "Evidence Closet 2"
|
||||
},
|
||||
/obj/item/storage/backpack{
|
||||
name = "Evidence Bag 2"
|
||||
},
|
||||
/obj/machinery/airalarm{
|
||||
dir = 4;
|
||||
pixel_x = -23
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 2;
|
||||
name = "2maintenance loot spawner"
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 1
|
||||
},
|
||||
@@ -4792,13 +4773,6 @@
|
||||
/obj/structure/closet{
|
||||
name = "Evidence Closet 5"
|
||||
},
|
||||
/obj/item/storage/backpack{
|
||||
name = "Evidence Bag 5"
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 2;
|
||||
name = "2maintenance loot spawner"
|
||||
},
|
||||
/obj/machinery/firealarm{
|
||||
dir = 4;
|
||||
pixel_x = 28
|
||||
@@ -5363,13 +5337,6 @@
|
||||
/obj/structure/closet{
|
||||
name = "Evidence Closet 4"
|
||||
},
|
||||
/obj/item/storage/backpack{
|
||||
name = "Evidence Bag 4"
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 2;
|
||||
name = "2maintenance loot spawner"
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 4
|
||||
},
|
||||
@@ -20485,13 +20452,6 @@
|
||||
/obj/structure/closet{
|
||||
name = "Evidence Closet 3"
|
||||
},
|
||||
/obj/item/storage/backpack{
|
||||
name = "Evidence Bag 3"
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 2;
|
||||
name = "2maintenance loot spawner"
|
||||
},
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 4
|
||||
},
|
||||
|
||||
@@ -140,6 +140,8 @@
|
||||
|
||||
#define isstructure(A) (istype(A, /obj/structure))
|
||||
|
||||
#define ismecha(A) (istype(A, /obj/mecha))
|
||||
|
||||
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
|
||||
|
||||
#define isorgan(A) (istype(A, /obj/item/organ))
|
||||
|
||||
@@ -70,6 +70,8 @@
|
||||
#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
|
||||
#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250)
|
||||
|
||||
#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow.
|
||||
|
||||
#define LIGHTING_PLANE_ALPHA_VISIBLE 255
|
||||
#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192
|
||||
#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// /tg/station 13 server tools API v3.1
|
||||
// /tg/station 13 server tools API v3.1.0.1
|
||||
|
||||
//CONFIGURATION
|
||||
//use this define if you want to do configuration outside of this file
|
||||
@@ -21,6 +21,8 @@
|
||||
#define SERVER_TOOLS_LOG(message) log_world("SERVICE: [##message]")
|
||||
//Notify current in-game administrators of a string `event`
|
||||
#define SERVER_TOOLS_NOTIFY_ADMINS(event) message_admins(##event)
|
||||
//The current amount of connected clients
|
||||
#define SERVER_TOOLS_CLIENT_COUNT GLOB.clients.len
|
||||
#endif
|
||||
|
||||
//Required hooks:
|
||||
@@ -62,7 +64,7 @@
|
||||
|
||||
//IMPLEMENTATION
|
||||
|
||||
#define SERVICE_API_VERSION_STRING "3.1.0.0"
|
||||
#define SERVICE_API_VERSION_STRING "3.1.0.1"
|
||||
|
||||
#define REBOOT_MODE_NORMAL 0
|
||||
#define REBOOT_MODE_HARD 1
|
||||
@@ -78,12 +80,13 @@
|
||||
#define SERVICE_CMD_GRACEFUL_SHUTDOWN "graceful_shutdown"
|
||||
#define SERVICE_CMD_WORLD_ANNOUNCE "world_announce"
|
||||
#define SERVICE_CMD_LIST_CUSTOM "list_custom_commands"
|
||||
#define SERVICE_CMD_API_COMPATIBLE "api_compat"
|
||||
#define SERVICE_CMD_PLAYER_COUNT "client_count"
|
||||
|
||||
#define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
|
||||
#define SERVICE_CMD_PARAM_COMMAND "command"
|
||||
#define SERVICE_CMD_PARAM_SENDER "sender"
|
||||
#define SERVICE_CMD_PARAM_CUSTOM "custom"
|
||||
#define SERVICE_CMD_API_COMPATIBLE "api_compat"
|
||||
|
||||
#define SERVICE_JSON_PARAM_HELPTEXT "help_text"
|
||||
#define SERVICE_JSON_PARAM_ADMINONLY "admin_only"
|
||||
|
||||
@@ -331,6 +331,20 @@
|
||||
afk_bracket += 600 // Add a minute to the bracket, for every attempt
|
||||
return candidates
|
||||
|
||||
/proc/considered_alive(datum/mind/M, enforce_human = TRUE)
|
||||
if(M && M.current)
|
||||
if(enforce_human)
|
||||
var/mob/living/carbon/human/H
|
||||
if(ishuman(M.current))
|
||||
H = M.current
|
||||
return M.current.stat != DEAD && !issilicon(M.current) && !isbrain(M.current) && (!H || H.dna.species.id != "memezombies")
|
||||
else if(isliving(M.current))
|
||||
return M.current.stat != DEAD
|
||||
return FALSE
|
||||
|
||||
/proc/considered_afk(datum/mind/M)
|
||||
return !M || !M.current || !M.current.client || M.current.client.is_afk()
|
||||
|
||||
/proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480)
|
||||
if(!isobj(O))
|
||||
O = new /obj/screen/text()
|
||||
|
||||
@@ -15,6 +15,7 @@ GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt"))
|
||||
GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt"))
|
||||
GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt"))
|
||||
GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt"))
|
||||
GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt"))
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt"))
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
if(!modifiers["catcher"] && A.IsObscured())
|
||||
return
|
||||
|
||||
if(istype(loc, /obj/mecha))
|
||||
if(ismecha(loc))
|
||||
var/obj/mecha/M = loc
|
||||
return M.click_action(A,src,params)
|
||||
|
||||
@@ -327,7 +327,7 @@
|
||||
ML.pulled(src)
|
||||
|
||||
/mob/living/carbon/human/CtrlClick(mob/user)
|
||||
if(ishuman(user) && Adjacent(user))
|
||||
if(ishuman(user) && Adjacent(user) && !user.incapacitated())
|
||||
if(world.time < user.next_move)
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/H = user
|
||||
@@ -359,7 +359,6 @@
|
||||
else
|
||||
user.listed_turf = T
|
||||
user.client.statpanel = T.name
|
||||
user.Stat() //responsive ui pls
|
||||
|
||||
/mob/proc/TurfAdjacent(turf/T)
|
||||
return T.Adjacent(src)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
icon_state = "act_equip"
|
||||
|
||||
/obj/screen/human/equip/Click()
|
||||
if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
|
||||
if(ismecha(usr.loc)) // stops inventory actions in a mech
|
||||
return 1
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.quick_equip()
|
||||
@@ -313,11 +313,15 @@
|
||||
inv.hud = src
|
||||
inv_slots[inv.slot_id] = inv
|
||||
inv.update_icon()
|
||||
|
||||
update_locked_slots()
|
||||
|
||||
/datum/hud/human/update_locked_slots()
|
||||
if(!mymob)
|
||||
return
|
||||
var/mob/living/carbon/human/H = mymob
|
||||
if(!istype(H) || !H.dna.species)
|
||||
return
|
||||
var/datum/species/S = H.dna.species
|
||||
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
|
||||
if(inv.slot_id)
|
||||
|
||||
+577
-577
File diff suppressed because it is too large
Load Diff
@@ -596,10 +596,10 @@ obj/item/projectile/bullet/c10mm/soporific
|
||||
if((blocked != 100) && isliving(target))
|
||||
var/mob/living/L = target
|
||||
L.blur_eyes(6)
|
||||
if(L.staminaloss >= 40)
|
||||
if(L.staminaloss >= 60)
|
||||
L.Sleeping(250)
|
||||
else
|
||||
L.adjustStaminaLoss(58)
|
||||
L.adjustStaminaLoss(25)
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_casing/c10mm/soporific
|
||||
|
||||
@@ -30,6 +30,14 @@
|
||||
item_color = null
|
||||
tagname = null
|
||||
|
||||
/obj/item/clothing/accessory/medal/steele
|
||||
name = "Insignia Of Steele"
|
||||
desc = "An intricate pendant given to those who help a key member of the Steele Corporation."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
icon_state = "steele"
|
||||
item_color = "steele"
|
||||
medaltype = "medal-silver"
|
||||
|
||||
/*DirtyOldHarry*/
|
||||
|
||||
/obj/item/lighter/gold
|
||||
@@ -55,6 +63,12 @@
|
||||
item_color = "zombscarf"
|
||||
dog_fashion = /datum/dog_fashion/head
|
||||
|
||||
/obj/item/clothing/suit/toggle/labcoat/mad/red
|
||||
name = "\improper The Mad's labcoat"
|
||||
desc = "An oddly special looking coat."
|
||||
icon_state = "labred"
|
||||
item_state = "labred"
|
||||
|
||||
|
||||
/*PLACEHOLDER*/
|
||||
|
||||
@@ -117,4 +131,14 @@
|
||||
desc = "You would swear this was in your nightmares after eating too many veggies."
|
||||
icon_state = "hos-g"
|
||||
item_state = "hos-g"
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
|
||||
|
||||
/*Slomek*/
|
||||
/obj/item/reagent_containers/food/drinks/flask/russian
|
||||
name = "russian flask"
|
||||
desc = "Every good russian spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
icon_state = "russianflask"
|
||||
item_state = "russianflask"
|
||||
volume = 60
|
||||
|
||||
@@ -24,8 +24,7 @@ GLOBAL_PROTECT(config_dir)
|
||||
LoadModes()
|
||||
for(var/I in config_files)
|
||||
LoadEntries(I)
|
||||
if(Get(/datum/config_entry/flag/maprotation))
|
||||
loadmaplist(CONFIG_MAPS_FILE)
|
||||
loadmaplist(CONFIG_MAPS_FILE)
|
||||
|
||||
/datum/controller/configuration/Destroy()
|
||||
entries_by_type.Cut()
|
||||
@@ -170,6 +169,7 @@ GLOBAL_PROTECT(config_dir)
|
||||
|
||||
/datum/controller/configuration/proc/loadmaplist(filename)
|
||||
filename = "[GLOB.config_dir][filename]"
|
||||
log_config("Loading config file [filename]...")
|
||||
var/list/Lines = world.file2list(filename)
|
||||
|
||||
var/datum/map_config/currentmap = null
|
||||
|
||||
@@ -8,10 +8,8 @@ CONFIG_DEF(string/autoadmin_rank) // the rank for autoadmins
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(string/servername) // server name (the name of the game window)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(string/serversqlname) // short form server name used for the DB
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(string/stationname) // station name (the name of the station in-game)
|
||||
|
||||
@@ -24,52 +22,38 @@ CONFIG_DEF(number/round_end_countdown) // Post round murder death kill countdown
|
||||
min_val = 0
|
||||
|
||||
CONFIG_DEF(flag/hub) // if the game appears on the hub or not
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_ooc) // log OOC channel
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_access) // log login/logout
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_say) // log client say
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_admin) // log admin actions
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_prayer) // log prayers
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_law) // log lawchanges
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_game) // log game events
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_vote) // log voting
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_whisper) // log client whisper
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_attack) // log attack messages
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_emote) // log emotes
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_adminchat) // log admin chat messages
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_pda) // log pda messages
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_twitter) // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/log_world_topic) // log all world.Topic() calls
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/allow_admin_ooccolor) // Allows admins with relevant permissions to have their own ooc colour
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
@@ -85,14 +69,12 @@ CONFIG_DEF(number/vote_delay) // minimum time between voting sessions (decisecon
|
||||
CONFIG_DEF(number/vote_period) // length of voting period (deciseconds, default 1 minute)
|
||||
value = 600
|
||||
min_val = 0
|
||||
|
||||
|
||||
CONFIG_DEF(flag/default_no_vote) // vote does not default to nochange/norestart
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/no_dead_vote) // dead people can't vote
|
||||
|
||||
CONFIG_DEF(flag/allow_metadata) // Metadata is supported.
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/popup_admin_pm) // adminPMs to non-admins show in a pop-up 'reply' window when set
|
||||
|
||||
@@ -140,14 +122,12 @@ CONFIG_DEF(flag/admin_legacy_system) //Defines whether the server uses the legac
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(string/hostedby)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/norespawn)
|
||||
|
||||
CONFIG_DEF(flag/guest_jobban)
|
||||
|
||||
CONFIG_DEF(flag/usewhitelist)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/ban_legacy_system) //Defines whether the server uses the legacy banning system with the files in /data or the SQL system.
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
@@ -171,29 +151,22 @@ CONFIG_DEF(flag/use_exp_restrictions_other)
|
||||
CONFIG_DEF(flag/use_exp_restrictions_admin_bypass)
|
||||
|
||||
CONFIG_DEF(string/server)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(string/banappeals)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(string/wikiurl)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = "http://www.tgstation13.org/wiki"
|
||||
|
||||
CONFIG_DEF(string/forumurl)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = "http://tgstation13.org/phpBB/index.php"
|
||||
|
||||
CONFIG_DEF(string/rulesurl)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = "http://www.tgstation13.org/wiki/Rules"
|
||||
|
||||
CONFIG_DEF(string/githuburl)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = "https://www.github.com/tgstation/-tg-station"
|
||||
|
||||
CONFIG_DEF(number/githubrepoid)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = null
|
||||
min_val = 0
|
||||
|
||||
@@ -233,7 +206,6 @@ CONFIG_DEF(flag/useircbot) //tgs2 support
|
||||
CONFIG_DEF(flag/automute_on) //enables automuting/spam prevention
|
||||
|
||||
CONFIG_DEF(string/panic_server_name)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val)
|
||||
return str_val != "\[Put the name here\]" && ..()
|
||||
@@ -290,7 +262,6 @@ CONFIG_DEF(string/extreme_popcap_message)
|
||||
value = "The server is currently serving a high number of users, find alternative servers."
|
||||
|
||||
CONFIG_DEF(flag/panic_bunker) // prevents people the server hasn't seen before from connecting
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(number/notify_new_player_age) // how long do we notify admins of a new player
|
||||
min_val = -1
|
||||
@@ -303,7 +274,6 @@ CONFIG_DEF(flag/irc_first_connection_alert) // do we notify the irc channel when
|
||||
CONFIG_DEF(flag/check_randomizer)
|
||||
|
||||
CONFIG_DEF(string/ipintel_email)
|
||||
protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN
|
||||
|
||||
/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val)
|
||||
return str_val != "ch@nge.me" && ..()
|
||||
@@ -315,17 +285,14 @@ CONFIG_DEF(number/ipintel_rating_bad)
|
||||
max_val = 1
|
||||
|
||||
CONFIG_DEF(number/ipintel_save_good)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = 12
|
||||
min_val = 0
|
||||
|
||||
CONFIG_DEF(number/ipintel_save_bad)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = 1
|
||||
min_val = 0
|
||||
|
||||
CONFIG_DEF(string/ipintel_domain)
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
value = "check.getipintel.net"
|
||||
|
||||
CONFIG_DEF(flag/aggressive_changelog)
|
||||
|
||||
@@ -344,6 +344,8 @@ SUBSYSTEM_DEF(ticker)
|
||||
var/list/miscreants = list()
|
||||
|
||||
to_chat(world, "<BR><BR><BR><FONT size=3><B>The round has ended.</B></FONT>")
|
||||
if(LAZYLEN(GLOB.round_end_notifiees))
|
||||
send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.")
|
||||
|
||||
/* var/nocredits = config.no_credits_round_end
|
||||
for(var/client/C in GLOB.clients)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/show_on_examine
|
||||
var/list/allowed_typecache
|
||||
var/last_inserted_type
|
||||
var/last_inserted_id
|
||||
var/last_amount_inserted
|
||||
var/last_insert_success
|
||||
var/datum/callback/precondition
|
||||
@@ -116,7 +117,7 @@
|
||||
if(!amt)
|
||||
return 0
|
||||
|
||||
insert_materials(S,amt)
|
||||
last_inserted_id = insert_materials(S,amt)
|
||||
last_inserted_type = S.type
|
||||
S.use(amt)
|
||||
last_amount_inserted = amt
|
||||
@@ -133,17 +134,22 @@
|
||||
if(!material_amount || !has_space(material_amount))
|
||||
return 0
|
||||
|
||||
insert_materials(I, multiplier)
|
||||
last_inserted_id = insert_materials(I, multiplier)
|
||||
last_inserted_type = I.type
|
||||
last_amount_inserted = material_amount
|
||||
return material_amount
|
||||
|
||||
/datum/component/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only
|
||||
var/datum/material/M
|
||||
var/primary_mat
|
||||
var/max_mat_value = 0
|
||||
for(var/MAT in materials)
|
||||
M = materials[MAT]
|
||||
M.amount += I.materials[MAT] * multiplier
|
||||
total_amount += I.materials[MAT] * multiplier
|
||||
if(I.materials[MAT] > max_mat_value)
|
||||
primary_mat = MAT
|
||||
return primary_mat
|
||||
|
||||
//For consuming material
|
||||
//mats is a list of types of material to use and the corresponding amounts, example: list(MAT_METAL=100, MAT_GLASS=200)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
|
||||
|
||||
//Copy properties over. This is so edited diseases persist.
|
||||
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms")
|
||||
var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms","processing")
|
||||
for(var/V in DD.vars)
|
||||
if(V in skipped)
|
||||
continue
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
destination.dna.temporary_mutations = temporary_mutations.Copy()
|
||||
if(transfer_SE)
|
||||
destination.dna.struc_enzymes = struc_enzymes
|
||||
if(ishuman(destination))
|
||||
var/mob/living/carbon/human/H = destination
|
||||
H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
|
||||
destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text
|
||||
|
||||
/datum/dna/proc/copy_dna(datum/dna/new_dna)
|
||||
new_dna.unique_enzymes = unique_enzymes
|
||||
@@ -227,6 +231,7 @@
|
||||
|
||||
if(newfeatures)
|
||||
dna.features = newfeatures
|
||||
flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text
|
||||
|
||||
if(mrace)
|
||||
var/datum/species/newrace = new mrace.type
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
|
||||
var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems)
|
||||
var/datum/language_holder/language_holder
|
||||
var/unconvertable = FALSE
|
||||
|
||||
/datum/mind/New(var/key)
|
||||
src.key = key
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
|
||||
/datum/status_effect/vanguard_shield/on_apply()
|
||||
owner.log_message("gained Vanguard stun immunity", INDIVIDUAL_ATTACK_LOG)
|
||||
owner.add_stun_absorption("vanguard", 200, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!")
|
||||
owner.add_stun_absorption("vanguard", INFINITY, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!")
|
||||
owner.visible_message("<span class='warning'>[owner] begins to faintly glow!</span>", "<span class='brass'>You will absorb all stuns for the next twenty seconds.</span>")
|
||||
owner.SetStun(0, FALSE)
|
||||
owner.SetKnockdown(0)
|
||||
@@ -87,7 +87,8 @@
|
||||
var/vanguard = owner.stun_absorption["vanguard"]
|
||||
var/stuns_blocked = 0
|
||||
if(vanguard)
|
||||
stuns_blocked = round(min(vanguard["stuns_absorbed"] * 0.25, 20))
|
||||
stuns_blocked = Floor(min(vanguard["stuns_absorbed"] * 0.25, 400))
|
||||
vanguard["end_time"] = 0 //so it doesn't absorb the stuns we're about to apply
|
||||
if(owner.stat != DEAD)
|
||||
var/message_to_owner = "<span class='warning'>You feel your Vanguard quietly fade...</span>"
|
||||
var/otheractiveabsorptions = FALSE
|
||||
@@ -95,7 +96,6 @@
|
||||
if(owner.stun_absorption[i]["end_time"] > world.time && owner.stun_absorption[i]["priority"] > vanguard["priority"])
|
||||
otheractiveabsorptions = TRUE
|
||||
if(!GLOB.ratvar_awakens && stuns_blocked && !otheractiveabsorptions)
|
||||
vanguard["end_time"] = 0 //so it doesn't absorb the stuns we're about to apply
|
||||
owner.Knockdown(stuns_blocked)
|
||||
message_to_owner = "<span class='boldwarning'>The weight of the Vanguard's protection crashes down upon you!</span>"
|
||||
if(stuns_blocked >= 300)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
probability = 90
|
||||
|
||||
/datum/weather/ash_storm/proc/is_ash_immune(mob/living/L)
|
||||
if(istype(L.loc, /obj/mecha)) //Mechs are immune
|
||||
if(ismecha(L.loc)) //Mechs are immune
|
||||
return TRUE
|
||||
if(ishuman(L)) //Are you immune?
|
||||
var/mob/living/carbon/human/H = L
|
||||
|
||||
@@ -151,7 +151,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
/area/maintenance/department/medical
|
||||
name = "Medbay Maintenance"
|
||||
icon_state = "asmaint"
|
||||
icon_state = "medbay_maint"
|
||||
|
||||
/area/maintenance/department/medical/morgue
|
||||
name = "Morgue Maintenance"
|
||||
icon_state = "morgue_maint"
|
||||
|
||||
/area/maintenance/department/science
|
||||
name = "Science Maintenance"
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
|
||||
|
||||
/atom/proc/CollidedWith(atom/movable/AM)
|
||||
set waitfor = FALSE
|
||||
return
|
||||
|
||||
// Convenience proc to see if a container is open for chemistry handling
|
||||
|
||||
@@ -53,6 +53,8 @@ Credit where due:
|
||||
return FALSE
|
||||
if(M.mind.enslaved_to && !is_servant_of_ratvar(M.mind.enslaved_to))
|
||||
return FALSE
|
||||
if(M.mind.unconvertable)
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
if(iscultist(M) || isconstruct(M) || M.isloyal() || ispAI(M))
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
if(GLOB.ratvar_awakens && L)
|
||||
L.adjust_fire_stacks(damage_per_tick)
|
||||
L.IgniteMob()
|
||||
else if(istype(target, /obj/mecha))
|
||||
else if(ismecha(target))
|
||||
var/obj/mecha/M = target
|
||||
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M))
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
to_chat(L, "<span class='neovgre'>\"I SEE YOU!\"</span>\n<span class='userdanger'>[src]'s gaze [GLOB.ratvar_awakens ? "melts you alive" : "burns you"]!</span>")
|
||||
else if(istype(target, /obj/mecha))
|
||||
else if(ismecha(target))
|
||||
var/obj/mecha/M = target
|
||||
to_chat(M.occupant, "<span class='neovgre'>\"I SEE YOU!\"</span>" )
|
||||
else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
return FALSE
|
||||
if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to))
|
||||
return FALSE
|
||||
if(M.mind.unconvertable)
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
if(M.isloyal() || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M))
|
||||
|
||||
@@ -468,11 +468,8 @@
|
||||
return
|
||||
|
||||
var/turf/open/floor/F
|
||||
switch(z) //Only the station/lavaland
|
||||
if(ZLEVEL_STATION_PRIMARY)
|
||||
F =find_safe_turf(zlevels = ZLEVEL_STATION_PRIMARY, extended_safety_checks = TRUE)
|
||||
if(ZLEVEL_LAVALAND)
|
||||
F = find_safe_turf(zlevels = ZLEVEL_LAVALAND, extended_safety_checks = TRUE)
|
||||
F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
|
||||
|
||||
if(!F)
|
||||
return
|
||||
// If we're getting rid of a human, slap some energy cuffs on
|
||||
|
||||
@@ -34,17 +34,13 @@
|
||||
|
||||
var/list/spawn_locs = list()
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/obj/effect/landmark/revenantspawn/L in GLOB.landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("revenantspawn")
|
||||
spawn_locs += L.loc
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs.len) //If we can't find any revenant spawns, try the carp spawns
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("carpspawn")
|
||||
spawn_locs += L.loc
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs.len) //If we can't find either, just spawn the revenant at the player's location
|
||||
spawn_locs += get_turf(selected)
|
||||
if(!spawn_locs.len) //If we can't find THAT, then just give up and cry
|
||||
|
||||
@@ -23,11 +23,9 @@
|
||||
player_mind.active = 1
|
||||
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("carpspawn")
|
||||
spawn_locs += L.loc
|
||||
spawn_locs += L.loc
|
||||
|
||||
if(!spawn_locs)
|
||||
message_admins("No valid spawn locations found, aborting...")
|
||||
|
||||
@@ -17,14 +17,6 @@
|
||||
if(owner)
|
||||
. += owner
|
||||
|
||||
/datum/objective/proc/considered_alive(var/datum/mind/M)
|
||||
if(M && M.current)
|
||||
var/mob/living/carbon/human/H
|
||||
if(ishuman(M.current))
|
||||
H = M.current
|
||||
return M.current.stat != DEAD && !issilicon(M.current) && !isbrain(M.current) && (!H || H.dna.species.id != "memezombies")
|
||||
return FALSE
|
||||
|
||||
/datum/objective/proc/considered_escaped(datum/mind/M)
|
||||
if(!considered_alive(M))
|
||||
return FALSE
|
||||
@@ -37,9 +29,6 @@
|
||||
return FALSE
|
||||
return location.onCentCom() || location.onSyndieBase()
|
||||
|
||||
/datum/objective/proc/considered_afk(datum/mind/M)
|
||||
return !M || !M.current || !M.current.client || M.current.client.is_afk()
|
||||
|
||||
/datum/objective/proc/check_completion()
|
||||
return completed
|
||||
|
||||
@@ -348,13 +337,14 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//Like survive, but works for silicons and zombies and such.
|
||||
/datum/objective/survive/exist/considered_alive(var/datum/mind/M)
|
||||
if(M && M.current)
|
||||
if(isliving(M.current))
|
||||
var/mob/living/L = M.current
|
||||
return L.stat != DEAD
|
||||
return FALSE
|
||||
/datum/objective/survive/exist //Like survive, but works for silicons and zombies and such.
|
||||
|
||||
/datum/objective/survive/exist/check_completion()
|
||||
var/list/datum/mind/owners = get_owners()
|
||||
for(var/datum/mind/M in owners)
|
||||
if(!considered_alive(M, FALSE))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/objective/martyr
|
||||
explanation_text = "Die a glorious death."
|
||||
|
||||
@@ -253,12 +253,14 @@
|
||||
|
||||
/datum/game_mode/proc/add_revolutionary(datum/mind/rev_mind)
|
||||
if(rev_mind.assigned_role in GLOB.command_positions)
|
||||
return 0
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted
|
||||
if(H.isloyal())
|
||||
return 0
|
||||
return FALSE
|
||||
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
|
||||
return 0
|
||||
return FALSE
|
||||
if(rev_mind.unconvertable)
|
||||
return FALSE
|
||||
revolutionaries += rev_mind
|
||||
if(iscarbon(rev_mind.current))
|
||||
var/mob/living/carbon/carbon_mob = rev_mind.current
|
||||
@@ -271,7 +273,7 @@
|
||||
update_rev_icons_added(rev_mind)
|
||||
if(jobban_isbanned(rev_mind.current, ROLE_REV))
|
||||
INVOKE_ASYNC(src, .proc/replace_jobbaned_player, rev_mind.current, ROLE_REV, ROLE_REV)
|
||||
return 1
|
||||
return TRUE
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@@ -329,7 +331,7 @@
|
||||
/datum/game_mode/revolution/proc/check_heads_victory()
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
var/turf/T = get_turf(rev_mind.current)
|
||||
if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != DEAD) && T && (T.z in GLOB.station_z_levels))
|
||||
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && (T.z in GLOB.station_z_levels))
|
||||
if(ishuman(rev_mind.current))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -95,6 +95,7 @@ Class Procs:
|
||||
/obj/machinery
|
||||
name = "machinery"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
desc = "Some kind of machine."
|
||||
verb_say = "beeps"
|
||||
verb_yell = "blares"
|
||||
pressure_resistance = 15
|
||||
|
||||
@@ -134,12 +134,11 @@
|
||||
if(ispath(lit, /obj/item/ore/bluespace_crystal))
|
||||
use_power(max(500,M.last_amount_inserted/10))
|
||||
else
|
||||
var/obj/item/stack/S = lit
|
||||
var/list/initmats = initial(S.materials)
|
||||
if (initmats[MAT_METAL])
|
||||
flick("autolathe_o",src)//plays metal insertion animation
|
||||
if (initmats[MAT_GLASS])
|
||||
flick("autolathe_r",src)//plays glass insertion animation
|
||||
switch(M.last_inserted_id)
|
||||
if (MAT_METAL)
|
||||
flick("autolathe_o",src)//plays metal insertion animation
|
||||
if (MAT_GLASS)
|
||||
flick("autolathe_r",src)//plays glass insertion animation
|
||||
use_power(M.last_amount_inserted*100)
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
if("working")
|
||||
temp_html += status
|
||||
temp_html += "<h1>System Busy</h1>"
|
||||
temp_html += "Working ... Please wait ([DisplayTimeText(radduration)])"
|
||||
temp_html += "Working ... Please wait ([DisplayTimeText(radduration*10)])"
|
||||
if("buffer")
|
||||
temp_html += status
|
||||
temp_html += buttons
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
bumpopen(M)
|
||||
return
|
||||
|
||||
if(istype(AM, /obj/mecha))
|
||||
if(ismecha(AM))
|
||||
var/obj/mecha/mecha = AM
|
||||
if(density)
|
||||
if(mecha.occupant)
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
if( operating || !src.density )
|
||||
return
|
||||
if (!( ismob(AM) ))
|
||||
if(istype(AM, /obj/mecha))
|
||||
if(ismecha(AM))
|
||||
var/obj/mecha/mecha = AM
|
||||
if(mecha.occupant && src.allowed(mecha.occupant))
|
||||
open_and_close()
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_button_standby"
|
||||
name = "access button"
|
||||
desc = "A button used for the explicit purpose of opening an airlock."
|
||||
var/idDoor
|
||||
var/obj/machinery/door/airlock/door
|
||||
var/obj/machinery/doorButtons/airlock_controller/controller
|
||||
@@ -107,6 +108,7 @@
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_control_standby"
|
||||
name = "access console"
|
||||
desc = "A small console that can cycle opening between two airlocks."
|
||||
var/obj/machinery/door/airlock/interiorAirlock
|
||||
var/obj/machinery/door/airlock/exteriorAirlock
|
||||
var/idInterior
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "light1"
|
||||
anchored = TRUE
|
||||
desc = "Make dark."
|
||||
var/on = TRUE
|
||||
var/area/area = null
|
||||
var/otherarea = null
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
var/O_limit
|
||||
var/atom/target = get_edge_target_turf(src, dir)
|
||||
for(var/atom/movable/O in loc)
|
||||
if(!O.anchored || istype(O, /obj/mecha)) //Mechs need their launch platforms.
|
||||
if(!O.anchored || ismecha(O)) //Mechs need their launch platforms.
|
||||
O_limit++
|
||||
if(O_limit >= 20)
|
||||
audible_message("<span class='notice'>[src] lets out a screech, it doesn't seem to be able to handle the load.</span>")
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "pipe dispenser"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "pipe_d"
|
||||
desc = "Dispenses countless types of pipes. Very useful if you need pipes."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/wait = 0
|
||||
@@ -108,6 +109,7 @@
|
||||
name = "disposal pipe dispenser"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "pipe_d"
|
||||
desc = "Dispenses pipes that will ultimately be used to move trash around."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
@@ -183,6 +185,7 @@ Nah
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "pipe_d"
|
||||
density = TRUE
|
||||
desc = "Dispenses pipes that will move beings around."
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/pipedispenser/disposal/transit_tube/attack_hand(mob/user)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
layer = OBJ_LAYER
|
||||
invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover
|
||||
density = TRUE
|
||||
desc = "A covered turret that shoots at its enemies."
|
||||
use_power = IDLE_POWER_USE //this turret uses and requires power
|
||||
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
|
||||
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
|
||||
@@ -389,7 +390,7 @@
|
||||
if(!in_faction(C))
|
||||
targets += C
|
||||
|
||||
if(istype(A, /obj/mecha))
|
||||
if(ismecha(A))
|
||||
var/obj/mecha/M = A
|
||||
//If there is a user and they're not in our faction
|
||||
if(M.occupant && !in_faction(M.occupant))
|
||||
@@ -552,6 +553,7 @@
|
||||
base_icon_state = "syndie"
|
||||
faction = "syndicate"
|
||||
emp_vunerable = 0
|
||||
desc = "A ballistic machine gun auto-turret."
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/energy
|
||||
icon_state = "standard_stun"
|
||||
@@ -560,6 +562,7 @@
|
||||
stun_projectile_sound = 'sound/weapons/taser.ogg'
|
||||
lethal_projectile = /obj/item/projectile/beam/laser/heavylaser
|
||||
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
desc = "An energy blaster auto-turret."
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/setup()
|
||||
return
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
name = "turret frame"
|
||||
icon = 'icons/obj/turrets.dmi'
|
||||
icon_state = "turret_frame"
|
||||
desc = "An unfinished covered turret frame."
|
||||
density = TRUE
|
||||
var/build_step = PTURRET_UNSECURED //the current step in the building process
|
||||
var/finish_name = "turret" //the name applied to the product turret
|
||||
|
||||
+198
-197
@@ -1,197 +1,198 @@
|
||||
#define SAFETY_COOLDOWN 100
|
||||
|
||||
/obj/machinery/recycler
|
||||
name = "recycler"
|
||||
desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side."
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "grinder-o0"
|
||||
layer = ABOVE_ALL_MOB_LAYER // Overhead
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/recycler
|
||||
var/safety_mode = FALSE // Temporarily stops machine if it detects a mob
|
||||
var/icon_name = "grinder-o"
|
||||
var/blood = 0
|
||||
var/eat_dir = WEST
|
||||
var/amount_produced = 50
|
||||
var/crush_damage = 1000
|
||||
var/eat_victim_items = TRUE
|
||||
var/item_recycle_sound = 'sound/items/welder.ogg'
|
||||
|
||||
/obj/machinery/recycler/Initialize()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM))
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/recycler/RefreshParts()
|
||||
var/amt_made = 0
|
||||
var/mat_mod = 0
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
mat_mod = 2 * B.rating
|
||||
mat_mod *= 50000
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
amt_made = 12.5 * M.rating //% of materials salvaged
|
||||
GET_COMPONENT(materials, /datum/component/material_container)
|
||||
materials.max_amount = mat_mod
|
||||
amount_produced = min(50, amt_made) + 50
|
||||
|
||||
/obj/machinery/recycler/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].")
|
||||
to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].")
|
||||
to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].")
|
||||
|
||||
/obj/machinery/recycler/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/recycler/attackby(obj/item/I, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
|
||||
return
|
||||
|
||||
if(exchange_parts(user, I))
|
||||
return
|
||||
|
||||
if(default_pry_open(I))
|
||||
return
|
||||
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/recycler/emag_act(mob/user)
|
||||
if(emagged)
|
||||
return
|
||||
emagged = TRUE
|
||||
if(safety_mode)
|
||||
safety_mode = FALSE
|
||||
update_icon()
|
||||
playsound(src, "sparks", 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>You use the cryptographic sequencer on the [src].</span>")
|
||||
|
||||
/obj/machinery/recycler/update_icon()
|
||||
..()
|
||||
var/is_powered = !(stat & (BROKEN|NOPOWER))
|
||||
if(safety_mode)
|
||||
is_powered = FALSE
|
||||
icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end
|
||||
|
||||
/obj/machinery/recycler/CollidedWith(atom/movable/AM)
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(!anchored)
|
||||
return
|
||||
if(safety_mode)
|
||||
return
|
||||
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
if(move_dir == eat_dir)
|
||||
eat(AM)
|
||||
|
||||
/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE)
|
||||
var/list/to_eat
|
||||
if(istype(AM0, /obj/item))
|
||||
to_eat = AM0.GetAllContents()
|
||||
else
|
||||
to_eat = list(AM0)
|
||||
|
||||
var/items_recycled = 0
|
||||
|
||||
for(var/i in to_eat)
|
||||
var/atom/movable/AM = i
|
||||
var/obj/item/bodypart/head/as_head = AM
|
||||
var/obj/item/device/mmi/as_mmi = AM
|
||||
var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain)
|
||||
if(isliving(AM) || brain_holder)
|
||||
if(emagged)
|
||||
if(!brain_holder)
|
||||
crush_living(AM)
|
||||
else
|
||||
emergency_stop(AM)
|
||||
else if(istype(AM, /obj/item))
|
||||
recycle_item(AM)
|
||||
items_recycled++
|
||||
else
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
AM.loc = src.loc
|
||||
|
||||
if(items_recycled && sound)
|
||||
playsound(src.loc, item_recycle_sound, 50, 1)
|
||||
|
||||
/obj/machinery/recycler/proc/recycle_item(obj/item/I)
|
||||
I.loc = src.loc
|
||||
|
||||
GET_COMPONENT(materials, /datum/component/material_container)
|
||||
var/material_amount = materials.get_item_material_amount(I)
|
||||
if(!material_amount)
|
||||
qdel(I)
|
||||
return
|
||||
materials.insert_item(I, multiplier = (amount_produced / 100))
|
||||
qdel(I)
|
||||
materials.retrieve_all()
|
||||
|
||||
|
||||
/obj/machinery/recycler/proc/emergency_stop(mob/living/L)
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
safety_mode = TRUE
|
||||
update_icon()
|
||||
L.loc = src.loc
|
||||
addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN)
|
||||
|
||||
/obj/machinery/recycler/proc/reboot()
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
safety_mode = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/recycler/proc/crush_living(mob/living/L)
|
||||
|
||||
L.loc = src.loc
|
||||
|
||||
if(issilicon(L))
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 50, 1)
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/gib = TRUE
|
||||
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
|
||||
if(iscarbon(L))
|
||||
gib = FALSE
|
||||
if(L.stat == CONSCIOUS)
|
||||
L.say("ARRRRRRRRRRRGH!!!")
|
||||
add_mob_blood(L)
|
||||
|
||||
if(!blood && !issilicon(L))
|
||||
blood = TRUE
|
||||
update_icon()
|
||||
|
||||
// Remove and recycle the equipped items
|
||||
if(eat_victim_items)
|
||||
for(var/obj/item/I in L.get_equipped_items())
|
||||
if(L.dropItemToGround(I))
|
||||
eat(I, sound=FALSE)
|
||||
|
||||
// Instantly lie down, also go unconscious from the pain, before you die.
|
||||
L.Unconscious(100)
|
||||
|
||||
// For admin fun, var edit emagged to 2.
|
||||
if(gib || emagged == 2)
|
||||
L.gib()
|
||||
else if(emagged == 1)
|
||||
L.adjustBruteLoss(crush_damage)
|
||||
|
||||
/obj/machinery/recycler/deathtrap
|
||||
name = "dangerous old crusher"
|
||||
emagged = TRUE
|
||||
crush_damage = 120
|
||||
flags_1 = NODECONSTRUCT_1
|
||||
|
||||
/obj/item/paper/guides/recycler
|
||||
name = "paper - 'garbage duty instructions'"
|
||||
info = "<h2>New Assignment</h2> You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.<br><br>There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!"
|
||||
|
||||
#undef SAFETY_COOLDOWN
|
||||
#define SAFETY_COOLDOWN 100
|
||||
|
||||
/obj/machinery/recycler
|
||||
name = "recycler"
|
||||
desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side."
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "grinder-o0"
|
||||
layer = ABOVE_ALL_MOB_LAYER // Overhead
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/recycler
|
||||
var/safety_mode = FALSE // Temporarily stops machine if it detects a mob
|
||||
var/icon_name = "grinder-o"
|
||||
var/blood = 0
|
||||
var/eat_dir = WEST
|
||||
var/amount_produced = 50
|
||||
var/crush_damage = 1000
|
||||
var/eat_victim_items = TRUE
|
||||
var/item_recycle_sound = 'sound/items/welder.ogg'
|
||||
|
||||
/obj/machinery/recycler/Initialize()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM))
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/recycler/RefreshParts()
|
||||
var/amt_made = 0
|
||||
var/mat_mod = 0
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
mat_mod = 2 * B.rating
|
||||
mat_mod *= 50000
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
amt_made = 12.5 * M.rating //% of materials salvaged
|
||||
GET_COMPONENT(materials, /datum/component/material_container)
|
||||
materials.max_amount = mat_mod
|
||||
amount_produced = min(50, amt_made) + 50
|
||||
|
||||
/obj/machinery/recycler/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].")
|
||||
to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].")
|
||||
to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].")
|
||||
|
||||
/obj/machinery/recycler/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/recycler/attackby(obj/item/I, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
|
||||
return
|
||||
|
||||
if(exchange_parts(user, I))
|
||||
return
|
||||
|
||||
if(default_pry_open(I))
|
||||
return
|
||||
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/recycler/emag_act(mob/user)
|
||||
if(emagged)
|
||||
return
|
||||
emagged = TRUE
|
||||
if(safety_mode)
|
||||
safety_mode = FALSE
|
||||
update_icon()
|
||||
playsound(src, "sparks", 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>You use the cryptographic sequencer on the [src].</span>")
|
||||
|
||||
/obj/machinery/recycler/update_icon()
|
||||
..()
|
||||
var/is_powered = !(stat & (BROKEN|NOPOWER))
|
||||
if(safety_mode)
|
||||
is_powered = FALSE
|
||||
icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end
|
||||
|
||||
/obj/machinery/recycler/CollidedWith(atom/movable/AM)
|
||||
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(!anchored)
|
||||
return
|
||||
if(safety_mode)
|
||||
return
|
||||
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
if(move_dir == eat_dir)
|
||||
eat(AM)
|
||||
|
||||
/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE)
|
||||
var/list/to_eat
|
||||
if(istype(AM0, /obj/item))
|
||||
to_eat = AM0.GetAllContents()
|
||||
else
|
||||
to_eat = list(AM0)
|
||||
|
||||
var/items_recycled = 0
|
||||
|
||||
for(var/i in to_eat)
|
||||
var/atom/movable/AM = i
|
||||
var/obj/item/bodypart/head/as_head = AM
|
||||
var/obj/item/device/mmi/as_mmi = AM
|
||||
var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain)
|
||||
if(brain_holder)
|
||||
emergency_stop(AM)
|
||||
else if(isliving(AM))
|
||||
if(emagged)
|
||||
crush_living(AM)
|
||||
else
|
||||
emergency_stop(AM)
|
||||
else if(istype(AM, /obj/item))
|
||||
recycle_item(AM)
|
||||
items_recycled++
|
||||
else
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
AM.forceMove(loc)
|
||||
|
||||
if(items_recycled && sound)
|
||||
playsound(src, item_recycle_sound, 50, 1)
|
||||
|
||||
/obj/machinery/recycler/proc/recycle_item(obj/item/I)
|
||||
I.forceMove(loc)
|
||||
|
||||
GET_COMPONENT(materials, /datum/component/material_container)
|
||||
var/material_amount = materials.get_item_material_amount(I)
|
||||
if(!material_amount)
|
||||
qdel(I)
|
||||
return
|
||||
materials.insert_item(I, multiplier = (amount_produced / 100))
|
||||
qdel(I)
|
||||
materials.retrieve_all()
|
||||
|
||||
|
||||
/obj/machinery/recycler/proc/emergency_stop(mob/living/L)
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
safety_mode = TRUE
|
||||
update_icon()
|
||||
L.forceMove(loc)
|
||||
addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN)
|
||||
|
||||
/obj/machinery/recycler/proc/reboot()
|
||||
playsound(src, 'sound/machines/ping.ogg', 50, 0)
|
||||
safety_mode = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/recycler/proc/crush_living(mob/living/L)
|
||||
|
||||
L.forceMove(loc)
|
||||
|
||||
if(issilicon(L))
|
||||
playsound(src, 'sound/items/welder.ogg', 50, 1)
|
||||
else
|
||||
playsound(src, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/gib = TRUE
|
||||
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
|
||||
if(iscarbon(L))
|
||||
gib = FALSE
|
||||
if(L.stat == CONSCIOUS)
|
||||
L.say("ARRRRRRRRRRRGH!!!")
|
||||
add_mob_blood(L)
|
||||
|
||||
if(!blood && !issilicon(L))
|
||||
blood = TRUE
|
||||
update_icon()
|
||||
|
||||
// Remove and recycle the equipped items
|
||||
if(eat_victim_items)
|
||||
for(var/obj/item/I in L.get_equipped_items())
|
||||
if(L.dropItemToGround(I))
|
||||
eat(I, sound=FALSE)
|
||||
|
||||
// Instantly lie down, also go unconscious from the pain, before you die.
|
||||
L.Unconscious(100)
|
||||
|
||||
// For admin fun, var edit emagged to 2.
|
||||
if(gib || emagged == 2)
|
||||
L.gib()
|
||||
else if(emagged == 1)
|
||||
L.adjustBruteLoss(crush_damage)
|
||||
|
||||
/obj/machinery/recycler/deathtrap
|
||||
name = "dangerous old crusher"
|
||||
emagged = TRUE
|
||||
crush_damage = 120
|
||||
flags_1 = NODECONSTRUCT_1
|
||||
|
||||
/obj/item/paper/guides/recycler
|
||||
name = "paper - 'garbage duty instructions'"
|
||||
info = "<h2>New Assignment</h2> You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.<br><br>There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!"
|
||||
|
||||
#undef SAFETY_COOLDOWN
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/obj/machinery/computer/telecomms/server
|
||||
name = "telecommunications server monitoring console"
|
||||
icon_screen = "comm_logs"
|
||||
desc = "Has full access to all details and record of the telecommunications network it's monitoring."
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
var/list/servers = list() // the servers located by the computer
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
/obj/machinery/computer/telecomms/monitor
|
||||
name = "telecommunications monitoring console"
|
||||
icon_screen = "comm_monitor"
|
||||
desc = "Monitors the details of the telecommunications network it's synced with."
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
var/list/machinelist = list() // the machines located by the computer
|
||||
|
||||
@@ -420,13 +420,7 @@
|
||||
var/datum/component/material_container/M = C
|
||||
if(!M.last_insert_success)
|
||||
return
|
||||
var/lit = M.last_inserted_type
|
||||
var/stack_name
|
||||
if(ispath(lit, /obj/item/ore/bluespace_crystal))
|
||||
stack_name = "bluespace"
|
||||
else
|
||||
var/obj/item/stack/S = lit
|
||||
stack_name = material2name(initial(S.materials)[1])
|
||||
var/stack_name = material2name(M.last_inserted_id)
|
||||
add_overlay("fab-load-[stack_name]")
|
||||
addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10)
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -1,137 +1,137 @@
|
||||
/obj/machinery/computer/mecha
|
||||
name = "exosuit control console"
|
||||
desc = "Used to remotely locate or lockdown exosuits."
|
||||
icon_screen = "mecha"
|
||||
icon_keyboard = "tech_key"
|
||||
/obj/machinery/computer/mecha
|
||||
name = "exosuit control console"
|
||||
desc = "Used to remotely locate or lockdown exosuits."
|
||||
icon_screen = "mecha"
|
||||
icon_keyboard = "tech_key"
|
||||
req_access = list(ACCESS_ROBOTICS)
|
||||
circuit = /obj/item/circuitboard/computer/mecha_control
|
||||
var/list/located = list()
|
||||
var/screen = 0
|
||||
var/stored_data
|
||||
|
||||
/obj/machinery/computer/mecha/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
var/list/trackerlist = list()
|
||||
for(var/obj/mecha/MC in GLOB.mechas_list)
|
||||
trackerlist += MC.trackers
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/TR in trackerlist)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br/>
|
||||
<a href='?src=\ref[src];send_message=\ref[TR]'>Send message</a><br/>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
dat += "[stored_data]"
|
||||
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>(Refresh)</A><BR>"
|
||||
dat += "</body></html>"
|
||||
|
||||
user << browse(dat, "window=computer;size=400x500")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/mecha/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
|
||||
var/message = stripped_input(usr,"Input message","Transmit message")
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(trim(message) && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking
|
||||
name = "exosuit tracking beacon"
|
||||
desc = "Device used to transmit exosuit data."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "motion2"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
origin_tech = "programming=2;magnets=2"
|
||||
var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking.
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
|
||||
if(!in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
var/cell_charge = M.get_charge()
|
||||
var/answer = {"<b>Name:</b> [M.name]
|
||||
<b>Integrity:</b> [M.obj_integrity/M.max_integrity*100]%
|
||||
<b>Cell charge:</b> [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa
|
||||
<b>Pilot:</b> [M.occupant||"None"]
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]
|
||||
<b>Active equipment:</b> [M.selected||"None"] "}
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
return answer
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/emp_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/Destroy()
|
||||
if(istype(loc, /obj/mecha))
|
||||
var/obj/mecha/M = loc
|
||||
if(src in M.trackers)
|
||||
M.trackers -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/in_mecha()
|
||||
if(istype(src.loc, /obj/mecha))
|
||||
return src.loc
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/shock()
|
||||
var/obj/mecha/M = in_mecha()
|
||||
if(M)
|
||||
circuit = /obj/item/circuitboard/computer/mecha_control
|
||||
var/list/located = list()
|
||||
var/screen = 0
|
||||
var/stored_data
|
||||
|
||||
/obj/machinery/computer/mecha/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
var/list/trackerlist = list()
|
||||
for(var/obj/mecha/MC in GLOB.mechas_list)
|
||||
trackerlist += MC.trackers
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/TR in trackerlist)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br/>
|
||||
<a href='?src=\ref[src];send_message=\ref[TR]'>Send message</a><br/>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
dat += "[stored_data]"
|
||||
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>(Refresh)</A><BR>"
|
||||
dat += "</body></html>"
|
||||
|
||||
user << browse(dat, "window=computer;size=400x500")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/mecha/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
|
||||
var/message = stripped_input(usr,"Input message","Transmit message")
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(trim(message) && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking
|
||||
name = "exosuit tracking beacon"
|
||||
desc = "Device used to transmit exosuit data."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "motion2"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
origin_tech = "programming=2;magnets=2"
|
||||
var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking.
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
|
||||
if(!in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
var/cell_charge = M.get_charge()
|
||||
var/answer = {"<b>Name:</b> [M.name]
|
||||
<b>Integrity:</b> [M.obj_integrity/M.max_integrity*100]%
|
||||
<b>Cell charge:</b> [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa
|
||||
<b>Pilot:</b> [M.occupant||"None"]
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]
|
||||
<b>Active equipment:</b> [M.selected||"None"] "}
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
return answer
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/emp_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/Destroy()
|
||||
if(ismecha(loc))
|
||||
var/obj/mecha/M = loc
|
||||
if(src in M.trackers)
|
||||
M.trackers -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/in_mecha()
|
||||
if(ismecha(loc))
|
||||
return loc
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/shock()
|
||||
var/obj/mecha/M = in_mecha()
|
||||
if(M)
|
||||
M.emp_act(EMP_LIGHT)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
|
||||
if(!istype(loc, /obj/mecha))
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
return M.get_log_html()
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/ai_control
|
||||
name = "exosuit AI control beacon"
|
||||
desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit."
|
||||
origin_tech = "programming=3;magnets=2;engineering=2"
|
||||
ai_beacon = TRUE
|
||||
|
||||
|
||||
/obj/item/storage/box/mechabeacons
|
||||
name = "exosuit tracking beacons"
|
||||
|
||||
/obj/item/storage/box/mechabeacons/New()
|
||||
..()
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
|
||||
if(!ismecha(loc))
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
return M.get_log_html()
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/ai_control
|
||||
name = "exosuit AI control beacon"
|
||||
desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit."
|
||||
origin_tech = "programming=3;magnets=2;engineering=2"
|
||||
ai_beacon = TRUE
|
||||
|
||||
|
||||
/obj/item/storage/box/mechabeacons
|
||||
name = "exosuit tracking beacons"
|
||||
|
||||
/obj/item/storage/box/mechabeacons/New()
|
||||
..()
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
|
||||
@@ -1,156 +1,154 @@
|
||||
|
||||
/proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal)
|
||||
if(!istype(source) || !istype(destination))
|
||||
return
|
||||
var/turf/actual_destination = get_teleport_turf(destination, accuracy)
|
||||
var/obj/effect/portal/P1 = new newtype(source, _creator, _lifespan, null, FALSE)
|
||||
var/obj/effect/portal/P2 = new newtype(actual_destination, _creator, _lifespan, P1, TRUE)
|
||||
if(!istype(P1)||!istype(P2))
|
||||
return
|
||||
P1.link_portal(P2)
|
||||
P1.hardlinked = TRUE
|
||||
return list(P1, P2)
|
||||
|
||||
/obj/effect/portal
|
||||
name = "portal"
|
||||
desc = "Looks unstable. Best to test it with the clown."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "portal"
|
||||
anchored = TRUE
|
||||
var/mech_sized = FALSE
|
||||
var/obj/effect/portal/linked
|
||||
var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted.
|
||||
var/creator
|
||||
var/turf/hard_target //For when a portal needs a hard target and isn't to be linked.
|
||||
var/atmos_link = FALSE //Link source/destination atmos.
|
||||
var/turf/open/atmos_source //Atmos link source
|
||||
var/turf/open/atmos_destination //Atmos link destination
|
||||
|
||||
/obj/effect/portal/anom
|
||||
name = "wormhole"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "anom"
|
||||
mech_sized = TRUE
|
||||
|
||||
/obj/effect/portal/Move(newloc)
|
||||
for(var/T in newloc)
|
||||
if(istype(T, /obj/effect/portal))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/attackby(obj/item/W, mob/user, params)
|
||||
if(user && Adjacent(user))
|
||||
teleport(user)
|
||||
|
||||
/obj/effect/portal/Crossed(atom/movable/AM, oldloc)
|
||||
if(get_turf(oldloc) == get_turf(linked))
|
||||
return ..()
|
||||
if(!teleport(AM))
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/attack_tk(mob/user)
|
||||
return
|
||||
|
||||
/obj/effect/portal/attack_hand(mob/user)
|
||||
if(Adjacent(user))
|
||||
teleport(user)
|
||||
|
||||
/obj/effect/portal/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override, atmos_link_override)
|
||||
. = ..()
|
||||
GLOB.portals += src
|
||||
if(!istype(_linked) && automatic_link)
|
||||
. = INITIALIZE_HINT_QDEL
|
||||
CRASH("Somebody fucked up.")
|
||||
if(_lifespan > 0)
|
||||
QDEL_IN(src, _lifespan)
|
||||
if(!isnull(atmos_link_override))
|
||||
atmos_link = atmos_link_override
|
||||
link_portal(_linked)
|
||||
hardlinked = automatic_link
|
||||
creator = _creator
|
||||
if(isturf(hard_target_override))
|
||||
hard_target = hard_target_override
|
||||
|
||||
/obj/effect/portal/proc/link_portal(obj/effect/portal/newlink)
|
||||
linked = newlink
|
||||
if(atmos_link)
|
||||
link_atmos()
|
||||
|
||||
/obj/effect/portal/proc/link_atmos()
|
||||
if(atmos_source || atmos_destination)
|
||||
unlink_atmos()
|
||||
if(!isopenturf(get_turf(src)))
|
||||
return FALSE
|
||||
if(linked)
|
||||
if(isopenturf(get_turf(linked)))
|
||||
atmos_source = get_turf(src)
|
||||
atmos_destination = get_turf(linked)
|
||||
else if(hard_target)
|
||||
if(isopenturf(hard_target))
|
||||
atmos_source = get_turf(src)
|
||||
atmos_destination = hard_target
|
||||
else
|
||||
return FALSE
|
||||
if(!istype(atmos_source) || !istype(atmos_destination))
|
||||
return FALSE
|
||||
LAZYINITLIST(atmos_source.atmos_adjacent_turfs)
|
||||
LAZYINITLIST(atmos_destination.atmos_adjacent_turfs)
|
||||
if(atmos_source.atmos_adjacent_turfs[atmos_destination] || atmos_destination.atmos_adjacent_turfs[atmos_source]) //Already linked!
|
||||
return FALSE
|
||||
atmos_source.atmos_adjacent_turfs[atmos_destination] = TRUE
|
||||
atmos_destination.atmos_adjacent_turfs[atmos_source] = TRUE
|
||||
atmos_source.air_update_turf(FALSE)
|
||||
atmos_destination.air_update_turf(FALSE)
|
||||
|
||||
/obj/effect/portal/proc/unlink_atmos()
|
||||
if(istype(atmos_source))
|
||||
if(istype(atmos_destination) && !atmos_source.Adjacent(atmos_destination) && !CANATMOSPASS(atmos_destination, atmos_source))
|
||||
LAZYREMOVE(atmos_source.atmos_adjacent_turfs, atmos_destination)
|
||||
atmos_source = null
|
||||
if(istype(atmos_destination))
|
||||
if(istype(atmos_source) && !atmos_destination.Adjacent(atmos_source) && !CANATMOSPASS(atmos_source, atmos_destination))
|
||||
LAZYREMOVE(atmos_destination.atmos_adjacent_turfs, atmos_source)
|
||||
atmos_destination = null
|
||||
|
||||
/obj/effect/portal/Destroy() //Calls on_portal_destroy(destroyed portal, location of destroyed portal) on creator if creator has such call.
|
||||
if(creator && hascall(creator, "on_portal_destroy"))
|
||||
call(creator, "on_portal_destroy")(src, src.loc)
|
||||
creator = null
|
||||
GLOB.portals -= src
|
||||
unlink_atmos()
|
||||
if(hardlinked && !QDELETED(linked))
|
||||
QDEL_NULL(linked)
|
||||
else
|
||||
linked = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/proc/teleport(atom/movable/M)
|
||||
if(!istype(M) || istype(M, /obj/effect) || (istype(M, /obj/mecha) && !mech_sized) || (!isobj(M) && !ismob(M))) //Things that shouldn't teleport.
|
||||
return
|
||||
var/turf/real_target = get_link_target_turf()
|
||||
if(!istype(real_target))
|
||||
return FALSE
|
||||
if(ismegafauna(M))
|
||||
message_admins("[M] has used a portal at [ADMIN_COORDJMP(src)] made by [usr].")
|
||||
if(do_teleport(M, real_target, 0))
|
||||
if(istype(M, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = M
|
||||
P.ignore_source_check = TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/effect/portal/proc/get_link_target_turf()
|
||||
var/turf/real_target
|
||||
if(!istype(linked) || QDELETED(linked))
|
||||
if(hardlinked)
|
||||
qdel(src)
|
||||
if(!istype(hard_target) || QDELETED(hard_target))
|
||||
hard_target = null
|
||||
return
|
||||
else
|
||||
real_target = hard_target
|
||||
linked = null
|
||||
else
|
||||
real_target = get_turf(linked)
|
||||
return real_target
|
||||
|
||||
/proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal)
|
||||
if(!istype(source) || !istype(destination))
|
||||
return
|
||||
var/turf/actual_destination = get_teleport_turf(destination, accuracy)
|
||||
var/obj/effect/portal/P1 = new newtype(source, _creator, _lifespan, null, FALSE)
|
||||
var/obj/effect/portal/P2 = new newtype(actual_destination, _creator, _lifespan, P1, TRUE)
|
||||
if(!istype(P1)||!istype(P2))
|
||||
return
|
||||
P1.link_portal(P2)
|
||||
P1.hardlinked = TRUE
|
||||
return list(P1, P2)
|
||||
|
||||
/obj/effect/portal
|
||||
name = "portal"
|
||||
desc = "Looks unstable. Best to test it with the clown."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "portal"
|
||||
anchored = TRUE
|
||||
var/mech_sized = FALSE
|
||||
var/obj/effect/portal/linked
|
||||
var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted.
|
||||
var/creator
|
||||
var/turf/hard_target //For when a portal needs a hard target and isn't to be linked.
|
||||
var/atmos_link = FALSE //Link source/destination atmos.
|
||||
var/turf/open/atmos_source //Atmos link source
|
||||
var/turf/open/atmos_destination //Atmos link destination
|
||||
|
||||
/obj/effect/portal/anom
|
||||
name = "wormhole"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "anom"
|
||||
mech_sized = TRUE
|
||||
|
||||
/obj/effect/portal/Move(newloc)
|
||||
for(var/T in newloc)
|
||||
if(istype(T, /obj/effect/portal))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/attackby(obj/item/W, mob/user, params)
|
||||
if(user && Adjacent(user))
|
||||
user.forceMove(get_turf(src))
|
||||
|
||||
/obj/effect/portal/Crossed(atom/movable/AM, oldloc)
|
||||
if(linked && (get_turf(oldloc) == get_turf(linked)))
|
||||
return ..()
|
||||
if(!teleport(AM))
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/attack_tk(mob/user)
|
||||
return
|
||||
|
||||
/obj/effect/portal/attack_hand(mob/user)
|
||||
if(Adjacent(user))
|
||||
user.forceMove(get_turf(src))
|
||||
|
||||
/obj/effect/portal/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override, atmos_link_override)
|
||||
. = ..()
|
||||
GLOB.portals += src
|
||||
if(!istype(_linked) && automatic_link)
|
||||
. = INITIALIZE_HINT_QDEL
|
||||
CRASH("Somebody fucked up.")
|
||||
if(_lifespan > 0)
|
||||
QDEL_IN(src, _lifespan)
|
||||
if(!isnull(atmos_link_override))
|
||||
atmos_link = atmos_link_override
|
||||
link_portal(_linked)
|
||||
hardlinked = automatic_link
|
||||
creator = _creator
|
||||
if(isturf(hard_target_override))
|
||||
hard_target = hard_target_override
|
||||
|
||||
/obj/effect/portal/proc/link_portal(obj/effect/portal/newlink)
|
||||
linked = newlink
|
||||
if(atmos_link)
|
||||
link_atmos()
|
||||
|
||||
/obj/effect/portal/proc/link_atmos()
|
||||
if(atmos_source || atmos_destination)
|
||||
unlink_atmos()
|
||||
if(!isopenturf(get_turf(src)))
|
||||
return FALSE
|
||||
if(linked)
|
||||
if(isopenturf(get_turf(linked)))
|
||||
atmos_source = get_turf(src)
|
||||
atmos_destination = get_turf(linked)
|
||||
else if(hard_target)
|
||||
if(isopenturf(hard_target))
|
||||
atmos_source = get_turf(src)
|
||||
atmos_destination = hard_target
|
||||
else
|
||||
return FALSE
|
||||
if(!istype(atmos_source) || !istype(atmos_destination))
|
||||
return FALSE
|
||||
LAZYINITLIST(atmos_source.atmos_adjacent_turfs)
|
||||
LAZYINITLIST(atmos_destination.atmos_adjacent_turfs)
|
||||
if(atmos_source.atmos_adjacent_turfs[atmos_destination] || atmos_destination.atmos_adjacent_turfs[atmos_source]) //Already linked!
|
||||
return FALSE
|
||||
atmos_source.atmos_adjacent_turfs[atmos_destination] = TRUE
|
||||
atmos_destination.atmos_adjacent_turfs[atmos_source] = TRUE
|
||||
atmos_source.air_update_turf(FALSE)
|
||||
atmos_destination.air_update_turf(FALSE)
|
||||
|
||||
/obj/effect/portal/proc/unlink_atmos()
|
||||
if(istype(atmos_source))
|
||||
if(istype(atmos_destination) && !atmos_source.Adjacent(atmos_destination) && !CANATMOSPASS(atmos_destination, atmos_source))
|
||||
LAZYREMOVE(atmos_source.atmos_adjacent_turfs, atmos_destination)
|
||||
atmos_source = null
|
||||
if(istype(atmos_destination))
|
||||
if(istype(atmos_source) && !atmos_destination.Adjacent(atmos_source) && !CANATMOSPASS(atmos_source, atmos_destination))
|
||||
LAZYREMOVE(atmos_destination.atmos_adjacent_turfs, atmos_source)
|
||||
atmos_destination = null
|
||||
|
||||
/obj/effect/portal/Destroy() //Calls on_portal_destroy(destroyed portal, location of destroyed portal) on creator if creator has such call.
|
||||
if(creator && hascall(creator, "on_portal_destroy"))
|
||||
call(creator, "on_portal_destroy")(src, src.loc)
|
||||
creator = null
|
||||
GLOB.portals -= src
|
||||
unlink_atmos()
|
||||
if(hardlinked && !QDELETED(linked))
|
||||
QDEL_NULL(linked)
|
||||
else
|
||||
linked = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/proc/teleport(atom/movable/M)
|
||||
if(!istype(M) || istype(M, /obj/effect) || (ismecha(M) && !mech_sized) || (!isobj(M) && !ismob(M))) //Things that shouldn't teleport.
|
||||
return
|
||||
var/turf/real_target = get_link_target_turf()
|
||||
if(!istype(real_target))
|
||||
return FALSE
|
||||
if(ismegafauna(M))
|
||||
message_admins("[M] has used a portal at [ADMIN_COORDJMP(src)] made by [usr].")
|
||||
if(do_teleport(M, real_target, 0))
|
||||
if(istype(M, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = M
|
||||
P.ignore_source_check = TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/effect/portal/proc/get_link_target_turf()
|
||||
var/turf/real_target
|
||||
if(!istype(linked) || QDELETED(linked))
|
||||
if(hardlinked)
|
||||
qdel(src)
|
||||
if(!istype(hard_target) || QDELETED(hard_target))
|
||||
hard_target = null
|
||||
return
|
||||
else
|
||||
real_target = hard_target
|
||||
linked = null
|
||||
else
|
||||
real_target = get_turf(linked)
|
||||
return real_target
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
/obj/effect/temp_visual/fire
|
||||
icon = 'icons/effects/fire.dmi'
|
||||
icon_state = "3"
|
||||
light_range = 3
|
||||
light_range = LIGHT_RANGE_FIRE
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
duration = 10
|
||||
|
||||
|
||||
@@ -143,4 +143,82 @@ Code:
|
||||
</TT>"}
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/device/electropack/shockcollar
|
||||
name = "shock collar"
|
||||
desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.."
|
||||
icon = 'icons/obj/clothing/neck.dmi'
|
||||
icon_state = "shockcollar"
|
||||
item_state = "shockcollar"
|
||||
body_parts_covered = NECK
|
||||
slot_flags = SLOT_NECK
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
strip_delay = 60
|
||||
equip_delay_other = 60
|
||||
materials = list(MAT_METAL=5000, MAT_GLASS=2000)
|
||||
var/tagname = null
|
||||
|
||||
/obj/item/device/electropack/shockcollar/attack_hand(mob/user)
|
||||
if(loc == user)
|
||||
if(slot_flags == SLOT_NECK)
|
||||
to_chat(user, "<span class='warning'>The collar is fastened tight! You'll need help taking this off!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/device/electropack/shockcollar/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption != code)
|
||||
return
|
||||
|
||||
if(isliving(loc) && on)
|
||||
if(shock_cooldown != 0)
|
||||
return
|
||||
shock_cooldown = 1
|
||||
spawn(100)
|
||||
shock_cooldown = 0
|
||||
var/mob/living/L = loc
|
||||
step(L, pick(GLOB.cardinals))
|
||||
|
||||
to_chat(L, "<span class='danger'>You feel a sharp shock from the collar!</span>")
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, L)
|
||||
s.start()
|
||||
|
||||
L.Knockdown(100)
|
||||
|
||||
if(master)
|
||||
master.receive_signal()
|
||||
return
|
||||
|
||||
/obj/item/device/electropack/shockcollar/attack_self(mob/user) //Turns out can't fully source this from the parent item, spritepath gets confused if power toggled. Will come back to this when I know how to code better and readd powertoggle..
|
||||
var/option = "Change Name"
|
||||
option = input(user, "What do you want to do?", "[src]", option) as null|anything in list("Change Name", "Change Frequency")
|
||||
switch(option)
|
||||
if("Change Name")
|
||||
var/t = input(user, "Would you like to change the name on the tag?", "Name your new pet", tagname ? tagname : "Spot") as null|text
|
||||
if(t)
|
||||
tagname = copytext(sanitize(t), 1, MAX_NAME_LEN)
|
||||
name = "[initial(name)] - [tagname]"
|
||||
if("Change Frequency")
|
||||
if(!ishuman(user))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = {"<SK><BR>
|
||||
<B>Frequency/Code</B> for shock collar:<BR>
|
||||
Frequency:
|
||||
<A href='byond://?src=\ref[src];freq=-10'>-</A>
|
||||
<A href='byond://?src=\ref[src];freq=-2'>-</A> [format_frequency(frequency)]
|
||||
<A href='byond://?src=\ref[src];freq=2'>+</A>
|
||||
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>
|
||||
|
||||
Code:
|
||||
<A href='byond://?src=\ref[src];code=-5'>-</A>
|
||||
<A href='byond://?src=\ref[src];code=-1'>-</A> [code]
|
||||
<A href='byond://?src=\ref[src];code=1'>+</A>
|
||||
<A href='byond://?src=\ref[src];code=5'>+</A><BR>
|
||||
</SK>"}
|
||||
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
suffix = "\[3\]"
|
||||
icon_state = "walkietalkie"
|
||||
item_state = "walkietalkie"
|
||||
desc = "A basic handheld radio that communicates with local telecommunication networks."
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
var/on = TRUE // 0 for off
|
||||
var/last_transmission
|
||||
|
||||
@@ -73,6 +73,7 @@ MASS SPECTROMETER
|
||||
origin_tech = "magnets=1;biotech=1"
|
||||
var/mode = 1
|
||||
var/scanmode = 0
|
||||
var/advanced = FALSE
|
||||
|
||||
/obj/item/device/healthanalyzer/attack_self(mob/user)
|
||||
if(!scanmode)
|
||||
@@ -97,7 +98,7 @@ MASS SPECTROMETER
|
||||
user.visible_message("<span class='notice'>[user] has analyzed [M]'s vitals.</span>")
|
||||
|
||||
if(scanmode == 0)
|
||||
healthscan(user, M, mode)
|
||||
healthscan(user, M, mode, advanced)
|
||||
else if(scanmode == 1)
|
||||
chemscan(user, M)
|
||||
|
||||
@@ -105,7 +106,7 @@ MASS SPECTROMETER
|
||||
|
||||
|
||||
// Used by the PDA medical scanner too
|
||||
/proc/healthscan(mob/living/user, mob/living/M, mode = 1)
|
||||
/proc/healthscan(mob/living/user, mob/living/M, mode = 1, advanced = FALSE)
|
||||
if(user.incapacitated() || user.eye_blind)
|
||||
return
|
||||
//Damage specifics
|
||||
@@ -115,8 +116,8 @@ MASS SPECTROMETER
|
||||
var/brute_loss = M.getBruteLoss()
|
||||
var/mob_status = (M.stat == DEAD ? "<span class='alert'><b>Deceased</b></span>" : "<b>[round(M.health/M.maxHealth,0.01)*100] % healthy</b>")
|
||||
|
||||
if(M.status_flags & FAKEDEATH)
|
||||
mob_status = "<span class='alert'>Deceased</span>"
|
||||
if(M.status_flags & FAKEDEATH && !advanced)
|
||||
mob_status = "<span class='alert'><b>Deceased</b></span>"
|
||||
oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss
|
||||
|
||||
if(ishuman(M))
|
||||
@@ -141,19 +142,77 @@ MASS SPECTROMETER
|
||||
if(oxy_loss > 10)
|
||||
to_chat(user, "\t<span class='info'><span class='alert'>[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.</span>")
|
||||
if(tox_loss > 10)
|
||||
to_chat(user, "\t<span class='alert'>[tox_loss > 50 ? "Critical" : "Dangerous"] amount of toxins detected.</span>")
|
||||
to_chat(user, "\t<span class='alert'>[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.</span>")
|
||||
if(M.getStaminaLoss())
|
||||
to_chat(user, "\t<span class='alert'>Subject appears to be suffering from fatigue.</span>")
|
||||
if(advanced)
|
||||
to_chat(user, "\t<span class='info'>Fatigue Level: [M.getStaminaLoss()]%.</span>")
|
||||
if (M.getCloneLoss())
|
||||
to_chat(user, "\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
|
||||
if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
|
||||
to_chat(user, "\t<span class='info'>Bloodstream analysis located [M.reagents.get_reagent_amount("epinephrine")] units of rejuvenation chemicals.</span>")
|
||||
if(advanced)
|
||||
to_chat(user, "\t<span class='info'>Cellular Damage Level: [M.getCloneLoss()].</span>")
|
||||
if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain))
|
||||
to_chat(user, "\t<span class='alert'>Subject brain function is non-existent.</span>")
|
||||
else if (M.getBrainLoss() >= 60)
|
||||
to_chat(user, "\t<span class='alert'>Severe brain damage detected. Subject likely to have mental retardation.</span>")
|
||||
else if (M.getBrainLoss() >= 10)
|
||||
to_chat(user, "\t<span class='alert'>Brain damage detected. Subject may have had a concussion.</span>")
|
||||
if(advanced)
|
||||
to_chat(user, "\t<span class='info'>Brain Activity Level: [100 - M.getBrainLoss()]%.</span>")
|
||||
if (M.radiation)
|
||||
to_chat(user, "\t<span class='alert'>Subject is irradiated.</span>")
|
||||
if(advanced)
|
||||
to_chat(user, "\t<span class='info'>Radiation Level: [M.radiation]%.</span>")
|
||||
|
||||
if(advanced && M.hallucinating())
|
||||
to_chat(user, "\t<span class='info'>Subject is hallucinating.</span>")
|
||||
|
||||
//Eyes and ears
|
||||
if(advanced)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/ears/ears = C.getorganslot("ears")
|
||||
to_chat(user, "\t<span class='info'><b>==EAR STATUS==</b></span>")
|
||||
if(istype(ears))
|
||||
var/healthy = TRUE
|
||||
if(C.disabilities & DEAF)
|
||||
healthy = FALSE
|
||||
to_chat(user, "\t<span class='alert'>Subject is genetically deaf.</span>")
|
||||
else
|
||||
if(ears.ear_damage)
|
||||
to_chat(user, "\t<span class='alert'>Subject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.</span>")
|
||||
healthy = FALSE
|
||||
if(ears.deaf)
|
||||
to_chat(user, "\t<span class='alert'>Subject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.</span>")
|
||||
healthy = FALSE
|
||||
if(healthy)
|
||||
to_chat(user, "\t<span class='info'>Healthy.</span>")
|
||||
else
|
||||
to_chat(user, "\t<span class='alert'>Subject does not have ears.</span>")
|
||||
var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
|
||||
to_chat(user, "\t<span class='info'><b>==EYE STATUS==</b></span>")
|
||||
if(istype(eyes))
|
||||
var/healthy = TRUE
|
||||
if(C.disabilities & BLIND)
|
||||
to_chat(user, "\t<span class='alert'>Subject is blind.</span>")
|
||||
healthy = FALSE
|
||||
if(C.disabilities & NEARSIGHT)
|
||||
to_chat(user, "\t<span class='alert'>Subject is nearsighted.</span>")
|
||||
healthy = FALSE
|
||||
if(eyes.eye_damage > 30)
|
||||
to_chat(user, "\t<span class='alert'>Subject has severe eye damage.</span>")
|
||||
healthy = FALSE
|
||||
else if(eyes.eye_damage > 20)
|
||||
to_chat(user, "\t<span class='alert'>Subject has significant eye damage.</span>")
|
||||
healthy = FALSE
|
||||
else if(eyes.eye_damage)
|
||||
to_chat(user, "\t<span class='alert'>Subject has minor eye damage.</span>")
|
||||
healthy = FALSE
|
||||
if(healthy)
|
||||
to_chat(user, "\t<span class='info'>Healthy.</span>")
|
||||
else
|
||||
to_chat(user, "\t<span class='alert'>Subject does not have eyes.</span>")
|
||||
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
@@ -177,7 +236,7 @@ MASS SPECTROMETER
|
||||
to_chat(user, "<span class='info'>Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)</span>")
|
||||
|
||||
// Time of death
|
||||
if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
|
||||
if(M.tod && (M.stat == DEAD || ((M.status_flags & FAKEDEATH) && !advanced)))
|
||||
to_chat(user, "<span class='info'>Time of Death:</span> [M.tod]")
|
||||
var/tdelta = round(world.time - M.timeofdeath)
|
||||
if(tdelta < (DEFIB_TIME_LIMIT * 10))
|
||||
@@ -251,6 +310,12 @@ MASS SPECTROMETER
|
||||
if(0)
|
||||
to_chat(usr, "The scanner no longer shows limb damage.")
|
||||
|
||||
/obj/item/device/healthanalyzer/advanced
|
||||
name = "advanced health analyzer"
|
||||
icon_state = "health_adv"
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
|
||||
origin_tech = "magnets=3;biotech=3"
|
||||
advanced = TRUE
|
||||
|
||||
/obj/item/device/analyzer
|
||||
desc = "A hand-held environmental scanner which reports current gas levels."
|
||||
|
||||
@@ -335,8 +335,8 @@
|
||||
/obj/item/nullrod/carp
|
||||
name = "carp-sie plushie"
|
||||
desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to receive the blessing of Carp-Sie."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "carpplushie"
|
||||
icon = 'icons/obj/plushes.dmi'
|
||||
icon_state = "carpplush"
|
||||
item_state = "carp_plushie"
|
||||
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
|
||||
/obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = 0)
|
||||
if(..())
|
||||
if((target.mind in (SSticker.mode.head_revolutionaries)))
|
||||
if((target.mind in (SSticker.mode.head_revolutionaries)) || target.mind.unconvertable)
|
||||
if(!silent)
|
||||
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
|
||||
removed(target, 1)
|
||||
qdel(src)
|
||||
return 0
|
||||
return FALSE
|
||||
if(target.mind in SSticker.mode.revolutionaries)
|
||||
SSticker.mode.remove_revolutionary(target.mind, FALSE, user)
|
||||
if(!silent)
|
||||
@@ -32,8 +32,8 @@
|
||||
to_chat(target, "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
|
||||
else
|
||||
to_chat(target, "<span class='notice'>You feel a sense of peace and security. You are now protected from brainwashing.</span>")
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/implant/mindshield/removed(mob/target, silent = 0, special = 0)
|
||||
if(..())
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
/obj/item/target/syndicate
|
||||
icon_state = "target_s"
|
||||
desc = "A shooting target that looks like a syndicate scum."
|
||||
desc = "A shooting target that looks like syndicate scum."
|
||||
hp = 2600
|
||||
|
||||
/obj/item/target/alien
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/picket_sign
|
||||
icon_state = "picket"
|
||||
name = "blank picket sign"
|
||||
desc = "It's blank"
|
||||
desc = "It's blank."
|
||||
force = 5
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
attack_verb = list("bashed","smacked")
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "donutbox6"
|
||||
name = "donut box"
|
||||
desc = "Mmm. Donuts."
|
||||
resistance_flags = FLAMMABLE
|
||||
var/icon_type = "donut"
|
||||
var/spawn_type = null
|
||||
|
||||
@@ -177,6 +177,14 @@
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/clothing/accessory/medal/silver/security(src)
|
||||
|
||||
/obj/item/storage/lockbox/medal/cargo
|
||||
name = "cargo award box"
|
||||
desc = "A locked box used to store awards to be given to members of the cargo department."
|
||||
req_access = list(ACCESS_QM)
|
||||
|
||||
/obj/item/storage/lockbox/medal/cargo/PopulateContents()
|
||||
new /obj/item/clothing/accessory/medal/ribbon/cargo(src)
|
||||
|
||||
/obj/item/storage/lockbox/medal/sci
|
||||
name = "science medal box"
|
||||
desc = "A locked box used to store medals to be given to members of the science department."
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
max_w_class = WEIGHT_CLASS_SMALL
|
||||
max_combined_w_class = 14
|
||||
desc = "This shouldn't exist. If it does, create an issue report."
|
||||
|
||||
/obj/item/storage/secure/examine(mob/user)
|
||||
..()
|
||||
@@ -177,6 +178,7 @@
|
||||
icon_opened = "safe0"
|
||||
icon_locking = "safeb"
|
||||
icon_sparking = "safespark"
|
||||
desc = "Excellent for securing things away from grubby hands."
|
||||
force = 8
|
||||
w_class = WEIGHT_CLASS_GIGANTIC
|
||||
max_w_class = 8
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
if(!over_object)
|
||||
return
|
||||
|
||||
if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
|
||||
if (ismecha(M.loc)) // stops inventory actions in a mech
|
||||
return
|
||||
|
||||
// this must come before the screen objects only block, dunno why it wasn't before
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon = 'icons/obj/vending_restock.dmi'
|
||||
icon_state = "refill_snack"
|
||||
item_state = "restock_unit"
|
||||
desc = "A vending machine restock cart."
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
name = "\improper AI core"
|
||||
icon = 'icons/mob/ai.dmi'
|
||||
icon_state = "0"
|
||||
desc = "The framework for an artificial intelligence core."
|
||||
max_integrity = 500
|
||||
var/state = 0
|
||||
var/datum/ai_laws/laws = new()
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
/obj/structure/closet/secure_closet/quartermaster
|
||||
name = "\proper quartermaster's locker"
|
||||
/obj/structure/closet/secure_closet/quartermaster
|
||||
name = "\proper quartermaster's locker"
|
||||
req_access = list(ACCESS_QM)
|
||||
icon_state = "qm"
|
||||
|
||||
/obj/structure/closet/secure_closet/quartermaster/PopulateContents()
|
||||
..()
|
||||
new /obj/item/clothing/neck/cloak/qm(src)
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown(src)
|
||||
new /obj/item/device/radio/headset/headset_cargo(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/gloves/fingerless(src)
|
||||
new /obj/item/device/megaphone/cargo(src)
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/clothing/head/soft(src)
|
||||
new /obj/item/device/export_scanner(src)
|
||||
new /obj/item/door_remote/quartermaster(src)
|
||||
icon_state = "qm"
|
||||
|
||||
/obj/structure/closet/secure_closet/quartermaster/PopulateContents()
|
||||
..()
|
||||
new /obj/item/clothing/neck/cloak/qm(src)
|
||||
new /obj/item/storage/lockbox/medal/cargo/(src)
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown(src)
|
||||
new /obj/item/device/radio/headset/headset_cargo(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/gloves/fingerless(src)
|
||||
new /obj/item/device/megaphone/cargo(src)
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/clothing/head/soft(src)
|
||||
new /obj/item/device/export_scanner(src)
|
||||
new /obj/item/door_remote/quartermaster(src)
|
||||
|
||||
@@ -1,93 +1,94 @@
|
||||
/obj/structure/closet/secure_closet/medical1
|
||||
name = "medicine closet"
|
||||
desc = "Filled to the brim with medical junk."
|
||||
icon_state = "med"
|
||||
/obj/structure/closet/secure_closet/medical1
|
||||
name = "medicine closet"
|
||||
desc = "Filled to the brim with medical junk."
|
||||
icon_state = "med"
|
||||
req_access = list(ACCESS_MEDICAL)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical1/PopulateContents()
|
||||
..()
|
||||
new /obj/item/reagent_containers/glass/beaker(src)
|
||||
new /obj/item/reagent_containers/glass/beaker(src)
|
||||
new /obj/item/reagent_containers/dropper(src)
|
||||
new /obj/item/reagent_containers/dropper(src)
|
||||
new /obj/item/storage/belt/medical(src)
|
||||
new /obj/item/storage/box/syringes(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/toxin(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/morphine(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/morphine(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/reagent_containers/glass/bottle/epinephrine(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/reagent_containers/glass/bottle/charcoal(src)
|
||||
new /obj/item/storage/box/rxglasses(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical2
|
||||
name = "anesthetic closet"
|
||||
desc = "Used to knock people out."
|
||||
|
||||
/obj/structure/closet/secure_closet/medical1/PopulateContents()
|
||||
..()
|
||||
new /obj/item/reagent_containers/glass/beaker(src)
|
||||
new /obj/item/reagent_containers/glass/beaker(src)
|
||||
new /obj/item/reagent_containers/dropper(src)
|
||||
new /obj/item/reagent_containers/dropper(src)
|
||||
new /obj/item/storage/belt/medical(src)
|
||||
new /obj/item/storage/box/syringes(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/toxin(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/morphine(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/morphine(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/reagent_containers/glass/bottle/epinephrine(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/reagent_containers/glass/bottle/charcoal(src)
|
||||
new /obj/item/storage/box/rxglasses(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical2
|
||||
name = "anesthetic closet"
|
||||
desc = "Used to knock people out."
|
||||
req_access = list(ACCESS_SURGERY)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical2/PopulateContents()
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/tank/internals/anesthetic(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/clothing/mask/breath/medical(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical3
|
||||
name = "medical doctor's locker"
|
||||
|
||||
/obj/structure/closet/secure_closet/medical2/PopulateContents()
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/tank/internals/anesthetic(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/clothing/mask/breath/medical(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical3
|
||||
name = "medical doctor's locker"
|
||||
req_access = list(ACCESS_SURGERY)
|
||||
icon_state = "med_secure"
|
||||
|
||||
/obj/structure/closet/secure_closet/medical3/PopulateContents()
|
||||
..()
|
||||
new /obj/item/device/radio/headset/headset_med(src)
|
||||
new /obj/item/defibrillator/loaded(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/storage/belt/medical(src)
|
||||
new /obj/item/clothing/glasses/hud/health(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/CMO
|
||||
name = "\proper chief medical officer's locker"
|
||||
icon_state = "med_secure"
|
||||
|
||||
/obj/structure/closet/secure_closet/medical3/PopulateContents()
|
||||
..()
|
||||
new /obj/item/device/radio/headset/headset_med(src)
|
||||
new /obj/item/defibrillator/loaded(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/storage/belt/medical(src)
|
||||
new /obj/item/clothing/glasses/hud/health(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/CMO
|
||||
name = "\proper chief medical officer's locker"
|
||||
req_access = list(ACCESS_CMO)
|
||||
icon_state = "cmo"
|
||||
|
||||
/obj/structure/closet/secure_closet/CMO/PopulateContents()
|
||||
..()
|
||||
new /obj/item/clothing/neck/cloak/cmo(src)
|
||||
new /obj/item/storage/backpack/duffelbag/med(src)
|
||||
new /obj/item/clothing/suit/bio_suit/cmo(src)
|
||||
new /obj/item/clothing/head/bio_hood/cmo(src)
|
||||
new /obj/item/clothing/suit/toggle/labcoat/cmo(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown (src)
|
||||
new /obj/item/cartridge/cmo(src)
|
||||
new /obj/item/device/radio/headset/heads/cmo(src)
|
||||
new /obj/item/device/megaphone/command(src)
|
||||
new /obj/item/defibrillator/compact/loaded(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/storage/belt/medical(src)
|
||||
new /obj/item/device/assembly/flash/handheld(src)
|
||||
new /obj/item/reagent_containers/hypospray/CMO(src)
|
||||
new /obj/item/device/autosurgeon/cmo(src)
|
||||
new /obj/item/door_remote/chief_medical_officer(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/animal
|
||||
name = "animal control"
|
||||
icon_state = "cmo"
|
||||
|
||||
/obj/structure/closet/secure_closet/CMO/PopulateContents()
|
||||
..()
|
||||
new /obj/item/clothing/neck/cloak/cmo(src)
|
||||
new /obj/item/storage/backpack/duffelbag/med(src)
|
||||
new /obj/item/clothing/suit/bio_suit/cmo(src)
|
||||
new /obj/item/clothing/head/bio_hood/cmo(src)
|
||||
new /obj/item/clothing/suit/toggle/labcoat/cmo(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown (src)
|
||||
new /obj/item/cartridge/cmo(src)
|
||||
new /obj/item/device/radio/headset/heads/cmo(src)
|
||||
new /obj/item/device/megaphone/command(src)
|
||||
new /obj/item/defibrillator/compact/loaded(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/storage/belt/medical(src)
|
||||
new /obj/item/device/healthanalyzer/advanced(src)
|
||||
new /obj/item/device/assembly/flash/handheld(src)
|
||||
new /obj/item/reagent_containers/hypospray/CMO(src)
|
||||
new /obj/item/device/autosurgeon/cmo(src)
|
||||
new /obj/item/door_remote/chief_medical_officer(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/animal
|
||||
name = "animal control"
|
||||
req_access = list(ACCESS_SURGERY)
|
||||
|
||||
/obj/structure/closet/secure_closet/animal/PopulateContents()
|
||||
..()
|
||||
new /obj/item/device/assembly/signaler(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/device/electropack(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/chemical
|
||||
name = "chemical closet"
|
||||
desc = "Store dangerous chemicals in here."
|
||||
icon_door = "chemical"
|
||||
|
||||
/obj/structure/closet/secure_closet/chemical/PopulateContents()
|
||||
..()
|
||||
new /obj/item/storage/box/pillbottles(src)
|
||||
new /obj/item/storage/box/pillbottles(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/animal/PopulateContents()
|
||||
..()
|
||||
new /obj/item/device/assembly/signaler(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/device/electropack(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/chemical
|
||||
name = "chemical closet"
|
||||
desc = "Store dangerous chemicals in here."
|
||||
icon_door = "chemical"
|
||||
|
||||
/obj/structure/closet/secure_closet/chemical/PopulateContents()
|
||||
..()
|
||||
new /obj/item/storage/box/pillbottles(src)
|
||||
new /obj/item/storage/box/pillbottles(src)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
max_integrity = 200
|
||||
desc = "The mechanical framework for an airlock."
|
||||
var/state = 0
|
||||
var/mineral = null
|
||||
var/typetext = ""
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
//trees
|
||||
/obj/structure/flora/tree
|
||||
name = "tree"
|
||||
desc = "A large tree."
|
||||
density = TRUE
|
||||
pixel_x = -16
|
||||
layer = FLY_LAYER
|
||||
@@ -40,6 +41,7 @@
|
||||
|
||||
/obj/structure/flora/tree/pine
|
||||
name = "pine tree"
|
||||
desc = "A coniferous pine tree."
|
||||
icon = 'icons/obj/flora/pinetrees.dmi'
|
||||
icon_state = "pine_1"
|
||||
|
||||
@@ -49,6 +51,7 @@
|
||||
|
||||
/obj/structure/flora/tree/pine/xmas
|
||||
name = "xmas tree"
|
||||
desc = "A wondrous decorated Christmas tree."
|
||||
icon_state = "pine_c"
|
||||
|
||||
/obj/structure/flora/tree/pine/xmas/Initialize()
|
||||
@@ -57,10 +60,12 @@
|
||||
|
||||
/obj/structure/flora/tree/dead
|
||||
icon = 'icons/obj/flora/deadtrees.dmi'
|
||||
desc = "A dead tree. How it died, you know not."
|
||||
icon_state = "tree_1"
|
||||
|
||||
/obj/structure/flora/tree/palm
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
desc = "A tree straight from the tropics."
|
||||
icon_state = "palm1"
|
||||
|
||||
/obj/structure/flora/tree/palm/Initialize()
|
||||
@@ -98,6 +103,7 @@
|
||||
//grass
|
||||
/obj/structure/flora/grass
|
||||
name = "grass"
|
||||
desc = "A patch of overgrown grass."
|
||||
icon = 'icons/obj/flora/snowflora.dmi'
|
||||
gender = PLURAL //"this is grass" not "this is a grass"
|
||||
|
||||
@@ -127,6 +133,7 @@
|
||||
//bushes
|
||||
/obj/structure/flora/bush
|
||||
name = "bush"
|
||||
desc = "Some type of shrub."
|
||||
icon = 'icons/obj/flora/snowflora.dmi'
|
||||
icon_state = "snowbush1"
|
||||
anchored = TRUE
|
||||
@@ -139,6 +146,7 @@
|
||||
|
||||
/obj/structure/flora/ausbushes
|
||||
name = "bush"
|
||||
desc = "Some kind of plant."
|
||||
icon = 'icons/obj/flora/ausflora.dmi'
|
||||
icon_state = "firstbush_1"
|
||||
|
||||
@@ -256,6 +264,7 @@
|
||||
name = "potted plant"
|
||||
icon = 'icons/obj/flora/plants.dmi'
|
||||
icon_state = "plant-01"
|
||||
desc = "A little bit of nature contained in a pot."
|
||||
layer = ABOVE_MOB_LAYER
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 10
|
||||
@@ -365,6 +374,7 @@
|
||||
|
||||
/obj/structure/flora/junglebush
|
||||
name = "bush"
|
||||
desc = "A wild plant that is found in jungles."
|
||||
icon = 'icons/obj/flora/jungleflora.dmi'
|
||||
icon_state = "busha"
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/structure/girder
|
||||
name = "girder"
|
||||
icon_state = "girder"
|
||||
desc = "A large structural assembly made out of metal; It requires a layer of metal before it can be considered a wall."
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
layer = BELOW_OBJ_LAYER
|
||||
|
||||
@@ -1,232 +1,232 @@
|
||||
//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its
|
||||
//machineryness
|
||||
|
||||
/obj/structure/mineral_door
|
||||
name = "metal door"
|
||||
//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its
|
||||
//machineryness
|
||||
|
||||
/obj/structure/mineral_door
|
||||
name = "metal door"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
opacity = TRUE
|
||||
|
||||
icon = 'icons/obj/doors/mineral_doors.dmi'
|
||||
icon_state = "metal"
|
||||
|
||||
var/initial_state
|
||||
var/state = 0 //closed, 1 == open
|
||||
var/isSwitchingStates = 0
|
||||
var/close_delay = -1 //-1 if does not auto close.
|
||||
max_integrity = 200
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50)
|
||||
var/sheetType = /obj/item/stack/sheet/metal
|
||||
var/sheetAmount = 7
|
||||
var/openSound = 'sound/effects/stonedoor_openclose.ogg'
|
||||
var/closeSound = 'sound/effects/stonedoor_openclose.ogg'
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
|
||||
/obj/structure/mineral_door/New(location)
|
||||
..()
|
||||
initial_state = icon_state
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/mineral_door/Destroy()
|
||||
opacity = TRUE
|
||||
|
||||
icon = 'icons/obj/doors/mineral_doors.dmi'
|
||||
icon_state = "metal"
|
||||
|
||||
var/initial_state
|
||||
var/state = 0 //closed, 1 == open
|
||||
var/isSwitchingStates = 0
|
||||
var/close_delay = -1 //-1 if does not auto close.
|
||||
max_integrity = 200
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50)
|
||||
var/sheetType = /obj/item/stack/sheet/metal
|
||||
var/sheetAmount = 7
|
||||
var/openSound = 'sound/effects/stonedoor_openclose.ogg'
|
||||
var/closeSound = 'sound/effects/stonedoor_openclose.ogg'
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
|
||||
/obj/structure/mineral_door/New(location)
|
||||
..()
|
||||
initial_state = icon_state
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/mineral_door/Destroy()
|
||||
density = FALSE
|
||||
air_update_turf(1)
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
move_update_air(T)
|
||||
|
||||
air_update_turf(1)
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
move_update_air(T)
|
||||
|
||||
/obj/structure/mineral_door/CollidedWith(atom/movable/AM)
|
||||
..()
|
||||
if(!state)
|
||||
..()
|
||||
if(!state)
|
||||
return TryToSwitchState(AM)
|
||||
|
||||
/obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral
|
||||
if(isAI(user)) //so the AI can't open it
|
||||
return
|
||||
else if(iscyborg(user)) //but cyborgs can
|
||||
if(get_dist(user,src) <= 1) //not remotely though
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/mineral_door/attack_paw(mob/user)
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/mineral_door/attack_hand(mob/user)
|
||||
return TryToSwitchState(user)
|
||||
|
||||
|
||||
/obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral
|
||||
if(isAI(user)) //so the AI can't open it
|
||||
return
|
||||
else if(iscyborg(user)) //but cyborgs can
|
||||
if(get_dist(user,src) <= 1) //not remotely though
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/mineral_door/attack_paw(mob/user)
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/mineral_door/attack_hand(mob/user)
|
||||
return TryToSwitchState(user)
|
||||
|
||||
/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /obj/effect/beam))
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
/obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
|
||||
if(isSwitchingStates)
|
||||
return
|
||||
if(isliving(user))
|
||||
var/mob/living/M = user
|
||||
if(world.time - M.last_bumped <= 60)
|
||||
return //NOTE do we really need that?
|
||||
if(M.client)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.handcuffed)
|
||||
SwitchState()
|
||||
else
|
||||
SwitchState()
|
||||
else if(istype(user, /obj/mecha))
|
||||
SwitchState()
|
||||
|
||||
/obj/structure/mineral_door/proc/SwitchState()
|
||||
if(state)
|
||||
Close()
|
||||
else
|
||||
Open()
|
||||
|
||||
/obj/structure/mineral_door/proc/Open()
|
||||
isSwitchingStates = 1
|
||||
playsound(src, openSound, 100, 1)
|
||||
set_opacity(FALSE)
|
||||
flick("[initial_state]opening",src)
|
||||
sleep(10)
|
||||
if(istype(mover, /obj/effect/beam))
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
/obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
|
||||
if(isSwitchingStates)
|
||||
return
|
||||
if(isliving(user))
|
||||
var/mob/living/M = user
|
||||
if(world.time - M.last_bumped <= 60)
|
||||
return //NOTE do we really need that?
|
||||
if(M.client)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.handcuffed)
|
||||
SwitchState()
|
||||
else
|
||||
SwitchState()
|
||||
else if(ismecha(user))
|
||||
SwitchState()
|
||||
|
||||
/obj/structure/mineral_door/proc/SwitchState()
|
||||
if(state)
|
||||
Close()
|
||||
else
|
||||
Open()
|
||||
|
||||
/obj/structure/mineral_door/proc/Open()
|
||||
isSwitchingStates = 1
|
||||
playsound(src, openSound, 100, 1)
|
||||
set_opacity(FALSE)
|
||||
flick("[initial_state]opening",src)
|
||||
sleep(10)
|
||||
density = FALSE
|
||||
state = 1
|
||||
air_update_turf(1)
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
|
||||
if(close_delay != -1)
|
||||
addtimer(CALLBACK(src, .proc/Close), close_delay)
|
||||
|
||||
/obj/structure/mineral_door/proc/Close()
|
||||
if(isSwitchingStates || state != 1)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/living/L in T)
|
||||
return
|
||||
isSwitchingStates = 1
|
||||
playsound(loc, closeSound, 100, 1)
|
||||
flick("[initial_state]closing",src)
|
||||
sleep(10)
|
||||
state = 1
|
||||
air_update_turf(1)
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
|
||||
if(close_delay != -1)
|
||||
addtimer(CALLBACK(src, .proc/Close), close_delay)
|
||||
|
||||
/obj/structure/mineral_door/proc/Close()
|
||||
if(isSwitchingStates || state != 1)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/living/L in T)
|
||||
return
|
||||
isSwitchingStates = 1
|
||||
playsound(loc, closeSound, 100, 1)
|
||||
flick("[initial_state]closing",src)
|
||||
sleep(10)
|
||||
density = TRUE
|
||||
set_opacity(TRUE)
|
||||
state = 0
|
||||
air_update_turf(1)
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
|
||||
/obj/structure/mineral_door/update_icon()
|
||||
if(state)
|
||||
icon_state = "[initial_state]open"
|
||||
else
|
||||
icon_state = initial_state
|
||||
|
||||
/obj/structure/mineral_door/attackby(obj/item/W, mob/user, params)
|
||||
set_opacity(TRUE)
|
||||
state = 0
|
||||
air_update_turf(1)
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
|
||||
/obj/structure/mineral_door/update_icon()
|
||||
if(state)
|
||||
icon_state = "[initial_state]open"
|
||||
else
|
||||
icon_state = initial_state
|
||||
|
||||
/obj/structure/mineral_door/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/pickaxe))
|
||||
var/obj/item/pickaxe/digTool = W
|
||||
to_chat(user, "<span class='notice'>You start digging the [name]...</span>")
|
||||
if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src)
|
||||
to_chat(user, "<span class='notice'>You finish digging.</span>")
|
||||
deconstruct(TRUE)
|
||||
else if(user.a_intent != INTENT_HARM)
|
||||
attack_hand(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/deconstruct(disassembled = TRUE)
|
||||
var/turf/T = get_turf(src)
|
||||
if(disassembled)
|
||||
new sheetType(T, sheetAmount)
|
||||
else
|
||||
new sheetType(T, max(sheetAmount - 2, 1))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/mineral_door/iron
|
||||
name = "iron door"
|
||||
max_integrity = 300
|
||||
|
||||
/obj/structure/mineral_door/silver
|
||||
name = "silver door"
|
||||
icon_state = "silver"
|
||||
sheetType = /obj/item/stack/sheet/mineral/silver
|
||||
max_integrity = 300
|
||||
|
||||
/obj/structure/mineral_door/gold
|
||||
name = "gold door"
|
||||
icon_state = "gold"
|
||||
sheetType = /obj/item/stack/sheet/mineral/gold
|
||||
|
||||
/obj/structure/mineral_door/uranium
|
||||
name = "uranium door"
|
||||
icon_state = "uranium"
|
||||
sheetType = /obj/item/stack/sheet/mineral/uranium
|
||||
max_integrity = 300
|
||||
light_range = 2
|
||||
|
||||
/obj/structure/mineral_door/sandstone
|
||||
name = "sandstone door"
|
||||
icon_state = "sandstone"
|
||||
sheetType = /obj/item/stack/sheet/mineral/sandstone
|
||||
max_integrity = 100
|
||||
|
||||
/obj/structure/mineral_door/transparent
|
||||
opacity = FALSE
|
||||
|
||||
/obj/structure/mineral_door/transparent/Close()
|
||||
..()
|
||||
set_opacity(FALSE)
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma
|
||||
name = "plasma door"
|
||||
icon_state = "plasma"
|
||||
sheetType = /obj/item/stack/sheet/mineral/plasma
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user, params)
|
||||
if(W.is_hot())
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
|
||||
log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]")
|
||||
TemperatureAct()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
TemperatureAct()
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct()
|
||||
atmos_spawn_air("plasma=500;TEMP=1000")
|
||||
deconstruct(FALSE)
|
||||
|
||||
/obj/structure/mineral_door/transparent/diamond
|
||||
name = "diamond door"
|
||||
icon_state = "diamond"
|
||||
sheetType = /obj/item/stack/sheet/mineral/diamond
|
||||
max_integrity = 1000
|
||||
|
||||
/obj/structure/mineral_door/wood
|
||||
name = "wood door"
|
||||
icon_state = "wood"
|
||||
openSound = 'sound/effects/doorcreaky.ogg'
|
||||
closeSound = 'sound/effects/doorcreaky.ogg'
|
||||
sheetType = /obj/item/stack/sheet/mineral/wood
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 200
|
||||
|
||||
/obj/structure/mineral_door/paperframe
|
||||
name = "paper frame door"
|
||||
icon_state = "paperframe"
|
||||
openSound = 'sound/effects/doorcreaky.ogg'
|
||||
closeSound = 'sound/effects/doorcreaky.ogg'
|
||||
sheetType = /obj/item/stack/sheet/paperframes
|
||||
sheetAmount = 3
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 20
|
||||
|
||||
/obj/structure/mineral_door/paperframe/Initialize()
|
||||
. = ..()
|
||||
queue_smooth_neighbors(src)
|
||||
|
||||
/obj/structure/mineral_door/paperframe/Destroy()
|
||||
queue_smooth_neighbors(src)
|
||||
return ..()
|
||||
var/obj/item/pickaxe/digTool = W
|
||||
to_chat(user, "<span class='notice'>You start digging the [name]...</span>")
|
||||
if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src)
|
||||
to_chat(user, "<span class='notice'>You finish digging.</span>")
|
||||
deconstruct(TRUE)
|
||||
else if(user.a_intent != INTENT_HARM)
|
||||
attack_hand(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/deconstruct(disassembled = TRUE)
|
||||
var/turf/T = get_turf(src)
|
||||
if(disassembled)
|
||||
new sheetType(T, sheetAmount)
|
||||
else
|
||||
new sheetType(T, max(sheetAmount - 2, 1))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/mineral_door/iron
|
||||
name = "iron door"
|
||||
max_integrity = 300
|
||||
|
||||
/obj/structure/mineral_door/silver
|
||||
name = "silver door"
|
||||
icon_state = "silver"
|
||||
sheetType = /obj/item/stack/sheet/mineral/silver
|
||||
max_integrity = 300
|
||||
|
||||
/obj/structure/mineral_door/gold
|
||||
name = "gold door"
|
||||
icon_state = "gold"
|
||||
sheetType = /obj/item/stack/sheet/mineral/gold
|
||||
|
||||
/obj/structure/mineral_door/uranium
|
||||
name = "uranium door"
|
||||
icon_state = "uranium"
|
||||
sheetType = /obj/item/stack/sheet/mineral/uranium
|
||||
max_integrity = 300
|
||||
light_range = 2
|
||||
|
||||
/obj/structure/mineral_door/sandstone
|
||||
name = "sandstone door"
|
||||
icon_state = "sandstone"
|
||||
sheetType = /obj/item/stack/sheet/mineral/sandstone
|
||||
max_integrity = 100
|
||||
|
||||
/obj/structure/mineral_door/transparent
|
||||
opacity = FALSE
|
||||
|
||||
/obj/structure/mineral_door/transparent/Close()
|
||||
..()
|
||||
set_opacity(FALSE)
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma
|
||||
name = "plasma door"
|
||||
icon_state = "plasma"
|
||||
sheetType = /obj/item/stack/sheet/mineral/plasma
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user, params)
|
||||
if(W.is_hot())
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
|
||||
log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]")
|
||||
TemperatureAct()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
TemperatureAct()
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct()
|
||||
atmos_spawn_air("plasma=500;TEMP=1000")
|
||||
deconstruct(FALSE)
|
||||
|
||||
/obj/structure/mineral_door/transparent/diamond
|
||||
name = "diamond door"
|
||||
icon_state = "diamond"
|
||||
sheetType = /obj/item/stack/sheet/mineral/diamond
|
||||
max_integrity = 1000
|
||||
|
||||
/obj/structure/mineral_door/wood
|
||||
name = "wood door"
|
||||
icon_state = "wood"
|
||||
openSound = 'sound/effects/doorcreaky.ogg'
|
||||
closeSound = 'sound/effects/doorcreaky.ogg'
|
||||
sheetType = /obj/item/stack/sheet/mineral/wood
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 200
|
||||
|
||||
/obj/structure/mineral_door/paperframe
|
||||
name = "paper frame door"
|
||||
icon_state = "paperframe"
|
||||
openSound = 'sound/effects/doorcreaky.ogg'
|
||||
closeSound = 'sound/effects/doorcreaky.ogg'
|
||||
sheetType = /obj/item/stack/sheet/paperframes
|
||||
sheetAmount = 3
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 20
|
||||
|
||||
/obj/structure/mineral_door/paperframe/Initialize()
|
||||
. = ..()
|
||||
queue_smooth_neighbors(src)
|
||||
|
||||
/obj/structure/mineral_door/paperframe/Destroy()
|
||||
queue_smooth_neighbors(src)
|
||||
return ..()
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
if(C.move_delay)
|
||||
return 0
|
||||
|
||||
if(istype(A, /obj/mecha))
|
||||
if(ismecha(A))
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
/obj/structure/transit_tube/station
|
||||
name = "station tube station"
|
||||
icon_state = "closed_station0"
|
||||
desc = "The lynchpin of the transit system."
|
||||
exit_delay = 1
|
||||
enter_delay = 2
|
||||
tube_construction = /obj/structure/c_transit_tube/station
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
name = "transit tube"
|
||||
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
|
||||
icon_state = "straight"
|
||||
desc = "A transit tube for moving things around."
|
||||
density = TRUE
|
||||
layer = LOW_ITEM_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
@@ -1,158 +1,159 @@
|
||||
// transit tube construction
|
||||
|
||||
// normal transit tubes
|
||||
/obj/structure/c_transit_tube
|
||||
name = "unattached transit tube"
|
||||
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
|
||||
icon_state = "straight"
|
||||
// transit tube construction
|
||||
|
||||
// normal transit tubes
|
||||
/obj/structure/c_transit_tube
|
||||
name = "unattached transit tube"
|
||||
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
|
||||
icon_state = "straight"
|
||||
desc = "An unattached segment of transit tube."
|
||||
density = FALSE
|
||||
layer = LOW_ITEM_LAYER //same as the built tube
|
||||
layer = LOW_ITEM_LAYER //same as the built tube
|
||||
anchored = FALSE
|
||||
var/flipped = 0
|
||||
var/build_type = /obj/structure/transit_tube
|
||||
var/flipped_build_type
|
||||
var/base_icon
|
||||
|
||||
/obj/structure/c_transit_tube/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to rotate it clockwise.</span>")
|
||||
|
||||
/obj/structure/c_transit_tube/proc/tube_rotate()
|
||||
setDir(turn(dir, -90))
|
||||
|
||||
/obj/structure/c_transit_tube/proc/tube_flip()
|
||||
if(flipped_build_type)
|
||||
flipped = !flipped
|
||||
var/cur_flip = initial(flipped) ? !flipped : flipped
|
||||
if(cur_flip)
|
||||
build_type = flipped_build_type
|
||||
else
|
||||
build_type = initial(build_type)
|
||||
icon_state = "[base_icon][flipped]"
|
||||
else
|
||||
setDir(turn(dir, 180))
|
||||
|
||||
// disposals-style flip and rotate verbs
|
||||
/obj/structure/c_transit_tube/verb/rotate()
|
||||
set name = "Rotate Tube"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
|
||||
tube_rotate()
|
||||
|
||||
/obj/structure/c_transit_tube/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
tube_rotate()
|
||||
|
||||
/obj/structure/c_transit_tube/verb/flip()
|
||||
set name = "Flip"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
tube_flip()
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start attaching the [name]...</span>")
|
||||
add_fingerprint(user)
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
if(do_after(user, 40*I.toolspeed, target = src))
|
||||
if(QDELETED(src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You attach the [name].</span>")
|
||||
var/obj/structure/transit_tube/R = new build_type(loc, dir)
|
||||
transfer_fingerprints_to(R)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
// transit tube station
|
||||
/obj/structure/c_transit_tube/station
|
||||
name = "unattached through station"
|
||||
icon_state = "closed_station0"
|
||||
build_type = /obj/structure/transit_tube/station
|
||||
flipped_build_type = /obj/structure/transit_tube/station/flipped
|
||||
base_icon = "closed_station"
|
||||
|
||||
/obj/structure/c_transit_tube/station/flipped
|
||||
icon_state = "closed_station1"
|
||||
flipped = 1
|
||||
build_type = /obj/structure/transit_tube/station/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/station
|
||||
|
||||
|
||||
// reverser station, used for the terminus
|
||||
/obj/structure/c_transit_tube/station/reverse
|
||||
name = "unattached terminus station"
|
||||
icon_state = "closed_terminus0"
|
||||
build_type = /obj/structure/transit_tube/station/reverse
|
||||
flipped_build_type = /obj/structure/transit_tube/station/reverse/flipped
|
||||
base_icon = "closed_terminus"
|
||||
|
||||
/obj/structure/c_transit_tube/station/reverse/flipped
|
||||
icon_state = "closed_terminus1"
|
||||
flipped = 1
|
||||
build_type = /obj/structure/transit_tube/station/reverse/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/station/reverse
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/crossing
|
||||
icon_state = "crossing"
|
||||
build_type = /obj/structure/transit_tube/crossing
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/diagonal
|
||||
icon_state = "diagonal"
|
||||
build_type = /obj/structure/transit_tube/diagonal
|
||||
|
||||
/obj/structure/c_transit_tube/diagonal/crossing
|
||||
icon_state = "diagonal_crossing"
|
||||
build_type = /obj/structure/transit_tube/diagonal/crossing
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/curved
|
||||
icon_state = "curved0"
|
||||
build_type = /obj/structure/transit_tube/curved
|
||||
flipped_build_type = /obj/structure/transit_tube/curved/flipped
|
||||
base_icon = "curved"
|
||||
|
||||
/obj/structure/c_transit_tube/curved/flipped
|
||||
icon_state = "curved1"
|
||||
build_type = /obj/structure/transit_tube/curved/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/curved
|
||||
flipped = 1
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/junction
|
||||
icon_state = "junction0"
|
||||
build_type = /obj/structure/transit_tube/junction
|
||||
flipped_build_type = /obj/structure/transit_tube/junction/flipped
|
||||
base_icon = "junction"
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/junction/flipped
|
||||
icon_state = "junction1"
|
||||
flipped = 1
|
||||
build_type = /obj/structure/transit_tube/junction/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/junction
|
||||
|
||||
|
||||
//transit tube pod
|
||||
//see station.dm for the logic
|
||||
/obj/structure/c_transit_tube_pod
|
||||
name = "unattached transit tube pod"
|
||||
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
|
||||
icon_state = "pod"
|
||||
var/flipped = 0
|
||||
var/build_type = /obj/structure/transit_tube
|
||||
var/flipped_build_type
|
||||
var/base_icon
|
||||
|
||||
/obj/structure/c_transit_tube/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to rotate it clockwise.</span>")
|
||||
|
||||
/obj/structure/c_transit_tube/proc/tube_rotate()
|
||||
setDir(turn(dir, -90))
|
||||
|
||||
/obj/structure/c_transit_tube/proc/tube_flip()
|
||||
if(flipped_build_type)
|
||||
flipped = !flipped
|
||||
var/cur_flip = initial(flipped) ? !flipped : flipped
|
||||
if(cur_flip)
|
||||
build_type = flipped_build_type
|
||||
else
|
||||
build_type = initial(build_type)
|
||||
icon_state = "[base_icon][flipped]"
|
||||
else
|
||||
setDir(turn(dir, 180))
|
||||
|
||||
// disposals-style flip and rotate verbs
|
||||
/obj/structure/c_transit_tube/verb/rotate()
|
||||
set name = "Rotate Tube"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
|
||||
tube_rotate()
|
||||
|
||||
/obj/structure/c_transit_tube/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
tube_rotate()
|
||||
|
||||
/obj/structure/c_transit_tube/verb/flip()
|
||||
set name = "Flip"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
tube_flip()
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start attaching the [name]...</span>")
|
||||
add_fingerprint(user)
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
if(do_after(user, 40*I.toolspeed, target = src))
|
||||
if(QDELETED(src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You attach the [name].</span>")
|
||||
var/obj/structure/transit_tube/R = new build_type(loc, dir)
|
||||
transfer_fingerprints_to(R)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
// transit tube station
|
||||
/obj/structure/c_transit_tube/station
|
||||
name = "unattached through station"
|
||||
icon_state = "closed_station0"
|
||||
build_type = /obj/structure/transit_tube/station
|
||||
flipped_build_type = /obj/structure/transit_tube/station/flipped
|
||||
base_icon = "closed_station"
|
||||
|
||||
/obj/structure/c_transit_tube/station/flipped
|
||||
icon_state = "closed_station1"
|
||||
flipped = 1
|
||||
build_type = /obj/structure/transit_tube/station/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/station
|
||||
|
||||
|
||||
// reverser station, used for the terminus
|
||||
/obj/structure/c_transit_tube/station/reverse
|
||||
name = "unattached terminus station"
|
||||
icon_state = "closed_terminus0"
|
||||
build_type = /obj/structure/transit_tube/station/reverse
|
||||
flipped_build_type = /obj/structure/transit_tube/station/reverse/flipped
|
||||
base_icon = "closed_terminus"
|
||||
|
||||
/obj/structure/c_transit_tube/station/reverse/flipped
|
||||
icon_state = "closed_terminus1"
|
||||
flipped = 1
|
||||
build_type = /obj/structure/transit_tube/station/reverse/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/station/reverse
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/crossing
|
||||
icon_state = "crossing"
|
||||
build_type = /obj/structure/transit_tube/crossing
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/diagonal
|
||||
icon_state = "diagonal"
|
||||
build_type = /obj/structure/transit_tube/diagonal
|
||||
|
||||
/obj/structure/c_transit_tube/diagonal/crossing
|
||||
icon_state = "diagonal_crossing"
|
||||
build_type = /obj/structure/transit_tube/diagonal/crossing
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/curved
|
||||
icon_state = "curved0"
|
||||
build_type = /obj/structure/transit_tube/curved
|
||||
flipped_build_type = /obj/structure/transit_tube/curved/flipped
|
||||
base_icon = "curved"
|
||||
|
||||
/obj/structure/c_transit_tube/curved/flipped
|
||||
icon_state = "curved1"
|
||||
build_type = /obj/structure/transit_tube/curved/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/curved
|
||||
flipped = 1
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/junction
|
||||
icon_state = "junction0"
|
||||
build_type = /obj/structure/transit_tube/junction
|
||||
flipped_build_type = /obj/structure/transit_tube/junction/flipped
|
||||
base_icon = "junction"
|
||||
|
||||
|
||||
/obj/structure/c_transit_tube/junction/flipped
|
||||
icon_state = "junction1"
|
||||
flipped = 1
|
||||
build_type = /obj/structure/transit_tube/junction/flipped
|
||||
flipped_build_type = /obj/structure/transit_tube/junction
|
||||
|
||||
|
||||
//transit tube pod
|
||||
//see station.dm for the logic
|
||||
/obj/structure/c_transit_tube_pod
|
||||
name = "unattached transit tube pod"
|
||||
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
|
||||
icon_state = "pod"
|
||||
anchored = FALSE
|
||||
density = FALSE
|
||||
|
||||
@@ -1,370 +1,371 @@
|
||||
/* Windoor (window door) assembly -Nodrak
|
||||
* Step 1: Create a windoor out of rglass
|
||||
* Step 2: Add r-glass to the assembly to make a secure windoor (Optional)
|
||||
* Step 3: Rotate or Flip the assembly to face and open the way you want
|
||||
* Step 4: Wrench the assembly in place
|
||||
* Step 5: Add cables to the assembly
|
||||
* Step 6: Set access for the door.
|
||||
* Step 7: Screwdriver the door to complete
|
||||
*/
|
||||
|
||||
|
||||
/obj/structure/windoor_assembly
|
||||
icon = 'icons/obj/doors/windoor.dmi'
|
||||
|
||||
name = "windoor Assembly"
|
||||
icon_state = "l_windoor_assembly01"
|
||||
/* Windoor (window door) assembly -Nodrak
|
||||
* Step 1: Create a windoor out of rglass
|
||||
* Step 2: Add r-glass to the assembly to make a secure windoor (Optional)
|
||||
* Step 3: Rotate or Flip the assembly to face and open the way you want
|
||||
* Step 4: Wrench the assembly in place
|
||||
* Step 5: Add cables to the assembly
|
||||
* Step 6: Set access for the door.
|
||||
* Step 7: Screwdriver the door to complete
|
||||
*/
|
||||
|
||||
|
||||
/obj/structure/windoor_assembly
|
||||
icon = 'icons/obj/doors/windoor.dmi'
|
||||
|
||||
name = "windoor Assembly"
|
||||
icon_state = "l_windoor_assembly01"
|
||||
desc = "A small glass and wire assembly for windoors."
|
||||
anchored = FALSE
|
||||
density = FALSE
|
||||
dir = NORTH
|
||||
|
||||
var/ini_dir
|
||||
var/obj/item/electronics/airlock/electronics = null
|
||||
var/created_name = null
|
||||
|
||||
//Vars to help with the icon's name
|
||||
var/facing = "l" //Does the windoor open to the left or right?
|
||||
dir = NORTH
|
||||
|
||||
var/ini_dir
|
||||
var/obj/item/electronics/airlock/electronics = null
|
||||
var/created_name = null
|
||||
|
||||
//Vars to help with the icon's name
|
||||
var/facing = "l" //Does the windoor open to the left or right?
|
||||
var/secure = FALSE //Whether or not this creates a secure windoor
|
||||
var/state = "01" //How far the door assembly has progressed
|
||||
CanAtmosPass = ATMOS_PASS_PROC
|
||||
|
||||
/obj/structure/windoor_assembly/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to rotate it clockwise.</span>")
|
||||
|
||||
/obj/structure/windoor_assembly/New(loc, set_dir)
|
||||
..()
|
||||
if(set_dir)
|
||||
dir = set_dir
|
||||
ini_dir = dir
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/windoor_assembly/Destroy()
|
||||
var/state = "01" //How far the door assembly has progressed
|
||||
CanAtmosPass = ATMOS_PASS_PROC
|
||||
|
||||
/obj/structure/windoor_assembly/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to rotate it clockwise.</span>")
|
||||
|
||||
/obj/structure/windoor_assembly/New(loc, set_dir)
|
||||
..()
|
||||
if(set_dir)
|
||||
dir = set_dir
|
||||
ini_dir = dir
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/windoor_assembly/Destroy()
|
||||
density = FALSE
|
||||
air_update_turf(1)
|
||||
return ..()
|
||||
|
||||
/obj/structure/windoor_assembly/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
setDir(ini_dir)
|
||||
move_update_air(T)
|
||||
|
||||
/obj/structure/windoor_assembly/update_icon()
|
||||
icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]"
|
||||
|
||||
air_update_turf(1)
|
||||
return ..()
|
||||
|
||||
/obj/structure/windoor_assembly/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
setDir(ini_dir)
|
||||
move_update_air(T)
|
||||
|
||||
/obj/structure/windoor_assembly/update_icon()
|
||||
icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]"
|
||||
|
||||
/obj/structure/windoor_assembly/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
|
||||
return !density
|
||||
if(istype(mover, /obj/structure/window))
|
||||
var/obj/structure/window/W = mover
|
||||
if(!valid_window_location(loc, W.ini_dir))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/structure/windoor_assembly))
|
||||
var/obj/structure/windoor_assembly/W = mover
|
||||
if(!valid_window_location(loc, W.ini_dir))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir))
|
||||
return FALSE
|
||||
return 1
|
||||
|
||||
/obj/structure/windoor_assembly/CanAtmosPass(turf/T)
|
||||
if(get_dir(loc, T) == dir)
|
||||
return !density
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir)
|
||||
return !density
|
||||
else
|
||||
return 1
|
||||
|
||||
|
||||
/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params)
|
||||
//I really should have spread this out across more states but thin little windoors are hard to sprite.
|
||||
add_fingerprint(user)
|
||||
switch(state)
|
||||
if("01")
|
||||
if(istype(W, /obj/item/weldingtool) && !anchored )
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if (WT.remove_fuel(0,user))
|
||||
user.visible_message("[user] disassembles the windoor assembly.", "<span class='notice'>You start to disassemble the windoor assembly...</span>")
|
||||
playsound(loc, 'sound/items/welder2.ogg', 50, 1)
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You disassemble the windoor assembly.</span>")
|
||||
var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
|
||||
RG.add_fingerprint(user)
|
||||
if(secure)
|
||||
var/obj/item/stack/rods/R = new (get_turf(src), 4)
|
||||
R.add_fingerprint(user)
|
||||
qdel(src)
|
||||
else
|
||||
return
|
||||
|
||||
//Wrenching an unsecure assembly anchors it in place. Step 4 complete
|
||||
if(istype(W, /obj/item/wrench) && !anchored)
|
||||
for(var/obj/machinery/door/window/WD in loc)
|
||||
if(WD.dir == dir)
|
||||
to_chat(user, "<span class='warning'>There is already a windoor in that location!</span>")
|
||||
return
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] secures the windoor assembly to the floor.", "<span class='notice'>You start to secure the windoor assembly to the floor...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || anchored)
|
||||
return
|
||||
for(var/obj/machinery/door/window/WD in loc)
|
||||
if(WD.dir == dir)
|
||||
to_chat(user, "<span class='warning'>There is already a windoor in that location!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You secure the windoor assembly.</span>")
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
|
||||
return !density
|
||||
if(istype(mover, /obj/structure/window))
|
||||
var/obj/structure/window/W = mover
|
||||
if(!valid_window_location(loc, W.ini_dir))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/structure/windoor_assembly))
|
||||
var/obj/structure/windoor_assembly/W = mover
|
||||
if(!valid_window_location(loc, W.ini_dir))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir))
|
||||
return FALSE
|
||||
return 1
|
||||
|
||||
/obj/structure/windoor_assembly/CanAtmosPass(turf/T)
|
||||
if(get_dir(loc, T) == dir)
|
||||
return !density
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir)
|
||||
return !density
|
||||
else
|
||||
return 1
|
||||
|
||||
|
||||
/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params)
|
||||
//I really should have spread this out across more states but thin little windoors are hard to sprite.
|
||||
add_fingerprint(user)
|
||||
switch(state)
|
||||
if("01")
|
||||
if(istype(W, /obj/item/weldingtool) && !anchored )
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if (WT.remove_fuel(0,user))
|
||||
user.visible_message("[user] disassembles the windoor assembly.", "<span class='notice'>You start to disassemble the windoor assembly...</span>")
|
||||
playsound(loc, 'sound/items/welder2.ogg', 50, 1)
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || !WT.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You disassemble the windoor assembly.</span>")
|
||||
var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
|
||||
RG.add_fingerprint(user)
|
||||
if(secure)
|
||||
var/obj/item/stack/rods/R = new (get_turf(src), 4)
|
||||
R.add_fingerprint(user)
|
||||
qdel(src)
|
||||
else
|
||||
return
|
||||
|
||||
//Wrenching an unsecure assembly anchors it in place. Step 4 complete
|
||||
if(istype(W, /obj/item/wrench) && !anchored)
|
||||
for(var/obj/machinery/door/window/WD in loc)
|
||||
if(WD.dir == dir)
|
||||
to_chat(user, "<span class='warning'>There is already a windoor in that location!</span>")
|
||||
return
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] secures the windoor assembly to the floor.", "<span class='notice'>You start to secure the windoor assembly to the floor...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || anchored)
|
||||
return
|
||||
for(var/obj/machinery/door/window/WD in loc)
|
||||
if(WD.dir == dir)
|
||||
to_chat(user, "<span class='warning'>There is already a windoor in that location!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You secure the windoor assembly.</span>")
|
||||
anchored = TRUE
|
||||
if(secure)
|
||||
name = "secure anchored windoor assembly"
|
||||
else
|
||||
name = "anchored windoor assembly"
|
||||
|
||||
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
|
||||
else if(istype(W, /obj/item/wrench) && anchored)
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] unsecures the windoor assembly to the floor.", "<span class='notice'>You start to unsecure the windoor assembly to the floor...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || !anchored)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You unsecure the windoor assembly.</span>")
|
||||
if(secure)
|
||||
name = "secure anchored windoor assembly"
|
||||
else
|
||||
name = "anchored windoor assembly"
|
||||
|
||||
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
|
||||
else if(istype(W, /obj/item/wrench) && anchored)
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] unsecures the windoor assembly to the floor.", "<span class='notice'>You start to unsecure the windoor assembly to the floor...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || !anchored)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You unsecure the windoor assembly.</span>")
|
||||
anchored = FALSE
|
||||
if(secure)
|
||||
name = "secure windoor assembly"
|
||||
else
|
||||
name = "windoor assembly"
|
||||
|
||||
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
|
||||
else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
|
||||
var/obj/item/stack/sheet/plasteel/P = W
|
||||
if(P.get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need more plasteel to do this!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start to reinforce the windoor with plasteel...</span>")
|
||||
|
||||
if(do_after(user,40, target = src))
|
||||
if(!src || secure || P.get_amount() < 2)
|
||||
return
|
||||
|
||||
P.use(2)
|
||||
to_chat(user, "<span class='notice'>You reinforce the windoor.</span>")
|
||||
if(secure)
|
||||
name = "secure windoor assembly"
|
||||
else
|
||||
name = "windoor assembly"
|
||||
|
||||
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
|
||||
else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
|
||||
var/obj/item/stack/sheet/plasteel/P = W
|
||||
if(P.get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need more plasteel to do this!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start to reinforce the windoor with plasteel...</span>")
|
||||
|
||||
if(do_after(user,40, target = src))
|
||||
if(!src || secure || P.get_amount() < 2)
|
||||
return
|
||||
|
||||
P.use(2)
|
||||
to_chat(user, "<span class='notice'>You reinforce the windoor.</span>")
|
||||
secure = TRUE
|
||||
if(anchored)
|
||||
name = "secure anchored windoor assembly"
|
||||
else
|
||||
name = "secure windoor assembly"
|
||||
|
||||
//Adding cable to the assembly. Step 5 complete.
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && anchored)
|
||||
user.visible_message("[user] wires the windoor assembly.", "<span class='notice'>You start to wire the windoor assembly...</span>")
|
||||
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!src || !anchored || src.state != "01")
|
||||
return
|
||||
var/obj/item/stack/cable_coil/CC = W
|
||||
if(!CC.use(1))
|
||||
to_chat(user, "<span class='warning'>You need more cable to do this!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You wire the windoor.</span>")
|
||||
state = "02"
|
||||
if(secure)
|
||||
name = "secure wired windoor assembly"
|
||||
else
|
||||
name = "wired windoor assembly"
|
||||
else
|
||||
return ..()
|
||||
|
||||
if("02")
|
||||
|
||||
//Removing wire from the assembly. Step 5 undone.
|
||||
if(istype(W, /obj/item/wirecutters))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] cuts the wires from the airlock assembly.", "<span class='notice'>You start to cut the wires from airlock assembly...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || state != "02")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You cut the windoor wires.</span>")
|
||||
new/obj/item/stack/cable_coil(get_turf(user), 1)
|
||||
state = "01"
|
||||
if(secure)
|
||||
name = "secure anchored windoor assembly"
|
||||
else
|
||||
name = "anchored windoor assembly"
|
||||
|
||||
//Adding airlock electronics for access. Step 6 complete.
|
||||
else if(istype(W, /obj/item/electronics/airlock))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "<span class='notice'>You start to install electronics into the airlock assembly...</span>")
|
||||
W.loc = src
|
||||
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!src || electronics)
|
||||
W.loc = src.loc
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You install the airlock electronics.</span>")
|
||||
name = "near finished windoor assembly"
|
||||
electronics = W
|
||||
else
|
||||
W.loc = loc
|
||||
|
||||
//Screwdriver to remove airlock electronics. Step 6 undone.
|
||||
else if(istype(W, /obj/item/screwdriver))
|
||||
if(!electronics)
|
||||
return
|
||||
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the airlock assembly.", "<span class='notice'>You start to uninstall electronics from the airlock assembly...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || !electronics)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You remove the airlock electronics.</span>")
|
||||
name = "wired windoor assembly"
|
||||
var/obj/item/electronics/airlock/ae
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = loc
|
||||
|
||||
else if(istype(W, /obj/item/pen))
|
||||
var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN)
|
||||
if(!t)
|
||||
return
|
||||
if(!in_range(src, usr) && loc != usr)
|
||||
return
|
||||
created_name = t
|
||||
return
|
||||
|
||||
|
||||
|
||||
//Crowbar to complete the assembly, Step 7 complete.
|
||||
else if(istype(W, /obj/item/crowbar))
|
||||
if(!electronics)
|
||||
to_chat(usr, "<span class='warning'>The assembly is missing electronics!</span>")
|
||||
return
|
||||
usr << browse(null, "window=windoor_access")
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] pries the windoor into the frame.", "<span class='notice'>You start prying the windoor into the frame...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
|
||||
if(loc && electronics)
|
||||
|
||||
if(anchored)
|
||||
name = "secure anchored windoor assembly"
|
||||
else
|
||||
name = "secure windoor assembly"
|
||||
|
||||
//Adding cable to the assembly. Step 5 complete.
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && anchored)
|
||||
user.visible_message("[user] wires the windoor assembly.", "<span class='notice'>You start to wire the windoor assembly...</span>")
|
||||
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!src || !anchored || src.state != "01")
|
||||
return
|
||||
var/obj/item/stack/cable_coil/CC = W
|
||||
if(!CC.use(1))
|
||||
to_chat(user, "<span class='warning'>You need more cable to do this!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You wire the windoor.</span>")
|
||||
state = "02"
|
||||
if(secure)
|
||||
name = "secure wired windoor assembly"
|
||||
else
|
||||
name = "wired windoor assembly"
|
||||
else
|
||||
return ..()
|
||||
|
||||
if("02")
|
||||
|
||||
//Removing wire from the assembly. Step 5 undone.
|
||||
if(istype(W, /obj/item/wirecutters))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] cuts the wires from the airlock assembly.", "<span class='notice'>You start to cut the wires from airlock assembly...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || state != "02")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You cut the windoor wires.</span>")
|
||||
new/obj/item/stack/cable_coil(get_turf(user), 1)
|
||||
state = "01"
|
||||
if(secure)
|
||||
name = "secure anchored windoor assembly"
|
||||
else
|
||||
name = "anchored windoor assembly"
|
||||
|
||||
//Adding airlock electronics for access. Step 6 complete.
|
||||
else if(istype(W, /obj/item/electronics/airlock))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "<span class='notice'>You start to install electronics into the airlock assembly...</span>")
|
||||
W.loc = src
|
||||
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!src || electronics)
|
||||
W.loc = src.loc
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You install the airlock electronics.</span>")
|
||||
name = "near finished windoor assembly"
|
||||
electronics = W
|
||||
else
|
||||
W.loc = loc
|
||||
|
||||
//Screwdriver to remove airlock electronics. Step 6 undone.
|
||||
else if(istype(W, /obj/item/screwdriver))
|
||||
if(!electronics)
|
||||
return
|
||||
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the airlock assembly.", "<span class='notice'>You start to uninstall electronics from the airlock assembly...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
if(!src || !electronics)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You remove the airlock electronics.</span>")
|
||||
name = "wired windoor assembly"
|
||||
var/obj/item/electronics/airlock/ae
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = loc
|
||||
|
||||
else if(istype(W, /obj/item/pen))
|
||||
var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN)
|
||||
if(!t)
|
||||
return
|
||||
if(!in_range(src, usr) && loc != usr)
|
||||
return
|
||||
created_name = t
|
||||
return
|
||||
|
||||
|
||||
|
||||
//Crowbar to complete the assembly, Step 7 complete.
|
||||
else if(istype(W, /obj/item/crowbar))
|
||||
if(!electronics)
|
||||
to_chat(usr, "<span class='warning'>The assembly is missing electronics!</span>")
|
||||
return
|
||||
usr << browse(null, "window=windoor_access")
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] pries the windoor into the frame.", "<span class='notice'>You start prying the windoor into the frame...</span>")
|
||||
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
|
||||
if(loc && electronics)
|
||||
|
||||
density = TRUE //Shouldn't matter but just incase
|
||||
to_chat(user, "<span class='notice'>You finish the windoor.</span>")
|
||||
|
||||
if(secure)
|
||||
var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc)
|
||||
if(facing == "l")
|
||||
windoor.icon_state = "leftsecureopen"
|
||||
windoor.base_state = "leftsecure"
|
||||
else
|
||||
windoor.icon_state = "rightsecureopen"
|
||||
windoor.base_state = "rightsecure"
|
||||
windoor.setDir(dir)
|
||||
to_chat(user, "<span class='notice'>You finish the windoor.</span>")
|
||||
|
||||
if(secure)
|
||||
var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc)
|
||||
if(facing == "l")
|
||||
windoor.icon_state = "leftsecureopen"
|
||||
windoor.base_state = "leftsecure"
|
||||
else
|
||||
windoor.icon_state = "rightsecureopen"
|
||||
windoor.base_state = "rightsecure"
|
||||
windoor.setDir(dir)
|
||||
windoor.density = FALSE
|
||||
|
||||
if(electronics.one_access)
|
||||
windoor.req_one_access = electronics.accesses
|
||||
else
|
||||
windoor.req_access = electronics.accesses
|
||||
windoor.electronics = electronics
|
||||
electronics.loc = windoor
|
||||
if(created_name)
|
||||
windoor.name = created_name
|
||||
qdel(src)
|
||||
windoor.close()
|
||||
|
||||
|
||||
else
|
||||
var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc)
|
||||
if(facing == "l")
|
||||
windoor.icon_state = "leftopen"
|
||||
windoor.base_state = "left"
|
||||
else
|
||||
windoor.icon_state = "rightopen"
|
||||
windoor.base_state = "right"
|
||||
windoor.setDir(dir)
|
||||
|
||||
if(electronics.one_access)
|
||||
windoor.req_one_access = electronics.accesses
|
||||
else
|
||||
windoor.req_access = electronics.accesses
|
||||
windoor.electronics = electronics
|
||||
electronics.loc = windoor
|
||||
if(created_name)
|
||||
windoor.name = created_name
|
||||
qdel(src)
|
||||
windoor.close()
|
||||
|
||||
|
||||
else
|
||||
var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc)
|
||||
if(facing == "l")
|
||||
windoor.icon_state = "leftopen"
|
||||
windoor.base_state = "left"
|
||||
else
|
||||
windoor.icon_state = "rightopen"
|
||||
windoor.base_state = "right"
|
||||
windoor.setDir(dir)
|
||||
windoor.density = FALSE
|
||||
|
||||
windoor.req_access = electronics.accesses
|
||||
windoor.electronics = electronics
|
||||
electronics.loc = windoor
|
||||
if(created_name)
|
||||
windoor.name = created_name
|
||||
qdel(src)
|
||||
windoor.close()
|
||||
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
//Update to reflect changes(if applicable)
|
||||
update_icon()
|
||||
|
||||
|
||||
//Rotates the windoor assembly clockwise
|
||||
/obj/structure/windoor_assembly/verb/revrotate()
|
||||
set name = "Rotate Windoor Assembly"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
if(anchored)
|
||||
to_chat(usr, "<span class='warning'>[src] cannot be rotated while it is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
|
||||
var/target_dir = turn(dir, 270)
|
||||
|
||||
if(!valid_window_location(loc, target_dir))
|
||||
to_chat(usr, "<span class='warning'>[src] cannot be rotated in that direction!</span>")
|
||||
return FALSE
|
||||
|
||||
setDir(target_dir)
|
||||
|
||||
ini_dir = dir
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/windoor_assembly/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
else
|
||||
revrotate()
|
||||
|
||||
//Flips the windoor assembly, determines whather the door opens to the left or the right
|
||||
/obj/structure/windoor_assembly/verb/flip()
|
||||
set name = "Flip Windoor Assembly"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
|
||||
if(facing == "l")
|
||||
to_chat(usr, "<span class='notice'>The windoor will now slide to the right.</span>")
|
||||
facing = "r"
|
||||
else
|
||||
facing = "l"
|
||||
to_chat(usr, "<span class='notice'>The windoor will now slide to the left.</span>")
|
||||
|
||||
update_icon()
|
||||
return
|
||||
|
||||
windoor.req_access = electronics.accesses
|
||||
windoor.electronics = electronics
|
||||
electronics.loc = windoor
|
||||
if(created_name)
|
||||
windoor.name = created_name
|
||||
qdel(src)
|
||||
windoor.close()
|
||||
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
//Update to reflect changes(if applicable)
|
||||
update_icon()
|
||||
|
||||
|
||||
//Rotates the windoor assembly clockwise
|
||||
/obj/structure/windoor_assembly/verb/revrotate()
|
||||
set name = "Rotate Windoor Assembly"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
if(anchored)
|
||||
to_chat(usr, "<span class='warning'>[src] cannot be rotated while it is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
|
||||
var/target_dir = turn(dir, 270)
|
||||
|
||||
if(!valid_window_location(loc, target_dir))
|
||||
to_chat(usr, "<span class='warning'>[src] cannot be rotated in that direction!</span>")
|
||||
return FALSE
|
||||
|
||||
setDir(target_dir)
|
||||
|
||||
ini_dir = dir
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/windoor_assembly/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
else
|
||||
revrotate()
|
||||
|
||||
//Flips the windoor assembly, determines whather the door opens to the left or the right
|
||||
/obj/structure/windoor_assembly/verb/flip()
|
||||
set name = "Flip Windoor Assembly"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
|
||||
if(facing == "l")
|
||||
to_chat(usr, "<span class='notice'>The windoor will now slide to the right.</span>")
|
||||
facing = "r"
|
||||
else
|
||||
facing = "l"
|
||||
to_chat(usr, "<span class='notice'>The windoor will now slide to the left.</span>")
|
||||
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
/obj/structure/shuttle/engine
|
||||
name = "engine"
|
||||
desc = "A bluespace engine used to make shuttles move."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/engine_power = 1
|
||||
@@ -81,18 +82,21 @@
|
||||
M.alter_engines(mod)
|
||||
|
||||
/obj/structure/shuttle/engine/heater
|
||||
name = "heater"
|
||||
name = "engine heater"
|
||||
icon_state = "heater"
|
||||
desc = "Directs energy into compressed particles in order to power engines."
|
||||
engine_power = 0 // todo make these into 2x1 parts
|
||||
|
||||
/obj/structure/shuttle/engine/platform
|
||||
name = "platform"
|
||||
name = "engine platform"
|
||||
icon_state = "platform"
|
||||
desc = "A platform for engine components."
|
||||
engine_power = 0
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion
|
||||
name = "propulsion engine"
|
||||
icon_state = "propulsion"
|
||||
desc = "A standard reliable bluespace engine used by many forms of shuttles."
|
||||
opacity = 1
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/left
|
||||
@@ -105,6 +109,7 @@
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst
|
||||
name = "burst engine"
|
||||
desc = "An engine that releases a large bluespace burst to propel it."
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst/cargo
|
||||
state = ENGINE_UNWRENCHED
|
||||
@@ -119,14 +124,16 @@
|
||||
icon_state = "burst_r"
|
||||
|
||||
/obj/structure/shuttle/engine/router
|
||||
name = "router"
|
||||
name = "engine router"
|
||||
icon_state = "router"
|
||||
desc = "Redirects around energized particles in engine structures."
|
||||
|
||||
/obj/structure/shuttle/engine/large
|
||||
name = "engine"
|
||||
opacity = 1
|
||||
icon = 'icons/obj/2x2.dmi'
|
||||
icon_state = "large_engine"
|
||||
desc = "A very large bluespace engine used to propel very large ships."
|
||||
bound_width = 64
|
||||
bound_height = 64
|
||||
appearance_flags = 0
|
||||
@@ -136,6 +143,7 @@
|
||||
opacity = 1
|
||||
icon = 'icons/obj/3x3.dmi'
|
||||
icon_state = "huge_engine"
|
||||
desc = "An extremely large bluespace engine used to propel extremely large ships."
|
||||
bound_width = 96
|
||||
bound_height = 96
|
||||
appearance_flags = 0
|
||||
appearance_flags = 0
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
|
||||
/turf/closed/bullet_act(obj/item/projectile/Proj)
|
||||
. = ..()
|
||||
if(!Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
if((. != -1) && !Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
var/mutable_appearance/bullet_hole = mutable_appearance('icons/effects/effects.dmi', "bullet_hole", BULLET_HOLE_LAYER)
|
||||
|
||||
var/random_x = rand(-13, 13)
|
||||
|
||||
@@ -111,12 +111,6 @@
|
||||
if(istype(R.module_active, /obj/item/pickaxe))
|
||||
src.attackby(R.module_active,R)
|
||||
return
|
||||
/* else if(istype(AM, /obj/mecha))
|
||||
var/obj/mecha/M = AM
|
||||
if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill))
|
||||
src.attackby(M.selected,M)
|
||||
return*/
|
||||
//Aparantly mechs are just TOO COOL to call Collide())
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
+15
-21
@@ -121,8 +121,6 @@
|
||||
return FALSE
|
||||
|
||||
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
|
||||
if (!mover)
|
||||
return TRUE
|
||||
// First, make sure it can leave its square
|
||||
if(isturf(mover.loc))
|
||||
// Nothing but border objects stop you from leaving a tile, only one loop is needed
|
||||
@@ -131,32 +129,28 @@
|
||||
mover.Collide(obstacle)
|
||||
return FALSE
|
||||
|
||||
var/list/large_dense = list()
|
||||
|
||||
//Next, check objects to block entry that are on the border
|
||||
for(var/atom/movable/border_obstacle in src)
|
||||
if(border_obstacle.flags_1 & ON_BORDER_1)
|
||||
if(!border_obstacle.CanPass(mover, mover.loc, 1) && (forget != border_obstacle))
|
||||
mover.Collide(border_obstacle)
|
||||
return FALSE
|
||||
else
|
||||
large_dense += border_obstacle
|
||||
|
||||
//Then, check the turf itself
|
||||
if (!src.CanPass(mover, src))
|
||||
mover.Collide(src)
|
||||
return FALSE
|
||||
|
||||
//Finally, check objects/mobs to block entry that are not on the border
|
||||
var/atom/movable/tompost_bump
|
||||
|
||||
var/atom/movable/topmost_bump
|
||||
var/top_layer = FALSE
|
||||
for(var/atom/movable/obstacle in large_dense)
|
||||
|
||||
//Next, check objects to block entry that are on the border
|
||||
for(var/atom/movable/obstacle in src)
|
||||
if(!obstacle.CanPass(mover, mover.loc, 1) && (forget != obstacle))
|
||||
if(obstacle.layer > top_layer)
|
||||
tompost_bump = obstacle
|
||||
top_layer = obstacle.layer
|
||||
if(tompost_bump)
|
||||
mover.Collide(tompost_bump)
|
||||
if(obstacle.flags_1 & ON_BORDER_1)
|
||||
mover.Collide(obstacle)
|
||||
return FALSE
|
||||
else
|
||||
if(obstacle.layer > top_layer)
|
||||
topmost_bump = obstacle
|
||||
top_layer = obstacle.layer
|
||||
|
||||
if(topmost_bump)
|
||||
mover.Collide(topmost_bump)
|
||||
return FALSE
|
||||
|
||||
return TRUE //Nothing found to block so return success!
|
||||
|
||||
@@ -60,3 +60,17 @@
|
||||
|
||||
/datum/server_tools_command/adminwho/Run(sender, params)
|
||||
return ircadminwho()
|
||||
|
||||
GLOBAL_LIST(round_end_notifiees)
|
||||
|
||||
/datum/server_tools_command/notify
|
||||
name = "notify"
|
||||
help_text = "Pings the invoker when the round ends"
|
||||
admin_only = TRUE
|
||||
|
||||
/datum/server_tools_command/notify/Run(sender, params)
|
||||
if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted())
|
||||
return "[sender], the round has already ended!"
|
||||
LAZYINITLIST(GLOB.round_end_notifiees)
|
||||
GLOB.round_end_notifiees[sender] = TRUE
|
||||
return "I will notify [sender] when the round ends."
|
||||
@@ -530,7 +530,7 @@
|
||||
else
|
||||
dat += "<tr><td><a href='?_src_=vars;[HrefToken()];Vars=\ref[brother]'>[brother.name]([brother.key])</a><i>Brother body destroyed!</i></td>"
|
||||
dat += "<td><A href='?priv_msg=[brother.key]'>PM</A></td></tr>"
|
||||
dat += "</table>"
|
||||
dat += "</table>"
|
||||
|
||||
if(SSticker.mode.abductors.len)
|
||||
dat += "<br><table cellspacing=5><tr><td><B>Abductors</B></td><td></td><td></td></tr>"
|
||||
|
||||
@@ -242,7 +242,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
/datum/admin_help/proc/LinkedReplyName(ref_src)
|
||||
if(!ref_src)
|
||||
ref_src = "\ref[src]"
|
||||
return "<A HREF='?_src_=holder;[HrefToken()];ahelp=[ref_src];ahelp_action=reply'>[initiator_key_name]</A>"
|
||||
return "<A HREF='?_src_=holder;[HrefToken(TRUE)];ahelp=[ref_src];ahelp_action=reply'>[initiator_key_name]</A>"
|
||||
|
||||
//private
|
||||
/datum/admin_help/proc/TicketHref(msg, ref_src, action = "ticket")
|
||||
|
||||
@@ -28,6 +28,22 @@
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/datum/admins/proc/isReadytoRumble(mob/living/carbon/human/applicant, targetrole, onstation = TRUE, conscious = TRUE)
|
||||
if(applicant.mind.special_role)
|
||||
return FALSE
|
||||
if(!(targetrole in applicant.client.prefs.be_special))
|
||||
return FALSE
|
||||
if(onstation)
|
||||
var/turf/T = get_turf(applicant)
|
||||
if(!(T.z in GLOB.station_z_levels))
|
||||
return FALSE
|
||||
if(conscious && applicant.stat) //incase you don't care about a certain antag being unconcious when made, ie if they have selfhealing abilities.
|
||||
return FALSE
|
||||
if(!considered_alive(applicant.mind) || considered_afk(applicant.mind)) //makes sure the player isn't a zombie, brain, or just afk all together
|
||||
return FALSE
|
||||
return (!jobban_isbanned(applicant, targetrole) && !jobban_isbanned(applicant, "Syndicate"))
|
||||
|
||||
|
||||
/datum/admins/proc/makeTraitors()
|
||||
var/datum/game_mode/traitor/temp = new
|
||||
|
||||
@@ -41,14 +57,10 @@
|
||||
var/mob/living/carbon/human/H = null
|
||||
|
||||
for(var/mob/living/carbon/human/applicant in GLOB.player_list)
|
||||
if(ROLE_TRAITOR in applicant.client.prefs.be_special)
|
||||
if(!applicant.stat)
|
||||
if(applicant.mind)
|
||||
if (!applicant.mind.special_role)
|
||||
if(!jobban_isbanned(applicant, ROLE_TRAITOR) && !jobban_isbanned(applicant, "Syndicate"))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
if(isReadytoRumble(applicant, ROLE_TRAITOR, FALSE))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
|
||||
if(candidates.len)
|
||||
var/numTraitors = min(candidates.len, 3)
|
||||
@@ -77,13 +89,10 @@
|
||||
var/mob/living/carbon/human/H = null
|
||||
|
||||
for(var/mob/living/carbon/human/applicant in GLOB.player_list)
|
||||
if(ROLE_CHANGELING in applicant.client.prefs.be_special)
|
||||
var/turf/T = get_turf(applicant)
|
||||
if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels))
|
||||
if(!jobban_isbanned(applicant, ROLE_CHANGELING) && !jobban_isbanned(applicant, "Syndicate"))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
if(isReadytoRumble(applicant, ROLE_CHANGELING))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
|
||||
if(candidates.len)
|
||||
var/numChanglings = min(candidates.len, 3)
|
||||
@@ -110,13 +119,10 @@
|
||||
var/mob/living/carbon/human/H = null
|
||||
|
||||
for(var/mob/living/carbon/human/applicant in GLOB.player_list)
|
||||
if(ROLE_REV in applicant.client.prefs.be_special)
|
||||
var/turf/T = get_turf(applicant)
|
||||
if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels))
|
||||
if(!jobban_isbanned(applicant, ROLE_REV) && !jobban_isbanned(applicant, "Syndicate"))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
if(isReadytoRumble(applicant, ROLE_REV))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
|
||||
if(candidates.len)
|
||||
var/numRevs = min(candidates.len, 3)
|
||||
@@ -152,13 +158,10 @@
|
||||
var/mob/living/carbon/human/H = null
|
||||
|
||||
for(var/mob/living/carbon/human/applicant in GLOB.player_list)
|
||||
if(ROLE_CULTIST in applicant.client.prefs.be_special)
|
||||
var/turf/T = get_turf(applicant)
|
||||
if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels))
|
||||
if(!jobban_isbanned(applicant, ROLE_CULTIST) && !jobban_isbanned(applicant, "Syndicate"))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
if(isReadytoRumble(applicant, ROLE_CULTIST))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
|
||||
if(candidates.len)
|
||||
var/numCultists = min(candidates.len, 4)
|
||||
@@ -185,13 +188,10 @@
|
||||
var/mob/living/carbon/human/H = null
|
||||
|
||||
for(var/mob/living/carbon/human/applicant in GLOB.player_list)
|
||||
if(ROLE_SERVANT_OF_RATVAR in applicant.client.prefs.be_special)
|
||||
var/turf/T = get_turf(applicant)
|
||||
if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels))
|
||||
if(!jobban_isbanned(applicant, ROLE_SERVANT_OF_RATVAR) && !jobban_isbanned(applicant, "Syndicate"))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
if(isReadytoRumble(applicant, ROLE_SERVANT_OF_RATVAR))
|
||||
if(temp.age_check(applicant.client))
|
||||
if(!(applicant.job in temp.restricted_jobs))
|
||||
candidates += applicant
|
||||
|
||||
if(candidates.len)
|
||||
var/numCultists = min(candidates.len, 4)
|
||||
|
||||
@@ -92,8 +92,7 @@
|
||||
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
|
||||
pitch = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
|
||||
to_chat(src, "You feel the Honkmother messing with your song...")
|
||||
|
||||
SSblackbox.add_details("played_url", web_sound_input)
|
||||
SSblackbox.add_details("played_url", "[web_sound_input]|[ckey]")
|
||||
log_admin("[key_name(src)] played web sound: [web_sound_input]")
|
||||
message_admins("[key_name(src)] played web sound: [web_sound_input]")
|
||||
else
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
icon = 'icons/effects/fire.dmi'
|
||||
icon_state = "1"
|
||||
layer = ABOVE_OPEN_TURF_LAYER
|
||||
light_range = 3
|
||||
light_range = LIGHT_RANGE_FIRE
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
|
||||
var/volume = 125
|
||||
@@ -175,3 +175,15 @@
|
||||
..()
|
||||
if(isliving(L))
|
||||
L.fire_act(temperature, volume)
|
||||
|
||||
/obj/effect/dummy/fire
|
||||
name = "fire"
|
||||
desc = "OWWWWWW. IT BURNS. Tell a coder if you're seeing this."
|
||||
icon_state = "nothing"
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
light_range = LIGHT_RANGE_FIRE
|
||||
|
||||
/obj/effect/dummy/fire/Initialize()
|
||||
. = ..()
|
||||
if(!isliving(loc))
|
||||
qdel(src)
|
||||
|
||||
@@ -5,7 +5,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
|
||||
/obj/machinery/atmospherics/components/binary/valve
|
||||
icon_state = "mvalve_map"
|
||||
name = "manual valve"
|
||||
desc = "A pipe valve"
|
||||
desc = "A pipe with a valve that can be used to disable flow of gas through it."
|
||||
|
||||
can_unwrench = TRUE
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/machinery/atmospherics/components/trinary/filter
|
||||
name = "gas filter"
|
||||
icon_state = "filter_off"
|
||||
desc = "Very useful for filtering gasses."
|
||||
density = FALSE
|
||||
can_unwrench = TRUE
|
||||
var/on = FALSE
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
name = "gas mixer"
|
||||
can_unwrench = TRUE
|
||||
desc = "Very useful for mixing gasses."
|
||||
|
||||
var/on = FALSE
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon_state = "vent_map"
|
||||
density = FALSE
|
||||
anchored=1
|
||||
desc = "This may be needed some day."
|
||||
|
||||
var/on = FALSE
|
||||
var/volume_rate = 800
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
if(pockets && over_object == M)
|
||||
return pockets.MouseDrop(over_object)
|
||||
|
||||
if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech
|
||||
if(ismecha(M.loc)) // stops inventory actions in a mech
|
||||
return
|
||||
|
||||
if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
|
||||
/obj/item/clothing/head/crown/fancy
|
||||
name = "magnificent crown"
|
||||
desc = "A crown worn by only the highest emperors of the land."
|
||||
desc = "A crown worn by only the highest emperors of the <s>land</s> space."
|
||||
icon_state = "fancycrown"
|
||||
|
||||
/obj/item/clothing/head/scarecrow_hat
|
||||
|
||||
@@ -151,6 +151,16 @@
|
||||
desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty."
|
||||
icon_state = "bronze_heart"
|
||||
|
||||
/obj/item/clothing/accessory/medal/ribbon
|
||||
name = "ribbon"
|
||||
desc = "A ribbon"
|
||||
icon_state = "cargo"
|
||||
item_color = "cargo"
|
||||
|
||||
/obj/item/clothing/accessory/medal/ribbon/cargo
|
||||
name = "\"cargo tech of the shift\" award"
|
||||
desc = "An award bestowed only upon those cargotechs who have exhibited devotion to their duty in keeping with the highest traditions of Cargonia."
|
||||
|
||||
/obj/item/clothing/accessory/medal/silver
|
||||
name = "silver medal"
|
||||
desc = "A silver medal."
|
||||
|
||||
@@ -1,28 +1,25 @@
|
||||
/datum/round_event_control/carp_migration
|
||||
name = "Carp Migration"
|
||||
typepath = /datum/round_event/carp_migration
|
||||
weight = 15
|
||||
min_players = 2
|
||||
earliest_start = 6000
|
||||
max_occurrences = 6
|
||||
|
||||
/datum/round_event/carp_migration
|
||||
announceWhen = 3
|
||||
startWhen = 50
|
||||
|
||||
/datum/round_event/carp_migration/setup()
|
||||
startWhen = rand(40, 60)
|
||||
|
||||
/datum/round_event/carp_migration/announce()
|
||||
priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
|
||||
/datum/round_event/carp_migration/start()
|
||||
for(var/obj/effect/landmark/C in GLOB.landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
if(prob(95))
|
||||
new /mob/living/simple_animal/hostile/carp(C.loc)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/carp/megacarp(C.loc)
|
||||
|
||||
|
||||
/datum/round_event_control/carp_migration
|
||||
name = "Carp Migration"
|
||||
typepath = /datum/round_event/carp_migration
|
||||
weight = 15
|
||||
min_players = 2
|
||||
earliest_start = 6000
|
||||
max_occurrences = 6
|
||||
|
||||
/datum/round_event/carp_migration
|
||||
announceWhen = 3
|
||||
startWhen = 50
|
||||
|
||||
/datum/round_event/carp_migration/setup()
|
||||
startWhen = rand(40, 60)
|
||||
|
||||
/datum/round_event/carp_migration/announce()
|
||||
priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
|
||||
/datum/round_event/carp_migration/start()
|
||||
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
|
||||
if(prob(95))
|
||||
new /mob/living/simple_animal/hostile/carp(C.loc)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/carp/megacarp(C.loc)
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
/datum/round_event_control/electrical_storm
|
||||
name = "Electrical Storm"
|
||||
typepath = /datum/round_event/electrical_storm
|
||||
earliest_start = 6000
|
||||
min_players = 5
|
||||
weight = 40
|
||||
alertadmins = 0
|
||||
|
||||
/datum/round_event/electrical_storm
|
||||
var/lightsoutAmount = 1
|
||||
var/lightsoutRange = 25
|
||||
announceWhen = 1
|
||||
|
||||
/datum/round_event/electrical_storm/announce()
|
||||
priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
|
||||
|
||||
|
||||
/datum/round_event/electrical_storm/start()
|
||||
var/list/epicentreList = list()
|
||||
|
||||
for(var/i=1, i <= lightsoutAmount, i++)
|
||||
var/list/possibleEpicentres = list()
|
||||
for(var/obj/effect/landmark/newEpicentre in GLOB.landmarks_list)
|
||||
if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList))
|
||||
possibleEpicentres += newEpicentre
|
||||
if(possibleEpicentres.len)
|
||||
epicentreList += pick(possibleEpicentres)
|
||||
else
|
||||
break
|
||||
|
||||
if(!epicentreList.len)
|
||||
return
|
||||
|
||||
for(var/obj/effect/landmark/epicentre in epicentreList)
|
||||
for(var/obj/machinery/power/apc/apc in urange(lightsoutRange, epicentre))
|
||||
apc.overload_lighting()
|
||||
/datum/round_event_control/electrical_storm
|
||||
name = "Electrical Storm"
|
||||
typepath = /datum/round_event/electrical_storm
|
||||
earliest_start = 6000
|
||||
min_players = 5
|
||||
weight = 40
|
||||
alertadmins = 0
|
||||
|
||||
/datum/round_event/electrical_storm
|
||||
var/lightsoutAmount = 1
|
||||
var/lightsoutRange = 25
|
||||
announceWhen = 1
|
||||
|
||||
/datum/round_event/electrical_storm/announce()
|
||||
priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
|
||||
|
||||
|
||||
/datum/round_event/electrical_storm/start()
|
||||
var/list/epicentreList = list()
|
||||
|
||||
for(var/i=1, i <= lightsoutAmount, i++)
|
||||
var/list/possibleEpicentres = list()
|
||||
for(var/obj/effect/landmark/lightsout/newEpicentre in GLOB.landmarks_list)
|
||||
if(!(newEpicentre in epicentreList))
|
||||
possibleEpicentres += newEpicentre
|
||||
if(possibleEpicentres.len)
|
||||
epicentreList += pick(possibleEpicentres)
|
||||
else
|
||||
break
|
||||
|
||||
if(!epicentreList.len)
|
||||
return
|
||||
|
||||
for(var/obj/effect/landmark/epicentre in epicentreList)
|
||||
for(var/obj/machinery/power/apc/apc in urange(lightsoutRange, epicentre))
|
||||
apc.overload_lighting()
|
||||
|
||||
@@ -1,138 +1,137 @@
|
||||
/datum/round_event_control/spooky
|
||||
name = "2 SPOOKY! (Halloween)"
|
||||
holidayID = HALLOWEEN
|
||||
typepath = /datum/round_event/spooky
|
||||
weight = -1 //forces it to be called, regardless of weight
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/spooky/start()
|
||||
..()
|
||||
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
||||
var/obj/item/storage/backpack/b = locate() in H.contents
|
||||
new /obj/item/storage/spooky(b)
|
||||
if(ishuman(H) || islizard(H))
|
||||
if(prob(50))
|
||||
H.set_species(/datum/species/skeleton)
|
||||
else
|
||||
H.set_species(/datum/species/zombie)
|
||||
|
||||
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list)
|
||||
Ian.place_on_head(new /obj/item/bedsheet(Ian))
|
||||
for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_list)
|
||||
new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc)
|
||||
qdel(Poly)
|
||||
|
||||
/datum/round_event/spooky/announce()
|
||||
priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
|
||||
|
||||
//Eyeball migration
|
||||
/datum/round_event_control/carp_migration/eyeballs
|
||||
name = "Eyeball Migration"
|
||||
typepath = /datum/round_event/carp_migration/eyeballs
|
||||
holidayID = HALLOWEEN
|
||||
weight = 25
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/carp_migration/eyeballs/start()
|
||||
for(var/obj/effect/landmark/C in GLOB.landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
new /mob/living/simple_animal/hostile/carp/eyeball(C.loc)
|
||||
|
||||
//Pumpking meteors waves
|
||||
/datum/round_event_control/meteor_wave/spooky
|
||||
name = "Pumpkin Wave"
|
||||
typepath = /datum/round_event/meteor_wave/spooky
|
||||
holidayID = HALLOWEEN
|
||||
weight = 20
|
||||
max_occurrences = 2
|
||||
|
||||
/datum/round_event/meteor_wave/spooky
|
||||
endWhen = 40
|
||||
|
||||
/datum/round_event/meteor_wave/spooky/tick()
|
||||
if(IsMultiple(activeFor, 4))
|
||||
spawn_meteors(3, GLOB.meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
|
||||
//Creepy clown invasion
|
||||
/datum/round_event_control/creepy_clowns
|
||||
name = "Clowns"
|
||||
typepath = /datum/round_event/creepy_clowns
|
||||
holidayID = HALLOWEEN
|
||||
weight = 20
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/creepy_clowns
|
||||
endWhen = 40
|
||||
|
||||
/datum/round_event/creepy_clowns/start()
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if(!H.client || !istype(H))
|
||||
return
|
||||
to_chat(H, "<span class='danger'>Honk...</span>")
|
||||
/datum/round_event_control/spooky
|
||||
name = "2 SPOOKY! (Halloween)"
|
||||
holidayID = HALLOWEEN
|
||||
typepath = /datum/round_event/spooky
|
||||
weight = -1 //forces it to be called, regardless of weight
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/spooky/start()
|
||||
..()
|
||||
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
||||
var/obj/item/storage/backpack/b = locate() in H.contents
|
||||
new /obj/item/storage/spooky(b)
|
||||
if(ishuman(H) || islizard(H))
|
||||
if(prob(50))
|
||||
H.set_species(/datum/species/skeleton)
|
||||
else
|
||||
H.set_species(/datum/species/zombie)
|
||||
|
||||
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list)
|
||||
Ian.place_on_head(new /obj/item/bedsheet(Ian))
|
||||
for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_list)
|
||||
new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc)
|
||||
qdel(Poly)
|
||||
|
||||
/datum/round_event/spooky/announce()
|
||||
priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
|
||||
|
||||
//Eyeball migration
|
||||
/datum/round_event_control/carp_migration/eyeballs
|
||||
name = "Eyeball Migration"
|
||||
typepath = /datum/round_event/carp_migration/eyeballs
|
||||
holidayID = HALLOWEEN
|
||||
weight = 25
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/carp_migration/eyeballs/start()
|
||||
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
|
||||
new /mob/living/simple_animal/hostile/carp/eyeball(C.loc)
|
||||
|
||||
//Pumpking meteors waves
|
||||
/datum/round_event_control/meteor_wave/spooky
|
||||
name = "Pumpkin Wave"
|
||||
typepath = /datum/round_event/meteor_wave/spooky
|
||||
holidayID = HALLOWEEN
|
||||
weight = 20
|
||||
max_occurrences = 2
|
||||
|
||||
/datum/round_event/meteor_wave/spooky
|
||||
endWhen = 40
|
||||
|
||||
/datum/round_event/meteor_wave/spooky/tick()
|
||||
if(IsMultiple(activeFor, 4))
|
||||
spawn_meteors(3, GLOB.meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
|
||||
//Creepy clown invasion
|
||||
/datum/round_event_control/creepy_clowns
|
||||
name = "Clowns"
|
||||
typepath = /datum/round_event/creepy_clowns
|
||||
holidayID = HALLOWEEN
|
||||
weight = 20
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/creepy_clowns
|
||||
endWhen = 40
|
||||
|
||||
/datum/round_event/creepy_clowns/start()
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if(!H.client || !istype(H))
|
||||
return
|
||||
to_chat(H, "<span class='danger'>Honk...</span>")
|
||||
SEND_SOUND(H, sound('sound/spookoween/scary_clown_appear.ogg'))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown(T, H, 50)
|
||||
|
||||
/datum/round_event/creepy_clowns/tick()
|
||||
if(IsMultiple(activeFor, 4))
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if (prob(66))
|
||||
playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1)
|
||||
if (prob(33))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown(T, H, 25)
|
||||
else if (prob(25))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown/scary(T, H, 25)
|
||||
else if (prob(5))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
spawn_atom_to_turf(/obj/effect/mob_spawn/human/clown/corpse, H, 1)
|
||||
else if (prob(1))
|
||||
spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1)
|
||||
|
||||
/datum/round_event/creepy_clowns/announce()
|
||||
priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg')
|
||||
|
||||
//spooky foods (you can't actually make these when it's not halloween)
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull
|
||||
name = "skull cookie"
|
||||
desc = "Spooky! It's got delicious calcium flavouring!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "skeletoncookie"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin
|
||||
name = "coffin cookie"
|
||||
desc = "Spooky! It's got delicious coffee flavouring!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "coffincookie"
|
||||
|
||||
|
||||
//spooky items
|
||||
|
||||
/obj/item/storage/spooky
|
||||
name = "trick-o-treat bag"
|
||||
desc = "A pumpkin-shaped bag that holds all sorts of goodies!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "treatbag"
|
||||
|
||||
/obj/item/storage/spooky/New()
|
||||
..()
|
||||
for(var/distrobuteinbag=0 to 5)
|
||||
var/type = pick(/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull,
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin,
|
||||
/obj/item/reagent_containers/food/snacks/candy_corn,
|
||||
/obj/item/reagent_containers/food/snacks/candy,
|
||||
/obj/item/reagent_containers/food/snacks/candiedapple,
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY!
|
||||
new type(src)
|
||||
|
||||
/obj/item/card/emag/halloween
|
||||
name = "hack-o'-lantern"
|
||||
desc = "It's a pumpkin with a cryptographic sequencer sticking out."
|
||||
icon_state = "hack_o_lantern"
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown(T, H, 50)
|
||||
|
||||
/datum/round_event/creepy_clowns/tick()
|
||||
if(IsMultiple(activeFor, 4))
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if (prob(66))
|
||||
playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1)
|
||||
if (prob(33))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown(T, H, 25)
|
||||
else if (prob(25))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown/scary(T, H, 25)
|
||||
else if (prob(5))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
spawn_atom_to_turf(/obj/effect/mob_spawn/human/clown/corpse, H, 1)
|
||||
else if (prob(1))
|
||||
spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1)
|
||||
|
||||
/datum/round_event/creepy_clowns/announce()
|
||||
priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg')
|
||||
|
||||
//spooky foods (you can't actually make these when it's not halloween)
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull
|
||||
name = "skull cookie"
|
||||
desc = "Spooky! It's got delicious calcium flavouring!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "skeletoncookie"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin
|
||||
name = "coffin cookie"
|
||||
desc = "Spooky! It's got delicious coffee flavouring!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "coffincookie"
|
||||
|
||||
|
||||
//spooky items
|
||||
|
||||
/obj/item/storage/spooky
|
||||
name = "trick-o-treat bag"
|
||||
desc = "A pumpkin-shaped bag that holds all sorts of goodies!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "treatbag"
|
||||
|
||||
/obj/item/storage/spooky/New()
|
||||
..()
|
||||
for(var/distrobuteinbag=0 to 5)
|
||||
var/type = pick(/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull,
|
||||
/obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin,
|
||||
/obj/item/reagent_containers/food/snacks/candy_corn,
|
||||
/obj/item/reagent_containers/food/snacks/candy,
|
||||
/obj/item/reagent_containers/food/snacks/candiedapple,
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY!
|
||||
new type(src)
|
||||
|
||||
/obj/item/card/emag/halloween
|
||||
name = "hack-o'-lantern"
|
||||
desc = "It's a pumpkin with a cryptographic sequencer sticking out."
|
||||
icon_state = "hack_o_lantern"
|
||||
|
||||
@@ -16,9 +16,8 @@
|
||||
var/mob/dead/selected = pick_n_take(candidates)
|
||||
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
if(L.name in list("ninjaspawn","carpspawn"))
|
||||
spawn_locs += L.loc
|
||||
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs.len)
|
||||
return MAP_ERROR
|
||||
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
/datum/round_event/wizard/magicarp/start()
|
||||
for(var/obj/effect/landmark/C in GLOB.landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
if(prob(5))
|
||||
new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/carp/ranged(C.loc)
|
||||
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
|
||||
if(prob(5))
|
||||
new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/carp/ranged(C.loc)
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged
|
||||
name = "magicarp"
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
for(var/i = 1, i <= number_of_wormholes, i++)
|
||||
var/turf/T = pick(pick_turfs)
|
||||
wormholes += new /obj/effect/portal/wormhole(T, null, 300, null, FALSE)
|
||||
wormholes += new /obj/effect/portal/wormhole(T, null, 0, null, FALSE)
|
||||
|
||||
/datum/round_event/wormholes/announce()
|
||||
priority_announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", 'sound/ai/spanomalies.ogg')
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
/datum/round_event/wormholes/end()
|
||||
QDEL_LIST(wormholes)
|
||||
wormholes = null
|
||||
|
||||
/obj/effect/portal/wormhole
|
||||
name = "wormhole"
|
||||
@@ -48,17 +49,11 @@
|
||||
icon_state = "anom"
|
||||
mech_sized = TRUE
|
||||
|
||||
/obj/effect/portal/wormhole/attack_hand(mob/user)
|
||||
teleport(user)
|
||||
|
||||
/obj/effect/portal/wormhole/attackby(obj/item/I, mob/user, params)
|
||||
teleport(user)
|
||||
|
||||
/obj/effect/portal/wormhole/teleport(atom/movable/M)
|
||||
if(istype(M, /obj/effect)) //sparks don't teleport
|
||||
return
|
||||
if(M.anchored)
|
||||
if(!(istype(M, /obj/mecha) && mech_sized))
|
||||
if(!(ismecha(M) && mech_sized))
|
||||
return
|
||||
|
||||
if(ismovableatom(M))
|
||||
|
||||
@@ -185,7 +185,9 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand()
|
||||
visible_message("<span class='notice'>[src] expands!</span>")
|
||||
new /mob/living/carbon/monkey(get_turf(src))
|
||||
var/mob/spammer = get_mob_by_key(src.fingerprintslast)
|
||||
var/mob/living/carbon/monkey/bananas = new(get_turf(src))
|
||||
bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/enchiladas
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null)
|
||||
tastes = list(name = 1) // apples taste of apple, silly.
|
||||
..()
|
||||
/obj/item/reagent_containers/food/snacks/grown/Initialize(mapload, obj/item/seeds/new_seed)
|
||||
. = ..()
|
||||
tastes = list("[name]" = 1) // apples taste of apple, silly.
|
||||
if(new_seed)
|
||||
seed = new_seed.Copy()
|
||||
else if(ispath(seed))
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_new(src, newloc)
|
||||
T.on_new(src, loc)
|
||||
seed.prepare_result(src)
|
||||
transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
|
||||
add_juice()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user