Merge remote-tracking branch 'skrat/master' into upstream-merge-branch

# Conflicts:
#	code/modules/research/machinery/_production.dm
This commit is contained in:
nevimer
2023-07-26 16:21:40 -04:00
223 changed files with 14819 additions and 13845 deletions
File diff suppressed because it is too large Load Diff
+2
View File
@@ -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" = (
+21 -74
View File
@@ -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)
+1 -3
View File
@@ -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" = (
+21 -33
View File
@@ -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
File diff suppressed because it is too large Load Diff
+282 -252
View File
@@ -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
+1
View File
@@ -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"
+5
View File
@@ -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"
+3
View File
@@ -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)
+11 -1
View File
@@ -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
+41
View File
@@ -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)
+10
View File
@@ -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"
+2 -10
View File
@@ -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
+3
View File
@@ -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]")
+1
View File
@@ -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
+2 -2
View File
@@ -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)
@@ -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
))
@@ -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
+9 -7
View File
@@ -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))
+7 -7
View File
@@ -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,
)
. = ..()
+19 -10
View File
@@ -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
+15
View File
@@ -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]"))
+36 -15
View File
@@ -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)
+1
View File
@@ -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
+72 -130
View File
@@ -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)
+24 -14
View File
@@ -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"
-1
View File
@@ -21,7 +21,6 @@
materials = AddComponent(
/datum/component/remote_materials, \
"charger", \
mapload, \
mat_container_flags = MATCONTAINER_NO_INSERT, \
)
+6 -2
View File
@@ -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()
+20 -5
View File
@@ -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)
+6
View File
@@ -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.
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"
+1
View File
@@ -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")
+13 -9
View File
@@ -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
+1 -1
View File
@@ -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."))
+29 -11
View File
@@ -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)
+67 -54
View File
@@ -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"
+1 -1
View File
@@ -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()
+16 -16
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+7 -4
View File
@@ -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."))
+2 -1
View File
@@ -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,
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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()
. = ..()
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -2
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+11 -13
View File
@@ -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&sup3;"
@@ -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
+6 -2
View File
@@ -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))
+10 -8
View File
@@ -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
+6 -1
View File
@@ -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
+7 -4
View File
@@ -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