mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-06-18 20:53:55 +01:00
Merge remote-tracking branch 'skrat/master' into upstream-merge-branch
# Conflicts: # code/modules/research/machinery/_production.dm
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -28,6 +28,7 @@
|
||||
/area/centcom/mafia)
|
||||
"l" = (
|
||||
/obj/structure/closet/abductor,
|
||||
/obj/item/abductor/gizmo,
|
||||
/turf/open/floor/plating/abductor,
|
||||
/area/centcom/mafia)
|
||||
"m" = (
|
||||
@@ -42,6 +43,7 @@
|
||||
/area/centcom/mafia)
|
||||
"o" = (
|
||||
/obj/structure/closet/abductor,
|
||||
/obj/item/abductor/gizmo,
|
||||
/turf/open/floor/plating/abductor2,
|
||||
/area/centcom/mafia)
|
||||
"p" = (
|
||||
|
||||
@@ -50,12 +50,9 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/centcom/mafia)
|
||||
"al" = (
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/fakebasalt,
|
||||
/area/centcom/mafia)
|
||||
"am" = (
|
||||
@@ -74,12 +71,9 @@
|
||||
/obj/effect/turf_decal/trimline/brown/filled/end{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"ap" = (
|
||||
@@ -98,12 +92,9 @@
|
||||
/obj/effect/turf_decal/trimline/brown/filled/line{
|
||||
dir = 9
|
||||
},
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"as" = (
|
||||
@@ -112,20 +103,6 @@
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"at" = (
|
||||
/obj/effect/turf_decal/tile/red,
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"au" = (
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"av" = (
|
||||
/obj/mafia_game_board,
|
||||
/obj/effect/mapping_helpers/burnt_floor,
|
||||
@@ -155,12 +132,9 @@
|
||||
/obj/effect/turf_decal/trimline/brown/filled/line{
|
||||
dir = 5
|
||||
},
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"aA" = (
|
||||
@@ -220,24 +194,18 @@
|
||||
/obj/effect/turf_decal/trimline/brown/filled/line{
|
||||
dir = 10
|
||||
},
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"aI" = (
|
||||
/obj/effect/turf_decal/trimline/brown/filled/line{
|
||||
dir = 6
|
||||
},
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"aJ" = (
|
||||
@@ -254,12 +222,9 @@
|
||||
/obj/effect/turf_decal/trimline/brown/filled/end{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/closet{
|
||||
desc = "It's a storage unit. For mining stuff. Y'know.";
|
||||
icon_state = "mining";
|
||||
name = "miner equipment locker"
|
||||
},
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland,
|
||||
/obj/item/shovel,
|
||||
/obj/item/pickaxe,
|
||||
/obj/structure/closet/secure_closet/miner/unlocked,
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"aL" = (
|
||||
@@ -334,24 +299,6 @@
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/centcom/mafia)
|
||||
"aW" = (
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"aX" = (
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/red{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"aY" = (
|
||||
/turf/closed/indestructible/reinforced,
|
||||
/area/centcom/mafia)
|
||||
|
||||
@@ -144,15 +144,13 @@
|
||||
/area/centcom/mafia)
|
||||
"D" = (
|
||||
/obj/structure/closet/crate/science,
|
||||
/obj/item/clothing/suit/hooded/wintercoat,
|
||||
/obj/item/clothing/shoes/winterboots,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/miner,
|
||||
/turf/open/floor/holofloor/snow,
|
||||
/area/centcom/mafia)
|
||||
"E" = (
|
||||
/obj/structure/lattice/catwalk,
|
||||
/obj/structure/closet/crate/critter,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/miner,
|
||||
/obj/item/clothing/shoes/winterboots,
|
||||
/turf/open/lava/plasma/mafia,
|
||||
/area/centcom/mafia)
|
||||
"F" = (
|
||||
|
||||
@@ -7,8 +7,7 @@
|
||||
desc = "A storage closet for syndicate conflict resolution operatives.";
|
||||
name = "red closet"
|
||||
},
|
||||
/obj/item/clothing/under/syndicate/tacticool,
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt,
|
||||
/obj/effect/spawner/random/clothing/syndie,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/centcom/mafia)
|
||||
"c" = (
|
||||
@@ -46,16 +45,6 @@
|
||||
/obj/mafia_game_board,
|
||||
/turf/open/floor/plating,
|
||||
/area/centcom/mafia)
|
||||
"m" = (
|
||||
/obj/structure/closet/syndicate{
|
||||
desc = "A storage closet for syndicate conflict resolution operatives.";
|
||||
name = "red closet"
|
||||
},
|
||||
/obj/item/clothing/under/syndicate/tacticool,
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt,
|
||||
/obj/effect/turf_decal/tile/red/fourcorners,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"n" = (
|
||||
/obj/effect/landmark/mafia,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
@@ -84,12 +73,6 @@
|
||||
"r" = (
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/centcom/mafia)
|
||||
"s" = (
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/centcom/mafia)
|
||||
"t" = (
|
||||
/turf/open/floor/circuit/red,
|
||||
/area/centcom/mafia)
|
||||
"u" = (
|
||||
/obj/effect/baseturf_helper/asteroid,
|
||||
/obj/effect/landmark/mafia/town_center,
|
||||
@@ -155,13 +138,12 @@
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/centcom/mafia)
|
||||
"G" = (
|
||||
/obj/item/clothing/under/syndicate/tacticool,
|
||||
/obj/structure/closet/syndicate{
|
||||
desc = "A storage closet for syndicate conflict resolution operatives.";
|
||||
name = "red closet"
|
||||
},
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt,
|
||||
/obj/effect/turf_decal/tile/red/fourcorners,
|
||||
/obj/effect/spawner/random/clothing/syndie,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"H" = (
|
||||
@@ -169,6 +151,12 @@
|
||||
/obj/effect/turf_decal/tile/red/fourcorners,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/centcom/mafia)
|
||||
"Q" = (
|
||||
/turf/open/floor/circuit/red,
|
||||
/area/centcom/mafia)
|
||||
"S" = (
|
||||
/turf/open/floor/mineral/plastitanium/red,
|
||||
/area/centcom/mafia)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -309,7 +297,7 @@ b
|
||||
r
|
||||
w
|
||||
o
|
||||
m
|
||||
G
|
||||
w
|
||||
j
|
||||
w
|
||||
@@ -327,7 +315,7 @@ c
|
||||
c
|
||||
d
|
||||
w
|
||||
m
|
||||
G
|
||||
o
|
||||
p
|
||||
n
|
||||
@@ -413,7 +401,7 @@ p
|
||||
p
|
||||
w
|
||||
p
|
||||
m
|
||||
G
|
||||
w
|
||||
d
|
||||
c
|
||||
@@ -431,9 +419,9 @@ r
|
||||
r
|
||||
y
|
||||
p
|
||||
s
|
||||
t
|
||||
s
|
||||
S
|
||||
Q
|
||||
S
|
||||
p
|
||||
q
|
||||
o
|
||||
@@ -456,9 +444,9 @@ p
|
||||
w
|
||||
p
|
||||
p
|
||||
t
|
||||
Q
|
||||
u
|
||||
t
|
||||
Q
|
||||
p
|
||||
p
|
||||
w
|
||||
@@ -481,9 +469,9 @@ o
|
||||
o
|
||||
z
|
||||
p
|
||||
s
|
||||
t
|
||||
s
|
||||
S
|
||||
Q
|
||||
S
|
||||
p
|
||||
E
|
||||
r
|
||||
@@ -501,7 +489,7 @@ w
|
||||
c
|
||||
d
|
||||
w
|
||||
m
|
||||
G
|
||||
p
|
||||
w
|
||||
p
|
||||
@@ -605,7 +593,7 @@ w
|
||||
w
|
||||
j
|
||||
w
|
||||
m
|
||||
G
|
||||
o
|
||||
w
|
||||
r
|
||||
|
||||
+7276
-7282
File diff suppressed because it is too large
Load Diff
+282
-252
@@ -6,38 +6,6 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/pirate)
|
||||
"af" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/box/flashbangs,
|
||||
/obj/structure/window/reinforced/tinted/spawner/directional/south,
|
||||
/obj/structure/window/reinforced/tinted/spawner/directional/west,
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = -5;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 2;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 9;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 9
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 2
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = -5
|
||||
},
|
||||
/obj/item/gun/grenadelauncher{
|
||||
pixel_y = 7
|
||||
},
|
||||
/obj/machinery/light/small/directional/west,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"az" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line{
|
||||
dir = 4
|
||||
@@ -71,27 +39,6 @@
|
||||
/obj/item/reagent_containers/cup/rag,
|
||||
/turf/open/floor/iron/kitchen,
|
||||
/area/shuttle/pirate)
|
||||
"bA" = (
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/irs,
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/pirate)
|
||||
"bO" = (
|
||||
/obj/machinery/door/window/brigdoor/right/directional/east{
|
||||
req_access = list("syndicate")
|
||||
},
|
||||
/obj/effect/turf_decal/siding/dark{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/turretid{
|
||||
icon_state = "control_kill";
|
||||
lethal = 1;
|
||||
locked = 0;
|
||||
pixel_y = -24;
|
||||
req_access = null
|
||||
},
|
||||
/turf/open/floor/iron/white,
|
||||
/area/shuttle/pirate)
|
||||
"bT" = (
|
||||
/obj/structure/sink/kitchen/directional/east,
|
||||
/obj/machinery/button/door/directional/south{
|
||||
@@ -124,17 +71,6 @@
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"cV" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/storage/toolbox/ammobox/wt550m9{
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/item/storage/toolbox/ammobox/wt550m9ap,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"dl" = (
|
||||
/obj/structure/sign/calendar/directional/north,
|
||||
/turf/open/floor/glass,
|
||||
@@ -176,18 +112,6 @@
|
||||
/obj/machinery/power/port_gen/pacman/pre_loaded,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"ej" = (
|
||||
/obj/effect/turf_decal/stripes,
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral/full,
|
||||
/obj/item/reagent_containers/cup/bucket,
|
||||
/obj/item/mop,
|
||||
/obj/effect/mapping_helpers/apc/cut_AI_wire,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"ev" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
@@ -206,6 +130,14 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/turf/open/floor/catwalk_floor/iron_dark,
|
||||
/area/shuttle/pirate)
|
||||
"fb" = (
|
||||
/obj/machinery/light/small/directional/south,
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"fe" = (
|
||||
/obj/machinery/computer/apc_control,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"fm" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
|
||||
dir = 4
|
||||
@@ -256,26 +188,6 @@
|
||||
"hK" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/pirate)
|
||||
"hO" = (
|
||||
/obj/structure/sign/departments/vault/directional/north,
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/end{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/railing{
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/shower/directional/south{
|
||||
layer = 4
|
||||
},
|
||||
/obj/effect/turf_decal/box,
|
||||
/obj/structure/fluff{
|
||||
desc = "What, you think the water just magically soaks into the metallic flooring?";
|
||||
icon = 'icons/obj/mining_zones/survival_pod.dmi';
|
||||
icon_state = "fan_tiny";
|
||||
name = "shower drain"
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"hS" = (
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/irs/auditor{
|
||||
dir = 4
|
||||
@@ -313,6 +225,24 @@
|
||||
},
|
||||
/turf/open/floor/iron/kitchen,
|
||||
/area/shuttle/pirate)
|
||||
"iG" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/structure/fluff{
|
||||
density = 1;
|
||||
desc = "Ill-gotten gains of the Space IRS";
|
||||
icon = 'icons/obj/stack_objects.dmi';
|
||||
icon_state = "sheet-gold_3";
|
||||
name = "recouped gold"
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod/spawner/directional/south,
|
||||
/obj/machinery/door/window/brigdoor/right/directional/north{
|
||||
req_access = list("syndicate")
|
||||
},
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"iZ" = (
|
||||
/obj/effect/turf_decal/tile/dark/full,
|
||||
/obj/structure/rack,
|
||||
@@ -358,10 +288,6 @@
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/pirate)
|
||||
"kG" = (
|
||||
/obj/machinery/computer/apc_control,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"kK" = (
|
||||
/obj/structure/rack,
|
||||
/obj/structure/window/reinforced/tinted/spawner/directional/east,
|
||||
@@ -450,24 +376,10 @@
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"mG" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"mN" = (
|
||||
/obj/machinery/loot_locator,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"mQ" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/iv_drip,
|
||||
/obj/machinery/light/small/directional/east,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"nk" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
@@ -515,6 +427,12 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/pirate)
|
||||
"nP" = (
|
||||
/obj/effect/turf_decal/tile/dark/full,
|
||||
/obj/effect/decal/cleanable/blood/splatter,
|
||||
/obj/machinery/firealarm/directional/north,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/pirate)
|
||||
"od" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
@@ -526,6 +444,30 @@
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"oo" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"oH" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/storage/toolbox/ammobox/wt550m9{
|
||||
pixel_y = 6
|
||||
},
|
||||
/obj/item/storage/toolbox/ammobox/wt550m9ap,
|
||||
/obj/machinery/firealarm/directional/east,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"oJ" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/flashlight/lamp{
|
||||
@@ -619,6 +561,13 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"rN" = (
|
||||
/obj/machinery/computer/records/medical/syndie,
|
||||
/obj/effect/turf_decal/trimline/blue/filled/line{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"sb" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line,
|
||||
/obj/structure/table/glass,
|
||||
@@ -634,6 +583,17 @@
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"sg" = (
|
||||
/obj/effect/turf_decal/siding/thinplating_new/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/railing/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
|
||||
/obj/machinery/firealarm/directional/north,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"sr" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
@@ -694,16 +654,11 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"tC" = (
|
||||
"tF" = (
|
||||
/obj/effect/turf_decal/trimline/yellow/filled/line,
|
||||
/obj/machinery/light/floor,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"tP" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"uc" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/effect/turf_decal/trimline/yellow/filled/corner{
|
||||
@@ -785,10 +740,6 @@
|
||||
/obj/machinery/door/firedoor,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"vC" = (
|
||||
/obj/machinery/light/small/directional/south,
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"vF" = (
|
||||
/obj/effect/turf_decal/stripes,
|
||||
/obj/effect/turf_decal/stripes{
|
||||
@@ -816,17 +767,6 @@
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"wm" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"ww" = (
|
||||
/obj/item/documents,
|
||||
/obj/structure/filingcabinet,
|
||||
@@ -838,6 +778,11 @@
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"xo" = (
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/irs,
|
||||
/obj/machinery/firealarm/directional/north,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/pirate)
|
||||
"xv" = (
|
||||
/obj/machinery/computer/crew{
|
||||
dir = 4
|
||||
@@ -855,24 +800,6 @@
|
||||
/obj/structure/curtain,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"xE" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/structure/fluff{
|
||||
density = 1;
|
||||
desc = "Ill-gotten gains of the Space IRS";
|
||||
icon = 'icons/obj/stack_objects.dmi';
|
||||
icon_state = "sheet-gold_3";
|
||||
name = "recouped gold"
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod/spawner/directional/south,
|
||||
/obj/machinery/door/window/brigdoor/right/directional/north{
|
||||
req_access = list("syndicate")
|
||||
},
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"xQ" = (
|
||||
/obj/effect/turf_decal/tile/dark/full,
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
|
||||
@@ -880,6 +807,11 @@
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/pirate)
|
||||
"yg" = (
|
||||
/obj/structure/chair/stool/directional/east,
|
||||
/obj/machinery/firealarm/directional/north,
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"yl" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line{
|
||||
dir = 1
|
||||
@@ -944,6 +876,20 @@
|
||||
dir = 1
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"Aw" = (
|
||||
/obj/effect/turf_decal/trimline/yellow/filled/line{
|
||||
dir = 5
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/crowbar/red{
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/multitool{
|
||||
pixel_x = 3
|
||||
},
|
||||
/obj/machinery/firealarm/directional/east,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"AB" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/arrow_cw,
|
||||
/turf/open/floor/plating/airless,
|
||||
@@ -990,6 +936,17 @@
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/turf/open/floor/catwalk_floor/iron_dark,
|
||||
/area/shuttle/pirate)
|
||||
"BY" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/obj/machinery/light/directional/west,
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"Cf" = (
|
||||
/obj/machinery/vending/autodrobe{
|
||||
onstation = 0
|
||||
@@ -1010,6 +967,14 @@
|
||||
},
|
||||
/turf/open/floor/iron/kitchen,
|
||||
/area/shuttle/pirate)
|
||||
"Cr" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/iv_drip,
|
||||
/obj/machinery/light/small/directional/east,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"Cx" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line,
|
||||
/obj/structure/table/optable,
|
||||
@@ -1056,13 +1021,38 @@
|
||||
/obj/structure/curtain,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"Dr" = (
|
||||
/obj/structure/sign/departments/vault/directional/north,
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/end{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/railing{
|
||||
dir = 10
|
||||
},
|
||||
/obj/machinery/shower/directional/south{
|
||||
layer = 4
|
||||
},
|
||||
/obj/effect/turf_decal/box,
|
||||
/obj/structure/fluff{
|
||||
desc = "What, you think the water just magically soaks into the metallic flooring?";
|
||||
icon = 'icons/obj/mining_zones/survival_pod.dmi';
|
||||
icon_state = "fan_tiny";
|
||||
name = "shower drain"
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"Dy" = (
|
||||
/obj/machinery/light/directional/south,
|
||||
/turf/open/floor/iron/white,
|
||||
/area/shuttle/pirate)
|
||||
"DT" = (
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/irs,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
"DK" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"DV" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{
|
||||
@@ -1077,11 +1067,22 @@
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"Eq" = (
|
||||
/obj/machinery/suit_storage_unit/standard_unit,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"Et" = (
|
||||
/obj/machinery/power/shuttle_engine/large,
|
||||
/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/pirate)
|
||||
"EJ" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"Fn" = (
|
||||
/obj/structure/chair/office{
|
||||
dir = 4
|
||||
@@ -1104,22 +1105,10 @@
|
||||
/obj/item/healthanalyzer,
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"FT" = (
|
||||
/obj/effect/turf_decal/tile/dark/full,
|
||||
/obj/effect/decal/cleanable/blood/splatter,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/shuttle/pirate)
|
||||
"FU" = (
|
||||
/obj/machinery/power/shuttle_engine/propulsion/burst,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/pirate)
|
||||
"FY" = (
|
||||
/obj/machinery/computer/records/medical/syndie,
|
||||
/obj/effect/turf_decal/trimline/blue/filled/line{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"Gt" = (
|
||||
/obj/structure/table,
|
||||
/obj/effect/turf_decal/siding/dark_green{
|
||||
@@ -1145,17 +1134,6 @@
|
||||
/obj/item/gun/ballistic/revolver/mateba,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"Hf" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/obj/machinery/light/directional/west,
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"Hg" = (
|
||||
/obj/effect/turf_decal/siding/dark/end{
|
||||
dir = 4
|
||||
@@ -1205,6 +1183,11 @@
|
||||
},
|
||||
/turf/open/floor/catwalk_floor/iron_dark,
|
||||
/area/shuttle/pirate)
|
||||
"Ic" = (
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/irs,
|
||||
/obj/machinery/light/small/directional/north,
|
||||
/turf/open/floor/mineral/plastitanium,
|
||||
/area/shuttle/pirate)
|
||||
"If" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 4
|
||||
@@ -1241,6 +1224,17 @@
|
||||
},
|
||||
/turf/open/floor/iron/dark,
|
||||
/area/shuttle/pirate)
|
||||
"IS" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"IU" = (
|
||||
/obj/structure/table/wood/poker,
|
||||
/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north,
|
||||
@@ -1283,19 +1277,6 @@
|
||||
dir = 1
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"Jv" = (
|
||||
/obj/effect/turf_decal/trimline/yellow/filled/line{
|
||||
dir = 5
|
||||
},
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/crowbar/red{
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/multitool{
|
||||
pixel_x = 3
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"Jx" = (
|
||||
/obj/machinery/porta_turret/syndicate/irs{
|
||||
dir = 8
|
||||
@@ -1356,6 +1337,66 @@
|
||||
/obj/effect/turf_decal/trimline/yellow/filled/line,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"KJ" = (
|
||||
/obj/structure/rack,
|
||||
/obj/item/storage/box/flashbangs,
|
||||
/obj/structure/window/reinforced/tinted/spawner/directional/south,
|
||||
/obj/structure/window/reinforced/tinted/spawner/directional/west,
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = -5;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 2;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 9;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 9
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = 2
|
||||
},
|
||||
/obj/item/grenade/smokebomb{
|
||||
pixel_x = -5
|
||||
},
|
||||
/obj/item/gun/grenadelauncher{
|
||||
pixel_y = 7
|
||||
},
|
||||
/obj/machinery/light/small/directional/west,
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"KO" = (
|
||||
/obj/effect/turf_decal/stripes,
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral/full,
|
||||
/obj/item/reagent_containers/cup/bucket,
|
||||
/obj/item/mop,
|
||||
/obj/effect/mapping_helpers/apc/cut_AI_wire,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/obj/machinery/firealarm/directional/west,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"KZ" = (
|
||||
/obj/machinery/door/window/brigdoor/right/directional/east{
|
||||
req_access = list("syndicate")
|
||||
},
|
||||
/obj/effect/turf_decal/siding/dark{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/turretid{
|
||||
icon_state = "control_kill";
|
||||
lethal = 1;
|
||||
pixel_y = -24;
|
||||
req_access = list("syndicate")
|
||||
},
|
||||
/turf/open/floor/iron/white,
|
||||
/area/shuttle/pirate)
|
||||
"Lf" = (
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
@@ -1374,6 +1415,17 @@
|
||||
/obj/effect/turf_decal/trimline/dark_blue/arrow_cw,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/pirate)
|
||||
"LR" = (
|
||||
/obj/effect/turf_decal/tile/dark_blue/half{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
|
||||
/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden/layer2,
|
||||
/obj/machinery/firealarm/directional/east,
|
||||
/turf/open/floor/iron/edge{
|
||||
dir = 4
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"LV" = (
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate,
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line{
|
||||
@@ -1488,10 +1540,6 @@
|
||||
/obj/effect/turf_decal/siding/dark_green,
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"Of" = (
|
||||
/obj/structure/chair/stool/directional/east,
|
||||
/turf/open/floor/wood,
|
||||
/area/shuttle/pirate)
|
||||
"Og" = (
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
@@ -1625,15 +1673,6 @@
|
||||
},
|
||||
/turf/open/floor/iron/white,
|
||||
/area/shuttle/pirate)
|
||||
"RB" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron/smooth,
|
||||
/area/shuttle/pirate)
|
||||
"RC" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/storage/fancy/donut_box,
|
||||
@@ -1656,20 +1695,6 @@
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"Se" = (
|
||||
/obj/machinery/photocopier/gratis,
|
||||
/turf/open/floor/iron/white,
|
||||
/area/shuttle/pirate)
|
||||
"Ss" = (
|
||||
/obj/effect/turf_decal/siding/thinplating_new/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/railing/corner{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"SA" = (
|
||||
/obj/effect/turf_decal/trimline/dark_blue/filled/line{
|
||||
dir = 10
|
||||
@@ -1701,6 +1726,16 @@
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/shuttle/pirate)
|
||||
"SM" = (
|
||||
/obj/effect/turf_decal/trimline/blue/filled/line,
|
||||
/obj/machinery/light/floor,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"SQ" = (
|
||||
/obj/machinery/photocopier/gratis,
|
||||
/obj/machinery/firealarm/directional/south,
|
||||
/turf/open/floor/iron/white,
|
||||
/area/shuttle/pirate)
|
||||
"Tg" = (
|
||||
/obj/effect/turf_decal/stripes{
|
||||
dir = 5
|
||||
@@ -1902,11 +1937,6 @@
|
||||
dir = 4
|
||||
},
|
||||
/area/shuttle/pirate)
|
||||
"Zb" = (
|
||||
/obj/effect/turf_decal/trimline/blue/filled/line,
|
||||
/obj/machinery/light/floor,
|
||||
/turf/open/floor/iron,
|
||||
/area/shuttle/pirate)
|
||||
"ZE" = (
|
||||
/obj/item/reagent_containers/cup/glass/bottle/ritual_wine{
|
||||
pixel_y = 14;
|
||||
@@ -2008,7 +2038,7 @@ hf
|
||||
hK
|
||||
hK
|
||||
mv
|
||||
ej
|
||||
KO
|
||||
Yf
|
||||
hK
|
||||
hK
|
||||
@@ -2049,7 +2079,7 @@ hK
|
||||
hK
|
||||
ZE
|
||||
hS
|
||||
Se
|
||||
SQ
|
||||
hK
|
||||
Ni
|
||||
lE
|
||||
@@ -2099,7 +2129,7 @@ hK
|
||||
oJ
|
||||
Rv
|
||||
NW
|
||||
bO
|
||||
KZ
|
||||
hK
|
||||
Cf
|
||||
lE
|
||||
@@ -2126,11 +2156,11 @@ kO
|
||||
kO
|
||||
IZ
|
||||
hK
|
||||
Of
|
||||
yg
|
||||
fm
|
||||
RF
|
||||
se
|
||||
vC
|
||||
fb
|
||||
hK
|
||||
Ae
|
||||
BG
|
||||
@@ -2143,7 +2173,7 @@ Og
|
||||
WR
|
||||
hK
|
||||
hK
|
||||
FY
|
||||
rN
|
||||
KA
|
||||
hK
|
||||
IZ
|
||||
@@ -2157,7 +2187,7 @@ Tu
|
||||
rf
|
||||
QQ
|
||||
hK
|
||||
mG
|
||||
Eq
|
||||
HO
|
||||
gd
|
||||
gd
|
||||
@@ -2169,7 +2199,7 @@ WR
|
||||
Rh
|
||||
Qv
|
||||
sE
|
||||
Zb
|
||||
SM
|
||||
hK
|
||||
Ka
|
||||
IZ
|
||||
@@ -2195,7 +2225,7 @@ Rh
|
||||
RC
|
||||
LB
|
||||
zh
|
||||
hK
|
||||
gd
|
||||
WA
|
||||
Xr
|
||||
hK
|
||||
@@ -2207,7 +2237,7 @@ vo
|
||||
WA
|
||||
hK
|
||||
gd
|
||||
Ss
|
||||
sg
|
||||
BG
|
||||
lf
|
||||
ig
|
||||
@@ -2223,13 +2253,13 @@ zy
|
||||
Jn
|
||||
nk
|
||||
RX
|
||||
wm
|
||||
IS
|
||||
nk
|
||||
od
|
||||
Hf
|
||||
BY
|
||||
nk
|
||||
YE
|
||||
fO
|
||||
oo
|
||||
fO
|
||||
Jq
|
||||
tv
|
||||
@@ -2247,7 +2277,7 @@ mA
|
||||
pO
|
||||
YJ
|
||||
sH
|
||||
sH
|
||||
LR
|
||||
sH
|
||||
sH
|
||||
Vf
|
||||
@@ -2270,7 +2300,7 @@ Rh
|
||||
gl
|
||||
nA
|
||||
nE
|
||||
hK
|
||||
gd
|
||||
hK
|
||||
hK
|
||||
Uk
|
||||
@@ -2292,16 +2322,16 @@ WR
|
||||
(15,1,1) = {"
|
||||
WR
|
||||
Rh
|
||||
Jv
|
||||
Aw
|
||||
uc
|
||||
tC
|
||||
tF
|
||||
hK
|
||||
ba
|
||||
af
|
||||
KJ
|
||||
BG
|
||||
GN
|
||||
hK
|
||||
DT
|
||||
xo
|
||||
bo
|
||||
Qi
|
||||
ie
|
||||
@@ -2318,21 +2348,21 @@ WR
|
||||
WR
|
||||
hK
|
||||
hK
|
||||
kG
|
||||
fe
|
||||
KI
|
||||
hK
|
||||
RB
|
||||
DK
|
||||
My
|
||||
BG
|
||||
xE
|
||||
iG
|
||||
hK
|
||||
bA
|
||||
Ic
|
||||
bo
|
||||
Qi
|
||||
yl
|
||||
Cx
|
||||
hK
|
||||
tP
|
||||
EJ
|
||||
sr
|
||||
gd
|
||||
gd
|
||||
@@ -2396,12 +2426,12 @@ WR
|
||||
WR
|
||||
WR
|
||||
hK
|
||||
cV
|
||||
oH
|
||||
OC
|
||||
Mu
|
||||
OC
|
||||
hK
|
||||
hO
|
||||
Dr
|
||||
BG
|
||||
XX
|
||||
wM
|
||||
@@ -2452,12 +2482,12 @@ hK
|
||||
hK
|
||||
hK
|
||||
xy
|
||||
mQ
|
||||
Cr
|
||||
CM
|
||||
az
|
||||
yP
|
||||
hK
|
||||
FT
|
||||
nP
|
||||
Mv
|
||||
nq
|
||||
Yu
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define ALERT_IRRADIATED "irradiated"
|
||||
#define ALERT_EMBEDDED_OBJECT "embeddedobject"
|
||||
#define ALERT_SHOES_KNOT "shoealert"
|
||||
#define ALERT_RADIOACTIVE_AREA "radioactive_area"
|
||||
|
||||
//antag related
|
||||
#define ALERT_HYPNOSIS "hypnosis"
|
||||
|
||||
@@ -112,3 +112,5 @@
|
||||
|
||||
/// From /datum/element/immerse/proc/add_submerge_overlay(): (visual_overlay)
|
||||
#define COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY "movable_edit_unique_submerge_overlay"
|
||||
/// From base of area/Exited(): (area/left, direction)
|
||||
#define COMSIG_MOVABLE_EXITED_AREA "movable_exited_area"
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
//Material Container Signals
|
||||
/// Called from datum/component/material_container/proc/can_hold_material() : (mat)
|
||||
#define COMSIG_MATCONTAINER_MAT_CHECK "matcontainer_mat_check"
|
||||
#define MATCONTAINER_ALLOW_MAT (1<<0)
|
||||
/// Called from datum/component/material_container/proc/user_insert() : (held_item, user)
|
||||
#define COMSIG_MATCONTAINER_PRE_USER_INSERT "matcontainer_pre_user_insert"
|
||||
#define MATCONTAINER_BLOCK_INSERT (1<<1)
|
||||
/// Called from datum/component/material_container/proc/insert_item() : (target, last_inserted_id, material_amount, container)
|
||||
#define COMSIG_MATCONTAINER_ITEM_CONSUMED "matcontainer_item_consumed"
|
||||
/// Called from datum/component/material_container/proc/retrieve_sheets() : (sheets)
|
||||
#define COMSIG_MATCONTAINER_SHEETS_RETRIVED "matcontainer_sheets_retrived"
|
||||
@@ -230,6 +230,11 @@
|
||||
#define JOB_ASSIGN_QUIRKS (1<<7)
|
||||
/// Whether this job can be an intern.
|
||||
#define JOB_CAN_BE_INTERN (1<<8)
|
||||
/// This job cannot have more slots opened by the Head of Personnel (but admins or other random events can still do this).
|
||||
#define JOB_CANNOT_OPEN_SLOTS (1<<9)
|
||||
|
||||
/// Combination flag for jobs which are considered regular crew members of the station.
|
||||
#define STATION_JOB_FLAGS (JOB_ANNOUNCE_ARRIVAL|JOB_CREW_MANIFEST|JOB_EQUIP_RANK|JOB_CREW_MEMBER|JOB_NEW_PLAYER_JOINABLE|JOB_REOPEN_ON_ROUNDSTART_LOSS|JOB_ASSIGN_QUIRKS|JOB_CAN_BE_INTERN)
|
||||
|
||||
#define FACTION_NONE "None"
|
||||
#define FACTION_STATION "Station"
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
/// Used to make a material type able to be instantiated on demand after roundstart.
|
||||
#define MATERIAL_INIT_BESPOKE (1<<1)
|
||||
|
||||
/// Makes sure only integer values are used when consuming, removing & checking for mats
|
||||
#define OPTIMAL_COST(cost)(max(1, round(cost)))
|
||||
|
||||
//Material Container Flags.
|
||||
///If the container shows the amount of contained materials on examine.
|
||||
#define MATCONTAINER_EXAMINE (1<<0)
|
||||
|
||||
@@ -43,7 +43,7 @@ Ask Mothblocks if they're around
|
||||
/// The minimum exposure time before uranium structures can irradiate
|
||||
#define URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME (3 SECONDS)
|
||||
/// The minimum exposure time before the radioactive nebula can irradiate
|
||||
#define NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME (10 SECONDS)
|
||||
#define NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME (6 SECONDS)
|
||||
|
||||
/// Return values of [proc/get_perceived_radiation_danger]
|
||||
// If you change these, update /datum/looping_sound/geiger as well.
|
||||
@@ -54,3 +54,13 @@ Ask Mothblocks if they're around
|
||||
|
||||
/// The time before geiger counters reset back to normal without any radiation pulses
|
||||
#define TIME_WITHOUT_RADIATION_BEFORE_RESET (5 SECONDS)
|
||||
|
||||
// Radiation exposure params
|
||||
|
||||
// For the radioactive nebula outside
|
||||
/// Base chance the nebula has of applying irradiation
|
||||
#define RADIATION_EXPOSURE_NEBULA_BASE_CHANCE 20
|
||||
/// The chance we add to the base chance every time we fail to irradiate
|
||||
#define RADIATION_EXPOSURE_NEBULA_CHANCE_INCREMENT 10
|
||||
/// Time it takes for the next irradiation check
|
||||
#define RADIATION_EXPOSURE_NEBULA_CHECK_INTERVAL 5 SECONDS
|
||||
|
||||
@@ -8,3 +8,44 @@
|
||||
)
|
||||
else
|
||||
return defaults
|
||||
|
||||
/**
|
||||
* Turns material amount into the number of sheets, returning FALSE if the number is less than SHEET_MATERIAL_AMOUNT
|
||||
*
|
||||
* Arguments:
|
||||
* - amt: amount to convert
|
||||
*/
|
||||
/proc/amount2sheet(amt)
|
||||
if(amt >= SHEET_MATERIAL_AMOUNT)
|
||||
return round(amt / SHEET_MATERIAL_AMOUNT)
|
||||
return 0
|
||||
|
||||
/**
|
||||
* Turns number of sheets into material amount, returning FALSE if the number is <= 0
|
||||
*
|
||||
* Arguments:
|
||||
* - amt: amount to convert
|
||||
*/
|
||||
/proc/sheet2amount(sheet_amt)
|
||||
if(sheet_amt > 0)
|
||||
return sheet_amt * SHEET_MATERIAL_AMOUNT
|
||||
return 0
|
||||
|
||||
/**
|
||||
* Splits a stack. we don't use /obj/item/stack/proc/fast_split_stack because Byond complains that should only be called asynchronously.
|
||||
* This proc is also more faster because it doesn't deal with mobs, copying evidences or refreshing atom storages
|
||||
* Has special internal uses for e.g. by the material container
|
||||
*
|
||||
* Arguments:
|
||||
* - [target][obj/item]: the stack to splot
|
||||
* - [amount]: amount to split by
|
||||
*/
|
||||
/datum/component/material_container/proc/fast_split_stack(obj/item/stack/target, amount)
|
||||
if(!target.use(amount, TRUE, FALSE))
|
||||
return null
|
||||
|
||||
. = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit)
|
||||
target.loc.atom_storage?.refresh_views()
|
||||
|
||||
target.is_zero_amount(delete_if_zero = TRUE)
|
||||
|
||||
|
||||
@@ -81,11 +81,21 @@ GLOBAL_LIST_INIT_TYPED(light_types, /datum/light_template, generate_light_types(
|
||||
category = "Bar"
|
||||
path_to_read = /obj/machinery/light/warm
|
||||
|
||||
/datum/light_template/read_light/dimwarm_bar
|
||||
name = "Dim Warm Bar"
|
||||
category = "Bar"
|
||||
path_to_read = /obj/machinery/light/warm/dim
|
||||
|
||||
/datum/light_template/read_light/cold_bar
|
||||
name = "Cold Bar"
|
||||
category = "Bar"
|
||||
path_to_read = /obj/machinery/light/cold
|
||||
|
||||
/datum/light_template/read_light/dimcold_bar
|
||||
name = "Dim Cold Bar"
|
||||
category = "Bar"
|
||||
path_to_read = /obj/machinery/light/cold/dim
|
||||
|
||||
/datum/light_template/read_light/red_bar
|
||||
name = "Red Bar"
|
||||
category = "Bar"
|
||||
|
||||
@@ -156,16 +156,8 @@
|
||||
return ..() || ((obj_flags & CAN_BE_HIT) && attacking_item.attack_atom(src, user, params))
|
||||
|
||||
/mob/living/attackby(obj/item/attacking_item, mob/living/user, params)
|
||||
for(var/datum/surgery/operations as anything in surgeries)
|
||||
if(user.combat_mode)
|
||||
break
|
||||
if(IS_IN_INVALID_SURGICAL_POSITION(src, operations))
|
||||
continue
|
||||
if(!(operations.surgery_flags & SURGERY_SELF_OPERABLE) && (user == src))
|
||||
continue
|
||||
var/list/modifiers = params2list(params)
|
||||
if(operations.next_step(user, modifiers))
|
||||
return TRUE
|
||||
if(can_perform_surgery(user, params))
|
||||
return TRUE
|
||||
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
@@ -104,6 +104,7 @@ SUBSYSTEM_DEF(job)
|
||||
new_overflow.allow_bureaucratic_error = FALSE
|
||||
new_overflow.spawn_positions = cap
|
||||
new_overflow.total_positions = cap
|
||||
new_overflow.job_flags |= JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
if(new_overflow.type == overflow_role)
|
||||
return
|
||||
@@ -111,6 +112,8 @@ SUBSYSTEM_DEF(job)
|
||||
old_overflow.allow_bureaucratic_error = initial(old_overflow.allow_bureaucratic_error)
|
||||
old_overflow.spawn_positions = initial(old_overflow.spawn_positions)
|
||||
old_overflow.total_positions = initial(old_overflow.total_positions)
|
||||
if(!(initial(old_overflow.job_flags) & JOB_CANNOT_OPEN_SLOTS))
|
||||
old_overflow.job_flags &= ~JOB_CANNOT_OPEN_SLOTS
|
||||
overflow_role = new_overflow.type
|
||||
JobDebug("Overflow role set to : [new_overflow.type]")
|
||||
|
||||
|
||||
@@ -285,6 +285,7 @@ SUBSYSTEM_DEF(tgui)
|
||||
* required ui datum/tgui The UI to be added.
|
||||
*/
|
||||
/datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui)
|
||||
ui.user?.tgui_open_uis |= ui
|
||||
LAZYOR(ui.src_object.open_uis, ui)
|
||||
all_uis |= ui
|
||||
|
||||
|
||||
@@ -109,9 +109,9 @@
|
||||
return
|
||||
var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine")
|
||||
if(reason)
|
||||
to_chat(owner, span_userdanger("Seeing [reason] [message]!"))
|
||||
to_chat(owner, span_userdanger("Seeing [span_phobia(reason)] [message]!"))
|
||||
else if(trigger_word)
|
||||
to_chat(owner, span_userdanger("Hearing \"[trigger_word]\" [message]!"))
|
||||
to_chat(owner, span_userdanger("Hearing \"[span_phobia(trigger_word)]\" [message]!"))
|
||||
else
|
||||
to_chat(owner, span_userdanger("Something [message]!"))
|
||||
var/reaction = rand(1,4)
|
||||
|
||||
+297
-281
@@ -10,8 +10,6 @@
|
||||
*/
|
||||
|
||||
/datum/component/material_container
|
||||
/// The total amount of materials this material container contains
|
||||
var/total_amount = 0
|
||||
/// The maximum amount of materials this material container can contain
|
||||
var/max_amount
|
||||
/// Map of material ref -> amount
|
||||
@@ -20,31 +18,22 @@
|
||||
var/list/allowed_materials
|
||||
/// The typecache of things that this material container can accept
|
||||
var/list/allowed_item_typecache
|
||||
/// The last main material that was inserted into this container
|
||||
var/last_inserted_id
|
||||
/// Whether or not this material container allows specific amounts from sheets to be inserted
|
||||
var/precise_insertion = FALSE
|
||||
/// A callback for checking wheter we can insert a material into this container
|
||||
var/datum/callback/insertion_check
|
||||
/// A callback invoked before materials are inserted into this container
|
||||
var/datum/callback/precondition
|
||||
/// A callback invoked after materials are inserted into this container
|
||||
var/datum/callback/after_insert
|
||||
/// A callback invoked after sheets are retrieve from this container
|
||||
var/datum/callback/after_retrieve
|
||||
/// The material container flags. See __DEFINES/materials.dm.
|
||||
var/mat_container_flags
|
||||
/// Signals that are registered with this contained
|
||||
var/list/registered_signals
|
||||
|
||||
/// Sets up the proper signals and fills the list of materials with the appropriate references.
|
||||
/datum/component/material_container/Initialize(list/init_mats,
|
||||
/datum/component/material_container/Initialize(
|
||||
list/init_mats,
|
||||
max_amt = 0,
|
||||
_mat_container_flags=NONE,
|
||||
list/allowed_mats=init_mats,
|
||||
_mat_container_flags = NONE,
|
||||
list/allowed_mats = init_mats,
|
||||
list/allowed_items,
|
||||
datum/callback/_insertion_check,
|
||||
datum/callback/_precondition,
|
||||
datum/callback/_after_insert,
|
||||
datum/callback/_after_retrieve)
|
||||
list/container_signals
|
||||
)
|
||||
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
@@ -60,11 +49,6 @@
|
||||
else
|
||||
allowed_item_typecache = typecacheof(allowed_items)
|
||||
|
||||
insertion_check = _insertion_check
|
||||
precondition = _precondition
|
||||
after_insert = _after_insert
|
||||
after_retrieve = _after_retrieve
|
||||
|
||||
for(var/mat in init_mats) //Make the assoc list material reference -> amount
|
||||
var/mat_ref = GET_MATERIAL_REF(mat)
|
||||
if(isnull(mat_ref))
|
||||
@@ -74,6 +58,11 @@
|
||||
mat_amt = 0
|
||||
materials[mat_ref] += mat_amt
|
||||
|
||||
//all user handled signals
|
||||
if(length(container_signals))
|
||||
for(var/signal in container_signals)
|
||||
parent.RegisterSignal(src, signal, container_signals[signal])
|
||||
|
||||
if(_mat_container_flags & MATCONTAINER_NO_INSERT)
|
||||
return
|
||||
|
||||
@@ -83,19 +72,11 @@
|
||||
RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item))
|
||||
|
||||
/datum/component/material_container/Destroy(force, silent)
|
||||
retrieve_all()
|
||||
materials = null
|
||||
allowed_materials = null
|
||||
if(insertion_check)
|
||||
QDEL_NULL(insertion_check)
|
||||
if(precondition)
|
||||
QDEL_NULL(precondition)
|
||||
if(after_insert)
|
||||
QDEL_NULL(after_insert)
|
||||
if(after_retrieve)
|
||||
QDEL_NULL(after_retrieve)
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/component/material_container/RegisterWithParent()
|
||||
. = ..()
|
||||
|
||||
@@ -104,6 +85,14 @@
|
||||
if(mat_container_flags & MATCONTAINER_EXAMINE)
|
||||
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
||||
|
||||
/datum/component/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/I in materials)
|
||||
var/datum/material/M = I
|
||||
var/amt = materials[I] / SHEET_MATERIAL_AMOUNT
|
||||
if(amt)
|
||||
examine_texts += span_notice("It has [amt] sheets of [lowertext(M.name)] stored.")
|
||||
|
||||
/datum/component/material_container/vv_edit_var(var_name, var_value)
|
||||
var/old_flags = mat_container_flags
|
||||
@@ -119,27 +108,137 @@
|
||||
else if(!(old_flags & MATCONTAINER_NO_INSERT) && mat_container_flags & MATCONTAINER_NO_INSERT)
|
||||
UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY)
|
||||
|
||||
/**
|
||||
* 3 Types of Procs
|
||||
* Material Insertion : Insert materials into the container
|
||||
* Material Validation : Checks how much materials are available, Extracts materials from items if the container can hold them
|
||||
* Material Removal : Removes material from the container
|
||||
*
|
||||
* Each Proc furthur belongs to a specific category
|
||||
* LOW LEVEL: Procs that are used internally & should not be used anywhere else unless you know what your doing
|
||||
* MID LEVEL: Procs that can be used by machines(like recycler, stacking machines) to bypass majority of checks
|
||||
* HIGH LEVEL: Procs that can be used by anyone publically and guarentees safty checks & limits
|
||||
*/
|
||||
|
||||
/datum/component/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts)
|
||||
SIGNAL_HANDLER
|
||||
//================================Material Insertion procs==============================
|
||||
|
||||
for(var/I in materials)
|
||||
var/datum/material/M = I
|
||||
var/amt = materials[I]
|
||||
if(amt)
|
||||
examine_texts += span_notice("It has [amt] units of [lowertext(M.name)] stored.")
|
||||
//======================================LOW LEVEL=========================================
|
||||
/**
|
||||
* Inserts the relevant materials from an item into this material container.
|
||||
* This low level proc should not be used directly by anyone
|
||||
*
|
||||
* Arguments:
|
||||
* - [source][/obj/item]: The source of the materials we are inserting.
|
||||
* - multiplier: The multiplier for the materials extract from this item being inserted.
|
||||
* - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source
|
||||
*/
|
||||
/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags)
|
||||
var/primary_mat
|
||||
var/max_mat_value = 0
|
||||
|
||||
/// Proc that allows players to fill the parent with mats
|
||||
/datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user)
|
||||
SIGNAL_HANDLER
|
||||
var/list/item_materials = source.get_material_composition(breakdown_flags)
|
||||
for(var/MAT in item_materials)
|
||||
if(!can_hold_material(MAT))
|
||||
continue
|
||||
materials[MAT] += OPTIMAL_COST(item_materials[MAT] * multiplier)
|
||||
if(item_materials[MAT] > max_mat_value)
|
||||
max_mat_value = item_materials[MAT]
|
||||
primary_mat = MAT
|
||||
|
||||
user_insert(weapon, user)
|
||||
return primary_mat
|
||||
//===================================================================================
|
||||
|
||||
return COMPONENT_NO_AFTERATTACK
|
||||
|
||||
//===============================MID LEVEL===================================================
|
||||
/**
|
||||
* For inserting an amount of material. Use this to add materials to the container directly
|
||||
*
|
||||
* Arguments:
|
||||
* - amt: amount of said material to insert
|
||||
* - mat: the material type to insert
|
||||
*/
|
||||
/datum/component/material_container/proc/insert_amount_mat(amt, datum/material/mat)
|
||||
if(amt <= 0)
|
||||
return 0
|
||||
amt = OPTIMAL_COST(amt)
|
||||
if(!has_space(amt))
|
||||
return 0
|
||||
|
||||
var/total_amount_saved = total_amount()
|
||||
if(mat)
|
||||
if(!istype(mat))
|
||||
mat = GET_MATERIAL_REF(mat)
|
||||
materials[mat] += amt
|
||||
else
|
||||
var/num_materials = length(materials)
|
||||
if(!num_materials)
|
||||
return 0
|
||||
|
||||
amt /= num_materials
|
||||
for(var/i in materials)
|
||||
materials[i] += amt
|
||||
return (total_amount() - total_amount_saved)
|
||||
|
||||
/**
|
||||
* Proc specifically for inserting items, use this when you want to insert any item into the container
|
||||
* this bypasses most of the material flag checks so much be used by machines like recycler, stacking machine etc that
|
||||
* does not care for such checks
|
||||
*
|
||||
* Arguments:
|
||||
* - [weapon][obj/item]: the item you are trying to insert
|
||||
* - multiplier: The multiplier for the materials being inserted
|
||||
* - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source
|
||||
*/
|
||||
/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags)
|
||||
if(QDELETED(weapon))
|
||||
return MATERIAL_INSERT_ITEM_NO_MATS
|
||||
multiplier = CEILING(multiplier, 0.01)
|
||||
|
||||
var/obj/item/target = weapon
|
||||
|
||||
var/material_amount = get_item_material_amount(target, breakdown_flags) * multiplier
|
||||
if(!material_amount)
|
||||
return MATERIAL_INSERT_ITEM_NO_MATS
|
||||
var/obj/item/stack/item_stack
|
||||
if(isstack(weapon) && !has_space(material_amount)) //not enough space split and feed as many sheets possible
|
||||
item_stack = weapon
|
||||
var/space_left = max_amount - total_amount()
|
||||
if(!space_left)
|
||||
return MATERIAL_INSERT_ITEM_NO_SPACE
|
||||
var/material_per_sheet = material_amount / item_stack.amount
|
||||
var/sheets_to_insert = round(space_left / material_per_sheet)
|
||||
if(!sheets_to_insert)
|
||||
return MATERIAL_INSERT_ITEM_NO_SPACE
|
||||
target = fast_split_stack(item_stack, sheets_to_insert)
|
||||
material_amount = get_item_material_amount(target, breakdown_flags) * multiplier
|
||||
material_amount = OPTIMAL_COST(material_amount)
|
||||
|
||||
//not enough space, time to bail
|
||||
if(!has_space(material_amount))
|
||||
return MATERIAL_INSERT_ITEM_NO_SPACE
|
||||
|
||||
//do the insert
|
||||
var/last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags)
|
||||
if(!isnull(last_inserted_id))
|
||||
SEND_SIGNAL(src, COMSIG_MATCONTAINER_ITEM_CONSUMED, target, last_inserted_id, material_amount, src)
|
||||
qdel(target) //item gone
|
||||
return material_amount
|
||||
else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original
|
||||
var/obj/item/stack/inserting_stack = target
|
||||
item_stack.add(inserting_stack.amount)
|
||||
qdel(inserting_stack)
|
||||
|
||||
return MATERIAL_INSERT_ITEM_FAILURE
|
||||
//============================================================================================
|
||||
|
||||
|
||||
//===================================HIGH LEVEL===================================================
|
||||
/**
|
||||
* inserts an item from the players hand into the container. Loops through all the contents inside reccursively
|
||||
* Arguments
|
||||
* Does all explicit checking for mat flags & callbacks to check if insertion is valid
|
||||
* This proc is what you should be using for almost all cases
|
||||
*
|
||||
* Arguments:
|
||||
* * held_item - the item to insert
|
||||
* * user - the mob inserting this item
|
||||
* * breakdown_flags - how this item and all it's contents inside are broken down during insertion. This is unique to the machine doing the insertion
|
||||
@@ -160,7 +259,7 @@
|
||||
if(held_item.resistance_flags & INDESTRUCTIBLE)
|
||||
return
|
||||
//user defined conditions
|
||||
if(precondition && !precondition.Invoke(user))
|
||||
if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, held_item, user) & MATCONTAINER_BLOCK_INSERT)
|
||||
return
|
||||
|
||||
//get all contents of this item reccursively
|
||||
@@ -216,7 +315,7 @@
|
||||
if(parent != current_parent || user.get_active_held_item() != active_held)
|
||||
continue
|
||||
if(requested_amount != item_stack.amount) //only split if its not the whole amount
|
||||
target = split_stack(item_stack, requested_amount) //split off the requested amount
|
||||
target = fast_split_stack(item_stack, requested_amount) //split off the requested amount
|
||||
requested_amount = 0
|
||||
|
||||
//is this item a stack and was it split by the player?
|
||||
@@ -235,6 +334,7 @@
|
||||
var/inserted = insert_item(target, breakdown_flags = mat_container_flags)
|
||||
if(inserted > 0)
|
||||
. += inserted
|
||||
inserted /= SHEET_MATERIAL_AMOUNT // display units inserted as sheets for improved readability
|
||||
var/message = null
|
||||
|
||||
//stack was either split by the container(!QDELETED(target) means the container only consumed a part of it) or by the player, put whats left back of the original stack back in players hand
|
||||
@@ -249,21 +349,23 @@
|
||||
//was this the original item in the players hand? put what's left back in the player's hand
|
||||
if(!isnull(original_item))
|
||||
user.put_in_active_hand(original_item)
|
||||
message = "Only [inserted] amount of [item_name] was consumed by [parent]."
|
||||
message = "Only [inserted] sheets of [item_name] was consumed by [parent]."
|
||||
|
||||
//collect all messages to print later
|
||||
if(!message)
|
||||
message = "[item_name] worth [inserted] material was consumed by [parent]."
|
||||
message = "[item_name] worth [inserted] sheets of material was consumed by [parent]."
|
||||
if(inserts[message])
|
||||
inserts[message] += 1
|
||||
else
|
||||
inserts[message] = 1
|
||||
else
|
||||
var/error_msg
|
||||
if(inserted == -2)
|
||||
if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE)
|
||||
error_msg = "[parent] has insufficient space to accept [target]"
|
||||
else
|
||||
else if(inserted == MATERIAL_INSERT_ITEM_NO_MATS)
|
||||
error_msg = "[target] has insufficient materials to be accepted by [parent]"
|
||||
else
|
||||
error_msg = "[parent] refuses to accept [target]"
|
||||
|
||||
//collect all messages to print later
|
||||
if(errors[error_msg])
|
||||
@@ -293,79 +395,27 @@
|
||||
for(var/i in 1 to count)
|
||||
to_chat(user, span_warning(error_msg))
|
||||
|
||||
/// Proc that allows players to fill the parent with mats
|
||||
/datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
user_insert(weapon, user)
|
||||
|
||||
return COMPONENT_NO_AFTERATTACK
|
||||
//===============================================================================================
|
||||
|
||||
|
||||
//======================================Material Validation=======================================
|
||||
|
||||
//=========================================LOW LEVEL===================================
|
||||
/**
|
||||
* Splits a stack. we don't use /obj/item/stack/proc/split_stack because Byond complains that should only be called asynchronously.
|
||||
* This proc is also more faster because it doesn't deal with mobs, copying evidences or refreshing atom storages
|
||||
*/
|
||||
/datum/component/material_container/proc/split_stack(obj/item/stack/target, amount)
|
||||
if(!target.use(amount, TRUE, FALSE))
|
||||
return null
|
||||
|
||||
. = new target.type(target.drop_location(), amount, FALSE, target.mats_per_unit)
|
||||
target.loc.atom_storage?.refresh_views()
|
||||
|
||||
target.is_zero_amount(delete_if_zero = TRUE)
|
||||
|
||||
/// Proc specifically for inserting items, returns the amount of materials entered.
|
||||
/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags)
|
||||
if(QDELETED(weapon))
|
||||
return MATERIAL_INSERT_ITEM_NO_MATS
|
||||
multiplier = CEILING(multiplier, 0.01)
|
||||
|
||||
var/obj/item/target = weapon
|
||||
|
||||
var/material_amount = get_item_material_amount(target, breakdown_flags) * multiplier
|
||||
if(!material_amount)
|
||||
return MATERIAL_INSERT_ITEM_NO_MATS
|
||||
var/obj/item/stack/item_stack
|
||||
if(isstack(weapon) && !has_space(material_amount)) //not enugh space split and feed as many sheets possible
|
||||
item_stack = weapon
|
||||
var/space_left = max_amount - total_amount
|
||||
if(!space_left)
|
||||
return MATERIAL_INSERT_ITEM_NO_SPACE
|
||||
var/material_per_sheet = material_amount / item_stack.amount
|
||||
var/sheets_to_insert = round(space_left / material_per_sheet)
|
||||
if(!sheets_to_insert)
|
||||
return MATERIAL_INSERT_ITEM_NO_SPACE
|
||||
target = split_stack(item_stack, sheets_to_insert)
|
||||
material_amount = get_item_material_amount(target, breakdown_flags) * multiplier
|
||||
if(!has_space(material_amount))
|
||||
return MATERIAL_INSERT_ITEM_NO_SPACE
|
||||
|
||||
last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags)
|
||||
if(!isnull(last_inserted_id))
|
||||
if(after_insert)
|
||||
after_insert.Invoke(target, last_inserted_id, material_amount, src)
|
||||
qdel(target) //item gone
|
||||
return material_amount
|
||||
else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original
|
||||
var/obj/item/stack/inserting_stack = target
|
||||
item_stack.add(inserting_stack.amount)
|
||||
qdel(inserting_stack)
|
||||
return MATERIAL_INSERT_ITEM_FAILURE
|
||||
|
||||
/**
|
||||
* Inserts the relevant materials from an item into this material container.
|
||||
* Proc that returns TRUE if the container has space
|
||||
*
|
||||
* Arguments:
|
||||
* - [source][/obj/item]: The source of the materials we are inserting.
|
||||
* - multiplier: The multiplier for the materials being inserted.
|
||||
* - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source
|
||||
* - amt: can this container hold this much amount of materials
|
||||
*/
|
||||
/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags)
|
||||
var/primary_mat
|
||||
var/max_mat_value = 0
|
||||
var/list/item_materials = source.get_material_composition(breakdown_flags)
|
||||
for(var/MAT in item_materials)
|
||||
if(!can_hold_material(MAT))
|
||||
continue
|
||||
materials[MAT] += item_materials[MAT] * multiplier
|
||||
total_amount += item_materials[MAT] * multiplier
|
||||
if(item_materials[MAT] > max_mat_value)
|
||||
max_mat_value = item_materials[MAT]
|
||||
primary_mat = MAT
|
||||
|
||||
return primary_mat
|
||||
/datum/component/material_container/proc/has_space(amt = 0)
|
||||
return (total_amount() + amt) <= max_amount
|
||||
|
||||
/**
|
||||
* The default check for whether we can add materials to this material container.
|
||||
@@ -379,102 +429,146 @@
|
||||
if(istype(mat) && ((mat.id in allowed_materials) || (mat.type in allowed_materials)))
|
||||
allowed_materials += mat // This could get messy with passing lists by ref... but if you're doing that the list expansion is probably being taken care of elsewhere anyway...
|
||||
return TRUE
|
||||
if(insertion_check?.Invoke(mat))
|
||||
if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_MAT_CHECK, mat) & MATCONTAINER_ALLOW_MAT)
|
||||
allowed_materials += mat
|
||||
return TRUE
|
||||
return FALSE
|
||||
//========================================================================================
|
||||
|
||||
/// For inserting an amount of material
|
||||
/datum/component/material_container/proc/insert_amount_mat(amt, datum/material/mat)
|
||||
if(amt <= 0 || !has_space(amt))
|
||||
return 0
|
||||
|
||||
var/total_amount_saved = total_amount
|
||||
if(mat)
|
||||
if(!istype(mat))
|
||||
mat = GET_MATERIAL_REF(mat)
|
||||
materials[mat] += amt
|
||||
else
|
||||
var/num_materials = length(materials)
|
||||
if(!num_materials)
|
||||
return 0
|
||||
|
||||
amt /= num_materials
|
||||
for(var/i in materials)
|
||||
materials[i] += amt
|
||||
total_amount += amt
|
||||
return (total_amount - total_amount_saved)
|
||||
|
||||
/// Uses an amount of a specific material, effectively removing it.
|
||||
/datum/component/material_container/proc/use_amount_mat(amt, datum/material/mat)
|
||||
//===================================MID LEVEL=============================================
|
||||
/**
|
||||
* Returns the amount of a specific material in this container.
|
||||
*
|
||||
* Arguments:
|
||||
* -[mat][datum/material] : the material type to check for 3 cases
|
||||
* a) If it's an path its ref is retrived
|
||||
* b) If it's text then its an category material & there is no way to deal with it so return 0
|
||||
* c) If normal material proceeds as usual
|
||||
*/
|
||||
/datum/component/material_container/proc/get_material_amount(datum/material/mat)
|
||||
if(!istype(mat))
|
||||
mat = GET_MATERIAL_REF(mat)
|
||||
return materials[mat]
|
||||
|
||||
if(!mat)
|
||||
return 0
|
||||
var/amount = materials[mat]
|
||||
if(amount < amt)
|
||||
/**
|
||||
* Returns the amount of material relevant to this container;
|
||||
* if this container does not support glass, any glass in 'I' will not be taken into account
|
||||
*
|
||||
* Arguments:
|
||||
* - [I][obj/item]: the item whos materials must be retrived
|
||||
* - breakdown_flags: how this item must be broken down to retrive its materials
|
||||
*/
|
||||
/datum/component/material_container/proc/get_item_material_amount(obj/item/I, breakdown_flags = mat_container_flags)
|
||||
if(!istype(I) || !I.custom_materials)
|
||||
return 0
|
||||
var/material_amount = 0
|
||||
var/list/item_materials = I.get_material_composition(breakdown_flags)
|
||||
for(var/MAT in item_materials)
|
||||
if(!can_hold_material(MAT))
|
||||
continue
|
||||
material_amount += item_materials[MAT]
|
||||
return material_amount
|
||||
//================================================================================================
|
||||
|
||||
materials[mat] -= amt
|
||||
total_amount -= amt
|
||||
return amt
|
||||
|
||||
/// Proc for transfering materials to another container.
|
||||
/datum/component/material_container/proc/transer_amt_to(datum/component/material_container/T, amt, datum/material/mat)
|
||||
if(!istype(mat))
|
||||
mat = GET_MATERIAL_REF(mat)
|
||||
if((amt == 0) || (!T) || (!mat))
|
||||
//=========================================HIGH LEVEL==========================================
|
||||
/// returns the total amount of material in the container
|
||||
/datum/component/material_container/proc/total_amount()
|
||||
. = 0
|
||||
for(var/i in materials)
|
||||
. += get_material_amount(i)
|
||||
|
||||
/**
|
||||
* Returns TRUE if you have enough of the specified material.
|
||||
*
|
||||
* Arguments:
|
||||
* - [req_mat][datum/material]: the material to check for
|
||||
* - amount: how much material do we need
|
||||
*/
|
||||
/datum/component/material_container/proc/has_enough_of_material(datum/material/req_mat, amount = 1)
|
||||
return get_material_amount(req_mat) >= OPTIMAL_COST(amount)
|
||||
|
||||
|
||||
/**
|
||||
* Checks if its possible to afford a certain amount of materials. Takes a dictionary of materials.
|
||||
* coefficient can be thought of as the machines efficiency & multiplier as the print quantity
|
||||
*
|
||||
* Arguments:
|
||||
* - mats: list of materials(key=material, value= 1 unit of material) to check for
|
||||
* - coefficient: scaling applied to 1 unit of material in the mats list
|
||||
* - multiplier: how many units(after scaling) do we require
|
||||
*/
|
||||
/datum/component/material_container/proc/has_materials(list/mats, coefficient = 1, multiplier = 1)
|
||||
if(!length(mats))
|
||||
return FALSE
|
||||
if(amt<0)
|
||||
return T.transer_amt_to(src, -amt, mat)
|
||||
var/tr = min(amt, materials[mat], T.can_insert_amount_mat(amt, mat))
|
||||
if(tr)
|
||||
use_amount_mat(tr, mat)
|
||||
T.insert_amount_mat(tr, mat)
|
||||
return tr
|
||||
return FALSE
|
||||
|
||||
/// Proc for checking if there is room in the component, returning the amount or else the amount lacking.
|
||||
/datum/component/material_container/proc/can_insert_amount_mat(amt, datum/material/mat)
|
||||
if(!amt || !mat)
|
||||
for(var/x in mats) //Loop through all required materials
|
||||
if(!has_enough_of_material(x, OPTIMAL_COST(mats[x] * coefficient) * multiplier))//Not a category, so just check the normal way
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
//==========================================================================================================
|
||||
|
||||
|
||||
//================================================Material Usage============================================
|
||||
|
||||
//==================================================LOW LEVEL=======================================
|
||||
/**
|
||||
* Uses an amount of a specific material, effectively removing it.
|
||||
*
|
||||
* Arguments:
|
||||
* - amt: amount of said material to use
|
||||
* - [mat][datum/material]: type of mat to use
|
||||
*/
|
||||
/datum/component/material_container/proc/use_amount_mat(amt, datum/material/mat)
|
||||
//round amount
|
||||
amt = OPTIMAL_COST(amt)
|
||||
|
||||
//get ref if nessassary
|
||||
if(!istype(mat))
|
||||
mat = GET_MATERIAL_REF(mat)
|
||||
|
||||
//check if sufficient is available
|
||||
if(materials[mat] < amt)
|
||||
return 0
|
||||
|
||||
if((total_amount + amt) <= max_amount)
|
||||
return amt
|
||||
else
|
||||
return (max_amount - total_amount)
|
||||
//consume & return amount consumed
|
||||
materials[mat] -= amt
|
||||
return amt
|
||||
//==============================================================================================
|
||||
|
||||
|
||||
/// For consuming a dictionary of materials. mats is the map of materials to use and the corresponding amounts, example: list(M/datum/material/glass =100, datum/material/iron=SMALL_MATERIAL_AMOUNT * 2)
|
||||
/datum/component/material_container/proc/use_materials(list/mats, multiplier=1)
|
||||
//=========================================MID LEVEL==========================================
|
||||
/**
|
||||
* For consuming a dictionary of materials.
|
||||
*
|
||||
* Arguments:
|
||||
* - mats: map of materials to consume(key = material type, value = amount)
|
||||
* - coefficient: how much fraction of unit material in the mats list must be consumed. This is usually your machines efficiency
|
||||
* - multiplier: how many units of material in the mats list(after each unit is multiplied and rounded with coefficient) must be consumed, This is usually your print quantity
|
||||
*/
|
||||
/datum/component/material_container/proc/use_materials(list/mats, coefficient = 1, multiplier = 1)
|
||||
if(!mats || !length(mats))
|
||||
return FALSE
|
||||
|
||||
var/list/mats_to_remove = list() //Assoc list MAT | AMOUNT
|
||||
var/amount_removed = 0
|
||||
for(var/i in mats)
|
||||
amount_removed += use_amount_mat(OPTIMAL_COST(mats[i] * coefficient) * multiplier, i)
|
||||
|
||||
for(var/x in mats) //Loop through all required materials
|
||||
var/datum/material/req_mat = x
|
||||
if(!istype(req_mat))
|
||||
req_mat = GET_MATERIAL_REF(req_mat) //Get the ref if necesary
|
||||
if(!materials[req_mat]) //Do we have the resource?
|
||||
return FALSE //Can't afford it
|
||||
var/amount_required = mats[x] * multiplier
|
||||
if(amount_required < 0)
|
||||
return FALSE //No negative mats
|
||||
if(!(materials[req_mat] >= amount_required)) // do we have enough of the resource?
|
||||
return FALSE //Can't afford it
|
||||
mats_to_remove[req_mat] += amount_required //Add it to the assoc list of things to remove
|
||||
continue
|
||||
return amount_removed
|
||||
//============================================================================================
|
||||
|
||||
var/total_amount_save = total_amount
|
||||
|
||||
for(var/i in mats_to_remove)
|
||||
total_amount_save -= use_amount_mat(mats_to_remove[i], i)
|
||||
//===========================================HIGH LEVEL=======================================
|
||||
|
||||
return total_amount_save - total_amount
|
||||
|
||||
/// For spawning mineral sheets at a specific location. Used by machines to output sheets.
|
||||
/**
|
||||
* For spawning mineral sheets at a specific location. Used by machines to output sheets.
|
||||
*
|
||||
* Arguments:
|
||||
* sheet_amt: number of sheets to extract
|
||||
* [material][datum/material]: type of sheets present in this container to extract
|
||||
* [target][atom]: drop location
|
||||
*/
|
||||
/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/material, atom/target = null)
|
||||
if(!material.sheet_type)
|
||||
return 0 //Add greyscale sheet handling here later
|
||||
@@ -489,108 +583,32 @@
|
||||
var/count = 0
|
||||
while(sheet_amt > MAX_STACK_SIZE)
|
||||
var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, MAX_STACK_SIZE, null, list((material) = SHEET_MATERIAL_AMOUNT))
|
||||
after_retrieve?.Invoke(new_sheets)
|
||||
count += MAX_STACK_SIZE
|
||||
use_amount_mat(sheet_amt * SHEET_MATERIAL_AMOUNT, material)
|
||||
sheet_amt -= MAX_STACK_SIZE
|
||||
SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIVED, new_sheets)
|
||||
if(sheet_amt >= 1)
|
||||
var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, sheet_amt, null, list((material) = SHEET_MATERIAL_AMOUNT))
|
||||
after_retrieve?.Invoke(new_sheets)
|
||||
count += sheet_amt
|
||||
use_amount_mat(sheet_amt * SHEET_MATERIAL_AMOUNT, material)
|
||||
SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIVED, new_sheets)
|
||||
return count
|
||||
|
||||
|
||||
/// Proc to get all the materials and dump them as sheets
|
||||
/**
|
||||
* Proc to get all the materials and dump them as sheets
|
||||
*
|
||||
* Arguments:
|
||||
* - target: drop location of the sheets
|
||||
*/
|
||||
/datum/component/material_container/proc/retrieve_all(target = null)
|
||||
var/result = 0
|
||||
for(var/MAT in materials)
|
||||
var/amount = materials[MAT]
|
||||
result += retrieve_sheets(amount2sheet(amount), MAT, target)
|
||||
return result
|
||||
//============================================================================================
|
||||
|
||||
/// Proc that returns TRUE if the container has space
|
||||
/datum/component/material_container/proc/has_space(amt = 0)
|
||||
return (total_amount + amt) <= max_amount
|
||||
|
||||
/// Checks if its possible to afford a certain amount of materials. Takes a dictionary of materials.
|
||||
/datum/component/material_container/proc/has_materials(list/mats, multiplier=1)
|
||||
if(!mats || !mats.len)
|
||||
return FALSE
|
||||
|
||||
for(var/x in mats) //Loop through all required materials
|
||||
var/datum/material/req_mat = x
|
||||
if(!istype(req_mat))
|
||||
if(ispath(req_mat)) //Is this an actual material, or is it a category?
|
||||
req_mat = GET_MATERIAL_REF(req_mat) //Get the ref
|
||||
|
||||
else // Its a category. (For example MAT_CATEGORY_RIGID)
|
||||
if(!has_enough_of_category(req_mat, mats[x], multiplier)) //Do we have enough of this category?
|
||||
return FALSE
|
||||
else
|
||||
continue
|
||||
|
||||
if(!has_enough_of_material(req_mat, mats[x], multiplier))//Not a category, so just check the normal way
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/// Returns all the categories in a recipe.
|
||||
/datum/component/material_container/proc/get_categories(list/mats)
|
||||
var/list/categories = list()
|
||||
for(var/x in mats) //Loop through all required materials
|
||||
if(!istext(x)) //This means its not a category
|
||||
continue
|
||||
categories += x
|
||||
return categories
|
||||
|
||||
/// Returns TRUE if you have enough of the specified material.
|
||||
/datum/component/material_container/proc/has_enough_of_material(datum/material/req_mat, amount, multiplier=1)
|
||||
if(!materials[req_mat]) //Do we have the resource?
|
||||
return FALSE //Can't afford it
|
||||
var/amount_required = amount * multiplier
|
||||
if(materials[req_mat] >= amount_required) // do we have enough of the resource?
|
||||
return TRUE
|
||||
return FALSE //Can't afford it
|
||||
|
||||
/// Returns TRUE if you have enough of a specified material category (Which could be multiple materials)
|
||||
/datum/component/material_container/proc/has_enough_of_category(category, amount, multiplier=1)
|
||||
for(var/i in SSmaterials.materials_by_category[category])
|
||||
var/datum/material/mat = i
|
||||
if(materials[mat] >= amount) //we have enough
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/// Turns a material amount into the amount of sheets it should output
|
||||
/datum/component/material_container/proc/amount2sheet(amt)
|
||||
if(amt >= SHEET_MATERIAL_AMOUNT)
|
||||
return round(amt / SHEET_MATERIAL_AMOUNT)
|
||||
return FALSE
|
||||
|
||||
/// Turns an amount of sheets into the amount of material amount it should output
|
||||
/datum/component/material_container/proc/sheet2amount(sheet_amt)
|
||||
if(sheet_amt > 0)
|
||||
return sheet_amt * SHEET_MATERIAL_AMOUNT
|
||||
return FALSE
|
||||
|
||||
|
||||
///returns the amount of material relevant to this container; if this container does not support glass, any glass in 'I' will not be taken into account
|
||||
/datum/component/material_container/proc/get_item_material_amount(obj/item/I, breakdown_flags = mat_container_flags)
|
||||
if(!istype(I) || !I.custom_materials)
|
||||
return 0
|
||||
var/material_amount = 0
|
||||
var/list/item_materials = I.get_material_composition(breakdown_flags)
|
||||
for(var/MAT in item_materials)
|
||||
if(!can_hold_material(MAT))
|
||||
continue
|
||||
material_amount += item_materials[MAT]
|
||||
return material_amount
|
||||
|
||||
/// Returns the amount of a specific material in this container.
|
||||
/datum/component/material_container/proc/get_material_amount(datum/material/mat)
|
||||
if(!istype(mat))
|
||||
mat = GET_MATERIAL_REF(mat)
|
||||
return materials[mat]
|
||||
|
||||
/datum/component/material_container/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
@@ -608,8 +626,6 @@
|
||||
"name" = material.name,
|
||||
"ref" = REF(material),
|
||||
"amount" = amount,
|
||||
"sheets" = round(amount / SHEET_MATERIAL_AMOUNT),
|
||||
"removable" = amount >= SHEET_MATERIAL_AMOUNT,
|
||||
"color" = material.greyscale_colors
|
||||
))
|
||||
|
||||
+31
-31
@@ -10,19 +10,24 @@ handles linking back and forth.
|
||||
// 1. silo exists, materials is parented to silo
|
||||
// 2. silo is null, materials is parented to parent
|
||||
// 3. silo is null, materials is null
|
||||
|
||||
/// The silo machine this container is connected to
|
||||
var/obj/machinery/ore_silo/silo
|
||||
//material container. the value is either the silo or local
|
||||
var/datum/component/material_container/mat_container
|
||||
var/category
|
||||
//should we create a local storage if we can't connect to silo
|
||||
var/allow_standalone
|
||||
//are we trying to connect to the silo
|
||||
var/connecting
|
||||
//local size of container when silo = null
|
||||
var/local_size = INFINITY
|
||||
///Flags used when converting inserted materials into their component materials.
|
||||
var/mat_container_flags = NONE
|
||||
|
||||
/datum/component/remote_materials/Initialize(category, mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags=NONE)
|
||||
/datum/component/remote_materials/Initialize(mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE)
|
||||
if (!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.category = category
|
||||
src.allow_standalone = allow_standalone
|
||||
src.mat_container_flags = mat_container_flags
|
||||
|
||||
@@ -30,30 +35,26 @@ handles linking back and forth.
|
||||
RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool))
|
||||
|
||||
var/turf/T = get_turf(parent)
|
||||
if (force_connect || (mapload && is_station_level(T.z)))
|
||||
addtimer(CALLBACK(src, PROC_REF(LateInitialize)))
|
||||
else if (allow_standalone)
|
||||
_MakeLocal()
|
||||
if(force_connect || (mapload && is_station_level(T.z)))
|
||||
connecting = TRUE
|
||||
|
||||
/datum/component/remote_materials/proc/LateInitialize()
|
||||
silo = GLOB.ore_silo_default
|
||||
if (silo)
|
||||
silo.ore_connected_machines += src
|
||||
mat_container = silo.GetComponent(/datum/component/material_container)
|
||||
else
|
||||
/datum/component/remote_materials/RegisterWithParent()
|
||||
if (connecting)
|
||||
silo = GLOB.ore_silo_default
|
||||
if (silo)
|
||||
silo.ore_connected_machines += src
|
||||
mat_container = silo.GetComponent(/datum/component/material_container)
|
||||
connecting = FALSE
|
||||
if (!mat_container && allow_standalone)
|
||||
_MakeLocal()
|
||||
|
||||
/datum/component/remote_materials/Destroy()
|
||||
if (silo)
|
||||
silo.ore_connected_machines -= src
|
||||
silo.holds -= src
|
||||
silo.updateUsrDialog()
|
||||
silo = null
|
||||
mat_container = null
|
||||
else if (mat_container)
|
||||
// specify explicitly in case the other component is deleted first
|
||||
var/atom/P = parent
|
||||
mat_container.retrieve_all(P.drop_location())
|
||||
QDEL_NULL(mat_container)
|
||||
mat_container = null
|
||||
return ..()
|
||||
|
||||
/datum/component/remote_materials/proc/_MakeLocal()
|
||||
@@ -71,9 +72,15 @@ handles linking back and forth.
|
||||
/datum/material/titanium,
|
||||
/datum/material/bluespace,
|
||||
/datum/material/plastic,
|
||||
)
|
||||
)
|
||||
|
||||
mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, mat_container_flags, allowed_items=/obj/item/stack)
|
||||
mat_container = parent.AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
allowed_mats, \
|
||||
local_size, \
|
||||
mat_container_flags, \
|
||||
allowed_items = /obj/item/stack \
|
||||
)
|
||||
|
||||
/datum/component/remote_materials/proc/toggle_holding(force_hold = FALSE)
|
||||
if(isnull(silo))
|
||||
@@ -123,9 +130,9 @@ handles linking back and forth.
|
||||
return COMPONENT_BLOCK_TOOL_ATTACK
|
||||
if (silo)
|
||||
silo.ore_connected_machines -= src
|
||||
silo.holds -= src
|
||||
silo.updateUsrDialog()
|
||||
else if (mat_container)
|
||||
mat_container.retrieve_all()
|
||||
qdel(mat_container)
|
||||
silo = M.buffer
|
||||
silo.ore_connected_machines += src
|
||||
@@ -150,7 +157,7 @@ handles linking back and forth.
|
||||
/datum/component/remote_materials/proc/on_hold()
|
||||
if(!check_z_level())
|
||||
return FALSE
|
||||
return silo.holds["[get_area(parent)]/[category]"]
|
||||
return silo.holds[src]
|
||||
|
||||
/datum/component/remote_materials/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats)
|
||||
if (silo)
|
||||
@@ -158,7 +165,7 @@ handles linking back and forth.
|
||||
|
||||
/datum/component/remote_materials/proc/format_amount()
|
||||
if (mat_container)
|
||||
return "[mat_container.total_amount] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])"
|
||||
return "[mat_container.total_amount()] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])"
|
||||
else
|
||||
return "0 / 0"
|
||||
|
||||
@@ -179,10 +186,3 @@ handles linking back and forth.
|
||||
matlist[material_ref] = eject_amount
|
||||
silo_log(parent, "ejected", -count, "sheets", matlist)
|
||||
return count
|
||||
|
||||
/// Returns `TRUE` if and only if the given material ref can be inserted/removed from this component
|
||||
/datum/component/remote_materials/proc/can_hold_material(datum/material/material_ref)
|
||||
if(!mat_container)
|
||||
return FALSE
|
||||
|
||||
return mat_container.can_hold_material(material_ref)
|
||||
@@ -0,0 +1,78 @@
|
||||
/// For directly applying to carbons to irradiate them, without pulses
|
||||
/datum/component/radioactive_exposure
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
|
||||
/// Base irradiation chance
|
||||
var/irradiation_chance_base
|
||||
/// Chance we have of applying irradiation
|
||||
var/irradiation_chance
|
||||
/// The amount the base chance is increased after every failed irradiation check
|
||||
var/irradiation_chance_increment
|
||||
/// Time till we attempt the next irradiation check
|
||||
var/irradiation_interval
|
||||
/// The source of irradiation, for logging
|
||||
var/source
|
||||
/// Area's where the component isnt removed if we cross to them
|
||||
var/list/radioactive_areas
|
||||
|
||||
/datum/component/radioactive_exposure/Initialize(
|
||||
minimum_exposure_time,
|
||||
irradiation_chance_base,
|
||||
irradiation_chance_increment,
|
||||
irradiation_interval,
|
||||
source,
|
||||
radioactive_areas
|
||||
)
|
||||
|
||||
if(!iscarbon(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
src.irradiation_chance_base = irradiation_chance_base
|
||||
src.irradiation_chance = irradiation_chance_base
|
||||
src.irradiation_chance_increment = irradiation_chance_increment
|
||||
src.irradiation_interval = irradiation_interval
|
||||
src.source = source
|
||||
src.radioactive_areas = radioactive_areas
|
||||
|
||||
// We use generally long times, so it's probably easier and more interpretable to just use a timer instead of processing the component
|
||||
addtimer(CALLBACK(src, PROC_REF(attempt_irradiate)), minimum_exposure_time)
|
||||
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_EXITED_AREA, PROC_REF(on_exited))
|
||||
|
||||
var/mob/living/living_parent = parent
|
||||
living_parent.throw_alert(ALERT_RADIOACTIVE_AREA, /atom/movable/screen/alert/radioactive_area)
|
||||
|
||||
/// Try and irradiate them. If we chance fail, we come back harder
|
||||
/datum/component/radioactive_exposure/proc/attempt_irradiate()
|
||||
if(!SSradiation.wearing_rad_protected_clothing(parent) && SSradiation.can_irradiate_basic(parent))
|
||||
if(prob(irradiation_chance))
|
||||
SSradiation.irradiate(parent)
|
||||
var/atom/atom = parent
|
||||
atom.investigate_log("was irradiated by [source].", INVESTIGATE_RADIATION)
|
||||
else
|
||||
irradiation_chance += irradiation_chance_increment
|
||||
else // we're immune, either through species, clothing, already being irradiated, etcetera
|
||||
// we slowly decrease the prob chance untill we hit the base probability again
|
||||
irradiation_chance = max(irradiation_chance - irradiation_chance_increment, irradiation_chance_base)
|
||||
|
||||
// Even if they are immune, or got irradiated plan a new check in-case they lose their protection or irradiation
|
||||
addtimer(CALLBACK(src, PROC_REF(attempt_irradiate)), irradiation_interval)
|
||||
|
||||
/datum/component/radioactive_exposure/proc/on_exited(atom/movable/also_parent, area/old_area, direction)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(istype(get_area(parent), radioactive_areas)) //we left to another area that is also radioactive, so dont do anything
|
||||
return
|
||||
|
||||
qdel(src)
|
||||
|
||||
/datum/component/radioactive_exposure/Destroy(force, silent)
|
||||
var/mob/living/carbon/human/human_parent = parent
|
||||
human_parent.clear_alert(ALERT_RADIOACTIVE_AREA)
|
||||
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/alert/radioactive_area
|
||||
name = "Radioactive Area"
|
||||
desc = "This place is no good! We need to get some protection or get out fast!"
|
||||
icon_state = ALERT_RADIOACTIVE_AREA
|
||||
@@ -2,21 +2,23 @@
|
||||
element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH_ON_HOST_DESTROY // Detach for turfs
|
||||
argument_hash_start_idx = 2
|
||||
///Time it takes to climb onto the object
|
||||
var/climb_time = (2 SECONDS)
|
||||
var/climb_time
|
||||
///Stun duration for when you get onto the object
|
||||
var/climb_stun = (2 SECONDS)
|
||||
var/climb_stun
|
||||
///Assoc list of object being climbed on - climbers. This allows us to check who needs to be shoved off a climbable object when its clicked on.
|
||||
var/list/current_climbers
|
||||
|
||||
/datum/element/climbable/Attach(datum/target, climb_time, climb_stun)
|
||||
/datum/element/climbable/Attach(
|
||||
datum/target,
|
||||
climb_time = 2 SECONDS,
|
||||
climb_stun = 2 SECONDS,
|
||||
)
|
||||
. = ..()
|
||||
|
||||
if(!isatom(target) || isarea(target))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
if(climb_time)
|
||||
src.climb_time = climb_time
|
||||
if(climb_stun)
|
||||
src.climb_stun = climb_stun
|
||||
src.climb_time = climb_time
|
||||
src.climb_stun = climb_stun
|
||||
|
||||
RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(attack_hand))
|
||||
RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
||||
|
||||
@@ -18,13 +18,13 @@
|
||||
/datum/element/radioactive/New()
|
||||
START_PROCESSING(SSdcs, src)
|
||||
|
||||
/datum/element/radioactive/Attach(\
|
||||
datum/target, \
|
||||
range = 3, \
|
||||
threshold = RAD_LIGHT_INSULATION, \
|
||||
chance = URANIUM_IRRADIATION_CHANCE, \
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,\
|
||||
)
|
||||
/datum/element/radioactive/Attach(
|
||||
datum/target,
|
||||
range = 3,
|
||||
threshold = RAD_LIGHT_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE,
|
||||
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
)
|
||||
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -545,11 +545,13 @@
|
||||
VAR_PROTECTED/send_care_package_time = 5 MINUTES
|
||||
///The glow of 'fake' radioactive objects in space
|
||||
var/nebula_radglow = "#66ff33"
|
||||
/// Area's that are part of the radioactive nebula
|
||||
var/radioactive_areas = /area/space
|
||||
|
||||
/datum/station_trait/nebula/hostile/radiation/New()
|
||||
. = ..()
|
||||
|
||||
for(var/area/target as anything in get_areas(/area/space))
|
||||
for(var/area/target as anything in get_areas(radioactive_areas))
|
||||
RegisterSignals(target, list(COMSIG_AREA_ENTERED, COMSIG_AREA_INITIALIZED_IN), PROC_REF(on_entered))
|
||||
RegisterSignal(target, COMSIG_AREA_EXITED, PROC_REF(on_exited))
|
||||
|
||||
@@ -574,25 +576,32 @@
|
||||
var/datum/round_event_control/modified_event = locate(/datum/round_event_control/radiation_storm) in SSevents.control
|
||||
modified_event.weight = 0
|
||||
|
||||
///They entered space? START BOMBING WITH RADS HAHAHAHA
|
||||
/datum/station_trait/nebula/hostile/radiation/proc/on_entered(area/space, atom/movable/enterer)
|
||||
///They entered space? START BOMBING WITH RADS HAHAHAHA. old_area can be null for new objects
|
||||
/datum/station_trait/nebula/hostile/radiation/proc/on_entered(area/space, atom/movable/enterer, area/old_area)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!ismovable(enterer))
|
||||
return
|
||||
if(iscarbon(enterer))//Don't actually make EVERY. SINGLE. THING. RADIOACTIVE. Just irradiate people
|
||||
if(!istype(old_area, radioactive_areas)) //old area wasnt radioactive
|
||||
enterer.AddComponent( \
|
||||
/datum/component/radioactive_exposure, \
|
||||
minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME, \
|
||||
irradiation_chance_base = RADIATION_EXPOSURE_NEBULA_BASE_CHANCE, \
|
||||
irradiation_chance_increment = RADIATION_EXPOSURE_NEBULA_CHANCE_INCREMENT, \
|
||||
irradiation_interval = RADIATION_EXPOSURE_NEBULA_CHECK_INTERVAL, \
|
||||
source = src, \
|
||||
radioactive_areas = radioactive_areas, \
|
||||
)
|
||||
|
||||
enterer.AddElement(/datum/element/radioactive, range = 0, minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME)
|
||||
//Don't actually make EVERY. SINGLE. THING. radioactive, just make them glow so people arent killed instantly
|
||||
if(!SSradiation.can_irradiate_basic(enterer))
|
||||
else if(isobj(enterer)) //and fake the rest
|
||||
//outline clashes too much with other outlines and creates pretty ugly lines
|
||||
enterer.add_filter(GLOW_NEBULA, 2, list("type" = "drop_shadow", "color" = nebula_radglow, "size" = 2))
|
||||
|
||||
///Called when an atom leaves space, so we can remove the radiation effect
|
||||
/datum/station_trait/nebula/hostile/radiation/proc/on_exited(area/space, atom/movable/exiter)
|
||||
/datum/station_trait/nebula/hostile/radiation/proc/on_exited(area/space, atom/movable/exiter, direction)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
exiter.RemoveElement(/datum/element/radioactive, range = 0, minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME)
|
||||
exiter.remove_filter(GLOW_NEBULA)
|
||||
// The component handles its own removal
|
||||
|
||||
/datum/station_trait/nebula/hostile/radiation/apply_nebula_effect(effect_strength = 0)
|
||||
//big bombad now
|
||||
|
||||
@@ -139,6 +139,9 @@
|
||||
|
||||
RegisterSignal(resolve_parent, COMSIG_TOPIC, PROC_REF(topic_handle))
|
||||
|
||||
RegisterSignal(resolve_parent, COMSIG_ATOM_EXAMINE, PROC_REF(handle_examination))
|
||||
RegisterSignal(resolve_parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(handle_extra_examination))
|
||||
|
||||
orient_to_hud()
|
||||
|
||||
/datum/storage/Destroy()
|
||||
@@ -234,6 +237,18 @@
|
||||
if(href_list["show_valid_pocket_items"])
|
||||
handle_show_valid_items(source, user)
|
||||
|
||||
/datum/storage/proc/handle_examination(datum/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!isnull(can_hold_description))
|
||||
examine_list += span_notice("You can examine this further to check what kind of extra items it can hold.")
|
||||
|
||||
/datum/storage/proc/handle_extra_examination(datum/source, mob/user, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!isnull(can_hold_description))
|
||||
examine_list += handle_show_valid_items(source, user)
|
||||
|
||||
/datum/storage/proc/handle_show_valid_items(datum/source, user)
|
||||
to_chat(user, span_notice("[source] can hold: [can_hold_description]"))
|
||||
|
||||
|
||||
@@ -3,42 +3,63 @@
|
||||
max_slots = 21
|
||||
|
||||
// Syndi bags get some FUN extras
|
||||
// You can fit any 3 bulky objects (assuming they're in the whitelist)
|
||||
// You can fit any 2 bulky objects (assuming they're in the whitelist)
|
||||
// Should have traitorus stuff in here, not just useful big things
|
||||
// Idea is to allow for things we typically restrict in exchange for going loud
|
||||
/datum/storage/duffel/syndicate
|
||||
silent = TRUE
|
||||
exception_max = 3
|
||||
exception_max = 2
|
||||
|
||||
/datum/storage/duffel/syndicate/New()
|
||||
. = ..()
|
||||
|
||||
var/static/list/exception_cache = typecacheof(list(
|
||||
var/static/list/exception_type_list = list(
|
||||
// Gun and gun-related accessories
|
||||
/obj/item/gun,
|
||||
/obj/item/pneumatic_cannon,
|
||||
// Melee
|
||||
/obj/item/kinetic_crusher, //mostly
|
||||
/obj/item/dualsaber,
|
||||
/obj/item/staff/bostaff,
|
||||
/obj/item/fireaxe,
|
||||
/obj/item/crowbar/mechremoval,
|
||||
/obj/item/spear,
|
||||
/obj/item/nullrod,
|
||||
/obj/item/melee/cleric_mace,
|
||||
/obj/item/melee/ghost_sword,
|
||||
/obj/item/melee/cleaving_saw,
|
||||
// Deployables
|
||||
/obj/item/transfer_valve,
|
||||
/obj/item/powersink,
|
||||
/obj/item/deployable_turret_folded,
|
||||
/obj/item/cardboard_cutout,
|
||||
/obj/item/dualsaber,
|
||||
/obj/item/fireaxe,
|
||||
/obj/item/pneumatic_cannon,
|
||||
/obj/item/spear,
|
||||
/obj/item/powersink,
|
||||
/obj/item/transfer_valve,
|
||||
/obj/item/gibtonite,
|
||||
// Sustenance
|
||||
/obj/item/food/cheese/royal,
|
||||
/obj/item/food/powercrepe,
|
||||
/obj/item/melee/cleric_mace,
|
||||
// Back Items
|
||||
/obj/item/tank/jetpack,
|
||||
/obj/item/watertank,
|
||||
// Skub
|
||||
/obj/item/skub,
|
||||
// Bulky Supplies
|
||||
/obj/item/mecha_ammo,
|
||||
/obj/item/golem_shell,
|
||||
// Clothing
|
||||
/obj/item/clothing/shoes/winterboots/ice_boots/eva,
|
||||
/obj/item/clothing/suit/space,
|
||||
/obj/item/clothing/suit/armor/heavy,
|
||||
/obj/item/clothing/suit/bio_suit,
|
||||
/obj/item/clothing/suit/utility,
|
||||
/obj/item/nullrod,
|
||||
// Storage
|
||||
/obj/item/storage/bag/money,
|
||||
/obj/item/kinetic_crusher,
|
||||
/obj/item/melee/ghost_sword,
|
||||
/obj/item/melee/cleaving_saw,
|
||||
// Heads!
|
||||
/obj/item/bodypart/head,
|
||||
))
|
||||
)
|
||||
|
||||
// We keep the type list and the typecache list separate...
|
||||
var/static/list/exception_cache = typecacheof(exception_type_list)
|
||||
exception_hold = exception_cache
|
||||
|
||||
//...So we can run this without it generating a line for every subtype.
|
||||
can_hold_description = generate_hold_desc(exception_type_list)
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
target_trait = ZTRAIT_STATION
|
||||
|
||||
immunity_type = TRAIT_RADSTORM_IMMUNE
|
||||
/// Chance we get a negative mutation, if we fail we get a positive one
|
||||
var/negative_mutation_chance = 90
|
||||
/// Chance we mutate
|
||||
var/mutate_chance = 40
|
||||
|
||||
/datum/weather/rad_storm/telegraph()
|
||||
..()
|
||||
@@ -31,7 +35,7 @@
|
||||
|
||||
|
||||
/datum/weather/rad_storm/weather_act(mob/living/L)
|
||||
if(!prob(40))
|
||||
if(!prob(mutate_chance))
|
||||
return
|
||||
|
||||
if(!ishuman(L))
|
||||
@@ -51,11 +55,7 @@
|
||||
H.random_mutate_unique_features()
|
||||
|
||||
if(prob(50))
|
||||
if(prob(90))
|
||||
H.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE)
|
||||
else
|
||||
H.easy_random_mutate(POSITIVE)
|
||||
H.domutcheck()
|
||||
do_mutate(L)
|
||||
|
||||
/datum/weather/rad_storm/end()
|
||||
if(..())
|
||||
@@ -63,6 +63,13 @@
|
||||
priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert", ANNOUNCER_RADIATIONPASSED) //SKYRAT EDIT CHANGE
|
||||
status_alarm(FALSE)
|
||||
|
||||
/datum/weather/rad_storm/proc/do_mutate(mob/living/carbon/human/mutant)
|
||||
if(prob(negative_mutation_chance))
|
||||
mutant.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE)
|
||||
else
|
||||
mutant.easy_random_mutate(POSITIVE)
|
||||
mutant.domutcheck()
|
||||
|
||||
/datum/weather/rad_storm/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement.
|
||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
|
||||
if(!frequency)
|
||||
@@ -88,10 +95,14 @@
|
||||
|
||||
end_message = null
|
||||
|
||||
mutate_chance = 0.1
|
||||
|
||||
///Chance we pulse a living during the storm
|
||||
var/radiation_chance = 20
|
||||
var/radiation_chance = 5
|
||||
|
||||
/datum/weather/rad_storm/nebula/weather_act(mob/living/living)
|
||||
..()
|
||||
|
||||
if(!prob(radiation_chance))
|
||||
return
|
||||
|
||||
@@ -103,7 +114,6 @@
|
||||
max_range = 0,
|
||||
threshold = RAD_LIGHT_INSULATION,
|
||||
chance = URANIUM_IRRADIATION_CHANCE,
|
||||
minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME,
|
||||
)
|
||||
|
||||
/datum/weather/rad_storm/nebula/status_alarm(active)
|
||||
|
||||
@@ -472,6 +472,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
*/
|
||||
/area/Exited(atom/movable/gone, direction)
|
||||
SEND_SIGNAL(src, COMSIG_AREA_EXITED, gone, direction)
|
||||
SEND_SIGNAL(gone, COMSIG_MOVABLE_EXITED_AREA, src, direction)
|
||||
|
||||
if(!gone.important_recursive_contents?[RECURSIVE_CONTENTS_AREA_SENSITIVE])
|
||||
return
|
||||
|
||||
@@ -22,15 +22,26 @@
|
||||
///Designs imported from technology disks that we can print.
|
||||
var/list/imported_designs = list()
|
||||
|
||||
///The container to hold materials
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/autolathe/Initialize(mapload)
|
||||
AddComponent(/datum/component/material_container, SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], 0, MATCONTAINER_EXAMINE, _after_insert = CALLBACK(src, PROC_REF(AfterMaterialInsert)))
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
SSmaterials.materials_by_category[MAT_CATEGORY_ITEM_MATERIAL], \
|
||||
0, \
|
||||
MATCONTAINER_EXAMINE, \
|
||||
container_signals = list(COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/autolathe, AfterMaterialInsert)) \
|
||||
)
|
||||
. = ..()
|
||||
|
||||
set_wires(new /datum/wires/autolathe(src))
|
||||
if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe])
|
||||
GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe] = new /datum/techweb/autounlocking/autolathe
|
||||
stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/autolathe]
|
||||
|
||||
/obj/machinery/autolathe/Destroy()
|
||||
materials = null
|
||||
QDEL_NULL(wires)
|
||||
return ..()
|
||||
|
||||
@@ -48,7 +59,7 @@
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/autolathe/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/data = materials.ui_static_data()
|
||||
|
||||
data["designs"] = handle_designs(stored_research.researched_designs)
|
||||
if(imported_designs.len)
|
||||
@@ -62,10 +73,7 @@
|
||||
var/list/data = list()
|
||||
|
||||
data["materials"] = list()
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
data["materialtotal"] = materials.total_amount
|
||||
data["materialtotal"] = materials.total_amount()
|
||||
data["materialsmax"] = materials.max_amount
|
||||
data["active"] = busy
|
||||
data["materials"] = materials.ui_data()
|
||||
@@ -78,63 +86,38 @@
|
||||
var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs)
|
||||
var/size32x32 = "[spritesheet.name]32x32"
|
||||
|
||||
var/max_multiplier = INFINITY
|
||||
for(var/design_id in designs)
|
||||
var/datum/design/design = SSresearch.techweb_design_by_id(design_id)
|
||||
if(design.make_reagent)
|
||||
continue
|
||||
|
||||
var/unbuildable = FALSE // we can't build the design currently
|
||||
var/m10 = FALSE // 10x mult
|
||||
var/m25 = FALSE // 25x mult
|
||||
var/m50 = FALSE // 50x mult
|
||||
var/m5 = FALSE // 5x mult
|
||||
var/sheets = FALSE // sheets or no?
|
||||
//compute cost & maximum number of printable items
|
||||
max_multiplier = INFINITY
|
||||
var/coeff = (ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency)
|
||||
var/list/cost = list()
|
||||
for(var/i in design.materials)
|
||||
var/datum/material/mat = i
|
||||
|
||||
if(disabled || !can_build(design))
|
||||
unbuildable = TRUE
|
||||
var/design_cost = OPTIMAL_COST(design.materials[i] * coeff)
|
||||
if(istype(mat))
|
||||
cost[mat.name] = design_cost
|
||||
else
|
||||
cost[i] = design_cost
|
||||
|
||||
var/max_multiplier = unbuildable ? 0 : 1
|
||||
|
||||
if(ispath(design.build_path, /obj/item/stack))
|
||||
sheets = TRUE
|
||||
|
||||
if(!unbuildable)
|
||||
var/datum/component/material_container/mats = GetComponent(/datum/component/material_container)
|
||||
|
||||
for(var/datum/material/mat in design.materials)
|
||||
max_multiplier = min(design.maxstack, round(mats.get_material_amount(mat) / design.materials[mat]))
|
||||
if (max_multiplier >= 10 && !disabled)
|
||||
m10 = TRUE
|
||||
if (max_multiplier >= 25 && !disabled)
|
||||
m25 = TRUE
|
||||
else
|
||||
if(!unbuildable)
|
||||
if(!disabled && can_build(design, 5))
|
||||
m5 = TRUE
|
||||
if(!disabled && can_build(design, 10))
|
||||
m10 = TRUE
|
||||
|
||||
var/datum/component/material_container/mats = GetComponent(/datum/component/material_container)
|
||||
|
||||
for(var/datum/material/mat in design.materials)
|
||||
max_multiplier = min(50, round(mats.get_material_amount(mat) / (design.materials[mat] * creation_efficiency)))
|
||||
max_multiplier = min(max_multiplier, 50, round((istype(mat) ? materials.get_material_amount(i) : 0) / design_cost))
|
||||
|
||||
//create & send ui data
|
||||
var/icon_size = spritesheet.icon_size_id(design.id)
|
||||
|
||||
var/list/design_data = list(
|
||||
"name" = design.name,
|
||||
"desc" = design.get_description(),
|
||||
"cost" = get_design_cost(design),
|
||||
"cost" = cost,
|
||||
"id" = design.id,
|
||||
"categories" = design.category,
|
||||
"icon" = "[icon_size == size32x32 ? "" : "[icon_size] "][design.id]",
|
||||
"constructionTime" = -1,
|
||||
|
||||
"buildable" = unbuildable,
|
||||
"mult5" = m5,
|
||||
"mult10" = m10,
|
||||
"mult25" = m25,
|
||||
"mult50" = m50,
|
||||
"sheet" = sheets,
|
||||
"maxmult" = max_multiplier,
|
||||
"maxmult" = max_multiplier
|
||||
)
|
||||
|
||||
output += list(design_data)
|
||||
@@ -153,85 +136,78 @@
|
||||
return
|
||||
|
||||
if(action == "make")
|
||||
if(disabled)
|
||||
say("The autolathe wires are disabled.")
|
||||
return
|
||||
if(busy)
|
||||
say("The autolathe is busy. Please wait for completion of previous operation.")
|
||||
return
|
||||
|
||||
var/design_id = params["id"]
|
||||
if(!istext(design_id))
|
||||
return
|
||||
|
||||
if(!stored_research.researched_designs.Find(design_id) && !stored_research.hacked_designs.Find(design_id) && !imported_designs.Find(design_id))
|
||||
return
|
||||
|
||||
var/datum/design/design = SSresearch.techweb_design_by_id(design_id)
|
||||
|
||||
if(!(design.build_type & AUTOLATHE) || design.id != design_id)
|
||||
return
|
||||
|
||||
if (busy)
|
||||
to_chat(usr, span_alert("The autolathe is busy. Please wait for completion of previous operation."))
|
||||
return
|
||||
|
||||
being_built = design
|
||||
var/is_stack = ispath(being_built.build_path, /obj/item/stack)
|
||||
var/coeff = (is_stack ? 1 : creation_efficiency) // Stacks are unaffected by production coefficient
|
||||
|
||||
var/multiplier = round(text2num(params["multiplier"]))
|
||||
|
||||
if(!multiplier || !IS_FINITE(multiplier))
|
||||
return
|
||||
|
||||
var/is_stack = ispath(being_built.build_path, /obj/item/stack)
|
||||
multiplier = clamp(multiplier, 1, 50)
|
||||
|
||||
var/coeff = (is_stack ? 1 : creation_efficiency) // Stacks are unaffected by production coefficient
|
||||
var/total_amount = 0
|
||||
|
||||
for(var/material in being_built.materials)
|
||||
total_amount += being_built.materials[material]
|
||||
|
||||
var/power = max(active_power_usage, (total_amount)*multiplier/5) // Change this to use all materials
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
//check for materials
|
||||
var/list/materials_used = list()
|
||||
var/list/custom_materials = list() // These will apply their material effect, should usually only be one.
|
||||
|
||||
for(var/mat in being_built.materials)
|
||||
var/datum/material/used_material = mat
|
||||
var/amount_needed = being_built.materials[mat] * coeff * multiplier
|
||||
|
||||
var/amount_needed = being_built.materials[mat]
|
||||
if(istext(used_material)) // This means its a category
|
||||
var/list/list_to_show = list()
|
||||
|
||||
//list all materials in said category
|
||||
for(var/i in SSmaterials.materials_by_category[used_material])
|
||||
if(materials.materials[i] > 0)
|
||||
list_to_show += i
|
||||
|
||||
//ask user to pick specific material from list
|
||||
used_material = tgui_input_list(
|
||||
usr,
|
||||
"Choose [used_material]",
|
||||
"Custom Material",
|
||||
sort_list(list_to_show, GLOBAL_PROC_REF(cmp_typepaths_asc))
|
||||
)
|
||||
|
||||
if(isnull(used_material))
|
||||
// Didn't pick any material, so you can't build shit either.
|
||||
return
|
||||
|
||||
//the item composition will be made of these materials
|
||||
custom_materials[used_material] += amount_needed
|
||||
|
||||
materials_used[used_material] = amount_needed
|
||||
|
||||
if(materials.has_materials(materials_used))
|
||||
busy = TRUE
|
||||
to_chat(usr, span_notice("You print [multiplier] item(s) from the [src]"))
|
||||
use_power(power)
|
||||
icon_state = "autolathe_n"
|
||||
var/time = is_stack ? 32 : (32 * coeff * multiplier) ** 0.8
|
||||
addtimer(CALLBACK(src, PROC_REF(make_item), power, materials_used, custom_materials, multiplier, coeff, is_stack, usr), time)
|
||||
. = TRUE
|
||||
else
|
||||
to_chat(usr, span_alert("Not enough materials for this operation."))
|
||||
if(!materials.has_materials(materials_used, coeff, multiplier))
|
||||
say("Not enough materials for this operation!.")
|
||||
return
|
||||
|
||||
/obj/machinery/autolathe/on_deconstruction()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.retrieve_all()
|
||||
//use power
|
||||
var/total_amount = 0
|
||||
for(var/material in being_built.materials)
|
||||
total_amount += being_built.materials[material]
|
||||
use_power(max(active_power_usage, (total_amount) * multiplier / 5))
|
||||
|
||||
//use materials
|
||||
materials.use_materials(materials_used, coeff, multiplier)
|
||||
busy = TRUE
|
||||
to_chat(usr, span_notice("You print [multiplier] item(s) from the [src]"))
|
||||
update_static_data_for_all_viewers()
|
||||
//print item
|
||||
icon_state = "autolathe_n"
|
||||
var/time = is_stack ? 32 : (32 * coeff * multiplier) ** 0.8
|
||||
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/autolathe, make_item), custom_materials, multiplier, is_stack, usr), time)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/autolathe/attackby(obj/item/attacking_item, mob/living/user, params)
|
||||
if(busy)
|
||||
@@ -303,8 +279,10 @@
|
||||
|
||||
return SECONDARY_ATTACK_CALL_NORMAL
|
||||
|
||||
/obj/machinery/autolathe/proc/AfterMaterialInsert(obj/item/item_inserted, id_inserted, amount_inserted)
|
||||
if(istype(item_inserted, /obj/item/stack/ore/bluespace_crystal))
|
||||
/obj/machinery/autolathe/proc/AfterMaterialInsert(obj/machinery/machine, obj/item/item_inserted, last_inserted_id, amount_inserted, container)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(ispath(item_inserted, /obj/item/stack/ore/bluespace_crystal))
|
||||
use_power(SHEET_MATERIAL_AMOUNT / 10)
|
||||
else if(item_inserted.has_material_type(/datum/material/glass))
|
||||
flick("autolathe_r", src)//plays glass insertion animation by default otherwise
|
||||
@@ -312,13 +290,10 @@
|
||||
flick("autolathe_o", src)//plays metal insertion animation
|
||||
|
||||
use_power(min(active_power_usage * 0.25, amount_inserted / 100))
|
||||
update_static_data_for_all_viewers()
|
||||
|
||||
/obj/machinery/autolathe/proc/make_item(power, list/materials_used, list/picked_materials, multiplier, coeff, is_stack, mob/user)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
/obj/machinery/autolathe/proc/make_item(list/picked_materials, multiplier, is_stack, mob/user)
|
||||
var/atom/A = drop_location()
|
||||
use_power(power)
|
||||
|
||||
materials.use_materials(materials_used)
|
||||
|
||||
if(is_stack)
|
||||
var/obj/item/stack/N = new being_built.build_path(A, multiplier, FALSE)
|
||||
@@ -334,7 +309,6 @@
|
||||
if(!istype(M, /datum/material/glass) && !istype(M, /datum/material/iron))
|
||||
user.client.give_award(/datum/award/achievement/misc/getting_an_upgrade, user)
|
||||
|
||||
|
||||
icon_state = "autolathe"
|
||||
busy = FALSE
|
||||
|
||||
@@ -343,7 +317,6 @@
|
||||
var/mat_capacity = 0
|
||||
for(var/datum/stock_part/matter_bin/new_matter_bin in component_parts)
|
||||
mat_capacity += new_matter_bin.tier * (37.5*SHEET_MATERIAL_AMOUNT)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.max_amount = mat_capacity
|
||||
|
||||
var/efficiency=1.8
|
||||
@@ -353,40 +326,9 @@
|
||||
|
||||
/obj/machinery/autolathe/examine(mob/user)
|
||||
. += ..()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += span_notice("The status display reads: Storing up to <b>[materials.max_amount]</b> material units.<br>Material consumption at <b>[creation_efficiency*100]%</b>.")
|
||||
|
||||
/obj/machinery/autolathe/proc/can_build(datum/design/D, amount = 1)
|
||||
if(D.make_reagent)
|
||||
return FALSE
|
||||
|
||||
var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : creation_efficiency)
|
||||
|
||||
var/list/required_materials = list()
|
||||
|
||||
for(var/i in D.materials)
|
||||
required_materials[i] = D.materials[i] * coeff * amount
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
return materials.has_materials(required_materials)
|
||||
|
||||
|
||||
/obj/machinery/autolathe/proc/get_design_cost(datum/design/design)
|
||||
var/coeff = (ispath(design.build_path, /obj/item/stack) ? 1 : creation_efficiency)
|
||||
var/list/cost = list()
|
||||
|
||||
for(var/material in design.materials)
|
||||
if (istext(material))
|
||||
// Wildcard materials
|
||||
cost[material] = design.materials[material] * coeff
|
||||
else
|
||||
var/datum/material/cast = material
|
||||
cost[cast.name] = design.materials[cast] * coeff
|
||||
|
||||
return cost
|
||||
|
||||
/obj/machinery/autolathe/proc/reset(wire)
|
||||
switch(wire)
|
||||
if(WIRE_HACK)
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
|
||||
var/list/using_materials
|
||||
var/starting_amount = 0
|
||||
var/iron_cost =HALF_SHEET_MATERIAL_AMOUNT
|
||||
var/glass_cost =HALF_SHEET_MATERIAL_AMOUNT
|
||||
var/iron_cost = HALF_SHEET_MATERIAL_AMOUNT
|
||||
var/glass_cost = HALF_SHEET_MATERIAL_AMOUNT
|
||||
var/power_used = 1000
|
||||
|
||||
var/mode = DRONE_READY
|
||||
@@ -48,16 +48,28 @@
|
||||
var/break_message = "lets out a tinny alarm before falling dark."
|
||||
var/break_sound = 'sound/machines/warning-buzzer.ogg'
|
||||
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/drone_dispenser/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass), SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_DRONE_DISPENSER, allowed_items=/obj/item/stack)
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
list(/datum/material/iron, /datum/material/glass), \
|
||||
SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \
|
||||
MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_DRONE_DISPENSER, \
|
||||
allowed_items=/obj/item/stack \
|
||||
)
|
||||
materials.insert_amount_mat(starting_amount)
|
||||
materials.precise_insertion = TRUE
|
||||
using_materials = list(/datum/material/iron = iron_cost, /datum/material/glass = glass_cost)
|
||||
REGISTER_REQUIRED_MAP_ITEM(1, 1)
|
||||
|
||||
/obj/machinery/drone_dispenser/Destroy()
|
||||
materials = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/drone_dispenser/preloaded
|
||||
starting_amount = 5000
|
||||
starting_amount = SHEET_MATERIAL_AMOUNT * 2.5
|
||||
|
||||
/obj/machinery/drone_dispenser/syndrone //Please forgive me
|
||||
name = "syndrone shell dispenser"
|
||||
@@ -66,7 +78,7 @@
|
||||
//If we're gonna be a jackass, go the full mile - 10 second recharge timer
|
||||
cooldownTime = 100
|
||||
end_create_message = "dispenses a suspicious drone shell."
|
||||
starting_amount = 25000
|
||||
starting_amount = SHEET_MATERIAL_AMOUNT * 12.5
|
||||
|
||||
/obj/machinery/drone_dispenser/syndrone/badass //Please forgive me
|
||||
name = "badass syndrone shell dispenser"
|
||||
@@ -81,10 +93,10 @@
|
||||
dispense_type = /obj/effect/mob_spawn/ghost_role/drone/snowflake
|
||||
end_create_message = "dispenses a snowflake drone shell."
|
||||
// Those holoprojectors aren't cheap
|
||||
iron_cost =SHEET_MATERIAL_AMOUNT
|
||||
glass_cost =SHEET_MATERIAL_AMOUNT
|
||||
iron_cost = SHEET_MATERIAL_AMOUNT
|
||||
glass_cost = SHEET_MATERIAL_AMOUNT
|
||||
power_used = 2000
|
||||
starting_amount = 10000
|
||||
starting_amount = SHEET_MATERIAL_AMOUNT * 5
|
||||
|
||||
// If the derelict gets lonely, make more friends.
|
||||
/obj/machinery/drone_dispenser/derelict
|
||||
@@ -92,8 +104,8 @@
|
||||
desc = "A rusty machine that, when supplied with iron and glass, will periodically create a derelict drone shell. Does not need to be manually operated."
|
||||
dispense_type = /obj/effect/mob_spawn/ghost_role/drone/derelict
|
||||
end_create_message = "dispenses a derelict drone shell."
|
||||
iron_cost = 10000
|
||||
glass_cost = 5000
|
||||
iron_cost = SHEET_MATERIAL_AMOUNT * 5
|
||||
glass_cost = SHEET_MATERIAL_AMOUNT * 2.5
|
||||
starting_amount = 0
|
||||
cooldownTime = 600
|
||||
|
||||
@@ -128,11 +140,11 @@
|
||||
. = ..()
|
||||
var/material_requirement_string = "It needs "
|
||||
if (iron_cost > 0)
|
||||
material_requirement_string += "[iron_cost] iron "
|
||||
material_requirement_string += "[iron_cost / SHEET_MATERIAL_AMOUNT] iron sheets "
|
||||
if (glass_cost > 0)
|
||||
material_requirement_string += "and "
|
||||
if (glass_cost > 0)
|
||||
material_requirement_string += "[glass_cost] glass "
|
||||
material_requirement_string += "[glass_cost / SHEET_MATERIAL_AMOUNT] glass sheets "
|
||||
if (iron_cost > 0 || glass_cost > 0)
|
||||
material_requirement_string += "to produce one drone shell."
|
||||
. += span_notice(material_requirement_string)
|
||||
@@ -144,7 +156,6 @@
|
||||
if((machine_stat & (NOPOWER|BROKEN)) || !anchored)
|
||||
return
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
if(!materials.has_materials(using_materials))
|
||||
return // We require more minerals
|
||||
|
||||
@@ -212,7 +223,6 @@
|
||||
|
||||
/obj/machinery/drone_dispenser/attackby(obj/item/I, mob/living/user)
|
||||
if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.retrieve_all()
|
||||
I.play_tool_sound(src)
|
||||
to_chat(user, span_notice("You retrieve the materials from [src]."))
|
||||
|
||||
@@ -1109,7 +1109,7 @@ DEFINE_BITFIELD(turret_flags, list(
|
||||
|
||||
/obj/item/gun/ballistic/get_turret_properties()
|
||||
. = ..()
|
||||
var/obj/item/ammo_box/mag = mag_type
|
||||
var/obj/item/ammo_box/mag = spawn_magazine_type
|
||||
var/obj/item/ammo_casing/primary_ammo = initial(mag.ammo_type)
|
||||
|
||||
.["base_icon_state"] = "syndie"
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
|
||||
materials = AddComponent(
|
||||
/datum/component/remote_materials, \
|
||||
"charger", \
|
||||
mapload, \
|
||||
mat_container_flags = MATCONTAINER_NO_INSERT, \
|
||||
)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/crush_damage = 1000
|
||||
var/eat_victim_items = TRUE
|
||||
var/item_recycle_sound = 'sound/items/welder.ogg'
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/recycler/Initialize(mapload)
|
||||
var/list/allowed_materials = list(
|
||||
@@ -32,7 +33,7 @@
|
||||
/datum/material/titanium,
|
||||
/datum/material/bluespace
|
||||
)
|
||||
AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_NO_INSERT|BREAKDOWN_FLAGS_RECYCLER)
|
||||
materials = AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_NO_INSERT|BREAKDOWN_FLAGS_RECYCLER)
|
||||
AddComponent(/datum/component/butchering/recycler, \
|
||||
speed = 0.1 SECONDS, \
|
||||
effectiveness = amount_produced, \
|
||||
@@ -50,6 +51,10 @@
|
||||
)
|
||||
AddElement(/datum/element/connect_loc, loc_connections)
|
||||
|
||||
/obj/machinery/recycler/Destroy()
|
||||
materials = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/recycler/RefreshParts()
|
||||
. = ..()
|
||||
var/amt_made = 0
|
||||
@@ -183,7 +188,6 @@
|
||||
new wood.plank_type(loc, 1 + seed_modifier)
|
||||
. = TRUE
|
||||
else
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/retrived = materials.insert_item(weapon, multiplier = (amount_produced / 100), breakdown_flags=BREAKDOWN_FLAGS_RECYCLER)
|
||||
if(retrived > 0) //item was salvaged i.e. deleted
|
||||
materials.retrieve_all()
|
||||
|
||||
@@ -7,11 +7,25 @@
|
||||
circuit = /obj/item/circuitboard/machine/sheetifier
|
||||
layer = BELOW_OBJ_LAYER
|
||||
var/busy_processing = FALSE
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/sheetifier/Initialize(mapload)
|
||||
. = ..()
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
list(/datum/material/meat, /datum/material/hauntium), \
|
||||
SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, \
|
||||
MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_SHEETIFIER, \
|
||||
typesof(/datum/material/meat) + /datum/material/hauntium, list(/obj/item/food/meat, /obj/item/photo), \
|
||||
container_signals = list(
|
||||
COMSIG_MATCONTAINER_PRE_USER_INSERT = TYPE_PROC_REF(/obj/machinery/sheetifier, CanInsertMaterials),
|
||||
COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/sheetifier, AfterInsertMaterials)
|
||||
) \
|
||||
)
|
||||
|
||||
AddComponent(/datum/component/material_container, list(/datum/material/meat, /datum/material/hauntium), SHEET_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_SHEETIFIER, typesof(/datum/material/meat) + /datum/material/hauntium, list(/obj/item/food/meat, /obj/item/photo), null, CALLBACK(src, PROC_REF(CanInsertMaterials)), CALLBACK(src, PROC_REF(AfterInsertMaterials)))
|
||||
/obj/machinery/sheetifier/Destroy()
|
||||
materials = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/sheetifier/update_overlays()
|
||||
. = ..()
|
||||
@@ -24,10 +38,12 @@
|
||||
icon_state = "base_machine[busy_processing ? "_processing" : ""]"
|
||||
return ..()
|
||||
|
||||
/obj/machinery/sheetifier/proc/CanInsertMaterials()
|
||||
return !busy_processing
|
||||
/obj/machinery/sheetifier/proc/CanInsertMaterials(obj/machinery/machine, held_item, user)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
/obj/machinery/sheetifier/proc/AfterInsertMaterials(item_inserted, id_inserted, amount_inserted)
|
||||
return busy_processing ? MATCONTAINER_BLOCK_INSERT : TRUE
|
||||
|
||||
/obj/machinery/sheetifier/proc/AfterInsertMaterials(obj/machinery/machine, item_inserted, id_inserted, amount_inserted, container)
|
||||
busy_processing = TRUE
|
||||
update_appearance()
|
||||
var/datum/material/last_inserted_material = id_inserted
|
||||
@@ -39,7 +55,6 @@
|
||||
/obj/machinery/sheetifier/proc/finish_processing()
|
||||
busy_processing = FALSE
|
||||
update_appearance()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.retrieve_all() //Returns all as sheets
|
||||
use_power(active_power_usage)
|
||||
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
if(isopenturf(target))
|
||||
deploy_bodybag(user, target)
|
||||
|
||||
/obj/item/bodybag/attempt_pickup(mob/user)
|
||||
// can't pick ourselves up if we are inside of the bodybag, else very weird things may happen
|
||||
if(contains(user))
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Creates a new body bag item when unfolded, at the provided location, replacing the body bag item.
|
||||
* * mob/user: User opening the body bag.
|
||||
|
||||
@@ -1663,7 +1663,7 @@
|
||||
*/
|
||||
/obj/item/card/cardboard
|
||||
name = "cardboard identification card"
|
||||
desc = "A card used to provice ID and det- Heeeey, wait a second, this is just a piece of cut cardboard!"
|
||||
desc = "A card used to provide ID and det- Heeeey, wait a second, this is just a piece of cut cardboard!"
|
||||
icon_state = "cardboard_id"
|
||||
inhand_icon_state = "cardboard-id"
|
||||
worn_icon_state = "nothing"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
/obj/item/toy/crayon
|
||||
name = "red crayon"
|
||||
name = "crayon"
|
||||
desc = "A colourful crayon. Looks tasty. Mmmm..."
|
||||
icon = 'icons/obj/art/crayons.dmi'
|
||||
icon_state = "crayonred"
|
||||
|
||||
@@ -264,6 +264,7 @@
|
||||
icon_state = "butteronastick"
|
||||
trash_type = /obj/item/stack/rods
|
||||
food_flags = FOOD_FINGER_FOOD
|
||||
venue_value = FOOD_PRICE_CHEAP
|
||||
|
||||
/obj/item/food/butter/make_processable()
|
||||
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/butterslice, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Slice")
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
//RAPID HANDHELD DEVICE. the base for all rapid devices
|
||||
|
||||
#define SILO_USE_AMOUNT (SHEET_MATERIAL_AMOUNT / 4)
|
||||
|
||||
/obj/item/construction
|
||||
name = "not for ingame use"
|
||||
desc = "A device used to rapidly build and deconstruct. Reload with iron, plasteel, glass or compressed matter cartridges."
|
||||
@@ -13,7 +15,7 @@
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*50)
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 50)
|
||||
req_access = list(ACCESS_ENGINE_EQUIP)
|
||||
armor_type = /datum/armor/item_construction
|
||||
resistance_flags = FIRE_PROOF
|
||||
@@ -46,13 +48,13 @@
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
if(upgrade & RCD_UPGRADE_SILO_LINK)
|
||||
silo_mats = AddComponent(/datum/component/remote_materials, "RCD", mapload, FALSE)
|
||||
silo_mats = AddComponent(/datum/component/remote_materials, mapload, FALSE)
|
||||
update_appearance()
|
||||
|
||||
///used for examining the RCD and for its UI
|
||||
/obj/item/construction/proc/get_silo_iron()
|
||||
if(silo_link && silo_mats.mat_container && !silo_mats.on_hold())
|
||||
return silo_mats.mat_container.get_material_amount(/datum/material/iron)/500
|
||||
return silo_mats.mat_container.get_material_amount(/datum/material/iron) / SILO_USE_AMOUNT
|
||||
return FALSE
|
||||
|
||||
///returns local matter units available. overriden by rcd borg to return power units available
|
||||
@@ -99,7 +101,7 @@
|
||||
return
|
||||
upgrade |= design_disk.upgrade
|
||||
if((design_disk.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats)
|
||||
silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE)
|
||||
silo_mats = AddComponent(/datum/component/remote_materials, FALSE, FALSE)
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
|
||||
qdel(design_disk)
|
||||
|
||||
@@ -171,16 +173,17 @@
|
||||
balloon_alert(user, "silo on hold!")
|
||||
return FALSE
|
||||
if(!silo_mats.mat_container)
|
||||
balloon_alert(user, "no silo detected!")
|
||||
if(user)
|
||||
balloon_alert(user, "no silo detected!")
|
||||
return FALSE
|
||||
if(!silo_mats.mat_container.has_materials(list(/datum/material/iron = 500), amount))
|
||||
if(!silo_mats.mat_container.has_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount))
|
||||
if(user)
|
||||
balloon_alert(user, "not enough silo material!")
|
||||
return FALSE
|
||||
|
||||
var/list/materials = list()
|
||||
materials[GET_MATERIAL_REF(/datum/material/iron)] = 500
|
||||
silo_mats.mat_container.use_materials(materials, amount)
|
||||
materials[GET_MATERIAL_REF(/datum/material/iron)] = SILO_USE_AMOUNT
|
||||
silo_mats.mat_container.use_materials(materials, multiplier = amount)
|
||||
silo_mats.silo_log(src, "consume", -amount, "build", materials)
|
||||
return TRUE
|
||||
|
||||
@@ -235,7 +238,7 @@
|
||||
if(user)
|
||||
balloon_alert(user, "silo on hold!")
|
||||
return FALSE
|
||||
. = silo_mats.mat_container.has_materials(list(/datum/material/iron = 500), amount)
|
||||
. = silo_mats.mat_container.has_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount)
|
||||
if(!. && user)
|
||||
balloon_alert(user, "low ammo!")
|
||||
if(has_ammobar)
|
||||
@@ -295,3 +298,4 @@
|
||||
name = "Destruction Scan"
|
||||
desc = "Scans the surrounding area for destruction. Scanned structures will rebuild significantly faster."
|
||||
|
||||
#undef SILO_USE_AMOUNT
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
. += span_notice("Activate it in your hand to inspire nearby allies of this banner's allegiance!")
|
||||
|
||||
/obj/item/banner/attack_self(mob/living/carbon/human/user)
|
||||
if(!inspiration_available)
|
||||
if(!inspiration_available || flags_1 & HOLOGRAM_1)
|
||||
return
|
||||
if(morale_time > world.time)
|
||||
to_chat(user, span_warning("You aren't feeling inspired enough to flourish [src] again yet."))
|
||||
|
||||
@@ -72,13 +72,13 @@
|
||||
user.suicide_log()
|
||||
qdel(user)
|
||||
|
||||
|
||||
/obj/item/storage/backpack/santabag
|
||||
name = "Santa's Gift Bag"
|
||||
desc = "Space Santa uses this to deliver presents to all the nice children in space in Christmas! Wow, it's pretty big!"
|
||||
icon_state = "giftbag0"
|
||||
inhand_icon_state = "giftbag"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
storage_type = /datum/storage/backpack/santabag
|
||||
|
||||
/obj/item/storage/backpack/santabag/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -392,6 +392,14 @@
|
||||
/// If this bag is zipped (contents hidden) up or not
|
||||
/// Starts enabled so you're forced to interact with it to "get" it
|
||||
var/zipped_up = TRUE
|
||||
// How much time it takes to zip up (close) the duffelbag
|
||||
var/zip_up_duration = 0.5 SECONDS
|
||||
// Audio played during zipup
|
||||
var/zip_up_sfx = 'sound/items/zip_up.ogg'
|
||||
// How much time it takes to unzip the duffel
|
||||
var/unzip_duration = 2.1 SECONDS
|
||||
// Audio played during unzip
|
||||
var/unzip_sfx = 'sound/items/un_zip.ogg'
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -425,9 +433,9 @@
|
||||
return ..()
|
||||
|
||||
balloon_alert(user, "unzipping...")
|
||||
playsound(src, 'sound/items/un_zip.ogg', 100, FALSE)
|
||||
playsound(src, unzip_sfx, 100, FALSE)
|
||||
var/datum/callback/can_unzip = CALLBACK(src, PROC_REF(zipper_matches), TRUE)
|
||||
if(!do_after(user, 2.1 SECONDS, src, extra_checks = can_unzip))
|
||||
if(!do_after(user, unzip_duration, src, extra_checks = can_unzip))
|
||||
user.balloon_alert(user, "unzip failed!")
|
||||
return
|
||||
balloon_alert(user, "unzipped")
|
||||
@@ -442,9 +450,9 @@
|
||||
return SECONDARY_ATTACK_CALL_NORMAL
|
||||
|
||||
balloon_alert(user, "zipping...")
|
||||
playsound(src, 'sound/items/zip_up.ogg', 100, FALSE)
|
||||
playsound(src, zip_up_sfx, 100, FALSE)
|
||||
var/datum/callback/can_zip = CALLBACK(src, PROC_REF(zipper_matches), FALSE)
|
||||
if(!do_after(user, 0.5 SECONDS, src, extra_checks = can_zip))
|
||||
if(!do_after(user, zip_up_duration, src, extra_checks = can_zip))
|
||||
user.balloon_alert(user, "zip failed!")
|
||||
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
|
||||
balloon_alert(user, "zipped")
|
||||
@@ -622,14 +630,25 @@
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie
|
||||
name = "tactical duffel bag" //SKYRAT EDIT CHANGE, was "suspicious-looking duffel bag". It's just a black duffel.
|
||||
desc = "A large duffel bag for holding extra tactical supplies."
|
||||
name = "suspicious looking duffel bag"
|
||||
desc = "A large duffel bag for holding extra tactical supplies. It contains an oiled plastitanium zipper for maximum speed tactical zipping, and is better balanced on your back than an average duffelbag. Can hold two bulky items!"
|
||||
icon_state = "duffel-syndie"
|
||||
inhand_icon_state = "duffel-syndieammo"
|
||||
storage_type = /datum/storage/duffel/syndicate
|
||||
resistance_flags = FIRE_PROOF
|
||||
special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT ADDITION
|
||||
special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials." // SKYRAT EDIT ADDITION
|
||||
// Less slowdown while unzipped. Still bulky, but it won't halve your movement speed in an active combat situation.
|
||||
zip_slowdown = 0.3
|
||||
// Faster unzipping. Utilizes the same noise as zipping up to fit the unzip duration.
|
||||
unzip_duration = 0.5 SECONDS
|
||||
unzip_sfx = 'sound/items/zip_up.ogg'
|
||||
|
||||
//SKYRAT EDIT CHANGE START - It's just a black duffel.
|
||||
/obj/item/storage/backpack/duffelbag/syndie
|
||||
name = "tactical duffel bag"
|
||||
desc = "A large duffel bag for holding extra tactical supplies."
|
||||
special_desc_requirement = EXAMINE_CHECK_SYNDICATE
|
||||
special_desc = "This duffel bag has the Syndicate logo stiched on the inside. It appears to be made from lighter yet sturdier materials, and features an oiled plastitanium zipper for maximum speed tactical zipping."
|
||||
//SKYRAT EDIT CHANGE END
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/hitman
|
||||
desc = "A large duffel bag for holding extra things. There is a Nanotrasen logo on the back."
|
||||
@@ -666,7 +685,6 @@
|
||||
new /obj/item/cautery/advanced(src)
|
||||
new /obj/item/surgical_drapes(src)
|
||||
new /obj/item/reagent_containers/medigel/sterilizine(src)
|
||||
new /obj/item/surgicaldrill(src)
|
||||
new /obj/item/bonesetter(src)
|
||||
new /obj/item/blood_filter(src)
|
||||
new /obj/item/stack/medical/bone_gel(src)
|
||||
@@ -746,7 +764,7 @@
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
|
||||
new /obj/item/mod/module/magboot(src)
|
||||
new /obj/item/storage/medkit/tactical(src)
|
||||
new /obj/item/storage/medkit/tactical/premium(src)
|
||||
new /obj/item/gun/ballistic/automatic/l6_saw/toy(src)
|
||||
new /obj/item/ammo_box/foambox/riot(src)
|
||||
|
||||
|
||||
@@ -19,7 +19,61 @@
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
var/empty = FALSE
|
||||
var/damagetype_healed //defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses
|
||||
/// Defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses
|
||||
var/damagetype_healed
|
||||
/// you just type this in holdables list of medkits instead of copypasting bunch of text.
|
||||
var/static/list/list_of_everything_medkits_can_hold = list(
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/reagent_containers/cup/beaker,
|
||||
/obj/item/reagent_containers/cup/bottle,
|
||||
/obj/item/reagent_containers/cup/tube,
|
||||
/obj/item/reagent_containers/pill,
|
||||
/obj/item/reagent_containers/syringe,
|
||||
/obj/item/reagent_containers/medigel,
|
||||
/obj/item/reagent_containers/spray,
|
||||
/obj/item/lighter,
|
||||
/obj/item/storage/fancy/cigarettes,
|
||||
/obj/item/storage/pill_bottle,
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/flashlight/pen,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/reagent_containers/hypospray,
|
||||
/obj/item/sensor_device,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/lazarus_injector,
|
||||
/obj/item/bikehorn/rubberducky,
|
||||
/obj/item/clothing/mask/surgical,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/mask/breath/medical,
|
||||
/obj/item/surgical_drapes,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/circular_saw,
|
||||
/obj/item/bonesetter,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/retractor,
|
||||
/obj/item/cautery,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/blood_filter,
|
||||
/obj/item/shears,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/clothing/neck/stethoscope,
|
||||
/obj/item/stamp,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/wrench/medical,
|
||||
/obj/item/clothing/mask/muzzle,
|
||||
/obj/item/reagent_containers/blood,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/gun/syringe/syndicate,
|
||||
/obj/item/implantcase,
|
||||
/obj/item/implant,
|
||||
/obj/item/implanter,
|
||||
/obj/item/pinpointer/crew,
|
||||
/obj/item/holosign_creator/medical,
|
||||
/obj/item/stack/sticky_tape,
|
||||
)
|
||||
|
||||
/obj/item/storage/medkit/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -76,58 +130,7 @@
|
||||
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL //holds the same equipment as a medibelt
|
||||
atom_storage.max_slots = 12
|
||||
atom_storage.max_total_storage = 24
|
||||
atom_storage.set_holdable(list(
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/reagent_containers/cup/beaker,
|
||||
/obj/item/reagent_containers/cup/bottle,
|
||||
/obj/item/reagent_containers/cup/tube,
|
||||
/obj/item/reagent_containers/pill,
|
||||
/obj/item/reagent_containers/syringe,
|
||||
/obj/item/reagent_containers/medigel,
|
||||
/obj/item/reagent_containers/spray,
|
||||
/obj/item/lighter,
|
||||
/obj/item/storage/fancy/cigarettes,
|
||||
/obj/item/storage/pill_bottle,
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/flashlight/pen,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/reagent_containers/hypospray,
|
||||
/obj/item/sensor_device,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves/,
|
||||
/obj/item/lazarus_injector,
|
||||
/obj/item/bikehorn/rubberducky,
|
||||
/obj/item/clothing/mask/surgical,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/clothing/mask/breath/medical,
|
||||
/obj/item/surgical_drapes, //for true paramedics
|
||||
/obj/item/scalpel,
|
||||
/obj/item/circular_saw,
|
||||
/obj/item/bonesetter,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/retractor,
|
||||
/obj/item/cautery,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/blood_filter,
|
||||
/obj/item/shears,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/clothing/neck/stethoscope,
|
||||
/obj/item/stamp,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/wrench/medical,
|
||||
/obj/item/clothing/mask/muzzle,
|
||||
/obj/item/reagent_containers/blood,
|
||||
/obj/item/tank/internals/emergency_oxygen,
|
||||
/obj/item/gun/syringe/syndicate,
|
||||
/obj/item/implantcase,
|
||||
/obj/item/implant,
|
||||
/obj/item/implanter,
|
||||
/obj/item/pinpointer/crew,
|
||||
/obj/item/holosign_creator/medical,
|
||||
/obj/item/stack/sticky_tape, //surgical tape
|
||||
))
|
||||
atom_storage.set_holdable(list_of_everything_medkits_can_hold)
|
||||
|
||||
/obj/item/storage/medkit/surgery/PopulateContents()
|
||||
if(empty)
|
||||
@@ -283,8 +286,9 @@
|
||||
/obj/item/storage/medkit/tactical/Initialize(mapload)
|
||||
. = ..()
|
||||
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
|
||||
atom_storage.max_slots = 12
|
||||
atom_storage.max_slots = 21
|
||||
atom_storage.max_total_storage = 24
|
||||
atom_storage.set_holdable(list_of_everything_medkits_can_hold)
|
||||
|
||||
/obj/item/storage/medkit/tactical/PopulateContents()
|
||||
if(empty)
|
||||
@@ -311,6 +315,14 @@
|
||||
desc = "May or may not contain traces of lead."
|
||||
grind_results = list(/datum/reagent/lead = 10)
|
||||
|
||||
/obj/item/storage/medkit/tactical/premium/Initialize(mapload)
|
||||
. = ..()
|
||||
atom_storage.allow_big_nesting = TRUE // so you can put back the box you took out
|
||||
atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL
|
||||
atom_storage.max_slots = 21
|
||||
atom_storage.max_total_storage = 34
|
||||
atom_storage.set_holdable(list_of_everything_medkits_can_hold)
|
||||
|
||||
/obj/item/storage/medkit/tactical/premium/PopulateContents()
|
||||
if(empty)
|
||||
return
|
||||
@@ -333,6 +345,7 @@
|
||||
/obj/item/clothing/glasses/hud/health/night/science = 1,
|
||||
)
|
||||
generate_items_inside(items_inside,src)
|
||||
list_of_everything_medkits_can_hold += items_inside
|
||||
|
||||
/obj/item/storage/medkit/coroner
|
||||
name = "compact coroner's medkit"
|
||||
|
||||
@@ -187,7 +187,7 @@ GLOBAL_LIST_INIT(mystery_box_extended, list(
|
||||
if(grant_extra_mag && istype(instantiated_gun, /obj/item/gun/ballistic))
|
||||
var/obj/item/gun/ballistic/instantiated_ballistic = instantiated_gun
|
||||
if(!instantiated_ballistic.internal_magazine)
|
||||
var/obj/item/ammo_box/magazine/extra_mag = new instantiated_ballistic.mag_type(loc)
|
||||
var/obj/item/ammo_box/magazine/extra_mag = new instantiated_ballistic.spawn_magazine_type(loc)
|
||||
user.put_in_hands(extra_mag)
|
||||
|
||||
user.visible_message(span_notice("[user] takes [presented_item] from [src]."), span_notice("You take [presented_item] from [src]."), vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
|
||||
if(result == "Clear")
|
||||
port.event_list.Cut()
|
||||
log_admin("[key_name_admin(usr)] has cleared the shuttle events on: [port]")
|
||||
message_admins("[key_name_admin(usr)] has cleared the shuttle events on: [port]")
|
||||
else if(options[result])
|
||||
var/typepath = options[result]
|
||||
if(typepath in active)
|
||||
port.event_list.Remove(active[options[result]])
|
||||
log_admin("[key_name_admin(usr)] has removed '[active[result]]' from [port].")
|
||||
message_admins("[key_name_admin(usr)] has removed '[active[result]]' from [port].")
|
||||
else
|
||||
port.event_list.Add(new typepath (port))
|
||||
log_admin("[key_name_admin(usr)] has added '[typepath]' to [port].")
|
||||
message_admins("[key_name_admin(usr)] has added '[typepath]' to [port].")
|
||||
|
||||
@@ -64,13 +64,11 @@
|
||||
. = ..()
|
||||
|
||||
create_storage(storage_type = /datum/storage/pockets/shoes)
|
||||
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
bananium.insert_amount_mat(BANANA_SHOES_MAX_CHARGE, /datum/material/bananium)
|
||||
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/process(seconds_per_tick)
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
var/bananium_amount = bananium.get_material_amount(/datum/material/bananium)
|
||||
if(bananium_amount < BANANA_SHOES_MAX_CHARGE)
|
||||
bananium.insert_amount_mat(min(BANANA_SHOES_RECHARGE_RATE * seconds_per_tick, BANANA_SHOES_MAX_CHARGE - bananium_amount), /datum/material/bananium)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
icon_state = "moistprime"
|
||||
inhand_icon_state = "moistprime"
|
||||
worn_icon_state = "moistprime"
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter
|
||||
fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
|
||||
|
||||
/obj/item/gun/ballistic/rifle/lionhunter/Initialize(mapload)
|
||||
|
||||
@@ -113,7 +113,6 @@
|
||||
gloves = null
|
||||
head = /obj/item/clothing/head/costume/irs
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
ears = /obj/item/radio/headset/syndicate
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
|
||||
/datum/outfit/pirate/irs/auditor
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/traitor_objective/target_player/kidnapping
|
||||
name = "Kidnap %TARGET% the %JOB TITLE% and deliver them to %AREA%"
|
||||
description = "%TARGET% holds extremely important information regarding secret NT projects - and you'll need to kidnap and deliver them to %AREA%, where our transport pod will be waiting. \
|
||||
You'll get additional reward if %TARGET% is delivered alive."
|
||||
If %TARGET% is delivered alive, you will be rewarded with an additional %TC% telecrystals."
|
||||
|
||||
abstract_type = /datum/traitor_objective/target_player/kidnapping
|
||||
|
||||
@@ -168,6 +168,7 @@
|
||||
replace_in_name("%TARGET%", target_mind.name)
|
||||
replace_in_name("%JOB TITLE%", target_mind.assigned_role.title)
|
||||
replace_in_name("%AREA%", initial(dropoff_area.name))
|
||||
replace_in_name("%TC%", alive_bonus)
|
||||
return TRUE
|
||||
|
||||
/datum/traitor_objective/target_player/kidnapping/ungenerate_objective()
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
// LASER RIFLE
|
||||
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle
|
||||
desc = "This looks like it could really hurt in melee."
|
||||
force = 50
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
@@ -70,7 +70,7 @@
|
||||
inhand_icon_state = "shotgun_combat"
|
||||
worn_icon_state = "gun"
|
||||
slot_flags = null
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun
|
||||
empty_indicator = TRUE
|
||||
fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg'
|
||||
semi_auto = TRUE
|
||||
@@ -103,7 +103,7 @@
|
||||
name = "designated marksman rifle"
|
||||
icon_state = "ctfmarksman"
|
||||
inhand_icon_state = "ctfmarksman"
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman
|
||||
fire_delay = 1 SECONDS
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/marksman
|
||||
@@ -125,7 +125,7 @@
|
||||
/obj/item/gun/ballistic/automatic/pistol/deagle/ctf
|
||||
desc = "This looks like it could really hurt in melee."
|
||||
force = 75
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/deagle
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/deagle
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
// Rifle
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/red
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/red
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/red
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/rifle/red
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/red
|
||||
@@ -252,7 +252,7 @@
|
||||
|
||||
// Shotgun
|
||||
/obj/item/gun/ballistic/shotgun/ctf/red
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/red
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/red
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/shotgun/red
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/red
|
||||
@@ -268,7 +268,7 @@
|
||||
|
||||
// DMR
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/marksman/red
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/red
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/red
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/marksman/red
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/red
|
||||
@@ -302,7 +302,7 @@
|
||||
|
||||
// Rifle
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/blue
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/blue
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/blue
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/rifle/blue
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/blue
|
||||
@@ -316,7 +316,7 @@
|
||||
|
||||
// Shotgun
|
||||
/obj/item/gun/ballistic/shotgun/ctf/blue
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/blue
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/blue
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/shotgun/blue
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/blue
|
||||
@@ -331,7 +331,7 @@
|
||||
|
||||
// DMR
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/marksman/blue
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/blue
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/blue
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/marksman/blue
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/blue
|
||||
@@ -361,7 +361,7 @@
|
||||
|
||||
// Rifle
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/green
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/green
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/green
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/rifle/green
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/green
|
||||
@@ -377,7 +377,7 @@
|
||||
|
||||
// Shotgun
|
||||
/obj/item/gun/ballistic/shotgun/ctf/green
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/green
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/green
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/shotgun/green
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/green
|
||||
@@ -393,7 +393,7 @@
|
||||
|
||||
// DMR
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/marksman/green
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/green
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/green
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/marksman/green
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/green
|
||||
@@ -427,7 +427,7 @@
|
||||
|
||||
// Rifle
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/yellow
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/yellow
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle/yellow
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/rifle/yellow
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/rifle/yellow
|
||||
@@ -443,7 +443,7 @@
|
||||
|
||||
// Shotgun
|
||||
/obj/item/gun/ballistic/shotgun/ctf/yellow
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun/yellow
|
||||
@@ -459,7 +459,7 @@
|
||||
|
||||
// DMR
|
||||
/obj/item/gun/ballistic/automatic/laser/ctf/marksman/yellow
|
||||
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow
|
||||
accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow
|
||||
ammo_type = /obj/item/ammo_casing/laser/ctf/marksman/yellow
|
||||
|
||||
@@ -980,7 +980,7 @@
|
||||
|
||||
if(istype(gun_to_set, /obj/item/gun/ballistic))
|
||||
var/obj/item/gun/ballistic/ball_gun = gun_to_set
|
||||
var/obj/item/ammo_box/ball_ammo = new ball_gun.mag_type(gun_to_set)
|
||||
var/obj/item/ammo_box/ball_ammo = new ball_gun.spawn_magazine_type(gun_to_set)
|
||||
qdel(ball_gun)
|
||||
|
||||
if(!istype(ball_ammo) || !ball_ammo.ammo_type)
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/marine/pmc
|
||||
icon_state = "marine"
|
||||
desc = "A tactical black helmet, designed to protect one's head and not much else."
|
||||
desc = "A tactical black helmet, designed to protect one's head from various injuries sustained in operations. Its stellar survivability making up is for it's lack of space worthiness"
|
||||
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
|
||||
clothing_flags = null
|
||||
|
||||
@@ -13,16 +13,22 @@
|
||||
var/material_per_banana =SMALL_MATERIAL_AMOUNT
|
||||
/// Typepath of created banana
|
||||
var/banana_type = /obj/item/grown/bananapeel/specialpeel
|
||||
/// Material container for bananium
|
||||
var/datum/component/material_container/bananium
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
AddComponent(/datum/component/material_container, list(/datum/material/bananium), 100 * SHEET_MATERIAL_AMOUNT, MATCONTAINER_EXAMINE|MATCONTAINER_ANY_INTENT|MATCONTAINER_SILENT, allowed_items=/obj/item/stack)
|
||||
bananium = AddComponent(/datum/component/material_container, list(/datum/material/bananium), 100 * SHEET_MATERIAL_AMOUNT, MATCONTAINER_EXAMINE|MATCONTAINER_ANY_INTENT|MATCONTAINER_SILENT, allowed_items=/obj/item/stack)
|
||||
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75, falloff_exponent = 20)
|
||||
RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, PROC_REF(on_step))
|
||||
if(always_noslip)
|
||||
LAZYOR(clothing_traits, TRAIT_NO_SLIP_WATER)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/Destroy()
|
||||
bananium = null
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/proc/toggle_clowning_action()
|
||||
on = !on
|
||||
update_appearance()
|
||||
@@ -38,7 +44,6 @@
|
||||
SIGNAL_HANDLER
|
||||
|
||||
var/mob/wearer = loc
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
if(!on || !istype(wearer))
|
||||
return
|
||||
|
||||
@@ -50,7 +55,6 @@
|
||||
to_chat(wearer, span_warning("You ran out of bananium!"))
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user)
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
var/sheet_amount = bananium.retrieve_all()
|
||||
if(sheet_amount)
|
||||
to_chat(user, span_notice("You retrieve [sheet_amount] sheets of bananium from the prototype shoes."))
|
||||
@@ -62,7 +66,6 @@
|
||||
. += span_notice("The shoes are [on ? "enabled" : "disabled"].")
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user)
|
||||
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
|
||||
if(bananium.get_material_amount(/datum/material/bananium) >= material_per_banana)
|
||||
toggle_clowning_action()
|
||||
to_chat(user, span_notice("You [on ? "activate" : "deactivate"] the prototype shoes."))
|
||||
|
||||
@@ -93,10 +93,11 @@
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/marine/pmc
|
||||
desc = "A set of the finest mass produced, stamped plasteel armor plates, for an all-around door-kicking and ass-smashing."
|
||||
desc = "A set of the finest mass produced, stamped plasteel armor plates, for an all-around door-kicking and ass-smashing. Its stellar survivability making up is for it's lack of space worthiness"
|
||||
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
|
||||
clothing_flags = THICKMATERIAL
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armor_type = /datum/armor/pmc
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/old
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
/obj/item/food/burger/plain = 25,
|
||||
/obj/item/food/burger/cheese = 15,
|
||||
/obj/item/food/burger/superbite = 1,
|
||||
/obj/item/food/butter/on_a_stick = 8,
|
||||
/obj/item/food/fries = 10,
|
||||
/obj/item/food/cheesyfries = 6,
|
||||
/obj/item/food/pie/applepie = 4,
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
/// List of family heirlooms this job can get with the family heirloom quirk. List of types.
|
||||
var/list/family_heirlooms
|
||||
|
||||
/// All values = (JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN)
|
||||
/// All values = (JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_CANNOT_OPEN_SLOTS)
|
||||
var/job_flags = NONE
|
||||
|
||||
/// Multiplier for general usage of the voice of god.
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
/// custom ringtone for this job
|
||||
var/job_tone
|
||||
|
||||
|
||||
/// Minimal character age for this job
|
||||
var/required_character_age
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/datum/job_department/silicon,
|
||||
)
|
||||
random_spawns_possible = FALSE
|
||||
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT
|
||||
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
var/do_special_check = TRUE
|
||||
config_tag = "AI"
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ Assistant
|
||||
/obj/item/crowbar/large = 1
|
||||
)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
rpg_title = "Lout"
|
||||
config_tag = "ASSISTANT"
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/obj/item/grenade/gas_crystal/nitrous_oxide_crystal = 5,
|
||||
)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
rpg_title = "Aeromancer"
|
||||
|
||||
/datum/outfit/job/atmos
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
/obj/item/stack/sheet/mineral/uranium = 10,
|
||||
)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
rpg_title = "Tavernkeeper"
|
||||
|
||||
/datum/job/bartender/award_service(client/winner, award)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/item/food/monkeycube/bee = 2
|
||||
)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
rpg_title = "Gardener"
|
||||
|
||||
/datum/outfit/job/botanist
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
/obj/item/skillchip/sabrage = 5,
|
||||
)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
rpg_title = "Star Duke"
|
||||
|
||||
voice_of_god_power = 1.4 //Command staff has authority
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/obj/item/gun/ballistic/automatic/wt550 = 1,
|
||||
)
|
||||
rpg_title = "Merchantman"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/cargo_tech
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/toy/plush/ratplush = 1
|
||||
)
|
||||
rpg_title = "Paladin"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
voice_of_god_power = 2 //Chaplains are very good at speaking with the voice of god
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/obj/item/paper/secretrecipe = 1
|
||||
)
|
||||
rpg_title = "Alchemist"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/chemist
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
/obj/effect/spawner/random/engineering/tool_advanced = 3
|
||||
)
|
||||
rpg_title = "Head Crystallomancer"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
voice_of_god_power = 1.4 //Command staff has authority
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
)
|
||||
family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom, /obj/item/scalpel, /obj/item/hemostat, /obj/item/circular_saw, /obj/item/retractor, /obj/item/cautery)
|
||||
rpg_title = "High Cleric"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
voice_of_god_power = 1.4 //Command staff has authority
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/bikehorn/golden)
|
||||
rpg_title = "Jester"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
job_tone = "honk"
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
)
|
||||
|
||||
rpg_title = "Tavern Chef"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
/datum/job/cook/award_service(client/winner, award)
|
||||
winner.give_award(award, winner.mob)
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock, /obj/item/shovel, /obj/item/storage/fancy/pickles_jar)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
rpg_title = "Undertaker"
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/pen/fountain, /obj/item/storage/dice)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
voice_of_god_silence_power = 3
|
||||
rpg_title = "Veteran Adventurer"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/datum/job_department/silicon,
|
||||
)
|
||||
random_spawns_possible = FALSE
|
||||
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK
|
||||
job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
|
||||
/datum/job/cyborg/after_spawn(mob/living/spawned, client/player_client)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/reagent_containers/cup/glass/bottle/whiskey)
|
||||
rpg_title = "Thiefcatcher" //I guess they caught them all rip thief...
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
job_tone = "objection"
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/clothing/under/shorts/purple)
|
||||
rpg_title = "Genemancer"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/geneticist
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
faction = FACTION_STATION
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = SUPERVISOR_HOP
|
||||
supervisors = SUPERVISOR_CAPTAIN
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_requirements = 180
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/reagent_containers/cup/glass/trophy/silver_cup)
|
||||
rpg_title = "Guild Questgiver"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
voice_of_god_power = 1.4 //Command staff has authority
|
||||
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/book/manual/wiki/security_space_law)
|
||||
rpg_title = "Guard Leader"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
voice_of_god_power = 1.4 //Command staff has authority
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/lightreplacer = 10
|
||||
)
|
||||
rpg_title = "Groundskeeper"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
job_tone = "slip"
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
rpg_title = "Magistrate"
|
||||
family_heirlooms = list(/obj/item/gavelhammer, /obj/item/book/manual/wiki/security_space_law)
|
||||
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
job_tone = "objection"
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/effect/spawner/random/medical/memeorgans = 1
|
||||
)
|
||||
rpg_title = "Cleric"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/doctor
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
/obj/item/book/granter/action/spell/mime/mimery = 1,
|
||||
)
|
||||
rpg_title = "Fool"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
voice_of_god_power = 0.5 //Why are you speaking
|
||||
voice_of_god_silence_power = 3
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/obj/item/reagent_containers/hypospray/medipen/survival/luxury = 5
|
||||
)
|
||||
rpg_title = "Corpse Runner"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/paramedic
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/pen/blue)
|
||||
rpg_title = "Defeated Miniboss"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
/datum/job/prisoner/New()
|
||||
. = ..()
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/gun/syringe = 1
|
||||
)
|
||||
rpg_title = "Snake Oil Salesman"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/psychologist
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/obj/item/circuitboard/machine/emitter = 3
|
||||
)
|
||||
rpg_title = "Steward"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
ignore_human_authority = TRUE
|
||||
|
||||
/datum/outfit/job/quartermaster
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/toy/plush/slimeplushie)
|
||||
rpg_title = "Archmagister"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS
|
||||
|
||||
voice_of_god_power = 1.4 //Command staff has authority
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/toy/plush/pkplush)
|
||||
rpg_title = "Necromancer"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/job/roboticist/New()
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/obj/item/camera_bug = 1
|
||||
)
|
||||
rpg_title = "Thaumaturgist"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
job_tone = "boom"
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
/obj/item/melee/baton/security/boomerang/loaded = 1
|
||||
)
|
||||
rpg_title = "Guard"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
family_heirlooms = list(/obj/item/pickaxe/mini, /obj/item/shovel)
|
||||
rpg_title = "Adventurer"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/miner
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/item/clothing/head/utility/hardhat/red/upgraded = 1
|
||||
)
|
||||
rpg_title = "Crystallomancer"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/engineer
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/item/stack/sheet/mineral/uranium = 5,
|
||||
)
|
||||
rpg_title = "Plague Doctor"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
job_flags = STATION_JOB_FLAGS
|
||||
|
||||
|
||||
/datum/outfit/job/virologist
|
||||
|
||||
@@ -40,8 +40,7 @@
|
||||
/obj/item/storage/box/rubbershot = 10
|
||||
)
|
||||
rpg_title = "Jailor"
|
||||
job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN
|
||||
|
||||
job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT
|
||||
|
||||
/datum/outfit/job/warden
|
||||
name = "Warden"
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
#define CAN_USE_ON_OTHERS (1<<0)
|
||||
///Flag that decides whether the Mafia ability can be used on themselves.
|
||||
#define CAN_USE_ON_SELF (1<<1)
|
||||
///Flag that decides whether the Mafia ability can be used on dead players. This overwrites the first two, and only allows for dead.
|
||||
///Flag that decides whether the Mafia ability can be used on dead players.
|
||||
#define CAN_USE_ON_DEAD (1<<2)
|
||||
|
||||
#define MAFIA_PHASE_SETUP "No Game"
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
return FALSE
|
||||
|
||||
if(potential_target)
|
||||
if(!(use_flags & CAN_USE_ON_DEAD) && (potential_target.game_status == MAFIA_DEAD))
|
||||
if((use_flags & CAN_USE_ON_DEAD) && (potential_target.game_status != MAFIA_DEAD))
|
||||
if(!silent)
|
||||
to_chat(host_role.body, span_notice("This can only be used on dead players."))
|
||||
return FALSE
|
||||
|
||||
@@ -136,6 +136,8 @@
|
||||
var/datum/techweb/stored_research
|
||||
///Proximity monitor associated with this atom, needed for proximity checks.
|
||||
var/datum/proximity_monitor/proximity_monitor
|
||||
///Material container for materials
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -152,13 +154,20 @@
|
||||
/datum/material/titanium,
|
||||
/datum/material/bluespace,
|
||||
)
|
||||
AddComponent(/datum/component/material_container, allowed_materials, INFINITY, MATCONTAINER_EXAMINE|BREAKDOWN_FLAGS_ORE_PROCESSOR, allowed_items=/obj/item/stack)
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
allowed_materials, \
|
||||
INFINITY, \
|
||||
MATCONTAINER_EXAMINE | BREAKDOWN_FLAGS_ORE_PROCESSOR, \
|
||||
allowed_items = /obj/item/stack \
|
||||
)
|
||||
if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter])
|
||||
GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter] = new /datum/techweb/autounlocking/smelter
|
||||
stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter]
|
||||
selected_material = GET_MATERIAL_REF(/datum/material/iron)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Destroy()
|
||||
materials = null
|
||||
mineral_machine = null
|
||||
stored_research = null
|
||||
return ..()
|
||||
@@ -166,7 +175,6 @@
|
||||
/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O)
|
||||
if(QDELETED(O))
|
||||
return
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/material_amount = materials.get_item_material_amount(O, BREAKDOWN_FLAGS_ORE_PROCESSOR)
|
||||
if(!materials.has_space(material_amount))
|
||||
unload_mineral(O)
|
||||
@@ -177,7 +185,6 @@
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/get_machine_data()
|
||||
var/dat = "<b>Smelter control console</b><br><br>"
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
for(var/datum/material/all_materials as anything in materials.materials)
|
||||
var/amount = materials.materials[all_materials]
|
||||
dat += "<span class=\"res_name\">[all_materials.name]: </span>[amount] cm³"
|
||||
@@ -231,7 +238,6 @@
|
||||
mineral_machine.updateUsrDialog()
|
||||
|
||||
/obj/machinery/mineral/processing_unit/proc/smelt_ore(seconds_per_tick = 2)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/datum/material/mat = selected_material
|
||||
if(!mat)
|
||||
return
|
||||
@@ -254,8 +260,7 @@
|
||||
on = FALSE
|
||||
return
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.use_materials(alloy.materials, amount)
|
||||
materials.use_materials(alloy.materials, multiplier = amount)
|
||||
|
||||
generate_mineral(alloy.build_path)
|
||||
|
||||
@@ -265,8 +270,6 @@
|
||||
|
||||
var/build_amount = SMELT_AMOUNT * seconds_per_tick
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
for(var/mat_cat in D.materials)
|
||||
var/required_amount = D.materials[mat_cat]
|
||||
var/amount = materials.materials[mat_cat]
|
||||
@@ -279,9 +282,4 @@
|
||||
var/O = new P(src)
|
||||
unload_mineral(O)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/on_deconstruction()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.retrieve_all()
|
||||
return ..()
|
||||
|
||||
#undef SMELT_AMOUNT
|
||||
|
||||
@@ -52,7 +52,11 @@
|
||||
if(!GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter])
|
||||
GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter] = new /datum/techweb/autounlocking/smelter
|
||||
stored_research = GLOB.autounlock_techwebs[/datum/techweb/autounlocking/smelter]
|
||||
materials = AddComponent(/datum/component/remote_materials, "orm", mapload, mat_container_flags=BREAKDOWN_FLAGS_ORM)
|
||||
materials = AddComponent(
|
||||
/datum/component/remote_materials, \
|
||||
mapload, \
|
||||
mat_container_flags = BREAKDOWN_FLAGS_ORM \
|
||||
)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/Destroy()
|
||||
stored_research = null
|
||||
@@ -375,7 +379,7 @@
|
||||
var/amount = round(min(text2num(params["sheets"]), 50, can_smelt_alloy(alloy)))
|
||||
if(amount < 1) //no negative mats
|
||||
return
|
||||
mat_container.use_materials(alloy.materials, amount)
|
||||
mat_container.use_materials(alloy.materials, multiplier = amount)
|
||||
materials.silo_log(src, "released", -amount, "sheets", alloy.materials)
|
||||
var/output
|
||||
if(ispath(alloy.build_path, /obj/item/stack/sheet))
|
||||
|
||||
@@ -15,6 +15,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
var/list/holds = list()
|
||||
/// List of all components that are sharing ores with this silo.
|
||||
var/list/datum/component/remote_materials/ore_connected_machines = list()
|
||||
/// Material Container
|
||||
var/datum/component/material_container/materials
|
||||
|
||||
/obj/machinery/ore_silo/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -31,7 +33,13 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
/datum/material/bluespace,
|
||||
/datum/material/plastic,
|
||||
)
|
||||
AddComponent(/datum/component/material_container, materials_list, INFINITY, MATCONTAINER_NO_INSERT, allowed_items=/obj/item/stack)
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
materials_list, \
|
||||
INFINITY, \
|
||||
MATCONTAINER_NO_INSERT, \
|
||||
allowed_items = /obj/item/stack \
|
||||
)
|
||||
if (!GLOB.ore_silo_default && mapload && is_station_level(z))
|
||||
GLOB.ore_silo_default = src
|
||||
|
||||
@@ -43,15 +51,11 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
mats.disconnect_from(src)
|
||||
|
||||
ore_connected_machines = null
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.retrieve_all()
|
||||
materials = null
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/ore_silo/proc/remote_attackby(obj/machinery/M, mob/living/user, obj/item/stack/I, breakdown_flags=NONE)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
// stolen from /datum/component/material_container/proc/OnAttackBy
|
||||
if(user.combat_mode)
|
||||
return
|
||||
if(I.item_flags & ABSTRACT)
|
||||
@@ -92,7 +96,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/ore_silo/proc/generate_ui()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/list/ui = list("<head><title>Ore Silo</title></head><body><div class='statusDisplay'><h2>Stored Material:</h2>")
|
||||
var/any = FALSE
|
||||
for(var/M in materials.materials)
|
||||
@@ -166,7 +169,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
return TRUE
|
||||
else if(href_list["ejectsheet"])
|
||||
var/datum/material/eject_sheet = locate(href_list["ejectsheet"])
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/count = materials.retrieve_sheets(text2num(href_list["eject_amt"]), eject_sheet, drop_location())
|
||||
var/list/matlist = list()
|
||||
matlist[eject_sheet] = SHEET_MATERIAL_AMOUNT * count
|
||||
|
||||
@@ -101,7 +101,12 @@
|
||||
/obj/machinery/mineral/stacking_machine/Initialize(mapload)
|
||||
. = ..()
|
||||
proximity_monitor = new(src, 1)
|
||||
materials = AddComponent(/datum/component/remote_materials, "stacking", mapload, FALSE, (mapload && force_connect))
|
||||
materials = AddComponent(
|
||||
/datum/component/remote_materials, \
|
||||
mapload, \
|
||||
FALSE, \
|
||||
(mapload && force_connect) \
|
||||
)
|
||||
|
||||
/obj/machinery/mineral/stacking_machine/Destroy()
|
||||
if(console)
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
if(handcuffed)
|
||||
var/mutable_appearance/handcuff_overlay = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
|
||||
if(handcuffed.blocks_emissive)
|
||||
if(handcuffed.blocks_emissive != EMISSIVE_BLOCK_NONE)
|
||||
handcuff_overlay += emissive_blocker(handcuff_overlay.icon, handcuff_overlay.icon_state, src, alpha = handcuff_overlay.alpha)
|
||||
|
||||
overlays_standing[HANDCUFF_LAYER] = handcuff_overlay
|
||||
@@ -86,7 +86,7 @@
|
||||
if(!itm_state)
|
||||
itm_state = l_hand.icon_state
|
||||
var/mutable_appearance/l_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_l", -HANDS_LAYER)
|
||||
if(l_hand.blocks_emissive)
|
||||
if(l_hand.blocks_emissive != EMISSIVE_BLOCK_NONE)
|
||||
l_hand_item.overlays += emissive_blocker(l_hand_item.icon, l_hand_item.icon_state, src, alpha = l_hand_item.alpha)
|
||||
hands += l_hand_item
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
if(!itm_state)
|
||||
itm_state = r_hand.icon_state
|
||||
var/mutable_appearance/r_hand_item = mutable_appearance(alt_inhands_file, "[itm_state][caste]_r", -HANDS_LAYER)
|
||||
if(r_hand.blocks_emissive)
|
||||
if(r_hand.blocks_emissive != EMISSIVE_BLOCK_NONE)
|
||||
r_hand_item.overlays += emissive_blocker(r_hand_item.icon, r_hand_item.icon_state, src, alpha = r_hand_item.alpha)
|
||||
hands += r_hand_item
|
||||
|
||||
|
||||
@@ -66,14 +66,17 @@
|
||||
else
|
||||
mode() // Activate held item
|
||||
|
||||
/mob/living/carbon/attackby(obj/item/I, mob/living/user, params)
|
||||
/mob/living/carbon/attackby(obj/item/item, mob/living/user, params)
|
||||
if(!all_wounds || !(!user.combat_mode || user == src))
|
||||
return ..()
|
||||
|
||||
if(can_perform_surgery(user, params))
|
||||
return TRUE
|
||||
|
||||
for(var/i in shuffle(all_wounds))
|
||||
var/datum/wound/W = i
|
||||
if(W.try_treating(I, user))
|
||||
return 1
|
||||
var/datum/wound/wound = i
|
||||
if(wound.try_treating(item, user))
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user