diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
index f0f2d8a6c5..c47534925f 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
@@ -460,7 +460,7 @@
/area/ruin/powered/beach)
"cz" = (
/obj/effect/turf_decal/sand,
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered/beach)
"cR" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
index 408fe6ff1d..87137f7d14 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
@@ -896,7 +896,7 @@
/area/ruin/powered/clownplanet)
"dR" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/indestructible/sound{
icon_state = "bananium";
name = "bananium floor";
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
index de78fed108..ec1ce79bd8 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
@@ -809,7 +809,7 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cF" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ruin/powered/animal_hospital)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index aed9b30686..3cae12bfe1 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -1071,7 +1071,7 @@
/area/ruin/unpowered/ash_walkers)
"cE" = (
/obj/structure/stone_tile/surrounding/cracked,
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"cF" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
index 49ae2cb4f5..722cc92d78 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
@@ -275,7 +275,7 @@
},
/area/ruin/powered/snow_biodome)
"bS" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plating/asteroid/snow{
initial_gas_mix = "o2=22;n2=82;TEMP=180"
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
index ed4aee469d..875cfdc35d 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
@@ -163,7 +163,7 @@
/turf/open/floor/plasteel/cult{
initial_gas_mix = "o2=14;n2=23;TEMP=300"
},
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall/mineral/cult,
/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
index 66d7173097..773fc01f51 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
@@ -104,7 +104,7 @@
/turf/open/floor/plating,
/area/ruin/unpowered)
"r" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall/rust,
/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
index 0c40aa2881..ab1d5764e1 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
@@ -29,7 +29,7 @@
/turf/open/floor/engine/cult,
/area/ruin/unpowered)
"i" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/engine/cult,
/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
index 97b44df094..3b1c555805 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
@@ -85,7 +85,7 @@
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
"D" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/gluttony)
"R" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
index fa1e394751..c993ecbb63 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
@@ -285,7 +285,7 @@
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
"Y" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
index 3d67d7b474..c81c510b9e 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
@@ -123,7 +123,7 @@
/turf/open/floor/engine/cult,
/area/ruin/powered/greed)
"z" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/engine/cult,
/area/ruin/powered/greed)
"J" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
index 896f13b1bb..2749e39f1f 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
@@ -180,7 +180,7 @@
},
/area/ruin/powered)
"L" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plating/asteroid/basalt,
/area/ruin/powered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
index 44c41f5b85..f14495c95c 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
@@ -342,7 +342,7 @@
/area/ruin/unpowered)
"S" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/wood{
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface;
initial_gas_mix = "o2=14;n2=23;TEMP=300"
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
index b1dedc0cb3..38b5f5f64d 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
@@ -65,7 +65,7 @@
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
"u" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/mineral/silver,
/area/ruin/powered/pride)
"G" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
index cb2686fe89..01ac536230 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -262,7 +262,7 @@
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
"Z" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall/r_wall,
/area/ruin/powered/seedvault)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
index 89a8b50c39..5ae4227813 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
@@ -42,7 +42,7 @@
},
/area/ruin/unpowered)
"h" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/sepia{
blocks_air = 0;
slowdown = 10
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm
index 3392d60307..8d40c16d58 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm
@@ -169,7 +169,7 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"B" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall/mineral/titanium/survival/pod,
/area/ruin/powered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
index a794b58db8..3962947551 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
@@ -22,7 +22,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/unpowered)
"g" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall/mineral/plastitanium,
/area/ruin/unpowered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index be96830ca4..2893f3481f 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -1285,7 +1285,7 @@
},
/area/ruin/powered/syndicate_lava_base)
"dd" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plasteel/vault{
dir = 5
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
index 22d341c7df..0c4dd60fb8 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
@@ -105,7 +105,7 @@
"s" = (
/obj/structure/table/optable/abductor,
/obj/item/weapon/cautery/alien,
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plating/abductor{
initial_gas_mix = "o2=16;n2=23;TEMP=300"
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
index d139ee641b..fed94448d0 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
@@ -269,7 +269,7 @@
"W" = (
/obj/structure/alien/weeds,
/obj/structure/alien/resin/wall,
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/xenonest)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej
new file mode 100644
index 0000000000..365cc7fdda
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej
@@ -0,0 +1,10 @@
+diff a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm (rejected hunks)
+@@ -269,7 +269,7 @@
+ "W" = (
+ /obj/structure/alien/weeds,
+ /obj/structure/alien/resin/wall,
+-/obj/effect/baseturf_helper,
++/obj/effect/baseturf_helper/lava_land/surface,
+ /turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+ /area/ruin/unpowered/xenonest)
+
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 72f9a75ebd..d1014775e4 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -18280,7 +18280,7 @@
/area/security/prison)
"aLB" = (
/obj/structure/table,
-/obj/item/trash/deadmouse{
+/obj/item/weapon/reagent_containers/food/snacks/deadmouse{
pixel_y = 5
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -25012,6 +25012,10 @@
dir = 1;
icon_state = "pipe-c"
},
+/obj/structure/fireaxecabinet{
+ pixel_x = -32;
+ pixel_y = 0
+ },
/turf/open/floor/plasteel/caution{
icon_state = "caution";
dir = 8
@@ -29567,10 +29571,10 @@
"bgT" = (
/obj/machinery/computer/atmos_control/tank{
frequency = 1441;
- input_tag = "co2_in";
- name = "Carbon Dioxide Supply Control";
- output_tag = "co2_out";
- sensors = list("co2_sensor" = "Tank")
+ input_tag = "n2o_in";
+ name = "Nitrous Oxide Supply Control";
+ output_tag = "n2o_out";
+ sensors = list("n2o_sensor" = "Tank")
},
/obj/structure/window/reinforced{
dir = 8
@@ -138458,7 +138462,7 @@ aRf
aSV
aUs
aIU
-aIU
+aSV
aIU
aSV
aSV
diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index 4c00524717..9b97eef1d5 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -1,4 +1,4 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/closed/indestructible/riveted/boss,
/area/lavaland/surface/outdoors)
@@ -1241,6 +1241,7 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/circuit,
/area/mine/maintenance)
"dy" = (
@@ -3399,17 +3400,27 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"Wt" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall,
/area/mine/laborcamp/security)
"Wu" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/closed/wall,
/area/mine/laborcamp)
"Ww" = (
-/obj/effect/baseturf_helper,
+/obj/effect/baseturf_helper/lava_land/surface,
/turf/open/floor/plasteel,
/area/mine/living_quarters)
+"Wx" = (
+/obj/effect/baseturf_helper/lava_land/surface,
+/turf/open/floor/plasteel/brown{
+ dir = 4
+ },
+/area/mine/eva)
+"Wy" = (
+/obj/effect/baseturf_helper/lava_land/surface,
+/turf/open/floor/plasteel,
+/area/mine/production)
(1,1,1) = {"
aa
@@ -19057,7 +19068,7 @@ cI
cP
cn
bP
-bP
+Wy
bP
bP
eD
@@ -19570,7 +19581,7 @@ bf
cK
bq
bq
-dt
+br
bq
dV
el
@@ -20335,7 +20346,7 @@ bf
bp
bu
bI
-bW
+Wx
cr
bf
ad
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index b4b78673a1..62f613dbf5 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -21075,7 +21075,7 @@
"aTX" = (
/obj/structure/kitchenspike,
/obj/item/device/assembly/mousetrap,
-/obj/item/trash/deadmouse,
+/obj/item/weapon/reagent_containers/food/snacks/deadmouse,
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/kitchen)
"aTY" = (
@@ -28572,7 +28572,7 @@
d2 = 8;
icon_state = "2-8"
},
-/obj/item/trash/deadmouse,
+/obj/item/weapon/reagent_containers/food/snacks/deadmouse,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
@@ -39250,7 +39250,7 @@
/area/maintenance/department/engine)
"bGL" = (
/obj/structure/closet/masks,
-/obj/item/trash/deadmouse,
+/obj/item/weapon/reagent_containers/food/snacks/deadmouse,
/obj/effect/landmark/revenantspawn,
/turf/open/floor/plating,
/area/maintenance/department/engine)
diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
new file mode 100644
index 0000000000..2d6ba0d946
--- /dev/null
+++ b/code/__DEFINES/food.dm
@@ -0,0 +1,12 @@
+#define MEAT 1
+#define VEGETABLES 2
+#define RAW 4
+#define JUNKFOOD 8
+#define GRAIN 16
+#define FRUIT 32
+#define DAIRY 64
+#define FRIED 128
+#define ALCOHOL 256
+#define SUGAR 512
+#define GROSS 1024
+#define TOXIC 2048
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 4342766be7..cca88750b5 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -441,3 +441,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define BEAT_NONE 0
#define BEAT_CHANNEL 150
+
+//http://www.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
+#define MOUSE_OPACITY_TRANSPARENT 0
+#define MOUSE_OPACITY_ICON 1
+#define MOUSE_OPACITY_OPAQUE 2
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 2b0e8ee74a..bff067dce1 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -65,6 +65,12 @@
#define NUTRITION_LEVEL_HUNGRY 250
#define NUTRITION_LEVEL_STARVING 150
+//Disgust levels for humans
+#define DISGUST_LEVEL_MAXEDOUT 150
+#define DISGUST_LEVEL_DISGUSTED 75
+#define DISGUST_LEVEL_VERYGROSS 50
+#define DISGUST_LEVEL_GROSS 25
+
//Slime evolution threshold. Controls how fast slimes can split/grow
#define SLIME_EVOLUTION_THRESHOLD 10
diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm
index 4624c5914f..a4afa58a87 100644
--- a/code/__DEFINES/server_tools.dm
+++ b/code/__DEFINES/server_tools.dm
@@ -4,6 +4,9 @@
#define IRC_STATUS_THROTTLE 5
+#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
+ //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
+
//keep these in sync with TGS3
#define SERVICE_WORLD_PARAM "server_service"
#define SERVICE_PR_TEST_JSON "..\\..\\prtestjob.json"
@@ -17,7 +20,7 @@
#define SERVICE_CMD_NAME_CHECK "namecheck"
#define SERVICE_CMD_ADMIN_WHO "adminwho"
-//#define SERVICE_CMD_PARAM_KEY //defined in __compile_options.dm
+#define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
#define SERVICE_CMD_PARAM_COMMAND "command"
#define SERVICE_CMD_PARAM_MESSAGE "message"
#define SERVICE_CMD_PARAM_TARGET "target"
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 36a81e90e2..7df96c3da2 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -537,3 +537,18 @@
if(!istype(the_matrix) || the_matrix.len != 20)
return "#ffffffff"
return rgb(the_matrix[1]*255, the_matrix[6]*255, the_matrix[11]*255, the_matrix[16]*255)
+
+/proc/type2parent(child)
+ var/string_type = "[child]"
+ var/last_slash = findlasttext(string_type, "/")
+ if(last_slash == 1)
+ switch(child)
+ if(/datum)
+ return null
+ if(/obj || /mob)
+ return /atom/movable
+ if(/area || /turf)
+ return /atom
+ else
+ return /datum
+ return text2path(copytext(string_type, 1, last_slash))
\ No newline at end of file
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 964c956eca..a669f1b4f5 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -69,8 +69,6 @@
#error You need version 511 or higher
#endif
- #define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
-
//Update this whenever the db schema changes
//make sure you add an update to the schema_version stable in the db changelog
#define DB_MAJOR_VERSION 3
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 079873030d..037ae47d98 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -434,7 +434,7 @@
icon = 'icons/mob/screen_gen.dmi'
icon_state = "flash"
plane = CLICKCATCHER_PLANE
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
screen_loc = "CENTER"
/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 7, view_size_y = 7)
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index e1f1410837..69deb2cb58 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -92,7 +92,7 @@
icon_state = "default"
name = "Alert"
desc = "Something seems to have gone wrong with this alert, so report this bug please"
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
var/severity = 0
var/alerttooltipstyle = ""
@@ -166,6 +166,21 @@
desc = "You're severely malnourished. The hunger pains make moving around a chore."
icon_state = "starving"
+/obj/screen/alert/gross
+ name = "Grossed out."
+ desc = "That was kind of gross..."
+ icon_state = "gross"
+
+/obj/screen/alert/verygross
+ name = "Very grossed out."
+ desc = "I'm not feeling very well.."
+ icon_state = "gross2"
+
+/obj/screen/alert/disgusted
+ name = "DISGUSTED"
+ desc = "ABSOLUTELY DISGUSTIN'"
+ icon_state = "gross3"
+
/obj/screen/alert/hot
name = "Too Hot"
desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit."
diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index c3cc3851dc..d6dc5f8a0a 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -130,7 +130,7 @@
blobpwrdisplay.name = "blob power"
blobpwrdisplay.icon_state = "block"
blobpwrdisplay.screen_loc = ui_health
- blobpwrdisplay.mouse_opacity = 0
+ blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
blobpwrdisplay.layer = ABOVE_HUD_LAYER
blobpwrdisplay.plane = ABOVE_HUD_PLANE
infodisplay += blobpwrdisplay
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index 9031983875..6c18ad0e07 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -67,7 +67,7 @@
screen_loc = "CENTER-7,CENTER-7"
layer = FULLSCREEN_LAYER
plane = FULLSCREEN_PLANE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/severity = 0
var/show_when_dead = FALSE
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index 74f8761863..f364bac76f 100755
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -243,7 +243,7 @@
blend_mode = BLEND_ADD
plane = PLANE_SPACE_PARALLAX
screen_loc = "CENTER-7,CENTER-7"
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/parallax_layer/Initialize(mapload, view)
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index 33f35eab57..f0c56b84ac 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -26,13 +26,13 @@
name = "lighting plane master"
plane = LIGHTING_PLANE
blend_mode = BLEND_MULTIPLY
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/plane_master/parallax
name = "parallax plane master"
plane = PLANE_SPACE_PARALLAX
blend_mode = BLEND_MULTIPLY
- mouse_opacity = FALSE
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/plane_master/parallax_white
name = "parallax whitifier plane master"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 01b163f8da..13717b576f 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -33,7 +33,7 @@
/obj/screen/text
icon = null
icon_state = null
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
screen_loc = "CENTER-7,CENTER-7"
maptext_height = 480
maptext_width = 480
@@ -468,7 +468,7 @@
name = "dmg"
blend_mode = BLEND_MULTIPLY
screen_loc = "CENTER-7,CENTER-7"
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
layer = UI_DAMAGE_LAYER
plane = FULLSCREEN_PLANE
@@ -494,7 +494,7 @@
name = "blob health"
icon_state = "block"
screen_loc = ui_internal
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/healths/blob/naut
name = "health"
@@ -511,13 +511,13 @@
icon = 'icons/mob/guardian.dmi'
icon_state = "base"
screen_loc = ui_health
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/healths/clock
icon = 'icons/mob/actions.dmi'
icon_state = "bg_clock"
screen_loc = ui_health
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/healths/clock/gear
icon = 'icons/mob/clockwork_mobs.dmi'
@@ -529,13 +529,13 @@
icon = 'icons/mob/actions.dmi'
icon_state = "bg_revenant"
screen_loc = ui_health
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/healths/construct
icon = 'icons/mob/screen_construct.dmi'
icon_state = "artificer_health0"
screen_loc = ui_construct_health
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/screen/healthdoll
name = "health doll"
diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm
index cf47dab1da..6005758144 100644
--- a/code/citadel/cit_arousal.dm
+++ b/code/citadel/cit_arousal.dm
@@ -181,224 +181,364 @@
else
to_chat(src, "You aren't aroused enough for that.")
+
+//These are various procs that we'll use later, split up for readability instead of having one, huge proc.
+//For all of these, we assume the arguments given are proper and have been checked beforehand.
+/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral
+ var/total_fluids = 0
+ var/datum/reagents/fluid_source = null
+
+ if(G.producing) //Can it produce its own fluids, such as breasts?
+ fluid_source = G.reagents
+ else
+ if(!G.linked_organ)
+ to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.")
+ return
+ fluid_source = G.linked_organ.reagents
+ total_fluids = fluid_source.total_volume
+ if(mb_time)
+ src.visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \
+ "You start to [G.masturbation_verb] your [G.name].", \
+ "You start to [G.masturbation_verb] your [G.name].")
+
+ if(do_after(src, mb_time, target = src))
+ if(total_fluids > 5)
+ fluid_source.reaction(src.loc, TOUCH, 1, 0)
+ fluid_source.clear_reagents()
+ src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
+ "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
+ "You have relieved yourself.")
+ if(G.can_climax)
+ setArousalLoss(min_arousal)
+
+
+/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30) //This is used for forced orgasms and other hands-free climaxes
+ var/total_fluids = 0
+ var/datum/reagents/fluid_source = null
+ var/unable_to_come = FALSE
+
+ if(G.producing) //Can it produce its own fluids, such as breasts?
+ fluid_source = G.reagents
+ total_fluids = fluid_source.total_volume
+ else
+ if(!G.linked_organ)
+ unable_to_come = TRUE
+ else
+ fluid_source = G.linked_organ.reagents
+ total_fluids = fluid_source.total_volume
+
+ if(unable_to_come)
+ src.visible_message("[src] shudders, their [G.name] unable to cum.", \
+ "Your [G.name] cannot cum, giving no relief.", \
+ "Your [G.name] cannot cum, giving no relief.")
+ else
+ total_fluids = fluid_source.total_volume
+ if(mb_time) //as long as it's not instant, give a warning
+ src.visible_message("[src] looks like they're about to cum.", \
+ "You feel yourself about to orgasm.", \
+ "You feel yourself about to orgasm.")
+ if(do_after(src, mb_time, target = src))
+ if(total_fluids > 5)
+ fluid_source.reaction(src.loc, TOUCH, 1, 0)
+ fluid_source.clear_reagents()
+ src.visible_message("[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!", \
+ "You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].", \
+ "You climax using your [G.name].")
+ if(G.can_climax)
+ setArousalLoss(min_arousal)
+
+
+/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30) //Used for climaxing with any living thing
+ var/total_fluids = 0
+ var/datum/reagents/fluid_source = null
+
+ if(G.producing) //Can it produce its own fluids, such as breasts?
+ fluid_source = G.reagents
+ else
+ if(!G.linked_organ)
+ to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.")
+ return
+ fluid_source = G.linked_organ.reagents
+ total_fluids = fluid_source.total_volume
+ if(mb_time) //Skip warning if this is an instant climax.
+ src.visible_message("[src] is about to climax with [L]!", \
+ "You're about to climax with [L]!", \
+ "You're preparing to climax with someone!")
+ if(spillage)
+ if(do_after(src, mb_time, target = src) && in_range(src, L))
+ fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor)
+ total_fluids -= total_fluids*G.fluid_transfer_factor
+ if(total_fluids > 5)
+ fluid_source.reaction(L.loc, TOUCH, 1, 0)
+ fluid_source.clear_reagents()
+ src.visible_message("[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!", \
+ "You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].", \
+ "You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].")
+ if(G.can_climax)
+ setArousalLoss(min_arousal)
+ else //knots and other non-spilling orgasms
+ if(do_after(src, mb_time, target = src) && in_range(src, L))
+ fluid_source.trans_to(L, total_fluids)
+ total_fluids = 0
+ src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \
+ "You ejaculate with [L], your [G.name] spilling nothing.", \
+ "You have climaxed inside someone, your [G.name] spilling nothing.")
+ if(G.can_climax)
+ setArousalLoss(min_arousal)
+
+
+/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/weapon/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
+ var/total_fluids = 0
+ var/datum/reagents/fluid_source = null
+
+ if(G.producing) //Can it produce its own fluids, such as breasts?
+ fluid_source = G.reagents
+ else
+ if(!G.linked_organ)
+ to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.")
+ return
+ fluid_source = G.linked_organ.reagents
+ total_fluids = fluid_source.total_volume
+
+ //if(!container) //Something weird happened
+ // to_chat(src, "You need a container to do this!")
+ // return
+
+ src.visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \
+ "You start to [G.masturbation_verb] your [G.name] over [container].", \
+ "You start to [G.masturbation_verb] your [G.name] over something.")
+ if(do_after(src, mb_time, target = src) && in_range(src, container))
+ fluid_source.trans_to(container, total_fluids)
+ src.visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \
+ "You used your [G.name] to fill [container].", \
+ "You have relieved some pressure.")
+ if(G.can_climax)
+ setArousalLoss(min_arousal)
+
+/mob/living/carbon/human/proc/pick_masturbate_genitals()
+ var/obj/item/organ/genital/ret_organ
+ var/list/genitals_list = list()
+ var/list/worn_stuff = get_equipped_items()
+
+ for(var/obj/item/organ/genital/G in internal_organs)
+ if(G.can_masturbate_with) //filter out what you can't masturbate with
+ if(G.is_exposed(worn_stuff)) //Nude or through_clothing
+ genitals_list += G
+ if(genitals_list.len)
+ ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list
+ return ret_organ
+ return null //error stuff
+
+
+/mob/living/carbon/human/proc/pick_climax_genitals()
+ var/obj/item/organ/genital/ret_organ
+ var/list/genitals_list = list()
+ var/list/worn_stuff = get_equipped_items()
+
+ for(var/obj/item/organ/genital/G in internal_organs)
+ if(G.can_climax) //filter out what you can't masturbate with
+ if(G.is_exposed(worn_stuff)) //Nude or through_clothing
+ genitals_list += G
+ if(genitals_list.len)
+ ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list
+ return ret_organ
+ return null //error stuff
+
+
+/mob/living/carbon/human/proc/pick_partner()
+ var/list/partners = list()
+ if(src.pulling)
+ partners += src.pulling //Yes, even objects for now
+ if(src.pulledby)
+ partners += src.pulledby
+ //Now we got both of them, let's check if they're proper
+ for(var/I in partners)
+ if(isliving(I))
+ if(iscarbon(I))
+ var/mob/living/carbon/C = I
+ if(!C.exposed_genitals.len) //Nothing through_clothing
+ if(!C.is_groin_exposed()) //No pants undone
+ if(!C.is_chest_exposed()) //No chest exposed
+ partners -= I //Then not proper, remove them
+ else
+ partners -= I //No fucking objects
+ //NOW the list should only contain correct partners
+ if(!partners.len)
+ return null //No one left.
+ return input(src, "With whom?", "Sexual partner", null) in partners //pick one, default to null
+
+/mob/living/carbon/human/proc/pick_climax_container()
+ var/obj/item/weapon/reagent_containers/SC = null
+ var/list/containers_list = list()
+
+ for(var/obj/item/weapon/reagent_containers/container in held_items)
+ if(container.is_open_container() || istype(container, /obj/item/weapon/reagent_containers/food/snacks))
+ containers_list += container
+
+ if(containers_list.len)
+ SC = input(src, "Into or onto what?(Cancel for nowhere)", null) as null|obj in containers_list
+ if(SC)
+ if(in_range(src, SC))
+ return SC
+ return null //If nothing correct, give null.
+
+
+//Here's the main proc itself
/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
if(mb_cd_timer > world.time)
if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
to_chat(src, "You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!")
return
mb_cd_timer = (world.time + mb_cd_length)
- var/list/genitals_list = list()
- var/obj/item/organ/genital/SG = null//originally selected_genital
- var/list/containers_list = list()
- var/obj/item/weapon/reagent_containers/SC = null
- var/datum/reagents/fluid_source = null
- var/into_container = 0
- var/free_hands = get_num_arms() //arms was only used to know if we had ANY at all
- var/total_cum = 0
- var/finished = 0
- var/mb_time = 30
+
+
if(canbearoused && has_dna())
if(stat==2)
to_chat(src, "You can't do that while dead!")
return
if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
- for(var/obj/item/organ/genital/G in internal_organs)
- if(G.can_masturbate_with) //All capable genitals will orgasm with this
- var/unable_to_come = FALSE
- switch(G.type)
- if(/obj/item/organ/genital/penis)
- var/obj/item/organ/genital/penis/P = G
- if(!P.linked_balls)
- unable_to_come = TRUE
- else
- fluid_source = P.linked_balls.reagents
+ for(var/obj/item/organ/O in internal_organs)
+ if(istype(O, /obj/item/organ/genital))
+ var/obj/item/organ/genital/G = O
+ if(!G.can_climax) //Skip things like wombs and testicles
+ continue
+ var/mob/living/partner
+ var/check_target
+ var/list/worn_stuff = get_equipped_items()
+ if(G.is_exposed(worn_stuff))
+ if(src.pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick
+ if(isliving(src.pulling)) //Don't fuck objects
+ check_target = src.pulling
+ if(src.pulledby && !check_target) //prioritise pulled over pulledby
+ if(isliving(src.pulledby))
+ check_target = src.pulledby
+ //Now we should have a partner, or else we have to come alone
+ if(check_target)
+ if(iscarbon(check_target)) //carbons can have clothes
+ var/mob/living/carbon/C = check_target
+ if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough?
+ partner = C
+ else //A cat is fine too
+ partner = check_target
+ if(partner) //Did they pass the clothing checks?
+ mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced
+ continue //You've climaxed once with this organ, continue on
+ //not exposed OR if no partner was found while exposed, climax alone
+ mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms
+ //Now all genitals that could climax, have.
+ //Since this was a forced climax, we do not need to continue with the other stuff
+ return
+ //If we get here, then this is not a forced climax and we gotta check a few things.
- if(/obj/item/organ/genital/vagina)
- var/obj/item/organ/genital/vagina/V = G
- if(!V.linked_womb)
- unable_to_come = TRUE
- else
- fluid_source = V.linked_womb.reagents
- else //Weird, undefined genitalia behaviour
- unable_to_come = TRUE
-
- if(unable_to_come)
- src.visible_message("[src] shudders, their [G.name] unable to cum.", \
- "Your [G.name] cannot cum, giving no relief.", \
- "Your [G.name] cannot cum, giving no relief.")
- else
- if(fluid_source)
- total_cum = fluid_source.total_volume
- src.visible_message("[src] looks like they're about to cum.", \
- "You feel yourself about to orgasm.", \
- "You feel yourself about to orgasm.")
- if(do_after(src, mb_time, target = src))
- if(total_cum > 5)
- fluid_source.reaction(src.loc, TOUCH, 1, 0)
- fluid_source.clear_reagents()
- fluid_source = null //cleanup so this can be used for the next genitalia
-
- src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
- "You're forced to cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""] with your [G].", \
- "Your [G] have been forced to climax.")
- finished = 1
- if(finished)
- setArousalLoss(min_arousal)
- return //Do not proceed to masturbating if all genitals have been forced to orgasm.
- if(stat==1) //Sleeping people can be forced chemically or with electrical stimulants, for example.
+ if(stat==1) //No sleep-masturbation, you're unconscious.
to_chat(src, "You must be conscious to do that!")
return
- if(restrained())
- to_chat(src, "You can't do that while restrained!")
- return
- if(getArousalLoss() < 33)//flat number instead of percentage
+ if(getArousalLoss() < 33) //flat number instead of percentage
to_chat(src, "You aren't aroused enough for that!")
return
- if(!is_groin_exposed())
- to_chat(src, "You need to undress, first!")
- return
- if(!free_hands)
- to_chat(src, "You need at least one free arm.")
- return
- for(var/helditem in held_items)//how many hands are free
- if(isobj(helditem))
- free_hands--
- if(free_hands <= 0)
- to_chat(src, "You need at least one free hand.")
- return
- for(var/obj/item/organ/genital/G in internal_organs)
- if(G.can_masturbate_with)//filter out what you can't masturbate with
- genitals_list += G
- if(genitals_list.len)
- SG = input(src, "with what?", "Masturbate") as null|obj in genitals_list
- if(SG)
- for(var/obj/item/weapon/reagent_containers/container in held_items)
- if(container.is_open_container() || istype(container, /obj/item/weapon/reagent_containers/food/snacks/pie))
- containers_list += container
- if(containers_list.len)
- SC = input(src, "Into or onto what?(Cancel for nowhere)", "Masturbate") as null|obj in containers_list
- if(SC)
- if(in_range(src, SC))
- into_container = 1
- SG.update()
- switch(SG.type)
- //Penis
- if(/obj/item/organ/genital/penis)
- var/obj/item/organ/genital/penis/P = SG
- if(!P.linked_balls)
- to_chat(src, "You need a pair of testicles to do this.")
- return
- fluid_source = P.linked_balls.reagents
- total_cum = fluid_source.total_volume
- if(into_container)//into a glass or beaker or whatever
- src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG.name] over [SC].", \
- "You start jerking off over [SC.name].", \
- "You start masturbating.")
- if(do_after(src, mb_time, target = src) && in_range(src, SC))
- fluid_source.trans_to(SC, total_cum)
- src.visible_message("[src] orgasms, [pick("cumming into", "emptying themself into")] [SC]!", \
- "You cum into [SC].", \
- "You have relieved yourself.")
- finished = 1
- else //Not in a container
- if(src.pulling)
- if(iscarbon(src.pulling))
- var/mob/living/carbon/C = src.pulling
- if(!C.is_groin_exposed())
- to_chat(src, "You must undress someone to climax inside them.")
- return
- if(isliving(src.pulling)) //Gotta be alive to fuck it, don't wanna have to code fucking objects that ain't containers...
- var/mob/living/partner = src.pulling
- src.visible_message("[src] is about to climax inside [partner]!", \
- "You're about to climax inside [partner]!", \
- "You're preparing to climax inside someone!")
- switch(grab_state)
- if(GRAB_PASSIVE)
- if(do_after(src, mb_time, target = src) && in_range(src, partner))
- var/spillage = 0.5 //Leaks a bit on passive grab
- var/did_spill = FALSE
- fluid_source.trans_to(partner, total_cum*(1-spillage))
- total_cum = total_cum*spillage
- if(total_cum > 5)
- fluid_source.reaction(partner.loc, TOUCH, 1, 0)
- did_spill = TRUE
- fluid_source.clear_reagents()
+ //Ok, now we check what they want to do.
+ var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner", "Fill container")
- src.visible_message("[src] ejaculates inside [partner][did_spill ? ", overflowing and spilling":""]!", \
- "You ejaculate inside [partner][did_spill ? ", spilling out of them":""].", \
- "You have climaxed inside someone[did_spill ? ", spilling out of them":""].")
- finished = 1
- else //Aggressive or higher
- if(do_after(src, mb_time, target = src) && in_range(src, partner))
- var/spillage = 0.0 //Leakproofing seals
- fluid_source.trans_to(partner, total_cum*(1-spillage))
- total_cum = total_cum*spillage
- if(total_cum > 5)
- fluid_source.reaction(partner.loc, TOUCH, 1, 0)
- fluid_source.clear_reagents()
+ switch(choice)
+ if("Masturbate")
+ if(restrained(TRUE)) //TRUE ignores grabs
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ for(var/helditem in held_items)//how many hands are free
+ if(isobj(helditem))
+ free_hands--
+ if(free_hands <= 0)
+ to_chat(src, "You're holding too many things.")
+ return
+ //We got hands, let's pick an organ
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_masturbate_genitals()
+ if(picked_organ)
+ mob_masturbate(picked_organ)
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot masturbate without choosing genitals.")
+ return
- src.visible_message("[src] ejaculates inside [partner], spilling nothing!", \
- "You ejaculate inside [partner], spilling nothing.", \
- "You have climaxed inside someone, spilling nothing.")
- finished = 1
- //Don't care, not coding you fucking a unanchored girder
- else //No pulling, or pulling non-living things
- src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG].", \
- "You start masturbating.", \
- "You start masturbating.")
- if(do_after(src, mb_time, target = src))
- if(total_cum > 5)
- fluid_source.reaction(src.loc, TOUCH, 1, 0)
- fluid_source.clear_reagents()
+ if("Climax alone")
+ if(restrained(TRUE)) //TRUE ignores grabs
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ for(var/helditem in held_items)//how many hands are free
+ if(isobj(helditem))
+ free_hands--
+ if(free_hands <= 0)
+ to_chat(src, "You're holding too many things.")
+ return
+ //We got hands, let's pick an organ
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_climax_genitals()
+ if(picked_organ)
+ mob_climax_outside(picked_organ)
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot climax without choosing genitals.")
+ return
- src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
- "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
- "You have relieved yourself.")
- finished = 1
+ if("Climax with partner")
+ //We need no hands, we can be restrained and so on, so let's pick an organ
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_climax_genitals()
+ if(picked_organ)
+ var/mob/living/partner = pick_partner() //Get someone
+ if(partner)
+ var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
+ if(spillage == "Yes")
+ mob_climax_partner(picked_organ, partner, TRUE)
+ else
+ mob_climax_partner(picked_organ, partner, FALSE)
+ return
+ else
+ to_chat(src, "You cannot do this alone.")
+ return
+ else //They either lack organs that can masturbate, or they didn't pick one.
+ to_chat(src, "You cannot climax without choosing genitals.")
+ return
- if(/obj/item/organ/genital/vagina)
- var/obj/item/organ/genital/vagina/V = SG
- if(!V.linked_womb)
- to_chat(src, "You need a womb to do this.")
- return
- fluid_source = V.linked_womb.reagents
- total_cum = fluid_source.total_volume
- if(into_container)//into a glass or beaker or whatever
- src.visible_message("[src] starts fingering their [SG.name] over [SC].", \
- "You start fingering over [SC.name].", \
- "You start masturbating.")
- if(do_after(src, mb_time, target = src) && in_range(src, SC))
- fluid_source.trans_to(SC, total_cum)
- src.visible_message("[src] orgasms, [pick("cumming into", "emptying themself into")] [SC]!", \
- "You cum into [SC].", \
- "You have relieved yourself.")
- finished = 1
-
- else//not into a container
- src.visible_message("[src] starts fingering their vagina.", \
- "You start fingering your vagina.", \
- "You start masturbating.")
- if(do_after(src, mb_time, target = src))
- if(total_cum > 5)
- fluid_source.reaction(src.loc, TOUCH, 1, 0)
- fluid_source.clear_reagents()
- src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
- "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
- "You have relieved yourself.")
- finished = 1
-
- else//backup message, just in case
- src.visible_message("[src] starts masturbating!", \
- "You start masturbating.")
- if(do_after(src, mb_time, target = src))
- src.visible_message("[src] [pick("relieves themself!", "shudders and moans in orgasm!")]", \
- "You have relieved yourself.")
- finished = 1
- if(finished)
- setArousalLoss(min_arousal)
-
- else
- to_chat(src, "You have no genitals!")
- return
+ if("Fill container")
+ //We'll need hands and no restraints.
+ if(restrained(TRUE)) //TRUE ignores grabs
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ for(var/helditem in held_items)//how many hands are free
+ if(isobj(helditem))
+ free_hands--
+ if(free_hands <= 0)
+ to_chat(src, "You're holding too many things.")
+ return
+ //We got hands, let's pick an organ
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
+ if(picked_organ)
+ //Good, got an organ, time to pick a container
+ var/obj/item/weapon/reagent_containers/fluid_container = pick_climax_container()
+ if(fluid_container)
+ mob_fill_container(picked_organ, fluid_container)
+ return
+ else
+ to_chat(src, "You cannot do this without anything to fill.")
+ return
+ else //They either lack organs that can climax, or they didn't pick one.
+ to_chat(src, "You cannot fill anything without choosing genitals.")
+ return
+ else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled
+ return //Just end it in that case.
diff --git a/code/citadel/cit_reagents.dm b/code/citadel/cit_reagents.dm
index 428729d30f..4a0e91479b 100644
--- a/code/citadel/cit_reagents.dm
+++ b/code/citadel/cit_reagents.dm
@@ -153,14 +153,13 @@
if(prob(33))
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
- to_chat(H, "Your libido is going haywire!")
- H.mob_climax(forced_climax=TRUE)
+ if(prob(50)) //Less spam
+ to_chat(H, "Your libido is going haywire!")
+ H.mob_climax(forced_climax=TRUE)
if(M.min_arousal < 50)
M.min_arousal += 1
- to_chat(M, "You're having a hard time thinkin about things other than sex!")
if(M.min_arousal < M.max_arousal)
M.min_arousal += 1
- to_chat(M, "You feel your libido permanently increasing.")
M.adjustArousalLoss(2)
..()
@@ -197,10 +196,8 @@
if(prob(33))
if(M.min_arousal > 0)
M.min_arousal -= 1
- to_chat(M, "You feel your libido returning to more normal levels.")
if(M.min_arousal > 50)
M.min_arousal -= 1
- to_chat(M, "You feel like your overactive libido is calming down.")
M.adjustArousalLoss(-2)
..()
diff --git a/code/citadel/organs/breasts.dm b/code/citadel/organs/breasts.dm
index ce45b88cfb..dda5e248ee 100644
--- a/code/citadel/organs/breasts.dm
+++ b/code/citadel/organs/breasts.dm
@@ -1,5 +1,5 @@
/obj/item/organ/genital/breasts
- name = "Breasts"
+ name = "breasts"
desc = "Female milk producing organs."
icon_state = "breasts"
icon = 'code/citadel/icons/breasts.dmi'
@@ -11,6 +11,10 @@
var/amount = 2
producing = TRUE
shape = "pair"
+ can_masturbate_with = TRUE
+ masturbation_verb = "massage"
+ can_climax = TRUE
+ fluid_transfer_factor =0.5
/obj/item/organ/genital/breasts/Initialize()
. = ..()
@@ -54,4 +58,10 @@
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
else
- color = "#[owner.dna.features["breasts_color"]]"
\ No newline at end of file
+ color = "#[owner.dna.features["breasts_color"]]"
+
+/obj/item/organ/genital/breasts/is_exposed()
+ . = ..()
+ if(.)
+ return TRUE
+ return owner.is_chest_exposed()
\ No newline at end of file
diff --git a/code/citadel/organs/eggsack.dm b/code/citadel/organs/eggsack.dm
index 718a353b87..1486310d61 100644
--- a/code/citadel/organs/eggsack.dm
+++ b/code/citadel/organs/eggsack.dm
@@ -7,7 +7,7 @@
slot = "testicles"
color = null //don't use the /genital color since it already is colored
w_class = 3
- var/internal = TRUE
+ internal = TRUE
var/egg_girth = EGG_GIRTH_DEF
var/cum_mult = CUM_RATE_MULT
var/cum_rate = CUM_RATE
diff --git a/code/citadel/organs/genitals.dm b/code/citadel/organs/genitals.dm
index 6bd86e7146..1f46778aaf 100644
--- a/code/citadel/organs/genitals.dm
+++ b/code/citadel/organs/genitals.dm
@@ -3,7 +3,10 @@
var/shape = "human"
var/sensitivity = 1
var/list/genital_flags = list()
- var/can_masturbate_with = 0
+ var/can_masturbate_with = FALSE
+ var/masturbation_verb = "masturbate"
+ var/can_climax = FALSE
+ var/fluid_transfer_factor = 0.0 //How much would a partner get in them if they climax using this?
var/size = 2 //can vary between num or text, just used in icon_state strings
var/fluid_id = null
var/fluid_max_volume = 50
@@ -13,6 +16,9 @@
var/producing = FALSE
var/aroused_state = FALSE //Boolean used in icon_state strings
var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons.
+ var/obj/item/organ/genital/linked_organ
+ var/through_clothes = FALSE
+ var/internal = FALSE
/obj/item/organ/genital/Initialize()
. = ..()
@@ -34,6 +40,52 @@
update_appearance()
update_link()
+//exposure and through-clothing code
+/mob/living/carbon
+ var/list/exposed_genitals = list() //Keeping track of them so we don't have to iterate through every genitalia and see if exposed
+
+/obj/item/organ/genital/proc/is_exposed()
+ if(!owner)
+ return FALSE
+ if(internal)
+ return FALSE
+ if(through_clothes)
+ return TRUE
+
+/obj/item/organ/genital/proc/toggle_through_clothes()
+ if(through_clothes)
+ through_clothes = FALSE
+ owner.exposed_genitals -= src
+ else
+ through_clothes = TRUE
+ owner.exposed_genitals += src
+ if(ishuman(owner)) //recast to use update genitals proc
+ var/mob/living/carbon/human/H = owner
+ H.update_genitals()
+
+/mob/living/carbon/verb/toggle_genitals()
+ set category = "IC"
+ set name = "Expose/Hide genitals"
+ set desc = "Allows you to toggle which genitals should show through clothes or not."
+
+ var/list/genital_list = list()
+ for(var/obj/item/organ/O in internal_organs)
+ if(istype(O, /obj/item/organ/genital))
+ var/obj/item/organ/genital/G = O
+ if(!G.internal)
+ genital_list += G
+ if(!genital_list.len) //There is nothing to expose
+ return
+ //Full list of exposable genitals created
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = input(src, "Expose/Hide genitals", "Choose which genitalia to expose/hide", null) in genital_list
+ if(picked_organ)
+ picked_organ.toggle_through_clothes()
+ return
+
+
+
+
/obj/item/organ/genital/proc/update_size()
/obj/item/organ/genital/proc/update_appearance()
@@ -41,6 +93,9 @@
/obj/item/organ/genital/proc/update_link()
/obj/item/organ/genital/proc/remove_ref()
+ if(linked_organ)
+ linked_organ.linked_organ = null
+ linked_organ = null
/obj/item/organ/genital/Insert(mob/living/carbon/M, special = 0)
..()
@@ -58,21 +113,21 @@
var/obj/item/organ/genital/GtoClean
for(GtoClean in internal_organs)
qdel(GtoClean)
-
- if(dna.features["has_cock"])
- give_penis()
- if(dna.features["has_balls"])
- give_balls()
- else if(dna.features["has_ovi"])
- give_ovipositor()
- if(dna.features["has_eggsack"])
- give_eggsack()
+ //Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in.
if(dna.features["has_breasts"])
give_breasts()
if(dna.features["has_vag"])
give_vagina()
- if(dna.features["has_womb"])
- give_womb()
+ if(dna.features["has_womb"])
+ give_womb()
+ if(dna.features["has_balls"])
+ give_balls()
+ if(dna.features["has_cock"])
+ give_penis()
+ if(dna.features["has_ovi"])
+ give_ovipositor()
+ if(dna.features["has_eggsack"])
+ give_eggsack()
/mob/living/carbon/human/proc/give_penis()
if(!dna)
@@ -208,17 +263,15 @@
if(H.disabilities & HUSK)
return
//start scanning for genitals
- var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again
- if(H.is_groin_exposed(worn_stuff))
- //ORDER is important here. Vaginas first, theoretical testes after, and penis LAST.
- //The latter is always drawn on top of the former.
- if(H.has_vagina())
- genitals_to_add += H.getorganslot("vagina")
- if(H.has_penis())
- genitals_to_add += H.getorganslot("penis")
- if(H.is_chest_exposed(worn_stuff))
- if(H.has_breasts())
- genitals_to_add += H.getorganslot("breasts")
+ //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again
+
+ for(var/obj/item/organ/O in H.internal_organs)
+ if(istype(O, /obj/item/organ/genital))
+ var/obj/item/organ/genital/G = O
+ if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes
+ genitals_to_add += H.getorganslot(G.slot)
+ //Now we added all genitals that aren't internal and should be rendered
+
var/image/I
//start applying overlays
for(var/layer in relevant_layers)
diff --git a/code/citadel/organs/penis.dm b/code/citadel/organs/penis.dm
index 9e2ce00666..7348e8c969 100644
--- a/code/citadel/organs/penis.dm
+++ b/code/citadel/organs/penis.dm
@@ -1,21 +1,23 @@
/obj/item/organ/genital/penis
- name = "Penis"
- desc = "A male reproductive organ."
- icon_state = "penis"
- icon = 'code/citadel/icons/penis.dmi'
- zone = "groin"
- slot = "penis"
- w_class = 3
- can_masturbate_with = 1
- size = 2 //arbitrary value derived from length and girth for sprites.
- var/length = 6 //inches
+ name = "penis"
+ desc = "A male reproductive organ."
+ icon_state = "penis"
+ icon = 'code/citadel/icons/penis.dmi'
+ zone = "groin"
+ slot = "penis"
+ w_class = 3
+ can_masturbate_with = TRUE
+ masturbation_verb = "stroke"
+ can_climax = TRUE
+ fluid_transfer_factor = 0.5
+ size = 2 //arbitrary value derived from length and girth for sprites.
+ var/length = 6 //inches
var/cached_length //used to detect a change in length
- var/girth = 0
- var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
- var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
- var/list/dickflags = list()
- var/list/knotted_types = list("knotted", "barbknot")
- var/obj/item/organ/genital/testicles/linked_balls
+ var/girth = 0
+ var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
+ var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
+ var/list/dickflags = list()
+ var/list/knotted_types = list("knotted", "barbknot")
/obj/item/organ/genital/penis/update_size()
if(length == cached_length)
@@ -55,15 +57,16 @@
/obj/item/organ/genital/penis/update_link()
if(owner)
- linked_balls = (owner.getorganslot("testicles"))
- if(linked_balls)
- linked_balls.linked_penis = src
+ linked_organ = (owner.getorganslot("testicles"))
+ if(linked_organ)
+ linked_organ.linked_organ = src
else
- if(linked_balls)
- linked_balls.linked_penis = null
- linked_balls = null
+ if(linked_organ)
+ linked_organ.linked_organ = null
+ linked_organ = null
-/obj/item/organ/genital/penis/remove_ref()
- if(linked_balls)
- linked_balls.linked_penis = null
- linked_balls = null
+/obj/item/organ/genital/penis/is_exposed()
+ . = ..()
+ if(.)
+ return TRUE
+ return owner.is_groin_exposed()
\ No newline at end of file
diff --git a/code/citadel/organs/testicles.dm b/code/citadel/organs/testicles.dm
index a759aeab52..bb3ade6048 100644
--- a/code/citadel/organs/testicles.dm
+++ b/code/citadel/organs/testicles.dm
@@ -1,18 +1,17 @@
/obj/item/organ/genital/testicles
- name = "Testicles"
+ name = "testicles"
desc = "A male reproductive organ."
icon_state = "testicles"
icon = 'code/citadel/icons/penis.dmi'
zone = "groin"
slot = "testicles"
w_class = 3
- var/internal = FALSE
+ internal = TRUE
size = BALLS_SIZE_DEF
var/sack_size = BALLS_SACK_SIZE_DEF
fluid_id = "semen"
producing = TRUE
var/sent_full_message = 1 //defaults to 1 since they're full to start
- var/obj/item/organ/genital/penis/linked_penis
/obj/item/organ/genital/testicles/Initialize()
. = ..()
@@ -33,20 +32,20 @@
return FALSE
sent_full_message = 0
update_link()
- if(!linked_penis)
+ if(!linked_organ)
return FALSE
reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum
/obj/item/organ/genital/testicles/update_link()
if(owner && !QDELETED(src))
- linked_penis = (owner.getorganslot("penis"))
- if(linked_penis)
- linked_penis.linked_balls = src
+ linked_organ = (owner.getorganslot("penis"))
+ if(linked_organ)
+ linked_organ.linked_organ = src
else
- if(linked_penis)
- linked_penis.linked_balls = null
- linked_penis = null
+ if(linked_organ)
+ linked_organ.linked_organ = null
+ linked_organ = null
/obj/item/organ/genital/testicles/proc/send_full_message(msg = "Your balls finally feel full, again.")
if(owner && istext(msg))
diff --git a/code/citadel/organs/vagina.dm b/code/citadel/organs/vagina.dm
index fa1f00bda2..f170ced9b6 100644
--- a/code/citadel/organs/vagina.dm
+++ b/code/citadel/organs/vagina.dm
@@ -1,12 +1,15 @@
/obj/item/organ/genital/vagina
- name = "Vagina"
+ name = "vagina"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "vagina"
zone = "groin"
slot = "vagina"
size = 1 //There is only 1 size right now
- can_masturbate_with = 1
+ can_masturbate_with = TRUE
+ masturbation_verb = "finger"
+ can_climax = TRUE
+ fluid_transfer_factor = 0.1 //Yes, some amount is exposed to you, go get your AIDS
w_class = 3
var/cap_length = 8//D E P T H (cap = capacity)
var/cap_girth = 12
@@ -15,7 +18,6 @@
var/clit_diam = 0.25
var/clit_len = 0.25
var/list/vag_types = list("tentacle", "dentata", "hairy")
- var/obj/item/organ/genital/womb/linked_womb
/obj/item/organ/genital/vagina/update_appearance()
@@ -56,15 +58,16 @@
/obj/item/organ/genital/vagina/update_link()
if(owner)
- linked_womb = (owner.getorganslot("womb"))
- if(linked_womb)
- linked_womb.linked_vag = src
+ linked_organ = (owner.getorganslot("womb"))
+ if(linked_organ)
+ linked_organ.linked_organ = src
else
- if(linked_womb)
- linked_womb.linked_vag = null
- linked_womb = null
+ if(linked_organ)
+ linked_organ.linked_organ = null
+ linked_organ = null
-/obj/item/organ/genital/vagina/remove_ref()
- if(linked_womb)
- linked_womb.linked_vag = null
- linked_womb = null
+/obj/item/organ/genital/vagina/is_exposed()
+ . = ..()
+ if(.)
+ return TRUE
+ return owner.is_groin_exposed()
\ No newline at end of file
diff --git a/code/citadel/organs/womb.dm b/code/citadel/organs/womb.dm
index 3ebe5c2f98..433f005623 100644
--- a/code/citadel/organs/womb.dm
+++ b/code/citadel/organs/womb.dm
@@ -1,15 +1,15 @@
/obj/item/organ/genital/womb
- name = "Womb"
+ name = "womb"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "womb"
zone = "groin"
slot = "womb"
w_class = 3
- var/internal = FALSE
+ internal = TRUE
fluid_id = "femcum"
producing = TRUE
- var/obj/item/organ/genital/vagina/linked_vag
+
/obj/item/organ/genital/womb/Initialize()
. = ..()
@@ -24,25 +24,20 @@
/obj/item/organ/genital/womb/proc/generate_femcum()
reagents.maximum_volume = fluid_max_volume
update_link()
- if(!linked_vag)
+ if(!linked_organ)
return FALSE
reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum
/obj/item/organ/genital/womb/update_link()
if(owner)
- linked_vag = (owner.getorganslot("vagina"))
- if(linked_vag)
- linked_vag.linked_womb = src
+ linked_organ = (owner.getorganslot("vagina"))
+ if(linked_organ)
+ linked_organ.linked_organ = src
else
- if(linked_vag)
- linked_vag.linked_womb = null
- linked_vag = null
-
-/obj/item/organ/genital/womb/remove_ref()
- if(linked_vag)
- linked_vag.linked_womb = null
- linked_vag = null
+ if(linked_organ)
+ linked_organ.linked_organ = null
+ linked_organ = null
/obj/item/organ/genital/womb/Destroy()
return ..()
diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm
index 451bd05606..c75063c256 100644
--- a/code/controllers/subsystem/disease.dm
+++ b/code/controllers/subsystem/disease.dm
@@ -1,6 +1,6 @@
SUBSYSTEM_DEF(disease)
name = "Disease"
- flags = SS_NO_FIRE
+ flags = SS_NO_FIRE | SS_NO_INIT
var/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
var/list/diseases
@@ -13,4 +13,4 @@ SUBSYSTEM_DEF(disease)
diseases = subtypesof(/datum/disease)
/datum/controller/subsystem/disease/stat_entry(msg)
- ..("P:[active_diseases.len]")
\ No newline at end of file
+ ..("P:[active_diseases.len]")
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index c7c50f4d04..d196c9cb10 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -283,7 +283,7 @@ SUBSYSTEM_DEF(ticker)
SSshuttle.lockdown = TRUE
//initialise our cinematic screen object
- cinematic = new /obj/screen{icon='icons/effects/station_explosion.dmi';icon_state="station_intact";layer=21;mouse_opacity=0;screen_loc="1,0";}(src)
+ cinematic = new /obj/screen{icon='icons/effects/station_explosion.dmi';icon_state="station_intact";layer=21;mouse_opacity = MOUSE_OPACITY_TRANSPARENT;screen_loc="1,0";}(src)
for(var/mob/M in GLOB.mob_list)
M.notransform = TRUE //stop everything moving
@@ -300,7 +300,7 @@ SUBSYSTEM_DEF(ticker)
if("nuclear emergency") //Nuke wasn't on station when it blew up
flick("intro_nuke",cinematic)
sleep(35)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
flick("station_intact_fade_red",cinematic)
cinematic.icon_state = "summary_nukefail"
@@ -329,13 +329,13 @@ SUBSYSTEM_DEF(ticker)
else
flick("intro_nuke",cinematic)
sleep(35)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
if(NUKE_MISS_STATION || NUKE_SYNDICATE_BASE) //nuke was nowhere nearby //TODO: a really distant explosion animation
sleep(50)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
actually_blew_up = station_missed == NUKE_SYNDICATE_BASE //don't kill everyone on station if it detonated off station
else //station was destroyed
@@ -346,28 +346,28 @@ SUBSYSTEM_DEF(ticker)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
cinematic.icon_state = "summary_nukewin"
if("AI malfunction") //Malf (screen,explosion,summary)
flick("intro_malf",cinematic)
sleep(76)
flick("station_explode_fade_red",cinematic)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb) //TODO: If we ever decide to actually detonate the vault bomb
cinematic.icon_state = "summary_malf"
if("blob") //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb) //TODO: no idea what this case could be
cinematic.icon_state = "summary_selfdes"
if("cult") //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb) //TODO: no idea what this case could be
cinematic.icon_state = "summary_cult"
if("no_core") //Nuke failed to detonate as it had no core
@@ -381,7 +381,7 @@ SUBSYSTEM_DEF(ticker)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red", cinematic)
- SEND_SOUND(world, sound('sound/effects/explosionfar.ogg'))
+ SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
cinematic.icon_state = "summary_selfdes"
//If its actually the end of the round, wait for it to end.
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index fa38e1530d..3276a5f5b9 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -141,7 +141,7 @@
afterDraw()
/obj/effect/ebeam
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
anchored = TRUE
var/datum/beam/owner
diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm
index 20e2a6e9ac..92ac9a4767 100644
--- a/code/datums/components/component.dm
+++ b/code/datums/components/component.dm
@@ -1,25 +1,70 @@
/datum/component
var/enabled = TRUE
var/dupe_mode = COMPONENT_DUPE_HIGHLANDER
+ var/dupe_type
var/list/signal_procs
var/datum/parent
/datum/component/New(datum/P, ...)
+ parent = P
+ var/list/arguments = args.Copy()
+ arguments.Cut(1, 2)
+ Initialize(arglist(arguments))
+
var/dm = dupe_mode
if(dm != COMPONENT_DUPE_ALLOWED)
- var/datum/component/old = P.GetExactComponent(type)
- if(old)
- switch(dm)
- if(COMPONENT_DUPE_HIGHLANDER)
- InheritComponent(old, FALSE)
- qdel(old)
- if(COMPONENT_DUPE_UNIQUE)
- old.InheritComponent(src, TRUE)
- qdel(src)
- return
+ var/dt = dupe_type
+ var/datum/component/old
+ if(!dt)
+ old = P.GetExactComponent(type)
+ else
+ old = P.GetComponent(dt)
+ switch(dm)
+ if(COMPONENT_DUPE_UNIQUE)
+ old.InheritComponent(src, TRUE)
+ parent = null //prevent COMPONENT_REMOVING signal
+ qdel(src)
+ return
+ if(COMPONENT_DUPE_HIGHLANDER)
+ InheritComponent(old, FALSE)
+ qdel(old)
+
+ //let the others know
P.SendSignal(COMSIG_COMPONENT_ADDED, src)
- LAZYADD(P.datum_components, src)
- parent = P
+
+ //lazy init the parent's dc list
+ var/list/dc = P.datum_components
+ if(!dc)
+ P.datum_components = dc = list()
+
+ //set up the typecache
+ var/our_type = type
+ for(var/I in _GetInverseTypeList(our_type))
+ var/test = dc[I]
+ if(test) //already another component of this type here
+ var/list/components_of_type
+ if(!islist(test))
+ components_of_type = list(test)
+ dc[I] = components_of_type
+ else
+ components_of_type = test
+ if(I == our_type) //exact match, take priority
+ var/inserted = FALSE
+ for(var/J in 1 to components_of_type.len)
+ var/datum/component/C = components_of_type[J]
+ if(C.type != our_type) //but not over other exact matches
+ components_of_type.Insert(J, I)
+ inserted = TRUE
+ break
+ if(!inserted)
+ components_of_type += src
+ else //indirect match, back of the line with ya
+ components_of_type += src
+ else //only component of this type, no list
+ dc[I] = src
+
+/datum/component/proc/Initialize(...)
+ return
/datum/component/Destroy()
enabled = FALSE
@@ -33,7 +78,20 @@
/datum/component/proc/_RemoveNoSignal()
var/datum/P = parent
if(P)
- LAZYREMOVE(P.datum_components, src)
+ var/list/dc = P.datum_components
+ var/our_type = type
+ for(var/I in _GetInverseTypeList(our_type))
+ var/list/components_of_type = dc[I]
+ if(islist(components_of_type)) //
+ var/list/subtracted = components_of_type - src
+ if(subtracted.len == 1) //only 1 guy left
+ dc[I] = subtracted[1] //make him special
+ else
+ dc[I] = subtracted
+ else //just us
+ dc -= I
+ if(!dc.len)
+ P.datum_components = null
parent = null
/datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE)
@@ -66,36 +124,66 @@
/datum/component/proc/OnTransfer(datum/new_parent)
return
+/datum/component/proc/AfterComponentActivated()
+ return
+
+/datum/component/proc/_GetInverseTypeList(current_type)
+ . = list(current_type)
+ while (current_type != /datum/component)
+ current_type = type2parent(current_type)
+ . += current_type
+
/datum/proc/SendSignal(sigtype, ...)
var/list/comps = datum_components
. = FALSE
- for(var/I in comps)
- var/datum/component/C = I
- if(!C.enabled)
- continue
- if(C.ReceiveSignal(arglist(args)))
+ if(!comps)
+ return
+ var/target = comps[/datum/component]
+ if(!islist(target))
+ var/datum/component/C = target
+ if(C.enabled && C.ReceiveSignal(arglist(args)))
ComponentActivated(C)
- . = TRUE
+ C.AfterComponentActivated()
+ return TRUE
+ else
+ for(var/I in target)
+ var/datum/component/C = I
+ if(!C.enabled)
+ continue
+ if(C.ReceiveSignal(arglist(args)))
+ ComponentActivated(C)
+ . = TRUE
/datum/proc/ComponentActivated(datum/component/C)
return
/datum/proc/GetComponent(c_type)
- for(var/I in datum_components)
- if(istype(I, c_type))
- return I
+ var/list/dc = datum_components
+ if(!dc)
+ return null
+ . = dc[c_type]
+ if(islist(.))
+ return .[1]
/datum/proc/GetExactComponent(c_type)
- for(var/I in datum_components)
- var/datum/component/C = I
+ var/list/dc = datum_components
+ if(!dc)
+ return null
+ var/datum/component/C = dc[c_type]
+ if(C)
+ if(islist(C))
+ C = C[1]
if(C.type == c_type)
- return I
+ return C
+ return null
/datum/proc/GetComponents(c_type)
- . = list()
- for(var/I in datum_components)
- if(istype(I, c_type))
- . += I
+ var/list/dc = datum_components
+ if(!dc)
+ return null
+ . = dc[c_type]
+ if(!islist(.))
+ return list(.)
/datum/proc/AddComponent(new_type, ...)
var/nt = new_type
@@ -103,6 +191,11 @@
var/datum/component/C = new nt(arglist(args))
return QDELING(C) ? GetComponent(new_type) : C
+/datum/proc/LoadComponent(component_type, ...)
+ . = GetComponent(component_type)
+ if(!.)
+ return AddComponent(arglist(args))
+
/datum/proc/TakeComponent(datum/component/C)
if(!C)
return
diff --git a/code/datums/components/component.dm.rej b/code/datums/components/component.dm.rej
new file mode 100644
index 0000000000..3cf20d57b0
--- /dev/null
+++ b/code/datums/components/component.dm.rej
@@ -0,0 +1 @@
+-
\ No newline at end of file
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 84d177a390..6d26246c38 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -43,7 +43,7 @@
SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
//Copy properties over. This is so edited diseases persist.
- var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed")
+ var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms")
for(var/V in DD.vars)
if(V in skipped)
continue
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index e8ddfdc3d7..7f09ffa48c 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -57,9 +57,7 @@
symptoms = GenerateSymptoms(0, 2)
else
for(var/datum/symptom/S in D.symptoms)
- var/datum/symptom/new_symp = new S.type
- new_symp.name = S.name
- new_symp.neutered = S.neutered
+ var/datum/symptom/new_symp = S.Copy()
symptoms += new_symp
Refresh()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index d943e417e5..a31aab8607 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -400,7 +400,15 @@
if (assigned_role in GLOB.command_positions)
text += "HEAD|loyal|employee|headrev|rev"
else if (src in SSticker.mode.head_revolutionaries)
- text += "head|loyal|employee|HEADREV|rev"
+ var/last_healthy_headrev = TRUE
+ for(var/I in SSticker.mode.head_revolutionaries)
+ if(I == src)
+ continue
+ var/mob/M = I
+ if(M.z == ZLEVEL_STATION && !M.stat)
+ last_healthy_headrev = FALSE
+ break
+ text += "head|loyal|employee|[last_healthy_headrev ? "LAST " : ""]HEADREV|rev"
text += "
Flash: give"
var/list/L = current.get_contents()
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 524ea9ba2b..f72dafdbac 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -7,7 +7,7 @@
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
layer = AREA_LAYER
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
invisibility = INVISIBILITY_LIGHTING
var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
@@ -242,7 +242,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
for(var/area/RA in related)
if (RA.fire)
RA.fire = 0
- RA.mouse_opacity = 0
+ RA.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
RA.updateicon()
RA.ModifyFiredoors(TRUE)
for(var/obj/machinery/firealarm/F in RA)
@@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/proc/set_fire_alarm_effect()
fire = 1
updateicon()
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/area/proc/readyalert()
if(name == "Space")
@@ -313,12 +313,12 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if (!( src.party ))
src.party = 1
src.updateicon()
- src.mouse_opacity = 0
+ src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/area/proc/partyreset()
if (src.party)
src.party = 0
- src.mouse_opacity = 0
+ src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
src.updateicon()
for(var/obj/machinery/door/firedoor/D in src)
if(!D.welded)
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 7fa09f3978..247b660dbc 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -4,7 +4,7 @@
desc = "The overmind. It controls the blob."
icon = 'icons/mob/blob.dmi'
icon_state = "marker"
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
move_on_shuttle = 1
see_in_dark = 8
invisibility = INVISIBILITY_OBSERVER
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index f6bf8539e0..389888ac28 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -175,7 +175,7 @@
SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg'))
to_chat(blobber, "You are a blobbernaut!")
to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.")
- to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b")
+ to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b")
to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!")
to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
if(blobber)
diff --git a/code/game/gamemodes/blob/powers.dm.rej b/code/game/gamemodes/blob/powers.dm.rej
new file mode 100644
index 0000000000..27dc764a75
--- /dev/null
+++ b/code/game/gamemodes/blob/powers.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm (rejected hunks)
+@@ -175,7 +175,7 @@
+ SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg'))
+ to_chat(blobber, "You are a blobbernaut!")
+ to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.")
+- to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b")
++ to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b")
+ to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!")
+ to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
+ if(blobber)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 9bce7319f8..f6cdd64bb6 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -24,6 +24,7 @@
M.changeNext_move(CLICK_CD_MELEE)
var/a = pick("gently stroke", "nuzzle", "affectionatly pet", "cuddle")
M.visible_message("[M] [a]s [src]!", "You [a] [src]!")
+ to_chat(overmind, "[M] [a]s you!")
playsound(src, 'sound/effects/blobattack.ogg', 50, 1) //SQUISH SQUISH
diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm
index 0d7a5b799c..e8cba1a39d 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_overlay.dm
@@ -1,6 +1,6 @@
//an "overlay" used by clockwork walls and floors to appear normal to mesons.
/obj/effect/clockwork/overlay
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/atom/linked
/obj/effect/clockwork/overlay/examine(mob/user)
diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
index 72ed326b26..0770c62bec 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm
@@ -130,13 +130,19 @@
playsound(src, 'sound/effects/empulse.ogg', 50, 1)
playsound(linked_gateway, 'sound/effects/empulse.ogg', 50, 1)
transform = matrix() * 1.5
- animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
linked_gateway.transform = matrix() * 1.5
- animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
A.forceMove(get_turf(linked_gateway))
if(!no_cost)
uses = max(0, uses - 1)
linked_gateway.uses = max(0, linked_gateway.uses - 1)
+ if(!uses)
+ animate(src, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW)
+ animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW)
+ density = FALSE
+ linked_gateway.density = FALSE
+ else
+ animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
+ animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
addtimer(CALLBACK(src, .proc/check_uses), 10)
return TRUE
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm
index 144e378304..2174f04dcb 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm
@@ -4,7 +4,7 @@
desc = "A massive, thrumming rip in spacetime."
clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits."
max_integrity = 500
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
icon = 'icons/effects/clockwork_effects.dmi'
icon_state = "nothing"
density = FALSE
@@ -68,7 +68,7 @@
if(!purpose_fulfilled)
var/area/gate_area = get_area(src)
hierophant_message("An Ark of the Clockwork Justicar has fallen at [gate_area.map_name]!")
- send_to_playing_players(sound(null, 0, channel = CHANNEL_JUSTICAR_ARK))
+ sound_to_playing_players(channel = CHANNEL_JUSTICAR_ARK, S = sound(null, 0))
var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED
SSshuttle.clearHostileEnvironment(src)
if(!was_stranded && !purpose_fulfilled)
@@ -87,7 +87,7 @@
resistance_flags |= INDESTRUCTIBLE
countdown.stop()
visible_message("[src] begins to pulse uncontrollably... you might want to run!")
- send_to_playing_players(sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = CHANNEL_JUSTICAR_ARK, volume = 50))
+ sound_to_playing_players(volume = 50, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_disrupted.ogg', 0))
make_glow()
glow.icon_state = "clockwork_gateway_disrupted"
resistance_flags |= INDESTRUCTIBLE
@@ -208,7 +208,7 @@
if(still_needs_components())
if(!first_sound_played)
priority_announce("Massive energy anomaly detected on short-range scanners. Attempting to triangulate location...", "Anomaly Alert")
- send_to_playing_players(sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 10))
+ sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', 1))
first_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_components"
@@ -228,7 +228,8 @@
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
if(!second_sound_played)
- send_to_playing_players(sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 30))
+ new /obj/effect/temp_visual/decoy/fading/threesecond(loc, glow)
+ sound_to_playing_players(volume = 30, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', 1))
second_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_charging"
@@ -236,13 +237,15 @@
if(!third_sound_played)
var/area/gate_area = get_area(src)
priority_announce("Location of massive energy anomaly has been triangulated. Location: [gate_area.map_name].", "Anomaly Alert")
- send_to_playing_players(sound('sound/effects/clockcult_gateway_active.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 35))
+ new /obj/effect/temp_visual/decoy/fading/threesecond(loc, glow)
+ sound_to_playing_players(volume = 35, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_active.ogg', 1))
third_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_active"
if(GATEWAY_RATVAR_COMING to GATEWAY_RATVAR_ARRIVAL)
if(!fourth_sound_played)
- send_to_playing_players(sound('sound/effects/clockcult_gateway_closing.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 40))
+ new /obj/effect/temp_visual/decoy/fading/threesecond(loc, glow)
+ sound_to_playing_players(volume = 40, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_closing.ogg', 1))
fourth_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_closing"
@@ -252,20 +255,20 @@
resistance_flags |= INDESTRUCTIBLE
purpose_fulfilled = TRUE
make_glow()
- animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125)
- send_to_playing_players(sound('sound/effects/ratvar_rises.ogg', 0, channel = CHANNEL_JUSTICAR_ARK)) //End the sounds
+ animate(glow, transform = matrix() * 3, time = 125)
+ sound_to_playing_players('sound/effects/ratvar_rises.ogg', channel = CHANNEL_JUSTICAR_ARK) //End the sounds
sleep(125)
- make_glow()
- animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
var/turf/startpoint = get_turf(src)
- QDEL_IN(src, 3)
- sleep(3)
+ make_glow()
+ glow.transform = matrix() * 4.5
+ animate(glow, transform = matrix() * 0.1, time = 10)
+ QDEL_IN(src, 10)
GLOB.clockwork_gateway_activated = TRUE
new/obj/structure/destructible/clockwork/massive/ratvar(startpoint)
send_to_playing_players("\"[text2ratvar("See Engine's mercy")]!\"\n\
\"[text2ratvar("Observe Engine's design skills")]!\"\n\"[text2ratvar("Behold Engine's light")]!!\"\n\
\"[text2ratvar("Gaze upon Engine's power")].\"")
- send_to_playing_players('sound/magic/clockwork/invoke_general.ogg')
+ sound_to_playing_players('sound/effects/empulse.ogg')
var/x0 = startpoint.x
var/y0 = startpoint.y
for(var/I in spiral_range_turfs(255, startpoint))
diff --git a/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm b/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm
index aae18ba175..cf730189e3 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm
@@ -130,6 +130,6 @@
if(hex_combo) //YOU BUILT A HEXAGON
hex_combo.pixel_x = -16
hex_combo.pixel_y = -16
- hex_combo.mouse_opacity = 0
+ hex_combo.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
hex_combo.plane = GAME_PLANE
new /obj/effect/temp_visual/ratvar/prolonging_prism(T, hex_combo)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
index c8b81a8ef0..c604e106f3 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -23,12 +23,12 @@
for(var/obj/O in GLOB.all_clockwork_objects)
O.ratvar_act()
START_PROCESSING(SSobj, src)
+ INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0, null, FALSE, 0)
send_to_playing_players("\"[text2ratvar("ONCE AGAIN MY LIGHT SHALL SHINE ACROSS THIS PATHETIC REALM")]!!\"")
sound_to_playing_players('sound/effects/ratvar_reveal.ogg')
var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert")
var/area/A = get_area(src)
notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay)
- INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0, null, FALSE, 0)
/obj/structure/destructible/clockwork/massive/ratvar/Destroy()
GLOB.ratvar_awakens--
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 4c80f53b94..7810df2a9a 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -476,7 +476,7 @@ structure_check() searches for nearby cultist structures required for the invoca
//BEGIN THE SUMMONING
used = TRUE
..()
- send_to_playing_players('sound/effects/dimensional_rend.ogg')
+ sound_to_playing_players('sound/effects/dimensional_rend.ogg')
var/turf/T = get_turf(src)
sleep(40)
if(src)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
index 90ea06fbd5..794b1bfa8e 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
@@ -13,8 +13,8 @@
//TODO : replace with presets or spectrum
return rgb(rand(0,255),rand(0,255),rand(0,255))
-/obj/machinery/abductor/gland_dispenser/New()
- ..()
+/obj/machinery/abductor/gland_dispenser/Initialize()
+ . = ..()
gland_types = subtypesof(/obj/item/organ/heart/gland)
gland_types = shuffle(gland_types)
gland_colors = new/list(gland_types.len)
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index d36cab4881..941e0bf081 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -85,9 +85,8 @@
. = ..()
var/obj/machinery/nuclearbomb/existing = locate("syndienuke") in GLOB.nuke_list
if(existing)
- qdel(src)
- throw EXCEPTION("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]")
- return 0
+ stack_trace("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]")
+ return INITIALIZE_HINT_QDEL
tag = "syndienuke"
/obj/machinery/nuclearbomb/attackby(obj/item/I, mob/user, params)
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index d50af412a4..80400fee05 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -11,8 +11,8 @@
idle_power_usage = 0
var/obj/item/device/radio/beacon/Beacon
-/obj/machinery/bluespace_beacon/New()
- ..()
+/obj/machinery/bluespace_beacon/Initialize()
+ . = ..()
var/turf/T = loc
Beacon = new /obj/item/device/radio/beacon
Beacon.invisibility = INVISIBILITY_MAXIMUM
@@ -21,9 +21,7 @@
hide(T.intact)
/obj/machinery/bluespace_beacon/Destroy()
- if(Beacon)
- qdel(Beacon)
- Beacon = null
+ QDEL_NULL(Beacon)
return ..()
// update the invisibility and icon
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 39f360e316..836287c9df 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -27,12 +27,16 @@
return
-/obj/machinery/pdapainter/New()
- ..()
- var/blocked = list(/obj/item/device/pda/ai/pai, /obj/item/device/pda/ai, /obj/item/device/pda/heads,
- /obj/item/device/pda/clear, /obj/item/device/pda/syndicate)
-
- for(var/P in typesof(/obj/item/device/pda)-blocked)
+/obj/machinery/pdapainter/Initialize()
+ . = ..()
+ var/list/blocked = list(
+ /obj/item/device/pda/ai/pai,
+ /obj/item/device/pda/ai,
+ /obj/item/device/pda/heads,
+ /obj/item/device/pda/clear,
+ /obj/item/device/pda/syndicate)
+
+ for(var/P in typesof(/obj/item/device/pda) - blocked)
var/obj/item/device/pda/D = new P
//D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA"
@@ -41,9 +45,7 @@
src.colorlist += D
/obj/machinery/pdapainter/Destroy()
- if(storedpda)
- qdel(storedpda)
- storedpda = null
+ QDEL_NULL(storedpda)
return ..()
/obj/machinery/pdapainter/on_deconstruction()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 7171718dce..a14989c199 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -13,6 +13,7 @@
density = FALSE
anchored = TRUE
state_open = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/sleeper
var/efficiency = 1
var/min_health = -25
var/list/available_chems
@@ -26,24 +27,11 @@
var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: antitoxin -> morphine
var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning
-/obj/machinery/sleeper/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/sleeper(null)
- B.apply_default_parts(src)
+/obj/machinery/sleeper/Initialize()
+ . = ..()
update_icon()
reset_chem_buttons()
-/obj/item/weapon/circuitboard/machine/sleeper
- name = "Sleeper (Machine Board)"
- build_path = /obj/machinery/sleeper
- origin_tech = "programming=3;biotech=2;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/stack/sheet/glass = 1)
-
/obj/machinery/sleeper/RefreshParts()
var/E
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/_machinery.dm
similarity index 98%
rename from code/game/machinery/machinery.dm
rename to code/game/machinery/_machinery.dm
index cf51158356..f9d530feac 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -123,12 +123,18 @@ Class Procs:
var/interact_open = FALSE // Can the machine be interacted with when in maint/when the panel is open.
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
var/speed_process = 0 // Process as fast as possible?
+ var/obj/item/weapon/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
/obj/machinery/Initialize()
if(!armor)
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
. = ..()
GLOB.machines += src
+
+ if(ispath(circuit, /obj/item/weapon/circuitboard))
+ circuit = new circuit
+ circuit.apply_default_parts(src)
+
if(!speed_process)
START_PROCESSING(SSmachines, src)
else
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 5b5c9bee34..b1fddc8a76 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -7,7 +7,6 @@ GLOBAL_LIST_EMPTY(announcement_systems)
desc = "An automated announcement system that handles minor announcements over the radio."
icon = 'icons/obj/machines/telecomms.dmi'
icon_state = "AAS_On"
- var/obj/item/device/radio/headset/radio
verb_say = "coldly states"
verb_ask = "queries"
@@ -16,6 +15,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
idle_power_usage = 20
active_power_usage = 50
+ circuit = /obj/item/weapon/circuitboard/machine/announcement_system
+
+ var/obj/item/device/radio/headset/radio
var/arrival = "%PERSON has signed up as %RANK"
var/arrivalToggle = 1
var/newhead = "%PERSON, %RANK, is the department head."
@@ -25,24 +27,12 @@ GLOBAL_LIST_EMPTY(announcement_systems)
var/pinklight = "Light_Pink"
var/errorlight = "Error_Red"
-/obj/machinery/announcement_system/New()
- ..()
+/obj/machinery/announcement_system/Initialize()
+ . = ..()
GLOB.announcement_systems += src
radio = new /obj/item/device/radio/headset/ai(src)
-
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/announcement_system(null)
- B.apply_default_parts(src)
-
update_icon()
-/obj/item/weapon/circuitboard/machine/announcement_system
- name = "Announcement System (Machine Board)"
- build_path = /obj/machinery/announcement_system
- origin_tech = "programming=3;bluespace=3;magnets=2"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
/obj/machinery/announcement_system/update_icon()
if(is_operational())
icon_state = (panel_open ? "AAS_On_Open" : "AAS_On")
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index db491bf52c..53d8acd0a2 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -7,9 +7,13 @@
desc = "It produces items using metal and glass."
icon_state = "autolathe"
density = TRUE
+ anchored = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 10
+ active_power_usage = 100
+ circuit = /obj/item/weapon/circuitboard/machine/autolathe
var/operating = FALSE
- anchored = TRUE
var/list/L = list()
var/list/LL = list()
var/hacked = FALSE
@@ -18,9 +22,7 @@
var/hack_wire
var/disable_wire
var/shock_wire
- use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
+
var/busy = FALSE
var/prod_coeff = 1
@@ -45,30 +47,16 @@
"Imported"
)
-/obj/machinery/autolathe/New()
- ..()
+/obj/machinery/autolathe/Initialize()
materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS))
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/autolathe(null)
- B.apply_default_parts(src)
-
wires = new /datum/wires/autolathe(src)
files = new /datum/research/autolathe(src)
matching_designs = list()
-
-/obj/item/weapon/circuitboard/machine/autolathe
- name = "Autolathe (Machine Board)"
- build_path = /obj/machinery/autolathe
- origin_tech = "engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 3,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
+ return ..()
/obj/machinery/autolathe/Destroy()
- qdel(wires)
- wires = null
- qdel(materials)
- materials = null
+ QDEL_NULL(wires)
+ QDEL_NULL(materials)
return ..()
/obj/machinery/autolathe/interact(mob/user)
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 0ebae75da6..de07fc9c2d 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -9,8 +9,8 @@
var/radio_channel = "Common"
var/minimum_time_between_warnings = 400
-/obj/machinery/computer/bank_machine/Initialize(mapload)
- ..()
+/obj/machinery/computer/bank_machine/Initialize()
+ . = ..()
radio = new(src)
radio.subspace_transmission = TRUE
radio.canhear_range = 0
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 9fdcea6aaf..8e5c83183d 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -17,6 +17,8 @@
icon_state = "pod_0"
req_access = list(ACCESS_CLONING) //FOR PREMATURE UNLOCKING.
verb_say = "states"
+ circuit = /obj/item/weapon/circuitboard/machine/clonepod
+
var/heal_level //The clone is released once its health reaches this level.
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
var/mess = FALSE //Need to clean out it if it's full of exploded clone.
@@ -46,8 +48,6 @@
/obj/machinery/clonepod/Initialize()
. = ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null)
- B.apply_default_parts(src)
countdown = new(src)
@@ -59,16 +59,11 @@
/obj/machinery/clonepod/Destroy()
go_out()
- qdel(radio)
- radio = null
- qdel(countdown)
- countdown = null
+ QDEL_NULL(radio)
+ QDEL_NULL(countdown)
if(connected)
connected.DetachCloner(src)
- for(var/i in unattached_flesh)
- qdel(i)
- LAZYCLEARLIST(unattached_flesh)
- unattached_flesh = null
+ QDEL_LIST(unattached_flesh)
. = ..()
/obj/machinery/clonepod/RefreshParts()
@@ -84,16 +79,6 @@
if(heal_level > 100)
heal_level = 100
-/obj/item/weapon/circuitboard/machine/clonepod
- name = "Clone Pod (Machine Board)"
- build_path = /obj/machinery/clonepod
- origin_tech = "programming=2;biotech=2"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/scanning_module = 2,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/sheet/glass = 1)
-
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
/obj/item/weapon/disk/data
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 02ef157de9..ab4eb941b7 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -4,8 +4,8 @@
icon_screen = "crew"
icon_keyboard = "med_key"
circuit = /obj/item/weapon/circuitboard/computer/operating
- var/mob/living/carbon/human/patient = null
- var/obj/structure/table/optable/table = null
+ var/mob/living/carbon/human/patient
+ var/obj/structure/table/optable/table
light_color = LIGHT_COLOR_BLUE
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/_computer.dm
similarity index 84%
rename from code/game/machinery/computer/computer.dm
rename to code/game/machinery/computer/_computer.dm
index d4dc73a2e6..85c02f6d37 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/_computer.dm
@@ -1,142 +1,129 @@
-/obj/machinery/computer
- name = "computer"
- icon = 'icons/obj/computer.dmi'
- icon_state = "computer"
- density = TRUE
- anchored = TRUE
- use_power = IDLE_POWER_USE
- idle_power_usage = 300
- active_power_usage = 300
- max_integrity = 200
- integrity_failure = 100
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20)
- var/obj/item/weapon/circuitboard/computer/circuit = null // if circuit==null, computer can't disassembly
- var/processing = FALSE
- var/brightness_on = 2
- var/icon_keyboard = "generic_key"
- var/icon_screen = "generic"
- var/clockwork = FALSE
-
-/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
- ..(location)
- if(C && istype(C))
- circuit = C
- //Some machines, oldcode arcades mostly, new themselves, so circuit
- //can already be an instance of a type and trying to new that will
- //cause a runtime
- else if(ispath(circuit))
- circuit = new circuit(null)
-
-/obj/machinery/computer/Destroy()
- if(circuit)
- qdel(circuit)
- circuit = null
- return ..()
-
-/obj/machinery/computer/Initialize()
- . = ..()
- power_change()
-
-/obj/machinery/computer/process()
- if(stat & (NOPOWER|BROKEN))
- return 0
- return 1
-
-/obj/machinery/computer/ratvar_act()
- if(!clockwork)
- clockwork = TRUE
- icon_screen = "ratvar[rand(1, 4)]"
- icon_keyboard = "ratvar_key[rand(1, 6)]"
- icon_state = "ratvarcomputer[rand(1, 4)]"
- update_icon()
-
-/obj/machinery/computer/narsie_act()
- if(clockwork && clockwork != initial(clockwork)) //if it's clockwork but isn't normally clockwork
- clockwork = FALSE
- icon_screen = initial(icon_screen)
- icon_keyboard = initial(icon_keyboard)
- icon_state = initial(icon_state)
- update_icon()
-
-/obj/machinery/computer/update_icon()
- cut_overlays()
- if(stat & NOPOWER)
- add_overlay("[icon_keyboard]_off")
- return
- add_overlay(icon_keyboard)
- if(stat & BROKEN)
- add_overlay("[icon_state]_broken")
- else
- add_overlay(icon_screen)
-
-/obj/machinery/computer/power_change()
- ..()
- if(stat & NOPOWER)
- set_light(0)
- else
- set_light(brightness_on)
- update_icon()
- return
-
-/obj/machinery/computer/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&NODECONSTRUCT))
- playsound(src.loc, I.usesound, 50, 1)
- to_chat(user, " You start to disconnect the monitor...")
- if(do_after(user, 20*I.toolspeed, target = src))
- deconstruct(TRUE, user)
- else
- return ..()
-
-/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- switch(damage_type)
- if(BRUTE)
- if(stat & BROKEN)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- else
- playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
- if(BURN)
- playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
-
-/obj/machinery/computer/obj_break(damage_flag)
- if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking
- if(!(stat & BROKEN))
- playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
- stat |= BROKEN
- update_icon()
-
-/obj/machinery/computer/emp_act(severity)
- switch(severity)
- if(1)
- if(prob(50))
- obj_break("energy")
- if(2)
- if(prob(10))
- obj_break("energy")
- ..()
-
-/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
- on_deconstruction()
- if(!(flags & NODECONSTRUCT))
- if(circuit) //no circuit, no computer frame
- var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
- A.circuit = circuit
- A.anchored = TRUE
- if(stat & BROKEN)
- if(user)
- to_chat(user, "The broken glass falls out.")
- else
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- new /obj/item/weapon/shard(src.loc)
- new /obj/item/weapon/shard(src.loc)
- A.state = 3
- A.icon_state = "3"
- else
- if(user)
- to_chat(user, "You disconnect the monitor.")
- A.state = 4
- A.icon_state = "4"
- circuit = null
- for(var/obj/C in src)
- C.forceMove(loc)
-
- qdel(src)
+/obj/machinery/computer
+ name = "computer"
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "computer"
+ density = TRUE
+ anchored = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 300
+ active_power_usage = 300
+ max_integrity = 200
+ integrity_failure = 100
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20)
+ var/processing = FALSE
+ var/brightness_on = 2
+ var/icon_keyboard = "generic_key"
+ var/icon_screen = "generic"
+ var/clockwork = FALSE
+
+/obj/machinery/computer/Initialize(mapload, obj/item/weapon/circuitboard/C)
+ . = ..()
+ power_change()
+
+/obj/machinery/computer/Destroy()
+ QDEL_NULL(circuit)
+ return ..()
+
+/obj/machinery/computer/process()
+ if(stat & (NOPOWER|BROKEN))
+ return 0
+ return 1
+
+/obj/machinery/computer/ratvar_act()
+ if(!clockwork)
+ clockwork = TRUE
+ icon_screen = "ratvar[rand(1, 4)]"
+ icon_keyboard = "ratvar_key[rand(1, 6)]"
+ icon_state = "ratvarcomputer[rand(1, 4)]"
+ update_icon()
+
+/obj/machinery/computer/narsie_act()
+ if(clockwork && clockwork != initial(clockwork)) //if it's clockwork but isn't normally clockwork
+ clockwork = FALSE
+ icon_screen = initial(icon_screen)
+ icon_keyboard = initial(icon_keyboard)
+ icon_state = initial(icon_state)
+ update_icon()
+
+/obj/machinery/computer/update_icon()
+ cut_overlays()
+ if(stat & NOPOWER)
+ add_overlay("[icon_keyboard]_off")
+ return
+ add_overlay(icon_keyboard)
+ if(stat & BROKEN)
+ add_overlay("[icon_state]_broken")
+ else
+ add_overlay(icon_screen)
+
+/obj/machinery/computer/power_change()
+ ..()
+ if(stat & NOPOWER)
+ set_light(0)
+ else
+ set_light(brightness_on)
+ update_icon()
+ return
+
+/obj/machinery/computer/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&NODECONSTRUCT))
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, " You start to disconnect the monitor...")
+ if(do_after(user, 20*I.toolspeed, target = src))
+ deconstruct(TRUE, user)
+ else
+ return ..()
+
+/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(stat & BROKEN)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ else
+ playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
+
+/obj/machinery/computer/obj_break(damage_flag)
+ if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking
+ if(!(stat & BROKEN))
+ playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/computer/emp_act(severity)
+ switch(severity)
+ if(1)
+ if(prob(50))
+ obj_break("energy")
+ if(2)
+ if(prob(10))
+ obj_break("energy")
+ ..()
+
+/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
+ on_deconstruction()
+ if(!(flags & NODECONSTRUCT))
+ if(circuit) //no circuit, no computer frame
+ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
+ A.circuit = circuit
+ A.anchored = TRUE
+ if(stat & BROKEN)
+ if(user)
+ to_chat(user, "The broken glass falls out.")
+ else
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/shard(src.loc)
+ A.state = 3
+ A.icon_state = "3"
+ else
+ if(user)
+ to_chat(user, "You disconnect the monitor.")
+ A.state = 4
+ A.icon_state = "4"
+ circuit = null
+ for(var/obj/C in src)
+ C.forceMove(loc)
+
+ qdel(src)
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index 134c28571e..45c4142f09 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -16,9 +16,9 @@
var/auth_id = "\[NULL\]"
/obj/machinery/computer/apc_control/Initialize()
+ . = ..()
apcs = list() //To avoid BYOND making the list run through a ton of procs
filters = list("Name" = null, "Charge Above" = null, "Charge Below" = null, "Responsive" = null)
- ..()
/obj/machinery/computer/apc_control/process()
apcs = list() //Clear the list every tick
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 286de0bcb8..ad48c9a12c 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -51,21 +51,17 @@
/obj/machinery/computer/arcade/proc/Reset()
return
-/obj/machinery/computer/arcade/New()
- ..()
+/obj/machinery/computer/arcade/Initialize()
+ . = ..()
// If it's a generic arcade machine, pick a random arcade
// circuit board for it and make the new machine
if(!circuit)
var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/computer/arcade))
var/obj/item/weapon/circuitboard/CB = new choice()
new CB.build_path(loc, CB)
- qdel(src)
-
-/obj/machinery/computer/arcade/Initialize()
- . = ..()
+ return INITIALIZE_HINT_QDEL
Reset()
-
#define PULSE_MEDAL "Jackpot"
/obj/machinery/computer/arcade/proc/prizevend()
@@ -78,11 +74,9 @@
new prizeselect(src)
var/atom/movable/prize = pick(contents)
- visible_message(
- "[src] dispenses a [prize]!",
- "You hear a chime and a clunk.")
+ visible_message("[src] dispenses a [prize]!", "You hear a chime and a clunk.")
- prize.loc = loc
+ prize.forceMove(get_turf(src))
#undef PULSE_MEDAL
/obj/machinery/computer/arcade/emp_act(severity)
@@ -157,7 +151,6 @@
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
- return
/obj/machinery/computer/arcade/battle/Topic(href, href_list)
if(..())
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 889fda3dd8..a53b270130 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -142,320 +142,4 @@
new /obj/item/weapon/shard(loc)
if(state >= 3)
new /obj/item/stack/cable_coil(loc , 5)
- ..()
-
-
-/obj/item/weapon/circuitboard
- name = "circuit board"
- icon = 'icons/obj/module.dmi'
- icon_state = "id_mod"
- item_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- origin_tech = "programming=2"
- materials = list(MAT_GLASS=1000)
- w_class = WEIGHT_CLASS_SMALL
- var/build_path = null
-
-/obj/item/weapon/circuitboard/computer/turbine_computer
- name = "Turbine Computer (Computer Board)"
- build_path = /obj/machinery/computer/turbine_computer
- origin_tech = "programming=4;engineering=4;powerstorage=4"
-/obj/item/weapon/circuitboard/computer/launchpad_console
- name = "Launchpad Control Console (Computer Board)"
- build_path = /obj/machinery/computer/launchpad
- origin_tech = "programming=3;bluespace=3;plasmatech=2"
-/obj/item/weapon/circuitboard/computer/message_monitor
- name = "Message Monitor (Computer Board)"
- build_path = /obj/machinery/computer/message_monitor
- origin_tech = "programming=2"
-/obj/item/weapon/circuitboard/computer/security
- name = "Security Cameras (Computer Board)"
- build_path = /obj/machinery/computer/security
- origin_tech = "programming=2;combat=2"
-/obj/item/weapon/circuitboard/computer/xenobiology
- name = "circuit board (Xenobiology Console)"
- build_path = /obj/machinery/computer/camera_advanced/xenobio
- origin_tech = "programming=3;biotech=3"
-/obj/item/weapon/circuitboard/computer/base_construction
- name = "circuit board (Aux Mining Base Construction Console)"
- build_path = /obj/machinery/computer/camera_advanced/base_construction
- origin_tech = "programming=3;engineering=3"
-/obj/item/weapon/circuitboard/computer/aiupload
- name = "AI Upload (Computer Board)"
- build_path = /obj/machinery/computer/upload/ai
- origin_tech = "programming=4;engineering=4"
-/obj/item/weapon/circuitboard/computer/borgupload
- name = "Cyborg Upload (Computer Board)"
- build_path = /obj/machinery/computer/upload/borg
- origin_tech = "programming=4;engineering=4"
-/obj/item/weapon/circuitboard/computer/med_data
- name = "Medical Records Console (Computer Board)"
- build_path = /obj/machinery/computer/med_data
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/computer/pandemic
- name = "PanD.E.M.I.C. 2200 (Computer Board)"
- build_path = /obj/machinery/computer/pandemic
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/computer/scan_consolenew
- name = "DNA Machine (Computer Board)"
- build_path = /obj/machinery/computer/scan_consolenew
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/computer/communications
- name = "Communications (Computer Board)"
- build_path = /obj/machinery/computer/communications
- origin_tech = "programming=3;magnets=3"
- var/lastTimeUsed = 0
-
-/obj/item/weapon/circuitboard/computer/card
- name = "ID Console (Computer Board)"
- build_path = /obj/machinery/computer/card
- origin_tech = "programming=3"
-/obj/item/weapon/circuitboard/computer/card/centcom
- name = "CentCom ID Console (Computer Board)"
- build_path = /obj/machinery/computer/card/centcom
-
-/obj/item/weapon/circuitboard/computer/card/minor
- name = "Department Management Console (Computer Board)"
- build_path = /obj/machinery/computer/card/minor
- var/target_dept = 1
- var/list/dept_list = list("General","Security","Medical","Science","Engineering")
-
-/obj/item/weapon/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1)
- to_chat(user, "You set the board to \"[dept_list[target_dept]]\".")
- else
- return ..()
-
-/obj/item/weapon/circuitboard/computer/card/minor/examine(user)
- ..()
- to_chat(user, "Currently set to \"[dept_list[target_dept]]\".")
-
-//obj/item/weapon/circuitboard/computer/shield
-// name = "Shield Control (Computer Board)"
-// build_path = /obj/machinery/computer/stationshield
-/obj/item/weapon/circuitboard/computer/teleporter
- name = "Teleporter (Computer Board)"
- build_path = /obj/machinery/computer/teleporter
- origin_tech = "programming=3;bluespace=3;plasmatech=3"
-/obj/item/weapon/circuitboard/computer/secure_data
- name = "Security Records Console (Computer Board)"
- build_path = /obj/machinery/computer/secure_data
- origin_tech = "programming=2;combat=2"
-/obj/item/weapon/circuitboard/computer/stationalert
- name = "Station Alerts (Computer Board)"
- build_path = /obj/machinery/computer/station_alert
-/*/obj/item/weapon/circuitboard/computer/atmospheresiphonswitch
- name = "Atmosphere siphon control (Computer Board)"
- build_path = /obj/machinery/computer/atmosphere/siphonswitch*/
-/obj/item/weapon/circuitboard/computer/atmos_control
- name = "Atmospheric Monitor (Computer Board)"
- build_path = /obj/machinery/computer/atmos_control
-/obj/item/weapon/circuitboard/computer/atmos_control/tank
- name = "Tank Control (Computer Board)"
- build_path = /obj/machinery/computer/atmos_control/tank
- origin_tech = "programming=2;engineering=3;materials=2"
-/obj/item/weapon/circuitboard/computer/atmos_alert
- name = "Atmospheric Alert (Computer Board)"
- build_path = /obj/machinery/computer/atmos_alert
-/obj/item/weapon/circuitboard/computer/pod
- name = "Massdriver control (Computer Board)"
- build_path = /obj/machinery/computer/pod
-/obj/item/weapon/circuitboard/computer/robotics
- name = "Robotics Control (Computer Board)"
- build_path = /obj/machinery/computer/robotics
- origin_tech = "programming=3"
-/obj/item/weapon/circuitboard/computer/cloning
- name = "Cloning (Computer Board)"
- build_path = /obj/machinery/computer/cloning
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/computer/arcade/battle
- name = "Arcade Battle (Computer Board)"
- build_path = /obj/machinery/computer/arcade/battle
- origin_tech = "programming=1"
-/obj/item/weapon/circuitboard/computer/arcade/orion_trail
- name = "Orion Trail (Computer Board)"
- build_path = /obj/machinery/computer/arcade/orion_trail
- origin_tech = "programming=1"
-/obj/item/weapon/circuitboard/computer/turbine_control
- name = "Turbine control (Computer Board)"
- build_path = /obj/machinery/computer/turbine_computer
-/obj/item/weapon/circuitboard/computer/solar_control
- name = "Solar Control (Computer Board)" //name fixed 250810
- build_path = /obj/machinery/power/solar_control
- origin_tech = "programming=2;powerstorage=2"
-/obj/item/weapon/circuitboard/computer/powermonitor
- name = "Power Monitor (Computer Board)" //name fixed 250810
- build_path = /obj/machinery/computer/monitor
- origin_tech = "programming=2;powerstorage=2"
-/obj/item/weapon/circuitboard/computer/olddoor
- name = "DoorMex (Computer Board)"
- build_path = /obj/machinery/computer/pod/old
-/obj/item/weapon/circuitboard/computer/syndicatedoor
- name = "ProComp Executive (Computer Board)"
- build_path = /obj/machinery/computer/pod/old/syndicate
-/obj/item/weapon/circuitboard/computer/swfdoor
- name = "Magix (Computer Board)"
- build_path = /obj/machinery/computer/pod/old/swf
-/obj/item/weapon/circuitboard/computer/prisoner
- name = "Prisoner Management Console (Computer Board)"
- build_path = /obj/machinery/computer/prisoner
-/obj/item/weapon/circuitboard/computer/gulag_teleporter_console
- name = "Labor Camp teleporter console (Computer Board)"
- build_path = /obj/machinery/computer/gulag_teleporter_computer
-
-/obj/item/weapon/circuitboard/computer/rdconsole
- name = "R&D Console (Computer Board)"
- build_path = /obj/machinery/computer/rdconsole/core
-
-/obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- if(build_path == /obj/machinery/computer/rdconsole/core)
- name = "R&D Console - Robotics (Computer Board)"
- build_path = /obj/machinery/computer/rdconsole/robotics
- to_chat(user, "Access protocols successfully updated.")
- else
- name = "R&D Console (Computer Board)"
- build_path = /obj/machinery/computer/rdconsole/core
- to_chat(user, "Defaulting access protocols.")
- else
- return ..()
-
-/obj/item/weapon/circuitboard/computer/mecha_control
- name = "Exosuit Control Console (Computer Board)"
- build_path = /obj/machinery/computer/mecha
-/obj/item/weapon/circuitboard/computer/rdservercontrol
- name = "R&D Server Control (Computer Board)"
- build_path = /obj/machinery/computer/rdservercontrol
-/obj/item/weapon/circuitboard/computer/crew
- name = "Crew Monitoring Console (Computer Board)"
- build_path = /obj/machinery/computer/crew
- origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/computer/mech_bay_power_console
- name = "Mech Bay Power Control Console (Computer Board)"
- build_path = /obj/machinery/computer/mech_bay_power_console
- origin_tech = "programming=3;powerstorage=3"
-
-/obj/item/weapon/circuitboard/computer/cargo
- name = "Supply Console (Computer Board)"
- build_path = /obj/machinery/computer/cargo
- origin_tech = "programming=3"
- var/contraband = FALSE
- var/emagged = FALSE
-
-/obj/item/weapon/circuitboard/computer/cargo/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/device/multitool))
- if(!emagged)
- contraband = !contraband
- to_chat(user, "Receiver spectrum set to [contraband ? "Broad" : "Standard"].")
- else
- to_chat(user, "The spectrum chip is unresponsive.")
- else if(istype(I, /obj/item/weapon/card/emag))
- if(!emagged)
- contraband = TRUE
- emagged = TRUE
- to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
- else
- return ..()
-
-
-/obj/item/weapon/circuitboard/computer/cargo/request
- name = "Supply Request Console (Computer Board)"
- build_path = /obj/machinery/computer/cargo/request
-/obj/item/weapon/circuitboard/computer/stockexchange
- name = "circuit board (Stock Exchange Console)"
- build_path = /obj/machinery/computer/stockexchange
- origin_tech = "programming=3"
-
-/obj/item/weapon/circuitboard/computer/operating
- name = "Operating Computer (Computer Board)"
- build_path = /obj/machinery/computer/operating
- origin_tech = "programming=2;biotech=3"
-/obj/item/weapon/circuitboard/computer/mining
- name = "Outpost Status Display (Computer Board)"
- build_path = /obj/machinery/computer/security/mining
-/obj/item/weapon/circuitboard/computer/comm_monitor
- name = "Telecommunications Monitor (Computer Board)"
- build_path = /obj/machinery/computer/telecomms/monitor
- origin_tech = "programming=3;magnets=3;bluespace=2"
-/obj/item/weapon/circuitboard/computer/comm_server
- name = "Telecommunications Server Monitor (Computer Board)"
- build_path = /obj/machinery/computer/telecomms/server
- origin_tech = "programming=3;magnets=3;bluespace=2"
-
-/obj/item/weapon/circuitboard/computer/shuttle
- name = "Shuttle (Computer Board)"
- build_path = /obj/machinery/computer/shuttle
- var/shuttleId
- var/possible_destinations = ""
-
-/obj/item/weapon/circuitboard/computer/shuttle/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/device/multitool))
- var/chosen_id = round(input(usr, "Choose an ID number (-1 for reset):", "Input an Integer", null) as num|null)
- if(chosen_id >= 0)
- shuttleId = chosen_id
- else
- shuttleId = initial(shuttleId)
- else
- return ..()
-
-/obj/item/weapon/circuitboard/computer/labor_shuttle
- name = "Labor Shuttle (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/labor
-/obj/item/weapon/circuitboard/computer/labor_shuttle/one_way
- name = "Prisoner Shuttle Console (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/labor/one_way
-/obj/item/weapon/circuitboard/computer/ferry
- name = "Transport Ferry (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/ferry
-/obj/item/weapon/circuitboard/computer/ferry/request
- name = "Transport Ferry Console (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/ferry/request
-/obj/item/weapon/circuitboard/computer/mining_shuttle
- name = "Mining Shuttle (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/mining
-/obj/item/weapon/circuitboard/computer/white_ship
- name = "White Ship (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/white_ship
-/obj/item/weapon/circuitboard/computer/auxillary_base
- name = "Auxillary Base Management Console (Computer Board)"
- build_path = /obj/machinery/computer/auxillary_base
-/obj/item/weapon/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future
- name = "Holodeck Control (Computer Board)"
- build_path = /obj/machinery/computer/holodeck
- origin_tech = "programming=4"
-/obj/item/weapon/circuitboard/computer/aifixer
- name = "AI Integrity Restorer (Computer Board)"
- build_path = /obj/machinery/computer/aifixer
- origin_tech = "programming=2;biotech=2"
-/*/obj/item/weapon/circuitboard/computer/prison_shuttle
- name = "Prison Shuttle (Computer Board)"
- build_path = /obj/machinery/computer/prison_shuttle*/
-/obj/item/weapon/circuitboard/computer/slot_machine
- name = "Slot Machine (Computer Board)"
- build_path = /obj/machinery/computer/slot_machine
- origin_tech = "programming=1"
-
-/obj/item/weapon/circuitboard/computer/libraryconsole
- name = "Library Visitor Console (Computer Board)"
- build_path = /obj/machinery/computer/libraryconsole
- origin_tech = "programming=1"
-
-/obj/item/weapon/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement)
- name = "Library Visitor Console (Computer Board)"
- build_path = /obj/machinery/computer/libraryconsole
- to_chat(user, "Defaulting access protocols.")
- else
- name = "Book Inventory Management Console (Computer Board)"
- build_path = /obj/machinery/computer/libraryconsole/bookmanagement
- to_chat(user, "Access protocols successfully updated.")
- else
- return ..()
-
-/obj/item/weapon/circuitboard/computer/apc_control
- name = "\improper Power Flow Control Console (Computer Board)"
- build_path = /obj/machinery/computer/apc_control
- origin_tech = "programming=3;engineering=3;powerstorage=2"
+ ..()
\ No newline at end of file
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 7330f2d072..480d446830 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -571,8 +571,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
icon_screen = "idminor"
circuit = /obj/item/weapon/circuitboard/computer/card/minor
-/obj/machinery/computer/card/minor/New()
- ..()
+/obj/machinery/computer/card/minor/Initialize()
+ . = ..()
var/obj/item/weapon/circuitboard/computer/card/minor/typed_circuit = circuit
if(target_dept)
typed_circuit.target_dept = target_dept
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index a4caa68480..6b76b3c98e 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -20,7 +20,7 @@
light_color = LIGHT_COLOR_BLUE
/obj/machinery/computer/cloning/Initialize()
- ..()
+ . = ..()
updatemodules(TRUE)
/obj/machinery/computer/cloning/Destroy()
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 75a73a5067..eef44384d2 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -41,9 +41,9 @@
return FALSE
return TRUE
-/obj/machinery/computer/communications/New()
+/obj/machinery/computer/communications/Initialize()
+ . = ..()
GLOB.shuttle_caller_list += src
- ..()
/obj/machinery/computer/communications/process()
if(..())
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index 27c0f50e7b..de18b51543 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -53,17 +53,13 @@
else
return ..()
-/obj/machinery/computer/scan_consolenew/New()
- ..()
-
- spawn(5)
- for(dir in list(NORTH,EAST,SOUTH,WEST))
- connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
- if(!isnull(connected))
- break
- injectorready = world.time + INJECTOR_TIMEOUT
- return
- return
+/obj/machinery/computer/scan_consolenew/Initialize()
+ . = ..()
+ for(dir in list(NORTH,EAST,SOUTH,WEST))
+ connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
+ if(!isnull(connected))
+ break
+ injectorready = world.time + INJECTOR_TIMEOUT
/obj/machinery/computer/scan_consolenew/attack_hand(mob/user)
if(..())
diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm
index 07bfb4b6dd..4b7fccc221 100644
--- a/code/game/machinery/computer/gulag_teleporter.dm
+++ b/code/game/machinery/computer/gulag_teleporter.dm
@@ -15,9 +15,9 @@
light_color = LIGHT_COLOR_RED
-/obj/machinery/computer/gulag_teleporter_computer/New()
- ..()
- addtimer(CALLBACK(src, .proc/scan_machinery), 5)
+/obj/machinery/computer/gulag_teleporter_computer/Initialize()
+ . = ..()
+ scan_machinery()
/obj/machinery/computer/gulag_teleporter_computer/Destroy()
if(id)
diff --git a/code/game/machinery/computer/monastery_shuttle.dm b/code/game/machinery/computer/monastery_shuttle.dm
index e64d784a1f..ac2e9c9e78 100644
--- a/code/game/machinery/computer/monastery_shuttle.dm
+++ b/code/game/machinery/computer/monastery_shuttle.dm
@@ -5,7 +5,3 @@
shuttleId = "pod1"
possible_destinations = "monastery_shuttle_asteroid;monastery_shuttle_station"
no_destination_swap = TRUE
-
-/obj/item/weapon/circuitboard/computer/shuttle/monastery_shuttle
- name = "Monastery Shuttle (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/monastery_shuttle
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
new file mode 100644
index 0000000000..f184d78a1b
--- /dev/null
+++ b/code/game/machinery/computer/teleporter.dm
@@ -0,0 +1,212 @@
+/obj/machinery/computer/teleporter
+ name = "teleporter control console"
+ desc = "Used to control a linked teleportation Hub and Station."
+ icon_screen = "teleport"
+ icon_keyboard = "teleport_key"
+ light_color = LIGHT_COLOR_BLUE
+ circuit = /obj/item/weapon/circuitboard/computer/teleporter
+ var/obj/item/device/gps/locked
+ var/regime_set = "Teleporter"
+ var/id
+ var/obj/machinery/teleport/station/power_station
+ var/calibrating
+ var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.)
+ //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location.
+
+/obj/machinery/computer/teleporter/Initialize()
+ . = ..()
+ id = "[rand(1000, 9999)]"
+ link_power_station()
+
+/obj/machinery/computer/teleporter/Destroy()
+ if (power_station)
+ power_station.teleporter_console = null
+ power_station = null
+ return ..()
+
+/obj/machinery/computer/teleporter/proc/link_power_station()
+ if(power_station)
+ return
+ for(dir in GLOB.cardinals)
+ power_station = locate(/obj/machinery/teleport/station, get_step(src, dir))
+ if(power_station)
+ break
+ return power_station
+
+/obj/machinery/computer/teleporter/attackby(obj/I, mob/living/user, params)
+ if(istype(I, /obj/item/device/gps))
+ var/obj/item/device/gps/L = I
+ if(L.locked_location && !(stat & (NOPOWER|BROKEN)))
+ if(!user.transferItemToLoc(L, src))
+ to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]!")
+ return
+ locked = L
+ to_chat(user, "You insert the GPS device into the [name]'s slot.")
+ else
+ return ..()
+
+/obj/machinery/computer/teleporter/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/computer/teleporter/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/computer/teleporter/interact(mob/user)
+ var/data = "
Teleporter Status
"
+ if(!power_station)
+ data += "No power station linked.
"
+ else if(!power_station.teleporter_hub)
+ data += "No hub linked.
"
+ else
+ data += "Current regime: [regime_set]
"
+ data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
"
+ if(calibrating)
+ data += "Calibration: In Progress"
+ else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3)
+ data += "Calibration: Optimal"
+ else
+ data += "Calibration: Sub-Optimal"
+ data += "
"
+
+ data += "Change regime
"
+ data += "Set target
"
+ if(locked)
+ data += "
Get target from memory
"
+ data += "Eject GPS device
"
+ else
+ data += "
Get target from memory
"
+ data += "Eject GPS device
"
+
+ data += "
Calibrate Hub"
+
+ var/datum/browser/popup = new(user, "teleporter", name, 400, 400)
+ popup.set_content(data)
+ popup.open()
+
+/obj/machinery/computer/teleporter/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["eject"])
+ eject()
+ updateDialog()
+ return
+
+ if(!check_hub_connection())
+ say("Error: Unable to detect hub.")
+ return
+ if(calibrating)
+ say("Error: Calibration in progress. Stand by.")
+ return
+
+ if(href_list["regimeset"])
+ power_station.engaged = 0
+ power_station.teleporter_hub.update_icon()
+ power_station.teleporter_hub.calibrated = 0
+ reset_regime()
+ if(href_list["settarget"])
+ power_station.engaged = 0
+ power_station.teleporter_hub.update_icon()
+ power_station.teleporter_hub.calibrated = 0
+ set_target(usr)
+ if(href_list["locked"])
+ power_station.engaged = 0
+ power_station.teleporter_hub.update_icon()
+ power_station.teleporter_hub.calibrated = 0
+ target = get_turf(locked.locked_location)
+ if(href_list["calibrate"])
+ if(!target)
+ say("Error: No target set to calibrate to.")
+ return
+ if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3)
+ say("Hub is already calibrated!")
+ return
+ say("Processing hub calibration to target...")
+
+ calibrating = 1
+ spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration
+ calibrating = 0
+ if(check_hub_connection())
+ power_station.teleporter_hub.calibrated = 1
+ say("Calibration complete.")
+ else
+ say("Error: Unable to detect hub.")
+ updateDialog()
+
+ updateDialog()
+
+/obj/machinery/computer/teleporter/proc/check_hub_connection()
+ if(!power_station)
+ return FALSE
+ if(!power_station.teleporter_hub)
+ return FALSE
+ return TRUE
+
+/obj/machinery/computer/teleporter/proc/reset_regime()
+ target = null
+ if(regime_set == "Teleporter")
+ regime_set = "Gate"
+ else
+ regime_set = "Teleporter"
+
+/obj/machinery/computer/teleporter/proc/eject()
+ if(locked)
+ locked.forceMove(get_turf(src))
+ locked = null
+
+/obj/machinery/computer/teleporter/proc/set_target(mob/user)
+ var/list/L = list()
+ var/list/areaindex = list()
+ if(regime_set == "Teleporter")
+ for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons)
+ var/turf/T = get_turf(R)
+ if(!T)
+ continue
+ if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
+ continue
+ L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R
+
+ for(var/obj/item/weapon/implant/tracking/I in GLOB.tracked_implants)
+ if(!I.imp_in || !ismob(I.loc))
+ continue
+ else
+ var/mob/M = I.loc
+ if(M.stat == DEAD)
+ if(M.timeofdeath + 6000 < world.time)
+ continue
+ var/turf/T = get_turf(M)
+ if(!T)
+ continue
+ if(T.z == ZLEVEL_CENTCOM)
+ continue
+ L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
+
+ var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
+ target = L[desc]
+
+ else
+ var/list/S = power_station.linked_stations
+ if(!S.len)
+ to_chat(user, "No connected stations located.")
+ return
+ for(var/obj/machinery/teleport/station/R in S)
+ var/turf/T = get_turf(R)
+ if(!T || !R.teleporter_hub || !R.teleporter_console)
+ continue
+ if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
+ continue
+ L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R
+ var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L
+ target = L[desc]
+ if(target)
+ var/obj/machinery/teleport/station/trg = target
+ trg.linked_stations |= power_station
+ trg.stat &= ~NOPOWER
+ if(trg.teleporter_hub)
+ trg.teleporter_hub.stat &= ~NOPOWER
+ trg.teleporter_hub.update_icon()
+ if(trg.teleporter_console)
+ trg.teleporter_console.stat &= ~NOPOWER
+ trg.teleporter_console.update_icon()
\ No newline at end of file
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 199e925f2d..1ff66314f2 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -259,52 +259,4 @@
for(var/X in components)
var/obj/item/I = X
I.forceMove(loc)
- ..()
-
-
-
-//Machine Frame Circuit Boards
-/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
-micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
-*/
-
-/obj/item/weapon/circuitboard/machine
- var/list/req_components = null
- // Components required by the machine.
- // Example: list(/obj/item/weapon/stock_parts/matter_bin = 5)
- var/list/def_components = null
- // Default replacements for req_components, to be used in apply_default_parts instead of req_components types
- // Example: list(/obj/item/weapon/stock_parts/matter_bin = /obj/item/weapon/stock_parts/matter_bin/super)
-
-/obj/item/weapon/circuitboard/machine/proc/apply_default_parts(obj/machinery/M)
- if(!req_components)
- return
-
- M.component_parts = list(src) // List of components always contains a board
- loc = null
-
- for(var/comp_path in req_components)
- var/comp_amt = req_components[comp_path]
- if(!comp_amt)
- continue
-
- if(def_components && def_components[comp_path])
- comp_path = def_components[comp_path]
-
- if(ispath(comp_path, /obj/item/stack))
- M.component_parts += new comp_path(null, comp_amt)
- else
- for(var/i in 1 to comp_amt)
- M.component_parts += new comp_path(null)
-
- M.RefreshParts()
-
-
-/obj/item/weapon/circuitboard/machine/abductor
- name = "alien board (Report This)"
- icon_state = "abductor_mod"
- origin_tech = "programming=5;abductor=3"
-
-/obj/item/weapon/circuitboard/machine/clockwork
- name = "clockwork board (Report This)"
- icon_state = "clock_mod"
+ ..()
\ No newline at end of file
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 5100ece31f..2891d47d91 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -50,7 +50,7 @@
songs += T
/obj/machinery/disco/Initialize()
- ..()
+ . = ..()
selection = songs[1]
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 20bb81e0b8..80f73b3027 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -4,32 +4,17 @@
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "scanner"
density = TRUE
- var/locked = FALSE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 50
active_power_usage = 300
occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain)
+ circuit = /obj/item/weapon/circuitboard/machine/clonescanner
+ var/locked = FALSE
var/damage_coeff
var/scan_level
var/precision_coeff
-/obj/machinery/dna_scannernew/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonescanner(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/clonescanner
- name = "Cloning Scanner (Machine Board)"
- build_path = /obj/machinery/dna_scannernew
- origin_tech = "programming=2;biotech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/stack/sheet/glass = 1,
- /obj/item/stack/cable_coil = 2)
-
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
damage_coeff = 0
diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm
index 4a92c935b4..3733c71844 100644
--- a/code/game/machinery/doors/alarmlock.dm
+++ b/code/game/machinery/doors/alarmlock.dm
@@ -21,7 +21,7 @@
return ..()
/obj/machinery/door/airlock/alarmlock/Initialize()
- ..()
+ . = ..()
SSradio.remove_object(src, air_frequency)
air_connection = SSradio.add_object(src, air_frequency, GLOB.RADIO_TO_AIRALARM)
open()
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 4e39255109..4c0d4a1804 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -45,7 +45,7 @@
Radio.listening = 0
/obj/machinery/door_timer/Initialize()
- ..()
+ . = ..()
if(id != null)
for(var/obj/machinery/door/window/brigdoor/M in urange(20, src))
if (M.id == id)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index d87f326c58..f610531be1 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -26,7 +26,7 @@
var/list/affecting_areas
/obj/machinery/door/firedoor/Initialize()
- ..()
+ . = ..()
CalculateAffectingAreas()
/obj/machinery/door/firedoor/examine(mob/user)
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 3dbf7888de..5adc8d1da3 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -11,8 +11,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
var/max_dist = 100
verb_say = "states coldly"
-/obj/machinery/doppler_array/New()
- ..()
+/obj/machinery/doppler_array/Initialize()
+ . = ..()
GLOB.doppler_arrays += src
/obj/machinery/doppler_array/Destroy()
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index c01cea0de3..4336571f56 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -24,6 +24,7 @@
var/datum/material_container/materials
var/list/using_materials
+ var/starting_amount = 0
var/metal_cost = 1000
var/glass_cost = 1000
var/power_used = 1000
@@ -52,34 +53,27 @@
var/break_message = "lets out a tinny alarm before falling dark."
var/break_sound = 'sound/machines/warning-buzzer.ogg'
-/obj/machinery/droneDispenser/New()
- ..()
- obj_integrity = max_integrity
- materials = new(src, list(MAT_METAL, MAT_GLASS),
- MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2)
-
+/obj/machinery/droneDispenser/Initialize()
+ . = ..()
+ materials = new(src, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2)
+ materials.insert_amount(starting_amount)
using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost)
/obj/machinery/droneDispenser/Destroy()
- qdel(materials)
- . = ..()
+ QDEL_NULL(materials)
+ return ..()
-/obj/machinery/droneDispenser/preloaded/New()
- ..()
- materials.insert_amount(5000)
+/obj/machinery/droneDispenser/preloaded
+ starting_amount = 5000
/obj/machinery/droneDispenser/syndrone //Please forgive me
name = "syndrone shell dispenser"
- desc = "A suspicious machine that will create Syndicate \
- exterminator drones when supplied with metal and glass. Disgusting."
+ desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting."
dispense_type = /obj/item/drone_shell/syndrone
//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."
-
-/obj/machinery/droneDispenser/syndrone/New()
- ..()
- materials.insert_amount(25000)
+ starting_amount = 25000
/obj/machinery/droneDispenser/syndrone/badass //Please forgive me
name = "badass syndrone shell dispenser"
@@ -101,10 +95,7 @@
metal_cost = 2000
glass_cost = 2000
power_used = 2000
-
-/obj/machinery/droneDispenser/snowflake/preloaded/New()
- ..()
- materials.insert_amount(10000)
+ starting_amount = 10000
// An example of a custom drone dispenser.
// This one requires no materials and creates basic hivebots
diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm
index fb50bc8314..be027a89c8 100644
--- a/code/game/machinery/embedded_controller/airlock_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_controller.dm
@@ -220,7 +220,7 @@
var/sanitize_external
/obj/machinery/embedded_controller/radio/airlock_controller/Initialize(mapload)
- ..()
+ . = ..()
if(!mapload)
return
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index 3c6f0ad13a..ee0b8f287c 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -77,7 +77,7 @@
return ..()
/obj/machinery/embedded_controller/radio/Initialize()
- ..()
+ . = ..()
set_frequency(frequency)
/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal)
diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm
index 5959939673..063e81354c 100644
--- a/code/game/machinery/embedded_controller/simple_vent_controller.dm
+++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm
@@ -52,8 +52,7 @@
var/airpump_tag
/obj/machinery/embedded_controller/radio/simple_vent_controller/Initialize(mapload)
- ..()
-
+ . = ..()
if(!mapload)
return
var/datum/computer/file/embedded_program/simple_vent_controller/new_prog = new
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index beaa0919ef..8a0b86d034 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -5,15 +5,15 @@
desc = "A wall-mounted flashbulb device."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "mflash1"
- var/obj/item/device/assembly/flash/handheld/bulb = null
+ max_integrity = 250
+ integrity_failure = 100
+ anchored = TRUE
+ var/obj/item/device/assembly/flash/handheld/bulb
var/id = null
var/range = 2 //this is roughly the size of brig cell
var/last_flash = 0 //Don't want it getting spammed like regular flashes
var/strength = 100 //How knocked down targets are when flashed.
var/base_state = "mflash"
- max_integrity = 250
- integrity_failure = 100
- anchored = TRUE
/obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored
name = "portable flasher"
@@ -24,19 +24,17 @@
base_state = "pflash"
density = TRUE
-/obj/machinery/flasher/New(loc, ndir = 0, built = 0)
- ..() // ..() is EXTREMELY IMPORTANT, never forget to add it
+/obj/machinery/flasher/Initialize(mapload, ndir = 0, built = 0)
+ . = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it
if(built)
setDir(ndir)
pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28)
pixel_y = (dir & 3)? (dir ==1 ? -28 : 28) : 0
else
- bulb = new /obj/item/device/assembly/flash/handheld(src)
+ bulb = new(src)
/obj/machinery/flasher/Destroy()
- if(bulb)
- qdel(bulb)
- bulb = null
+ QDEL_NULL(bulb)
return ..()
/obj/machinery/flasher/power_change()
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index 81ffc18836..6970db7c12 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -17,25 +17,23 @@ The console is located at computer/gulag_teleporter.dm
use_power = IDLE_POWER_USE
idle_power_usage = 200
active_power_usage = 5000
+ circuit = /obj/item/weapon/circuitboard/machine/gulag_teleporter
var/locked = FALSE
var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner
var/shoes_type = /obj/item/clothing/shoes/sneakers/orange
- var/obj/machinery/gulag_item_reclaimer/linked_reclaimer = null
- var/list/required_items
+ var/obj/machinery/gulag_item_reclaimer/linked_reclaimer
+ var/static/list/telegulag_required_items = typecacheof(list(
+ /obj/item/weapon/implant,
+ /obj/item/clothing/suit/space/eva/plasmaman,
+ /obj/item/clothing/under/plasmaman,
+ /obj/item/clothing/head/helmet/space/plasmaman,
+ /obj/item/weapon/tank/internals,
+ /obj/item/clothing/mask/breath,
+ /obj/item/clothing/mask/gas))
-/obj/machinery/gulag_teleporter/New()
- ..()
- required_items = typecacheof(list(
- /obj/item/weapon/implant,
- /obj/item/clothing/suit/space/eva/plasmaman,
- /obj/item/clothing/under/plasmaman,
- /obj/item/clothing/head/helmet/space/plasmaman,
- /obj/item/weapon/tank/internals,
- /obj/item/clothing/mask/breath,
- /obj/item/clothing/mask/gas))
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gulag_teleporter(null)
- B.apply_default_parts(src)
- addtimer(CALLBACK(src, .proc/locate_reclaimer), 5)
+/obj/machinery/gulag_teleporter/Initialize()
+ . = ..()
+ locate_reclaimer()
/obj/machinery/gulag_teleporter/Destroy()
if(linked_reclaimer)
@@ -46,7 +44,6 @@ The console is located at computer/gulag_teleporter.dm
..()
update_icon()
-
/obj/machinery/gulag_teleporter/interact(mob/user)
if(locked)
to_chat(user, "[src] is locked.")
@@ -138,7 +135,7 @@ The console is located at computer/gulag_teleporter.dm
linked_reclaimer.stored_items[occupant] = list()
var/mob/living/mob_occupant = occupant
for(var/obj/item/W in mob_occupant)
- if(!is_type_in_typecache(W, required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W))
+ if(!is_type_in_typecache(W, telegulag_required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W))
if(istype(W, /obj/item/weapon/restraints/handcuffs))
W.forceMove(get_turf(src))
continue
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index e8606238d4..4a0cf3a23a 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -40,6 +40,7 @@ Possible to do for anyone motivated enough:
active_power_usage = 100
max_integrity = 300
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
+ circuit = /obj/item/weapon/circuitboard/machine/holopad
var/list/masters = list()//List of living mobs that use the holopad
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
@@ -51,8 +52,6 @@ Possible to do for anyone motivated enough:
/obj/machinery/holopad/Initialize()
. = ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null)
- B.apply_default_parts(src)
holopads += src
/obj/machinery/holopad/Destroy()
@@ -293,7 +292,7 @@ Possible to do for anyone motivated enough:
Hologram.Impersonation = user
Hologram.copy_known_languages_from(user,replace = TRUE)
- Hologram.mouse_opacity = 0//So you can't click on it.
+ Hologram.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it.
Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
Hologram.anchored = TRUE//So space wind cannot drag it.
Hologram.name = "[user.name] (Hologram)"//If someone decides to right click.
@@ -384,11 +383,5 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
return Impersonation.examine(user)
return ..()
-/obj/item/weapon/circuitboard/machine/holopad
- name = "AI Holopad (Machine Board)"
- build_path = /obj/machinery/holopad
- origin_tech = "programming=1"
- req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
-
#undef HOLOPAD_PASSIVE_POWER_USAGE
#undef HOLOGRAM_POWER_USAGE
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 0210659eb9..0e450533fa 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -36,8 +36,8 @@
location.hotspot_expose(1000,500,1)
return 1
-/obj/machinery/igniter/New()
- ..()
+/obj/machinery/igniter/Initialize()
+ . = ..()
icon_state = "igniter[on]"
/obj/machinery/igniter/power_change()
@@ -61,15 +61,14 @@
anchored = TRUE
resistance_flags = FIRE_PROOF
-/obj/machinery/sparker/New()
- ..()
+/obj/machinery/sparker/Initialize()
+ . = ..()
spark_system = new /datum/effect_system/spark_spread
spark_system.set_up(2, 1, src)
spark_system.attach(src)
/obj/machinery/sparker/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
return ..()
/obj/machinery/sparker/power_change()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index bca6c51559..45b891ce30 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -15,7 +15,7 @@
/obj/item/weapon/reagent_containers/glass)
/obj/machinery/iv_drip/Initialize()
- ..()
+ . = ..()
update_icon()
drip_containers = typecacheof(drip_containers)
diff --git a/code/game/machinery/iv_drip.dm.rej b/code/game/machinery/iv_drip.dm.rej
new file mode 100644
index 0000000000..4c8aa8206c
--- /dev/null
+++ b/code/game/machinery/iv_drip.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm (rejected hunks)
+@@ -15,7 +15,7 @@
+ /obj/item/weapon/reagent_containers/glass)
+
+ /obj/machinery/iv_drip/Initialize()
+- ..()
++ . = ..()
+ update_icon()
+ drip_containers = typecacheof(drip_containers)
+
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 931ec8a984..1155dfa577 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -8,6 +8,7 @@
use_power = TRUE
idle_power_usage = 200
active_power_usage = 2500
+ circuit = /obj/item/weapon/circuitboard/machine/launchpad
var/stationary = TRUE //to prevent briefcase pad deconstruction and such
var/display_name = "Launchpad"
var/teleport_speed = 35
@@ -17,20 +18,6 @@
var/x_offset = 0
var/y_offset = 0
-/obj/machinery/launchpad/Initialize()
- . = ..()
- var/obj/item/weapon/circuitboard/machine/launchpad/B = new
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/launchpad
- name = "Bluespace Launchpad (Machine Board)"
- build_path = /obj/machinery/launchpad
- origin_tech = "programming=3;engineering=3;plasmatech=2;bluespace=3"
- req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
- def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
-
/obj/machinery/launchpad/RefreshParts()
var/E = -1 //to make default parts have the base value
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
@@ -171,9 +158,7 @@
qdel(src)
/obj/machinery/launchpad/briefcase/Destroy()
- if(!QDELETED(briefcase))
- qdel(briefcase)
- briefcase = null
+ QDEL_NULL(briefcase)
return ..()
/obj/machinery/launchpad/briefcase/isAvailable()
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index a09adf6155..a979ba6398 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -12,7 +12,7 @@
// luminosity = 1
/obj/machinery/light_switch/Initialize()
- ..()
+ . = ..()
area = get_area(src)
if(otherarea)
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index 60fd945a12..ec0c6eb4d7 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -11,21 +11,20 @@
icon_state = "limbgrower_idleoff"
density = TRUE
container_type = OPENCONTAINER
-
- var/operating = FALSE
anchored = TRUE
use_power = IDLE_POWER_USE
- var/disabled = 0
idle_power_usage = 10
active_power_usage = 100
+ circuit = /obj/item/weapon/circuitboard/machine/limbgrower
+
+ var/operating = FALSE
+ var/disabled = FALSE
var/busy = FALSE
var/prod_coeff = 1
-
var/datum/design/being_built
var/datum/research/files
var/selected_category
var/screen = 1
-
var/list/categories = list(
"human",
"lizard",
@@ -33,22 +32,11 @@
"special"
)
-/obj/machinery/limbgrower/New()
- ..()
+/obj/machinery/limbgrower/Initialize()
+ . = ..()
create_reagents(0)
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/limbgrower(null)
- B.apply_default_parts(src)
files = new /datum/research/limbgrower(src)
-/obj/item/weapon/circuitboard/machine/limbgrower
- name = "Limb Grower (Machine Board)"
- build_path = /obj/machinery/limbgrower
- origin_tech = "programming=2;biotech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/reagent_containers/glass/beaker = 2,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
/obj/machinery/limbgrower/interact(mob/user)
if(!is_operational())
return
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index f7c9725f36..d0d40e7233 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -5,7 +5,6 @@
// This was created for firing ranges, but I suppose this could have other applications - Doohl
/obj/machinery/magnetic_module
-
icon = 'icons/obj/objects.dmi'
icon_state = "floor_magnet-f"
name = "electromagnetic generator"
@@ -29,22 +28,21 @@
var/center_y = 0
var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer
-/obj/machinery/magnetic_module/New()
+/obj/machinery/magnetic_module/Initialize()
..()
var/turf/T = loc
hide(T.intact)
center = T
+ SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS)
+ return INITIALIZE_HINT_LATELOAD
- spawn(10) // must wait for map loading to finish
- SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS)
-
- spawn()
- magnetic_process()
+/obj/machinery/magnetic_module/LateInitialize()
+ magnetic_process()
/obj/machinery/magnetic_module/Destroy()
SSradio.remove_object(src, freq)
- . = ..()
center = null
+ return ..()
// update the invisibility and icon
/obj/machinery/magnetic_module/hide(intact)
@@ -216,27 +214,22 @@
var/datum/radio_frequency/radio_connection
-/obj/machinery/magnetic_controller/New()
+/obj/machinery/magnetic_controller/Initialize()
..()
-
if(autolink)
for(var/obj/machinery/magnetic_module/M in GLOB.machines)
if(M.freq == frequency && M.code == code)
magnets.Add(M)
-
- spawn(45) // must wait for map loading to finish
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS)
-
-
if(path) // check for default path
filter_path() // renders rpath
+ radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS)
/obj/machinery/magnetic_controller/Destroy()
SSradio.remove_object(src, frequency)
magnets = null
rpath = null
- . = ..()
+ return ..()
/obj/machinery/magnetic_controller/process()
if(magnets.len == 0 && autolink)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index a10c4976aa..2b5a1f08b0 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -22,8 +22,8 @@
req_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS)
-/obj/machinery/navbeacon/New()
- ..()
+/obj/machinery/navbeacon/Initialize()
+ . = ..()
set_codes()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index ec0aaf2bcd..9883236d64 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -197,16 +197,15 @@ GLOBAL_LIST_EMPTY(allCasters)
name = "security newscaster"
securityCaster = 1
-/obj/machinery/newscaster/New(loc, ndir, building)
- ..()
+/obj/machinery/newscaster/Initialize(mapload, ndir, building)
+ . = ..()
if(building)
setDir(ndir)
pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32)
pixel_y = (dir & 3)? (dir ==1 ? -32 : 32) : 0
GLOB.allCasters += src
- for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
- unit_no++
+ unit_no = GLOB.allCasters.len
update_icon()
/obj/machinery/newscaster/Destroy()
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index f31bde299c..2e090e7c4f 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -72,8 +72,8 @@
var/obj/machinery/turretid/cp = null
-/obj/machinery/porta_turret/New(loc)
- ..()
+/obj/machinery/porta_turret/Initialize()
+ . = ..()
if(!base)
base = src
update_icon()
@@ -143,18 +143,13 @@
/obj/machinery/porta_turret/Destroy()
//deletes its own cover with it
- if(cover)
- qdel(cover)
- cover = null
+ QDEL_NULL(cover)
base = null
if(cp)
cp.turrets -= src
cp = null
- if(stored_gun)
- qdel(stored_gun)
- stored_gun = null
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(stored_gun)
+ QDEL_NULL(spark_system)
return ..()
@@ -602,8 +597,8 @@
/obj/machinery/porta_turret/aux_base/interact(mob/user) //Controlled solely from the base console.
return
-/obj/machinery/porta_turret/aux_base/New()
- ..()
+/obj/machinery/porta_turret/aux_base/Initialize()
+ . = ..()
cover.name = name
cover.desc = desc
@@ -650,8 +645,8 @@
var/list/obj/machinery/porta_turret/turrets = list()
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
-/obj/machinery/turretid/New(loc, ndir = 0, built = 0)
- ..()
+/obj/machinery/turretid/Initialize(mapload, ndir = 0, built = 0)
+ . = ..()
if(built)
setDir(ndir)
locked = FALSE
@@ -664,7 +659,7 @@
return ..()
/obj/machinery/turretid/Initialize(mapload) //map-placed turrets autolink turrets
- ..()
+ . = ..()
if(!mapload)
return
if(control_area && istext(control_area))
@@ -682,7 +677,8 @@
T.cp = src
/obj/machinery/turretid/attackby(obj/item/I, mob/user, params)
- if(stat & BROKEN) return
+ if(stat & BROKEN)
+ return
if (istype(I, /obj/item/device/multitool))
var/obj/item/device/multitool/M = I
diff --git a/code/game/machinery/porta_turret/portable_turret.dm.rej b/code/game/machinery/porta_turret/portable_turret.dm.rej
new file mode 100644
index 0000000000..0f16ca5ef3
--- /dev/null
+++ b/code/game/machinery/porta_turret/portable_turret.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm (rejected hunks)
+@@ -664,7 +659,7 @@
+ return ..()
+
+ /obj/machinery/turretid/Initialize(mapload) //map-placed turrets autolink turrets
+- ..()
++ . = ..()
+ if(!mapload)
+ return
+
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index b05ecdea70..f0d793732b 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -8,28 +8,13 @@
idle_power_usage = 200
active_power_usage = 5000
unique_rename = 1
+ circuit = /obj/item/weapon/circuitboard/machine/quantumpad
var/teleport_cooldown = 400 //30 seconds base due to base parts
var/teleport_speed = 50
var/last_teleport //to handle the cooldown
var/teleporting = 0 //if it's in the process of teleporting
var/power_efficiency = 1
- var/obj/machinery/quantumpad/linked_pad = null
-
-/obj/machinery/quantumpad/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/quantumpad(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/quantumpad
- name = "Quantum Pad (Machine Board)"
- build_path = /obj/machinery/quantumpad
- origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4"
- req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 1,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/stack/cable_coil = 1)
- def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
+ var/obj/machinery/quantumpad/linked_pad
/obj/machinery/quantumpad/RefreshParts()
var/E = 0
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 437fb3eb27..72b03bc7b5 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -7,20 +7,14 @@
use_power = IDLE_POWER_USE
idle_power_usage = 4
active_power_usage = 250
+ circuit = /obj/item/weapon/circuitboard/machine/recharger
var/obj/item/charging = null
- var/static/list/allowed_devices = typecacheof(list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/ammo_box/magazine/recharge, /obj/item/device/modular_computer))
var/recharge_coeff = 1
-
-/obj/machinery/recharger/Initialize()
- . = ..()
- var/obj/item/weapon/circuitboard/machine/recharger/B = new()
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/recharger
- name = "Weapon Recharger (Machine Board)"
- build_path = /obj/machinery/recharger
- origin_tech = "powerstorage=4;engineering=3;materials=4"
- req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+ var/static/list/allowed_devices = typecacheof(list(
+ /obj/item/weapon/gun/energy,
+ /obj/item/weapon/melee/baton,
+ /obj/item/ammo_box/magazine/recharge,
+ /obj/item/device/modular_computer))
/obj/machinery/recharger/RefreshParts()
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 90854e5f74..8d69d6a37d 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -8,27 +8,15 @@
idle_power_usage = 5
active_power_usage = 1000
req_access = list(ACCESS_ROBOTICS)
+ state_open = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/cyborgrecharger
var/recharge_speed
var/repairs
- state_open = TRUE
-/obj/machinery/recharge_station/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/cyborgrecharger(null)
- B.apply_default_parts(src)
+/obj/machinery/recharge_station/Initialize()
+ . = ..()
update_icon()
-/obj/item/weapon/circuitboard/machine/cyborgrecharger
- name = "Cyborg Recharger (Machine Board)"
- build_path = /obj/machinery/recharge_station
- origin_tech = "powerstorage=3;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 2,
- /obj/item/weapon/stock_parts/cell = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
- def_components = list(
- /obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high)
-
/obj/machinery/recharge_station/RefreshParts()
recharge_speed = 0
repairs = 0
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index f853407df8..07251f6cf0 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -8,6 +8,7 @@
layer = ABOVE_ALL_MOB_LAYER // Overhead
anchored = TRUE
density = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/recycler
var/safety_mode = FALSE // Temporarily stops machine if it detects a mob
var/icon_name = "grinder-o"
var/blood = 0
@@ -18,20 +19,10 @@
var/eat_victim_items = TRUE
var/item_recycle_sound = 'sound/items/welder.ogg'
-/obj/machinery/recycler/New()
- ..()
+/obj/machinery/recycler/Initialize()
materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM))
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recycler(null)
- B.apply_default_parts(src)
update_icon()
-
-/obj/item/weapon/circuitboard/machine/recycler
- name = "Recycler (Machine Board)"
- build_path = /obj/machinery/recycler
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
+ return ..()
/obj/machinery/recycler/RefreshParts()
var/amt_made = 0
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 4ca6592b21..efcf10dcb6 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
icon_state = "req_comp0"
/obj/machinery/requests_console/Initialize()
- ..()
+ . = ..()
name = "\improper [department] requests console"
GLOB.allConsoles += src
switch(departmentType)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 729d84973d..4079db2018 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -58,7 +58,7 @@
desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals"
color = "#FF0000"
max_integrity = 20
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/structure/emergency_shield/invoker/emp_act(severity)
return
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index e72e65f99a..71036c735f 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -34,7 +34,7 @@
light_color = LIGHT_COLOR_BROWN
/obj/machinery/computer/slot_machine/Initialize()
- ..()
+ . = ..()
jackpots = rand(1, 4) //false hope
plays = rand(75, 200)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 70481ad299..033310e55d 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -12,6 +12,7 @@
desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire."
max_integrity = 250
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 10)
+ circuit = /obj/item/weapon/circuitboard/machine/space_heater
var/obj/item/weapon/stock_parts/cell/cell
var/on = FALSE
var/mode = HEATER_MODE_STANDBY
@@ -26,22 +27,11 @@
/obj/machinery/space_heater/get_cell()
return cell
-/obj/machinery/space_heater/New()
- ..()
+/obj/machinery/space_heater/Initialize()
+ . = ..()
cell = new(src)
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/space_heater(null)
- B.apply_default_parts(src)
update_icon()
-/obj/item/weapon/circuitboard/machine/space_heater
- name = "Space Heater (Machine Board)"
- build_path = /obj/machinery/space_heater
- origin_tech = "programming=2;engineering=2;plasmatech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/stack/cable_coil = 3)
-
/obj/machinery/space_heater/on_construction()
qdel(cell)
cell = null
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 4475a85594..f625de8c5c 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -101,8 +101,8 @@
mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double
-/obj/machinery/suit_storage_unit/New()
- ..()
+/obj/machinery/suit_storage_unit/Initialize()
+ . = ..()
wires = new /datum/wires/suit_storage_unit(src)
if(suit_type)
suit = new suit_type(src)
@@ -115,18 +115,10 @@
update_icon()
/obj/machinery/suit_storage_unit/Destroy()
- if(suit)
- qdel(suit)
- suit = null
- if(helmet)
- qdel(helmet)
- helmet = null
- if(mask)
- qdel(mask)
- mask = null
- if(storage)
- qdel(storage)
- storage = null
+ QDEL_NULL(suit)
+ QDEL_NULL(helmet)
+ QDEL_NULL(mask)
+ QDEL_NULL(storage)
return ..()
/obj/machinery/suit_storage_unit/update_icon()
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 56c4038a76..4e96eb661d 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -82,22 +82,19 @@
countdown.stop()
STOP_PROCESSING(SSfastprocess, src)
-/obj/machinery/syndicatebomb/New()
+/obj/machinery/syndicatebomb/Initialize()
+ . = ..()
wires = new /datum/wires/syndicatebomb(src)
- if(src.payload)
+ if(payload)
payload = new payload(src)
update_icon()
countdown = new(src)
- ..()
/obj/machinery/syndicatebomb/Destroy()
- qdel(wires)
- wires = null
- if(countdown)
- qdel(countdown)
- countdown = null
+ QDEL_NULL(wires)
+ QDEL_NULL(countdown)
STOP_PROCESSING(SSfastprocess, src)
- . = ..()
+ return ..()
/obj/machinery/syndicatebomb/examine(mob/user)
..()
diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm
index 286630a777..66783ee062 100644
--- a/code/game/machinery/telecomms/machines/broadcaster.dm
+++ b/code/game/machinery/telecomms/machines/broadcaster.dm
@@ -17,8 +17,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages
use_power = IDLE_POWER_USE
idle_power_usage = 25
machinetype = 5
- /*heatgen = 0
- delay = 7*/
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/broadcaster
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
// Don't broadcast rejected signals
@@ -82,22 +81,6 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages
/* --- Do a snazzy animation! --- */
flick("broadcaster_send", src)
-/obj/machinery/telecomms/broadcaster/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/broadcaster(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/telecomms/broadcaster
- name = "Subspace Broadcaster (Machine Board)"
- build_path = /obj/machinery/telecomms/broadcaster
- origin_tech = "programming=2;engineering=2;bluespace=1"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
- /obj/item/weapon/stock_parts/subspace/crystal = 1,
- /obj/item/weapon/stock_parts/micro_laser = 2)
-
/obj/machinery/telecomms/broadcaster/Destroy()
// In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore.
if(GLOB.message_delay)
diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm
index fb2f06aca7..52437afb66 100644
--- a/code/game/machinery/telecomms/machines/bus.dm
+++ b/code/game/machinery/telecomms/machines/bus.dm
@@ -17,8 +17,8 @@
use_power = IDLE_POWER_USE
idle_power_usage = 50
machinetype = 2
- //heatgen = 20
netspeed = 40
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/bus
var/change_frequency = 0
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
@@ -49,24 +49,6 @@
if(can_send)
break
-/obj/machinery/telecomms/bus/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/bus(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/telecomms/bus
- name = "Bus Mainframe (Machine Board)"
- build_path = /obj/machinery/telecomms/bus
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
-
-
-
-
-
//Preset Buses
/obj/machinery/telecomms/bus/preset_one
@@ -93,10 +75,10 @@
freq_listening = list(GLOB.ENG_FREQ)
autolinkers = list("processor4", "engineering", "common")
-/obj/machinery/telecomms/bus/preset_four/New()
+/obj/machinery/telecomms/bus/preset_four/Initialize()
+ . = ..()
for(var/i = 1441, i < 1489, i += 2)
freq_listening |= i
- ..()
/obj/machinery/telecomms/bus/preset_one/birdstation
name = "Bus"
diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm
index 656eb4a522..41d59e1e77 100644
--- a/code/game/machinery/telecomms/machines/hub.dm
+++ b/code/game/machinery/telecomms/machines/hub.dm
@@ -18,10 +18,9 @@
use_power = IDLE_POWER_USE
idle_power_usage = 80
machinetype = 7
- //heatgen = 40
long_range_link = 1
netspeed = 40
-
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/hub
/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
@@ -33,23 +32,6 @@
relay_information(signal, "/obj/machinery/telecomms/relay", 1)
relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster.
-/obj/machinery/telecomms/hub/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/hub(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/telecomms/hub
- name = "Hub Mainframe (Machine Board)"
- build_path = /obj/machinery/telecomms/hub
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
-
-
-
-
//Preset HUB
/obj/machinery/telecomms/hub/preset
diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm
index 5680c880b3..8d1494ff61 100644
--- a/code/game/machinery/telecomms/machines/processor.dm
+++ b/code/game/machinery/telecomms/machines/processor.dm
@@ -16,8 +16,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 30
machinetype = 3
- //heatgen = 100
- //delay = 5
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/processor
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
@@ -35,24 +34,6 @@
signal.data["slow"] += rand(5, 10) // slow the signal down
relay_information(signal, "/obj/machinery/telecomms/server")
-/obj/machinery/telecomms/processor/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/processor(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/telecomms/processor
- name = "Processor Unit (Machine Board)"
- build_path = /obj/machinery/telecomms/processor
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 3,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
- /obj/item/weapon/stock_parts/subspace/treatment = 2,
- /obj/item/weapon/stock_parts/subspace/analyzer = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/amplifier = 1)
-
-
//Preset Processors
/obj/machinery/telecomms/processor/preset_one
diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm
index af218fd663..0614668f3a 100644
--- a/code/game/machinery/telecomms/machines/receiver.dm
+++ b/code/game/machinery/telecomms/machines/receiver.dm
@@ -16,7 +16,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 30
machinetype = 1
- //heatgen = 0
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/receiver
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal)
@@ -50,25 +50,6 @@
return 0
return 1
-
-/obj/machinery/telecomms/receiver/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/receiver(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/telecomms/receiver
- name = "Subspace Receiver (Machine Board)"
- build_path = /obj/machinery/telecomms/receiver
- origin_tech = "programming=2;engineering=2;bluespace=1"
- req_components = list(
- /obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/stock_parts/micro_laser = 1)
-
-
-
-
//Preset Receivers
//--PRESET LEFT--//
@@ -89,10 +70,10 @@
freq_listening = list(GLOB.COMM_FREQ, GLOB.ENG_FREQ, GLOB.SEC_FREQ) //command, engineering, security
//Common and other radio frequencies for people to freely use
-/obj/machinery/telecomms/receiver/preset_right/New()
+/obj/machinery/telecomms/receiver/preset_right/Initialize()
+ . = ..()
for(var/i = 1441, i < 1489, i += 2)
freq_listening |= i
- ..()
/obj/machinery/telecomms/receiver/preset_left/birdstation
name = "Receiver"
diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm
index 5bc97d54c7..4dee1e8078 100644
--- a/code/game/machinery/telecomms/machines/relay.dm
+++ b/code/game/machinery/telecomms/machines/relay.dm
@@ -15,9 +15,9 @@
use_power = IDLE_POWER_USE
idle_power_usage = 30
machinetype = 8
- //heatgen = 0
netspeed = 5
long_range_link = 1
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/relay
var/broadcasting = 1
var/receiving = 1
@@ -45,22 +45,6 @@
return FALSE
return receiving
-/obj/machinery/telecomms/relay/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/relay(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/telecomms/relay
- name = "Relay Mainframe (Machine Board)"
- build_path = /obj/machinery/telecomms/relay
- origin_tech = "programming=2;engineering=2;bluespace=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
-
-
-
//Preset Relay
/obj/machinery/telecomms/relay/preset
diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm
index cd8e433cea..703bd378dd 100644
--- a/code/game/machinery/telecomms/machines/server.dm
+++ b/code/game/machinery/telecomms/machines/server.dm
@@ -16,7 +16,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 15
machinetype = 4
- //heatgen = 50
+ circuit = /obj/item/weapon/circuitboard/machine/telecomms/server
var/list/log_entries = list()
var/list/stored_names = list()
var/list/TrafficActions = list()
@@ -32,20 +32,9 @@
var/obj/item/device/radio/headset/server_radio = null
var/last_signal = 0 // Last time it sent a signal
-/obj/machinery/telecomms/server/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/server(null)
- B.apply_default_parts(src)
- server_radio = new()
-
-/obj/item/weapon/circuitboard/machine/telecomms/server
- name = "Telecommunication Server (Machine Board)"
- build_path = /obj/machinery/telecomms/server
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
+/obj/machinery/telecomms/server/Initialize()
+ . = ..()
+ server_radio = new
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
@@ -135,8 +124,8 @@
/obj/machinery/telecomms/server/presets
network = "tcommsat"
-/obj/machinery/telecomms/server/presets/New()
- ..()
+/obj/machinery/telecomms/server/presets/Initialize()
+ . = ..()
name = id
@@ -167,10 +156,10 @@
//Common and other radio frequencies for people to freely use
// 1441 to 1489
-/obj/machinery/telecomms/server/presets/common/New()
+/obj/machinery/telecomms/server/presets/common/Initialize()
+ . = ..()
for(var/i = 1441, i < 1489, i += 2)
freq_listening |= i
- ..()
/obj/machinery/telecomms/server/presets/command
id = "Command Server"
@@ -187,6 +176,6 @@
freq_listening = list(GLOB.SEC_FREQ)
autolinkers = list("security")
-/obj/machinery/telecomms/server/presets/common/birdstation/New()
- ..()
+/obj/machinery/telecomms/server/presets/common/birdstation/Initialize()
+ . = ..()
freq_listening = list()
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 48bb5bb5ab..62f53f73ad 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -16,6 +16,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
/obj/machinery/telecomms
icon = 'icons/obj/machines/telecomms.dmi'
+ critical_machine = TRUE
var/list/links = list() // list of machines this machine is linked to
var/traffic = 0 // value increases as traffic increases
var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed)
@@ -31,7 +32,6 @@ GLOBAL_LIST_EMPTY(telecomms_list)
var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
var/hide = 0 // Is it a hidden machine?
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
- critical_machine = TRUE
/obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20)
@@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
listening_level = position.z
/obj/machinery/telecomms/Initialize(mapload)
- ..()
+ . = ..()
if(mapload && autolinkers.len)
// Links nearby machines
if(!long_range_link)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index b737b7e77e..b1edee8325 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -1,221 +1,3 @@
-/obj/machinery/computer/teleporter
- name = "teleporter control console"
- desc = "Used to control a linked teleportation Hub and Station."
- icon_screen = "teleport"
- icon_keyboard = "teleport_key"
- circuit = /obj/item/weapon/circuitboard/computer/teleporter
- var/obj/item/device/gps/locked = null
- var/regime_set = "Teleporter"
- var/id = null
- var/obj/machinery/teleport/station/power_station
- var/calibrating
- var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.)
- //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location.
-
- light_color = LIGHT_COLOR_BLUE
-
-/obj/machinery/computer/teleporter/New()
- src.id = "[rand(1000, 9999)]"
- ..()
-
-/obj/machinery/computer/teleporter/Initialize()
- ..()
- link_power_station()
-
-/obj/machinery/computer/teleporter/Destroy()
- if (power_station)
- power_station.teleporter_console = null
- power_station = null
- return ..()
-
-/obj/machinery/computer/teleporter/proc/link_power_station()
- if(power_station)
- return
- for(dir in list(NORTH,EAST,SOUTH,WEST))
- power_station = locate(/obj/machinery/teleport/station, get_step(src, dir))
- if(power_station)
- break
- return power_station
-
-/obj/machinery/computer/teleporter/attackby(obj/I, mob/living/user, params)
- if(istype(I, /obj/item/device/gps))
- var/obj/item/device/gps/L = I
- if(L.locked_location && !(stat & (NOPOWER|BROKEN)))
- if(!user.transferItemToLoc(L, src))
- to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]!")
- return
- locked = L
- to_chat(user, "You insert the GPS device into the [name]'s slot.")
- else
- return ..()
-
-/obj/machinery/computer/teleporter/attack_ai(mob/user)
- src.attack_hand(user)
-
-/obj/machinery/computer/teleporter/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/computer/teleporter/interact(mob/user)
- var/data = "Teleporter Status
"
- if(!power_station)
- data += "No power station linked.
"
- else if(!power_station.teleporter_hub)
- data += "No hub linked.
"
- else
- data += "Current regime: [regime_set]
"
- data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
"
- if(calibrating)
- data += "Calibration: In Progress"
- else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3)
- data += "Calibration: Optimal"
- else
- data += "Calibration: Sub-Optimal"
- data += "
"
-
- data += "Change regime
"
- data += "Set target
"
- if(locked)
- data += "
Get target from memory
"
- data += "Eject GPS device
"
- else
- data += "
Get target from memory
"
- data += "Eject GPS device
"
-
- data += "
Calibrate Hub"
-
- var/datum/browser/popup = new(user, "teleporter", name, 400, 400)
- popup.set_content(data)
- popup.open()
- return
-
-/obj/machinery/computer/teleporter/Topic(href, href_list)
- if(..())
- return
-
- if(href_list["eject"])
- eject()
- updateDialog()
- return
-
- if(!check_hub_connection())
- say("Error: Unable to detect hub.")
- return
- if(calibrating)
- say("Error: Calibration in progress. Stand by.")
- return
-
- if(href_list["regimeset"])
- power_station.engaged = 0
- power_station.teleporter_hub.update_icon()
- power_station.teleporter_hub.calibrated = 0
- reset_regime()
- if(href_list["settarget"])
- power_station.engaged = 0
- power_station.teleporter_hub.update_icon()
- power_station.teleporter_hub.calibrated = 0
- set_target(usr)
- if(href_list["locked"])
- power_station.engaged = 0
- power_station.teleporter_hub.update_icon()
- power_station.teleporter_hub.calibrated = 0
- target = get_turf(locked.locked_location)
- if(href_list["calibrate"])
- if(!target)
- say("Error: No target set to calibrate to.")
- return
- if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3)
- say("Hub is already calibrated!")
- return
- say("Processing hub calibration to target...")
-
- calibrating = 1
- spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration
- calibrating = 0
- if(check_hub_connection())
- power_station.teleporter_hub.calibrated = 1
- say("Calibration complete.")
- else
- say("Error: Unable to detect hub.")
- updateDialog()
-
- updateDialog()
-
-/obj/machinery/computer/teleporter/proc/check_hub_connection()
- if(!power_station)
- return
- if(!power_station.teleporter_hub)
- return
- return 1
-
-/obj/machinery/computer/teleporter/proc/reset_regime()
- target = null
- if(regime_set == "Teleporter")
- regime_set = "Gate"
- else
- regime_set = "Teleporter"
-
-/obj/machinery/computer/teleporter/proc/eject()
- if(locked)
- locked.loc = loc
- locked = null
-
-/obj/machinery/computer/teleporter/proc/set_target(mob/user)
- var/list/L = list()
- var/list/areaindex = list()
- if(regime_set == "Teleporter")
- for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons)
- var/turf/T = get_turf(R)
- if(!T)
- continue
- if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
- continue
- L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R
-
- for(var/obj/item/weapon/implant/tracking/I in GLOB.tracked_implants)
- if(!I.imp_in || !ismob(I.loc))
- continue
- else
- var/mob/M = I.loc
- if(M.stat == DEAD)
- if(M.timeofdeath + 6000 < world.time)
- continue
- var/turf/T = get_turf(M)
- if(!T)
- continue
- if(T.z == ZLEVEL_CENTCOM)
- continue
- L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
-
- var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
- target = L[desc]
-
- else
- var/list/S = power_station.linked_stations
- if(!S.len)
- to_chat(user, "No connected stations located.")
- return
- for(var/obj/machinery/teleport/station/R in S)
- var/turf/T = get_turf(R)
- if(!T || !R.teleporter_hub || !R.teleporter_console)
- continue
- if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
- continue
- L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R
- var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L
- target = L[desc]
- if(target)
- var/obj/machinery/teleport/station/trg = target
- trg.linked_stations |= power_station
- trg.stat &= ~NOPOWER
- if(trg.teleporter_hub)
- trg.teleporter_hub.stat &= ~NOPOWER
- trg.teleporter_hub.update_icon()
- if(trg.teleporter_console)
- trg.teleporter_console.stat &= ~NOPOWER
- trg.teleporter_console.update_icon()
-
/obj/machinery/teleport
name = "teleport"
icon = 'icons/obj/machines/teleporter.dmi'
@@ -226,29 +8,16 @@
name = "teleporter hub"
desc = "It's the hub of a teleporting machine."
icon_state = "tele0"
- var/accurate = 0
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 2000
+ circuit = /obj/item/weapon/circuitboard/machine/teleporter_hub
+ var/accurate = FALSE
var/obj/machinery/teleport/station/power_station
var/calibrated //Calibration prevents mutation
-/obj/machinery/teleport/hub/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/teleporter_hub(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/teleporter_hub
- name = "Teleporter Hub (Machine Board)"
- build_path = /obj/machinery/teleport/hub
- origin_tech = "programming=3;engineering=4;bluespace=4;materials=4"
- req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 3,
- /obj/item/weapon/stock_parts/matter_bin = 1)
- def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
-
/obj/machinery/teleport/hub/Initialize()
- ..()
+ . = ..()
link_power_station()
/obj/machinery/teleport/hub/Destroy()
@@ -327,8 +96,8 @@
/obj/machinery/teleport/hub/proc/is_ready()
. = !panel_open && !(stat & (BROKEN|NOPOWER)) && power_station && power_station.engaged && !(power_station.stat & (BROKEN|NOPOWER))
-/obj/machinery/teleport/hub/syndicate/New()
- ..()
+/obj/machinery/teleport/hub/syndicate/Initialize()
+ . = ..()
component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
RefreshParts()
@@ -337,32 +106,18 @@
name = "station"
desc = "The power control station for a bluespace teleporter. Used for toggling power, and can activate a test-fire to prevent malfunctions."
icon_state = "controller"
- var/engaged = 0
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 2000
+ circuit = /obj/item/weapon/circuitboard/machine/teleporter_station
+ var/engaged = FALSE
var/obj/machinery/computer/teleporter/teleporter_console
var/obj/machinery/teleport/hub/teleporter_hub
var/list/linked_stations = list()
var/efficiency = 0
-/obj/machinery/teleport/station/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/teleporter_station(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/teleporter_station
- name = "Teleporter Station (Machine Board)"
- build_path = /obj/machinery/teleport/station
- origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3"
- req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 2,
- /obj/item/weapon/stock_parts/capacitor = 2,
- /obj/item/weapon/stock_parts/console_screen = 1)
- def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
-
/obj/machinery/teleport/station/Initialize()
- ..()
+ . = ..()
link_console_and_hub()
/obj/machinery/teleport/station/RefreshParts()
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 3215727740..79428fce6f 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -22,7 +22,7 @@
. = ..()
new /obj/machinery/conveyor/auto(locate(x - 1, y, z), WEST)
new /obj/machinery/conveyor/auto(loc, WEST)
- new /obj/machinery/conveyor/auto(locate(x + 1, y, z), WEST)
+ new /obj/machinery/conveyor/auto(locate(x + 1, y, z), WEST)
countdown = new(src)
countdown.start()
@@ -33,9 +33,7 @@
to_chat(user, "It will be ready in [max(0, seconds_remaining)] seconds.")
/obj/machinery/transformer/Destroy()
- if(countdown)
- qdel(countdown)
- countdown = null
+ QDEL_NULL(countdown)
. = ..()
/obj/machinery/transformer/power_change()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 486081a4c6..15877eea39 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -24,6 +24,7 @@
max_integrity = 300
integrity_failure = 100
armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
+ circuit = /obj/item/weapon/circuitboard/machine/vendor
var/active = 1 //No sales pitches if off!
var/vend_ready = 1 //Are we ready to vend?? Is it time??
@@ -60,12 +61,13 @@
var/refill_count = 3 //The number of canisters the vending machine uses
/obj/machinery/vending/Initialize()
- . = ..()
+ var/build_inv = FALSE
+ if(!refill_canister)
+ circuit = null
+ build_inv = TRUE
+ . = ..()
wires = new /datum/wires/vending(src)
- if(refill_canister) //constructable vending machine
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/vendor(null)
- B.apply_default_parts(src)
- else
+ if(build_inv) //non-constructable vending machine
build_inventory(products)
build_inventory(contraband, 1)
build_inventory(premium, 0, 1)
@@ -77,46 +79,6 @@
last_slogan = world.time + rand(0, slogan_delay)
power_change()
-/obj/item/weapon/circuitboard/machine/vendor
- name = "Booze-O-Mat Vendor (Machine Board)"
- build_path = /obj/machinery/vending/boozeomat
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/vending_refill/boozeomat = 3)
-
- var/list/names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat",
- /obj/machinery/vending/coffee = "Solar's Best Hot Drinks",
- /obj/machinery/vending/snack = "Getmore Chocolate Corp",
- /obj/machinery/vending/cola = "Robust Softdrinks",
- /obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
- /obj/machinery/vending/autodrobe = "AutoDrobe",
- /obj/machinery/vending/clothing = "ClothesMate",
- /obj/machinery/vending/medical = "NanoMed Plus",
- /obj/machinery/vending/wallmed = "NanoMed")
-
-/obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- var/position = names_paths.Find(build_path)
- position = (position == names_paths.len) ? 1 : (position + 1)
- var/typepath = names_paths[position]
-
- to_chat(user, "You set the board to \"[names_paths[typepath]]\".")
- set_type(typepath)
- else
- return ..()
-
-/obj/item/weapon/circuitboard/machine/vendor/proc/set_type(var/obj/machinery/vending/typepath)
- build_path = typepath
- name = "[names_paths[build_path]] Vendor (Machine Board)"
- req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count))
-
-/obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M)
- for(var/typepath in names_paths)
- if(istype(M, typepath))
- set_type(typepath)
- break
- ..()
-
/obj/machinery/vending/Destroy()
QDEL_NULL(wires)
QDEL_NULL(coin)
@@ -125,9 +87,7 @@
/obj/machinery/vending/snack/Destroy()
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
- S.loc = get_turf(src)
- qdel(wires)
- wires = null
+ S.forceMove(get_turf(src))
return ..()
/obj/machinery/vending/RefreshParts() //Better would be to make constructable child
@@ -795,7 +755,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
desc = "Uh oh!"
/obj/machinery/vending/cola/random/Initialize()
- ..()
+ . = ..()
var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random)
new T(get_turf(src))
qdel(src)
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 11b5a075fc..7db5321b9e 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -17,6 +17,7 @@
dir = EAST
icon = 'icons/mecha/mech_bay.dmi'
icon_state = "recharge_port"
+ circuit = /obj/item/weapon/circuitboard/machine/mech_recharger
var/obj/mecha/recharging_mech
var/obj/machinery/computer/mech_bay_power_console/recharge_console
var/max_charge = 50
@@ -24,20 +25,10 @@
var/repairability = 0
var/turf/recharging_turf = null
-/obj/machinery/mech_bay_recharge_port/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mech_recharger(null)
- B.apply_default_parts(src)
+/obj/machinery/mech_bay_recharge_port/Initialize()
+ . = ..()
recharging_turf = get_step(loc, dir)
-/obj/item/weapon/circuitboard/machine/mech_recharger
- name = "Mechbay Recharger (Machine Board)"
- build_path = /obj/machinery/mech_bay_recharge_port
- origin_tech = "programming=3;powerstorage=3;engineering=3"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/capacitor = 5)
-
/obj/machinery/mech_bay_recharge_port/RefreshParts()
var/MC
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
@@ -149,5 +140,5 @@
add_overlay("recharge_comp_on")
/obj/machinery/computer/mech_bay_power_console/Initialize()
- ..()
+ . = ..()
reconnect()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 7c28f5d95b..9865175486 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -9,6 +9,7 @@
idle_power_usage = 20
active_power_usage = 5000
req_access = list(ACCESS_ROBOTICS)
+ circuit = /obj/item/weapon/circuitboard/machine/mechfab
var/time_coeff = 1
var/component_coeff = 1
var/datum/material_container/materials
@@ -34,22 +35,10 @@
"Misc"
)
-/obj/machinery/mecha_part_fabricator/New()
- ..()
+/obj/machinery/mecha_part_fabricator/Initialize()
files = new /datum/research(src) //Setup the research data holder.
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE))
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mechfab(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/mechfab
- name = "Exosuit Fabricator (Machine Board)"
- build_path = /obj/machinery/mecha_part_fabricator
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
+ return ..()
/obj/machinery/mecha_part_fabricator/RefreshParts()
var/T = 0
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 2bf3b525ac..3692af855b 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -238,7 +238,7 @@
blueeffect.icon_state = "shieldsparkles"
blueeffect.layer = FLASH_LAYER
blueeffect.plane = FULLSCREEN_PLANE
- blueeffect.mouse_opacity = 0
+ blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
M.client.screen += blueeffect
sleep(20)
M.client.screen -= blueeffect
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 98a9782600..35c32b26e6 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -30,7 +30,7 @@
name = "dirt"
desc = "Someone should clean that up."
icon_state = "dirt"
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/decal/cleanable/flour
name = "flour"
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index 6c841080d5..20b59b678e 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -8,7 +8,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/particle_effect
name = "particle effect"
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pass_flags = PASSTABLE | PASSGRILLE
/obj/effect/particle_effect/New()
diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm
index 24674e96a6..8e7f2dfd12 100644
--- a/code/game/objects/effects/effect_system/effects_explosion.dm
+++ b/code/game/objects/effects/effect_system/effects_explosion.dm
@@ -27,7 +27,7 @@
icon_state = "explosion"
opacity = 1
anchored = TRUE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pixel_x = -32
pixel_y = -32
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 48260e02e1..7e48e919ca 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -12,7 +12,7 @@
anchored = TRUE
density = FALSE
layer = WALL_OBJ_LAYER
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/amount = 3
animate_movement = 0
var/metal = 0
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 46fe4e5e8e..f09ae53e31 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -11,7 +11,7 @@
opacity = 0
layer = FLY_LAYER
anchored = TRUE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
animate_movement = 0
var/amount = 4
var/lifetime = 5
diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm
index 7e746f7866..4c84c97650 100644
--- a/code/game/objects/effects/effect_system/effects_water.dm
+++ b/code/game/objects/effects/effect_system/effects_water.dm
@@ -4,7 +4,7 @@
name = "water"
icon_state = "extinguish"
var/life = 15
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/particle_effect/water/New()
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index a9798800a0..edff2653ca 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -46,7 +46,7 @@
/obj/item/trash/cheesie = 1,
/obj/item/trash/candy = 1,
/obj/item/trash/chips = 1,
- /obj/item/trash/deadmouse = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/deadmouse = 1,
/obj/item/trash/pistachios = 1,
/obj/item/trash/plate = 1,
/obj/item/trash/popcorn = 1,
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index dc293bf4a4..b0049fc3fd 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -188,12 +188,15 @@
name = mimiced_atom.name
appearance = mimiced_atom.appearance
setDir(mimiced_atom.dir)
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom)
. = ..()
animate(src, alpha = 0, time = duration)
+/obj/effect/temp_visual/decoy/fading/threesecond
+ duration = 40
+
/obj/effect/temp_visual/decoy/fading/fivesecond
duration = 50
@@ -394,7 +397,7 @@
if(warp_color)
color = list(warp_color, warp_color, warp_color, list(0,0,0))
set_light(1.4, 1, warp_color)
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/matrix/skew = transform
skew = skew.Turn(180)
skew = skew.Interpolate(transform, 0.5)
diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
index 1eb427cfb6..6a1bbc4437 100644
--- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm
+++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
@@ -3,7 +3,7 @@
icon_state = "nothing"
anchored = TRUE
layer = ABOVE_MOB_LAYER
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/duration = 10 //in deciseconds
var/randomdir = TRUE
var/timerid
diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm
index 5c67e520cb..e3fb16ee81 100644
--- a/code/game/objects/items/devices/forcefieldprojector.dm
+++ b/code/game/objects/items/devices/forcefieldprojector.dm
@@ -77,7 +77,7 @@
layer = ABOVE_ALL_MOB_LAYER
anchored = TRUE
density = TRUE
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
resistance_flags = INDESTRUCTIBLE
CanAtmosPass = ATMOS_PASS_DENSITY
armor = list(melee = 0, bullet = 25, laser = 50, energy = 50, bomb = 25, bio = 100, rad = 100, fire = 100, acid = 100)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index dc2cc108d5..9d3a0c7705 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -12,7 +12,7 @@
novariants = FALSE
GLOBAL_LIST_INIT(human_recipes, list( \
- new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \
+ new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \
))
/obj/item/stack/sheet/animalhide/human/Initialize(mapload, new_amount, merge = TRUE)
@@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \
icon_state = "sheet-corgi"
GLOBAL_LIST_INIT(corgi_recipes, list ( \
- new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, on_floor = 1), \
+ new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3), \
))
/obj/item/stack/sheet/animalhide/corgi/Initialize(mapload, new_amount, merge = TRUE)
@@ -53,8 +53,8 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \
icon_state = "sheet-monkey"
GLOBAL_LIST_INIT(monkey_recipes, list ( \
- new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, on_floor = 1), \
- new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2, on_floor = 1), \
+ new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1), \
+ new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2), \
))
/obj/item/stack/sheet/animalhide/monkey/Initialize(mapload, new_amount, merge = TRUE)
@@ -74,8 +74,8 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \
icon_state = "sheet-xeno"
GLOBAL_LIST_INIT(xeno_recipes, list ( \
- new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1, on_floor = 1), \
- new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2, on_floor = 1), \
+ new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \
+ new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \
))
/obj/item/stack/sheet/animalhide/xeno/Initialize(mapload, new_amount, merge = TRUE)
@@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
GLOBAL_LIST_INIT(sinew_recipes, list ( \
- new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \
+ new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1), \
))
/obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge = TRUE)
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
new file mode 100644
index 0000000000..e15cdf930b
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
@@ -0,0 +1,55 @@
+//File with the circuitboard and circuitboard/machine class definitions and procs
+
+
+// Circuitboard
+
+/obj/item/weapon/circuitboard
+ name = "circuit board"
+ icon = 'icons/obj/module.dmi'
+ icon_state = "id_mod"
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ origin_tech = "programming=2"
+ materials = list(MAT_GLASS=1000)
+ w_class = WEIGHT_CLASS_SMALL
+ var/build_path = null
+
+/obj/item/weapon/circuitboard/proc/apply_default_parts(obj/machinery/M)
+ return
+
+// Circuitboard/machine
+/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
+micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
+*/
+
+/obj/item/weapon/circuitboard/machine
+ var/list/req_components // Components required by the machine.
+ // Example: list(/obj/item/weapon/stock_parts/matter_bin = 5)
+
+ var/list/def_components // Default replacements for req_components, to be used in apply_default_parts instead of req_components types
+ // Example: list(/obj/item/weapon/stock_parts/matter_bin = /obj/item/weapon/stock_parts/matter_bin/super)
+
+// Applies the default parts defined by the circuit board when the machine is created
+/obj/item/weapon/circuitboard/machine/apply_default_parts(obj/machinery/M)
+ if(!req_components)
+ return
+
+ M.component_parts = list(src) // List of components always contains a board
+ loc = null
+
+ for(var/comp_path in req_components)
+ var/comp_amt = req_components[comp_path]
+ if(!comp_amt)
+ continue
+
+ if(def_components && def_components[comp_path])
+ comp_path = def_components[comp_path]
+
+ if(ispath(comp_path, /obj/item/stack))
+ M.component_parts += new comp_path(null, comp_amt)
+ else
+ for(var/i in 1 to comp_amt)
+ M.component_parts += new comp_path(null)
+
+ M.RefreshParts()
diff --git a/code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm b/code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm
new file mode 100644
index 0000000000..17e5dbf597
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm
@@ -0,0 +1,369 @@
+/obj/item/weapon/circuitboard/computer/turbine_computer
+ name = "Turbine Computer (Computer Board)"
+ build_path = /obj/machinery/computer/turbine_computer
+ origin_tech = "programming=4;engineering=4;powerstorage=4"
+
+/obj/item/weapon/circuitboard/computer/launchpad_console
+ name = "Launchpad Control Console (Computer Board)"
+ build_path = /obj/machinery/computer/launchpad
+ origin_tech = "programming=3;bluespace=3;plasmatech=2"
+
+/obj/item/weapon/circuitboard/computer/message_monitor
+ name = "Message Monitor (Computer Board)"
+ build_path = /obj/machinery/computer/message_monitor
+ origin_tech = "programming=2"
+
+/obj/item/weapon/circuitboard/computer/security
+ name = "Security Cameras (Computer Board)"
+ build_path = /obj/machinery/computer/security
+ origin_tech = "programming=2;combat=2"
+
+/obj/item/weapon/circuitboard/computer/xenobiology
+ name = "circuit board (Xenobiology Console)"
+ build_path = /obj/machinery/computer/camera_advanced/xenobio
+ origin_tech = "programming=3;biotech=3"
+
+/obj/item/weapon/circuitboard/computer/base_construction
+ name = "circuit board (Aux Mining Base Construction Console)"
+ build_path = /obj/machinery/computer/camera_advanced/base_construction
+ origin_tech = "programming=3;engineering=3"
+
+/obj/item/weapon/circuitboard/computer/aiupload
+ name = "AI Upload (Computer Board)"
+ build_path = /obj/machinery/computer/upload/ai
+ origin_tech = "programming=4;engineering=4"
+
+/obj/item/weapon/circuitboard/computer/borgupload
+ name = "Cyborg Upload (Computer Board)"
+ build_path = /obj/machinery/computer/upload/borg
+ origin_tech = "programming=4;engineering=4"
+
+/obj/item/weapon/circuitboard/computer/med_data
+ name = "Medical Records Console (Computer Board)"
+ build_path = /obj/machinery/computer/med_data
+ origin_tech = "programming=2;biotech=2"
+
+/obj/item/weapon/circuitboard/computer/pandemic
+ name = "PanD.E.M.I.C. 2200 (Computer Board)"
+ build_path = /obj/machinery/computer/pandemic
+ origin_tech = "programming=2;biotech=2"
+
+/obj/item/weapon/circuitboard/computer/scan_consolenew
+ name = "DNA Machine (Computer Board)"
+ build_path = /obj/machinery/computer/scan_consolenew
+ origin_tech = "programming=2;biotech=2"
+
+/obj/item/weapon/circuitboard/computer/communications
+ name = "Communications (Computer Board)"
+ build_path = /obj/machinery/computer/communications
+ origin_tech = "programming=3;magnets=3"
+ var/lastTimeUsed = 0
+
+/obj/item/weapon/circuitboard/computer/card
+ name = "ID Console (Computer Board)"
+ build_path = /obj/machinery/computer/card
+ origin_tech = "programming=3"
+
+/obj/item/weapon/circuitboard/computer/card/centcom
+ name = "CentCom ID Console (Computer Board)"
+ build_path = /obj/machinery/computer/card/centcom
+
+/obj/item/weapon/circuitboard/computer/card/minor
+ name = "Department Management Console (Computer Board)"
+ build_path = /obj/machinery/computer/card/minor
+ var/target_dept = 1
+ var/list/dept_list = list("General","Security","Medical","Science","Engineering")
+
+/obj/item/weapon/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1)
+ to_chat(user, "You set the board to \"[dept_list[target_dept]]\".")
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/card/minor/examine(user)
+ ..()
+ to_chat(user, "Currently set to \"[dept_list[target_dept]]\".")
+
+//obj/item/weapon/circuitboard/computer/shield
+// name = "Shield Control (Computer Board)"
+// build_path = /obj/machinery/computer/stationshield
+/obj/item/weapon/circuitboard/computer/teleporter
+ name = "Teleporter (Computer Board)"
+ build_path = /obj/machinery/computer/teleporter
+ origin_tech = "programming=3;bluespace=3;plasmatech=3"
+
+/obj/item/weapon/circuitboard/computer/secure_data
+ name = "Security Records Console (Computer Board)"
+ build_path = /obj/machinery/computer/secure_data
+ origin_tech = "programming=2;combat=2"
+
+/obj/item/weapon/circuitboard/computer/stationalert
+ name = "Station Alerts (Computer Board)"
+ build_path = /obj/machinery/computer/station_alert
+
+/obj/item/weapon/circuitboard/computer/atmos_control
+ name = "Atmospheric Monitor (Computer Board)"
+ build_path = /obj/machinery/computer/atmos_control
+
+/obj/item/weapon/circuitboard/computer/atmos_control/tank
+ name = "Tank Control (Computer Board)"
+ build_path = /obj/machinery/computer/atmos_control/tank
+ origin_tech = "programming=2;engineering=3;materials=2"
+
+/obj/item/weapon/circuitboard/computer/atmos_alert
+ name = "Atmospheric Alert (Computer Board)"
+ build_path = /obj/machinery/computer/atmos_alert
+
+/obj/item/weapon/circuitboard/computer/pod
+ name = "Massdriver control (Computer Board)"
+ build_path = /obj/machinery/computer/pod
+
+/obj/item/weapon/circuitboard/computer/robotics
+ name = "Robotics Control (Computer Board)"
+ build_path = /obj/machinery/computer/robotics
+ origin_tech = "programming=3"
+
+/obj/item/weapon/circuitboard/computer/cloning
+ name = "Cloning (Computer Board)"
+ build_path = /obj/machinery/computer/cloning
+ origin_tech = "programming=2;biotech=2"
+
+/obj/item/weapon/circuitboard/computer/arcade/battle
+ name = "Arcade Battle (Computer Board)"
+ build_path = /obj/machinery/computer/arcade/battle
+ origin_tech = "programming=1"
+
+/obj/item/weapon/circuitboard/computer/arcade/orion_trail
+ name = "Orion Trail (Computer Board)"
+ build_path = /obj/machinery/computer/arcade/orion_trail
+ origin_tech = "programming=1"
+
+/obj/item/weapon/circuitboard/computer/turbine_control
+ name = "Turbine control (Computer Board)"
+ build_path = /obj/machinery/computer/turbine_computer
+
+/obj/item/weapon/circuitboard/computer/solar_control
+ name = "Solar Control (Computer Board)" //name fixed 250810
+ build_path = /obj/machinery/power/solar_control
+ origin_tech = "programming=2;powerstorage=2"
+
+/obj/item/weapon/circuitboard/computer/powermonitor
+ name = "Power Monitor (Computer Board)" //name fixed 250810
+ build_path = /obj/machinery/computer/monitor
+ origin_tech = "programming=2;powerstorage=2"
+
+/obj/item/weapon/circuitboard/computer/olddoor
+ name = "DoorMex (Computer Board)"
+ build_path = /obj/machinery/computer/pod/old
+
+/obj/item/weapon/circuitboard/computer/syndicatedoor
+ name = "ProComp Executive (Computer Board)"
+ build_path = /obj/machinery/computer/pod/old/syndicate
+
+/obj/item/weapon/circuitboard/computer/swfdoor
+ name = "Magix (Computer Board)"
+ build_path = /obj/machinery/computer/pod/old/swf
+
+/obj/item/weapon/circuitboard/computer/prisoner
+ name = "Prisoner Management Console (Computer Board)"
+ build_path = /obj/machinery/computer/prisoner
+/obj/item/weapon/circuitboard/computer/gulag_teleporter_console
+ name = "Labor Camp teleporter console (Computer Board)"
+ build_path = /obj/machinery/computer/gulag_teleporter_computer
+
+/obj/item/weapon/circuitboard/computer/rdconsole
+ name = "R&D Console (Computer Board)"
+ build_path = /obj/machinery/computer/rdconsole/core
+
+/obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(build_path == /obj/machinery/computer/rdconsole/core)
+ name = "R&D Console - Robotics (Computer Board)"
+ build_path = /obj/machinery/computer/rdconsole/robotics
+ to_chat(user, "Access protocols successfully updated.")
+ else
+ name = "R&D Console (Computer Board)"
+ build_path = /obj/machinery/computer/rdconsole/core
+ to_chat(user, "Defaulting access protocols.")
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/mecha_control
+ name = "Exosuit Control Console (Computer Board)"
+ build_path = /obj/machinery/computer/mecha
+
+/obj/item/weapon/circuitboard/computer/rdservercontrol
+ name = "R&D Server Control (Computer Board)"
+ build_path = /obj/machinery/computer/rdservercontrol
+
+/obj/item/weapon/circuitboard/computer/crew
+ name = "Crew Monitoring Console (Computer Board)"
+ build_path = /obj/machinery/computer/crew
+ origin_tech = "programming=2;biotech=2"
+
+/obj/item/weapon/circuitboard/computer/mech_bay_power_console
+ name = "Mech Bay Power Control Console (Computer Board)"
+ build_path = /obj/machinery/computer/mech_bay_power_console
+ origin_tech = "programming=3;powerstorage=3"
+
+/obj/item/weapon/circuitboard/computer/cargo
+ name = "Supply Console (Computer Board)"
+ build_path = /obj/machinery/computer/cargo
+ origin_tech = "programming=3"
+ var/contraband = FALSE
+ var/emagged = FALSE
+
+/obj/item/weapon/circuitboard/computer/cargo/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/multitool))
+ if(!emagged)
+ contraband = !contraband
+ to_chat(user, "Receiver spectrum set to [contraband ? "Broad" : "Standard"].")
+ else
+ to_chat(user, "The spectrum chip is unresponsive.")
+ else if(istype(I, /obj/item/weapon/card/emag))
+ if(!emagged)
+ contraband = TRUE
+ emagged = TRUE
+ to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
+ else
+ return ..()
+
+
+/obj/item/weapon/circuitboard/computer/cargo/request
+ name = "Supply Request Console (Computer Board)"
+ build_path = /obj/machinery/computer/cargo/request
+
+/obj/item/weapon/circuitboard/computer/stockexchange
+ name = "circuit board (Stock Exchange Console)"
+ build_path = /obj/machinery/computer/stockexchange
+ origin_tech = "programming=3"
+
+/obj/item/weapon/circuitboard/computer/operating
+ name = "Operating Computer (Computer Board)"
+ build_path = /obj/machinery/computer/operating
+ origin_tech = "programming=2;biotech=3"
+
+/obj/item/weapon/circuitboard/computer/mining
+ name = "Outpost Status Display (Computer Board)"
+ build_path = /obj/machinery/computer/security/mining
+
+/obj/item/weapon/circuitboard/computer/comm_monitor
+ name = "Telecommunications Monitor (Computer Board)"
+ build_path = /obj/machinery/computer/telecomms/monitor
+ origin_tech = "programming=3;magnets=3;bluespace=2"
+
+/obj/item/weapon/circuitboard/computer/comm_server
+ name = "Telecommunications Server Monitor (Computer Board)"
+ build_path = /obj/machinery/computer/telecomms/server
+ origin_tech = "programming=3;magnets=3;bluespace=2"
+
+/obj/item/weapon/circuitboard/computer/shuttle
+ name = "Shuttle (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle
+ var/shuttleId
+ var/possible_destinations = ""
+
+/obj/item/weapon/circuitboard/computer/shuttle/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/device/multitool))
+ var/chosen_id = round(input(usr, "Choose an ID number (-1 for reset):", "Input an Integer", null) as num|null)
+ if(chosen_id >= 0)
+ shuttleId = chosen_id
+ else
+ shuttleId = initial(shuttleId)
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/labor_shuttle
+ name = "Labor Shuttle (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/labor
+
+/obj/item/weapon/circuitboard/computer/labor_shuttle/one_way
+ name = "Prisoner Shuttle Console (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/labor/one_way
+
+/obj/item/weapon/circuitboard/computer/ferry
+ name = "Transport Ferry (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/ferry
+
+/obj/item/weapon/circuitboard/computer/ferry/request
+ name = "Transport Ferry Console (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/ferry/request
+
+/obj/item/weapon/circuitboard/computer/mining_shuttle
+ name = "Mining Shuttle (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/mining
+
+/obj/item/weapon/circuitboard/computer/white_ship
+ name = "White Ship (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/white_ship
+
+/obj/item/weapon/circuitboard/computer/auxillary_base
+ name = "Auxillary Base Management Console (Computer Board)"
+ build_path = /obj/machinery/computer/auxillary_base
+
+/obj/item/weapon/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future
+ name = "Holodeck Control (Computer Board)"
+ build_path = /obj/machinery/computer/holodeck
+ origin_tech = "programming=4"
+
+/obj/item/weapon/circuitboard/computer/aifixer
+ name = "AI Integrity Restorer (Computer Board)"
+ build_path = /obj/machinery/computer/aifixer
+ origin_tech = "programming=2;biotech=2"
+
+/obj/item/weapon/circuitboard/computer/slot_machine
+ name = "Slot Machine (Computer Board)"
+ build_path = /obj/machinery/computer/slot_machine
+ origin_tech = "programming=1"
+
+/obj/item/weapon/circuitboard/computer/libraryconsole
+ name = "Library Visitor Console (Computer Board)"
+ build_path = /obj/machinery/computer/libraryconsole
+ origin_tech = "programming=1"
+
+/obj/item/weapon/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement)
+ name = "Library Visitor Console (Computer Board)"
+ build_path = /obj/machinery/computer/libraryconsole
+ to_chat(user, "Defaulting access protocols.")
+ else
+ name = "Book Inventory Management Console (Computer Board)"
+ build_path = /obj/machinery/computer/libraryconsole/bookmanagement
+ to_chat(user, "Access protocols successfully updated.")
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/apc_control
+ name = "\improper Power Flow Control Console (Computer Board)"
+ build_path = /obj/machinery/computer/apc_control
+ origin_tech = "programming=3;engineering=3;powerstorage=2"
+
+/obj/item/weapon/circuitboard/computer/shuttle/monastery_shuttle
+ name = "Monastery Shuttle (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/monastery_shuttle
+
+/obj/item/weapon/circuitboard/computer/syndicate_shuttle
+ name = "Syndicate Shuttle (Computer Board)"
+ build_path = /obj/machinery/computer/shuttle/syndicate
+ var/challenge = FALSE
+ var/moved = FALSE
+
+/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Initialize()
+ . = ..()
+ GLOB.syndicate_shuttle_boards += src
+
+/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Destroy()
+ GLOB.syndicate_shuttle_boards -= src
+ return ..()
+
+/obj/item/weapon/circuitboard/computer/bsa_control
+ name = "Bluespace Artillery Controls (Computer Board)"
+ build_path = /obj/machinery/computer/bsa_control
+ origin_tech = "engineering=2;combat=2;bluespace=2"
+
+/obj/item/weapon/circuitboard/computer/sat_control
+ name = "Satellite Network Control (Computer Board)"
+ build_path = /obj/machinery/computer/sat_control
+ origin_tech = "engineering=3"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm b/code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm
new file mode 100644
index 0000000000..adaf7623b9
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm
@@ -0,0 +1,723 @@
+/obj/item/weapon/circuitboard/machine/sleeper
+ name = "Sleeper (Machine Board)"
+ build_path = /obj/machinery/sleeper
+ origin_tech = "programming=3;biotech=2;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/sheet/glass = 1)
+
+/obj/item/weapon/circuitboard/machine/announcement_system
+ name = "Announcement System (Machine Board)"
+ build_path = /obj/machinery/announcement_system
+ origin_tech = "programming=3;bluespace=3;magnets=2"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/autolathe
+ name = "Autolathe (Machine Board)"
+ build_path = /obj/machinery/autolathe
+ origin_tech = "engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 3,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/clonepod
+ name = "Clone Pod (Machine Board)"
+ build_path = /obj/machinery/clonepod
+ origin_tech = "programming=2;biotech=2"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/sheet/glass = 1)
+
+/obj/item/weapon/circuitboard/machine/abductor
+ name = "alien board (Report This)"
+ icon_state = "abductor_mod"
+ origin_tech = "programming=5;abductor=3"
+
+/obj/item/weapon/circuitboard/machine/clockwork
+ name = "clockwork board (Report This)"
+ icon_state = "clock_mod"
+
+/obj/item/weapon/circuitboard/machine/clonescanner
+ name = "Cloning Scanner (Machine Board)"
+ build_path = /obj/machinery/dna_scannernew
+ origin_tech = "programming=2;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/stack/sheet/glass = 1,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/holopad
+ name = "AI Holopad (Machine Board)"
+ build_path = /obj/machinery/holopad
+ origin_tech = "programming=1"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+
+/obj/item/weapon/circuitboard/machine/launchpad
+ name = "Bluespace Launchpad (Machine Board)"
+ build_path = /obj/machinery/launchpad
+ origin_tech = "programming=3;engineering=3;plasmatech=2;bluespace=3"
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+ def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
+
+/obj/item/weapon/circuitboard/machine/limbgrower
+ name = "Limb Grower (Machine Board)"
+ build_path = /obj/machinery/limbgrower
+ origin_tech = "programming=2;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/quantumpad
+ name = "Quantum Pad (Machine Board)"
+ build_path = /obj/machinery/quantumpad
+ origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4"
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 1,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 1)
+ def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
+
+/obj/item/weapon/circuitboard/machine/recharger
+ name = "Weapon Recharger (Machine Board)"
+ build_path = /obj/machinery/recharger
+ origin_tech = "powerstorage=4;engineering=3;materials=4"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+
+/obj/item/weapon/circuitboard/machine/cyborgrecharger
+ name = "Cyborg Recharger (Machine Board)"
+ build_path = /obj/machinery/recharge_station
+ origin_tech = "powerstorage=3;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/weapon/stock_parts/cell = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+ def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high)
+
+/obj/item/weapon/circuitboard/machine/recycler
+ name = "Recycler (Machine Board)"
+ build_path = /obj/machinery/recycler
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/machine/space_heater
+ name = "Space Heater (Machine Board)"
+ build_path = /obj/machinery/space_heater
+ origin_tech = "programming=2;engineering=2;plasmatech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/stack/cable_coil = 3)
+
+/obj/item/weapon/circuitboard/machine/telecomms/broadcaster
+ name = "Subspace Broadcaster (Machine Board)"
+ build_path = /obj/machinery/telecomms/broadcaster
+ origin_tech = "programming=2;engineering=2;bluespace=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/crystal = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 2)
+
+/obj/item/weapon/circuitboard/machine/telecomms/bus
+ name = "Bus Mainframe (Machine Board)"
+ build_path = /obj/machinery/telecomms/bus
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
+
+/obj/item/weapon/circuitboard/machine/telecomms/hub
+ name = "Hub Mainframe (Machine Board)"
+ build_path = /obj/machinery/telecomms/hub
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 2)
+
+/obj/item/weapon/circuitboard/machine/telecomms/processor
+ name = "Processor Unit (Machine Board)"
+ build_path = /obj/machinery/telecomms/processor
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 3,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/treatment = 2,
+ /obj/item/weapon/stock_parts/subspace/analyzer = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/amplifier = 1)
+
+/obj/item/weapon/circuitboard/machine/telecomms/receiver
+ name = "Subspace Receiver (Machine Board)"
+ build_path = /obj/machinery/telecomms/receiver
+ origin_tech = "programming=2;engineering=2;bluespace=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/subspace/ansible = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
+
+/obj/item/weapon/circuitboard/machine/telecomms/relay
+ name = "Relay Mainframe (Machine Board)"
+ build_path = /obj/machinery/telecomms/relay
+ origin_tech = "programming=2;engineering=2;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 2)
+
+/obj/item/weapon/circuitboard/machine/telecomms/server
+ name = "Telecommunication Server (Machine Board)"
+ build_path = /obj/machinery/telecomms/server
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
+
+/obj/item/weapon/circuitboard/machine/teleporter_hub
+ name = "Teleporter Hub (Machine Board)"
+ build_path = /obj/machinery/teleport/hub
+ origin_tech = "programming=3;engineering=4;bluespace=4;materials=4"
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 3,
+ /obj/item/weapon/stock_parts/matter_bin = 1)
+ def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
+
+/obj/item/weapon/circuitboard/machine/teleporter_station
+ name = "Teleporter Station (Machine Board)"
+ build_path = /obj/machinery/teleport/station
+ origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3"
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 2,
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+ def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial)
+
+/obj/item/weapon/circuitboard/machine/vendor
+ name = "Booze-O-Mat Vendor (Machine Board)"
+ build_path = /obj/machinery/vending/boozeomat
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/vending_refill/boozeomat = 3)
+
+ var/static/list/vending_names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat",
+ /obj/machinery/vending/coffee = "Solar's Best Hot Drinks",
+ /obj/machinery/vending/snack = "Getmore Chocolate Corp",
+ /obj/machinery/vending/cola = "Robust Softdrinks",
+ /obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
+ /obj/machinery/vending/autodrobe = "AutoDrobe",
+ /obj/machinery/vending/clothing = "ClothesMate",
+ /obj/machinery/vending/medical = "NanoMed Plus",
+ /obj/machinery/vending/wallmed = "NanoMed")
+
+/obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/position = vending_names_paths.Find(build_path)
+ position = (position == vending_names_paths.len) ? 1 : (position + 1)
+ var/typepath = vending_names_paths[position]
+
+ to_chat(user, "You set the board to \"[vending_names_paths[typepath]]\".")
+ set_type(typepath)
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/vendor/proc/set_type(obj/machinery/vending/typepath)
+ build_path = typepath
+ name = "[vending_names_paths[build_path]] Vendor (Machine Board)"
+ req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count))
+
+/obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M)
+ for(var/typepath in vending_names_paths)
+ if(istype(M, typepath))
+ set_type(typepath)
+ break
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/mech_recharger
+ name = "Mechbay Recharger (Machine Board)"
+ build_path = /obj/machinery/mech_bay_recharge_port
+ origin_tech = "programming=3;powerstorage=3;engineering=3"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/capacitor = 5)
+
+/obj/item/weapon/circuitboard/machine/mechfab
+ name = "Exosuit Fabricator (Machine Board)"
+ build_path = /obj/machinery/mecha_part_fabricator
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/cryo_tube
+ name = "Cryotube (Machine Board)"
+ build_path = /obj/machinery/atmospherics/components/unary/cryo_cell
+ origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/sheet/glass = 2)
+
+/obj/item/weapon/circuitboard/machine/thermomachine
+ name = "Thermomachine (Machine Board)"
+ desc = "You can use a screwdriver to switch between heater and freezer."
+ origin_tech = "programming=3;plasmatech=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/thermomachine/Initialize()
+ . = ..()
+ if(prob(50))
+ name = "Freezer (Machine Board)"
+ build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer
+ else
+ name = "Heater (Machine Board)"
+ build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater
+
+#define FREEZER /obj/item/weapon/circuitboard/machine/thermomachine/freezer
+#define HEATER /obj/item/weapon/circuitboard/machine/thermomachine/heater
+
+/obj/item/weapon/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/obj/item/weapon/circuitboard/new_type
+ var/new_setting
+ switch(build_path)
+ if(FREEZER)
+ new_type = HEATER
+ new_setting = "Heater"
+ if(HEATER)
+ new_type = FREEZER
+ new_setting = "Freezer"
+ name = initial(new_type.name)
+ build_path = initial(new_type.build_path)
+ playsound(user, I.usesound, 50, 1)
+ to_chat(user, "You change the circuitboard setting to \"[new_setting]\".")
+ else
+ return ..()
+
+#undef FREEZER
+#undef HEATER
+
+/obj/item/weapon/circuitboard/machine/thermomachine/heater
+ name = "Heater (Machine Board)"
+ build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater
+
+/obj/item/weapon/circuitboard/machine/thermomachine/freezer
+ name = "Freezer (Machine Board)"
+ build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer
+
+/obj/item/weapon/circuitboard/machine/deep_fryer
+ name = "circuit board (Deep Fryer)"
+ build_path = /obj/machinery/deepfryer
+ origin_tech = "programming=1"
+ req_components = list(/obj/item/weapon/stock_parts/micro_laser = 1)
+
+/obj/item/weapon/circuitboard/machine/gibber
+ name = "Gibber (Machine Board)"
+ build_path = /obj/machinery/gibber
+ origin_tech = "programming=2;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/machine/monkey_recycler
+ name = "Monkey Recycler (Machine Board)"
+ build_path = /obj/machinery/monkey_recycler
+ origin_tech = "programming=1;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/machine/processor
+ name = "Food Processor (Machine Board)"
+ build_path = /obj/machinery/processor
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(build_path == /obj/machinery/processor)
+ name = "Slime Processor (Machine Board)"
+ build_path = /obj/machinery/processor/slime
+ to_chat(user, "Name protocols successfully updated.")
+ else
+ name = "Food Processor (Machine Board)"
+ build_path = /obj/machinery/processor
+ to_chat(user, "Defaulting name protocols.")
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/processor/slime
+ name = "Slime Processor (Machine Board)"
+ build_path = /obj/machinery/processor/slime
+
+/obj/item/weapon/circuitboard/machine/smartfridge
+ name = "Smartfridge (Machine Board)"
+ build_path = /obj/machinery/smartfridge
+ origin_tech = "programming=1"
+ req_components = list(/obj/item/weapon/stock_parts/matter_bin = 1)
+ var/static/list/fridges_name_paths = list(/obj/machinery/smartfridge = "plant produce",
+ /obj/machinery/smartfridge/food = "food",
+ /obj/machinery/smartfridge/drinks = "drinks",
+ /obj/machinery/smartfridge/extract = "slimes",
+ /obj/machinery/smartfridge/chemistry = "chems",
+ /obj/machinery/smartfridge/chemistry/virology = "viruses",
+ /obj/machinery/smartfridge/disks = "disks")
+
+/obj/item/weapon/circuitboard/machine/smartfridge/Initialize(mapload, new_type)
+ if(new_type)
+ build_path = new_type
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/position = fridges_name_paths.Find(build_path, fridges_name_paths)
+ position = (position == fridges_name_paths.len) ? 1 : (position + 1)
+ build_path = fridges_name_paths[position]
+ to_chat(user, "You set the board to [fridges_name_paths[build_path]].")
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/smartfridge/examine(mob/user)
+ ..()
+ to_chat(user, "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.")
+
+/obj/item/weapon/circuitboard/machine/biogenerator
+ name = "Biogenerator (Machine Board)"
+ build_path = /obj/machinery/biogenerator
+ origin_tech = "programming=2;biotech=3;materials=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/plantgenes
+ name = "Plant DNA Manipulator (Machine Board)"
+ build_path = /obj/machinery/plantgenes
+ origin_tech = "programming=3;biotech=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/scanning_module = 1)
+
+/obj/item/weapon/circuitboard/machine/plantgenes/vault
+ name = "alien board (Plant DNA Manipulator)"
+ icon_state = "abductor_mod"
+ origin_tech = "programming=5;biotech=5"
+ // It wasn't made by actual abductors race, so no abductor tech here.
+ def_components = list(
+ /obj/item/weapon/stock_parts/manipulator = /obj/item/weapon/stock_parts/manipulator/femto,
+ /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra,
+ /obj/item/weapon/stock_parts/scanning_module = /obj/item/weapon/stock_parts/scanning_module/triphasic)
+
+
+/obj/item/weapon/circuitboard/machine/hydroponics
+ name = "Hydroponics Tray (Machine Board)"
+ build_path = /obj/machinery/hydroponics/constructable
+ origin_tech = "programming=1;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/seed_extractor
+ name = "Seed Extractor (Machine Board)"
+ build_path = /obj/machinery/seed_extractor
+ origin_tech = "programming=1"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/machine/ore_redemption
+ name = "Ore Redemption (Machine Board)"
+ build_path = /obj/machinery/mineral/ore_redemption
+ origin_tech = "programming=1;engineering=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/device/assembly/igniter = 1)
+
+/obj/item/weapon/circuitboard/machine/mining_equipment_vendor
+ name = "Mining Equipment Vendor (Machine Board)"
+ build_path = /obj/machinery/mineral/equipment_vendor
+ origin_tech = "programming=1;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 3)
+
+/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem
+ name = "Golem Ship Equipment Vendor (Machine Board)"
+ build_path = /obj/machinery/mineral/equipment_vendor/golem
+
+/obj/item/weapon/circuitboard/machine/ntnet_relay
+ name = "NTNet Relay (Machine Board)"
+ build_path = /obj/machinery/ntnet_relay
+ origin_tech = "programming=3;bluespace=3;magnets=2"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
+
+/obj/item/weapon/circuitboard/machine/pacman
+ name = "PACMAN-type Generator (Machine Board)"
+ build_path = /obj/machinery/power/port_gen/pacman
+ origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/capacitor = 1)
+
+/obj/item/weapon/circuitboard/machine/pacman/super
+ name = "SUPERPACMAN-type Generator (Machine Board)"
+ build_path = /obj/machinery/power/port_gen/pacman/super
+ origin_tech = "programming=3;powerstorage=4;engineering=4"
+
+/obj/item/weapon/circuitboard/machine/pacman/mrs
+ name = "MRSPACMAN-type Generator (Machine Board)"
+ build_path = /obj/machinery/power/port_gen/pacman/mrs
+ origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4"
+
+/obj/item/weapon/circuitboard/machine/rtg
+ name = "RTG (Machine Board)"
+ build_path = /obj/machinery/power/rtg
+ origin_tech = "programming=2;materials=4;powerstorage=3;engineering=2"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it.
+
+/obj/item/weapon/circuitboard/machine/rtg/advanced
+ name = "Advanced RTG (Machine Board)"
+ build_path = /obj/machinery/power/rtg/advanced
+ origin_tech = "programming=3;materials=5;powerstorage=4;engineering=3;plasmatech=3"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/stack/sheet/mineral/uranium = 10,
+ /obj/item/stack/sheet/mineral/plasma = 5)
+
+/obj/item/weapon/circuitboard/machine/abductor/core
+ name = "alien board (Void Core)"
+ build_path = /obj/machinery/power/rtg/abductor
+ origin_tech = "programming=5;abductor=5;powerstorage=8;engineering=8"
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/cell/infinite/abductor = 1)
+ def_components = list(
+ /obj/item/weapon/stock_parts/capacitor = /obj/item/weapon/stock_parts/capacitor/quadratic,
+ /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra)
+
+/obj/item/weapon/circuitboard/machine/emitter
+ name = "Emitter (Machine Board)"
+ build_path = /obj/machinery/power/emitter
+ origin_tech = "programming=3;powerstorage=4;engineering=4"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
+
+/obj/item/weapon/circuitboard/machine/smes
+ name = "SMES (Machine Board)"
+ build_path = /obj/machinery/power/smes
+ origin_tech = "programming=3;powerstorage=3;engineering=3"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/cell = 5,
+ /obj/item/weapon/stock_parts/capacitor = 1)
+ def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high/empty)
+
+/obj/item/weapon/circuitboard/machine/tesla_coil
+ name = "Tesla Coil (Machine Board)"
+ build_path = /obj/machinery/power/tesla_coil
+ origin_tech = "programming=3;magnets=3;powerstorage=3"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+
+/obj/item/weapon/circuitboard/machine/grounding_rod
+ name = "Grounding Rod (Machine Board)"
+ build_path = /obj/machinery/power/grounding_rod
+ origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2"
+ req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+
+/obj/item/weapon/circuitboard/machine/power_compressor
+ name = "Power Compressor (Machine Board)"
+ build_path = /obj/machinery/power/compressor
+ origin_tech = "programming=4;powerstorage=4;engineering=4"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/manipulator = 6)
+
+/obj/item/weapon/circuitboard/machine/power_turbine
+ name = "Power Turbine (Machine Board)"
+ build_path = /obj/machinery/power/turbine
+ origin_tech = "programming=4;powerstorage=4;engineering=4"
+ req_components = list(
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 6)
+
+/obj/item/weapon/circuitboard/machine/chem_dispenser
+ name = "Portable Chem Dispenser (Machine Board)"
+ build_path = /obj/machinery/chem_dispenser/constructable
+ origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/cell = 1)
+ def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high)
+
+/obj/item/weapon/circuitboard/machine/chem_heater
+ name = "Chemical Heater (Machine Board)"
+ build_path = /obj/machinery/chem_heater
+ origin_tech = "programming=2;engineering=2;biotech=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/chem_master
+ name = "ChemMaster 3000 (Machine Board)"
+ build_path = /obj/machinery/chem_master
+ origin_tech = "materials=3;programming=2;biotech=3"
+ req_components = list(
+ /obj/item/weapon/reagent_containers/glass/beaker = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ var/new_name = "ChemMaster"
+ var/new_path = /obj/machinery/chem_master
+
+ if(build_path == /obj/machinery/chem_master)
+ new_name = "CondiMaster"
+ new_path = /obj/machinery/chem_master/condimaster
+
+ build_path = new_path
+ name = "[new_name] 3000 (Machine Board)"
+ to_chat(user, "You change the circuit board setting to \"[new_name]\".")
+ else
+ return ..()
+
+/obj/item/weapon/circuitboard/machine/chem_master/condi
+ name = "CondiMaster 3000 (Machine Board)"
+ build_path = /obj/machinery/chem_master/condimaster
+
+/obj/item/weapon/circuitboard/machine/circuit_imprinter
+ name = "Circuit Imprinter (Machine Board)"
+ build_path = /obj/machinery/r_n_d/circuit_imprinter
+ origin_tech = "engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2)
+
+/obj/item/weapon/circuitboard/machine/destructive_analyzer
+ name = "Destructive Analyzer (Machine Board)"
+ build_path = /obj/machinery/r_n_d/destructive_analyzer
+ origin_tech = "magnets=2;engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
+
+/obj/item/weapon/circuitboard/machine/experimentor
+ name = "E.X.P.E.R.I-MENTOR (Machine Board)"
+ build_path = /obj/machinery/r_n_d/experimentor
+ origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 2)
+
+/obj/item/weapon/circuitboard/machine/protolathe
+ name = "Protolathe (Machine Board)"
+ build_path = /obj/machinery/r_n_d/protolathe
+ origin_tech = "engineering=2;programming=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2)
+
+/obj/item/weapon/circuitboard/machine/rdserver
+ name = "R&D Server (Machine Board)"
+ build_path = /obj/machinery/r_n_d/server
+ origin_tech = "programming=3"
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 1)
+
+/obj/item/weapon/circuitboard/machine/bsa/back
+ name = "Bluespace Artillery Generator (Machine Board)"
+ build_path = /obj/machinery/bsa/back
+ origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies!
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor/quadratic = 5,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/bsa/middle
+ name = "Bluespace Artillery Fusor (Machine Board)"
+ build_path = /obj/machinery/bsa/middle
+ origin_tech = "engineering=2;combat=2;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/ore/bluespace_crystal = 20,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/bsa/front
+ name = "Bluespace Artillery Bore (Machine Board)"
+ build_path = /obj/machinery/bsa/front
+ origin_tech = "engineering=2;combat=2;bluespace=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator/femto = 5,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/dna_vault
+ name = "DNA Vault (Machine Board)"
+ build_path = /obj/machinery/dna_vault
+ origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies!
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor/super = 5,
+ /obj/item/weapon/stock_parts/manipulator/pico = 5,
+ /obj/item/stack/cable_coil = 2)
+
+/obj/item/weapon/circuitboard/machine/microwave
+ name = "Microwave (Machine Board)"
+ build_path = /obj/machinery/microwave
+ origin_tech = "programming=2;magnets=2"
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/sheet/glass = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 0dcdf1d7b6..0db6f10438 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -547,7 +547,3 @@
beakers += B1
beakers += B2
-
-#undef EMPTY
-#undef WIRED
-#undef READY
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 487b70f8f2..ccfbae5e96 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -20,15 +20,13 @@
var/special = FALSE
var/special_name = "special function"
-/obj/machinery/implantchair/New()
- ..()
+/obj/machinery/implantchair/Initialize()
+ . = ..()
open_machine()
update_icon()
-/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
-
+/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "implantchair", name, 375, 280, master_ui, state)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index dff48b6d41..5c245bf4c0 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -377,5 +377,5 @@
max_combined_w_class = 200
w_class = WEIGHT_CLASS_TINY
preposition = "in"
- can_hold = list(/obj/item/slime_extract, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/hypospray/medipen, /obj/item/trash/deadmouse, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)
+ can_hold = list(/obj/item/slime_extract, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/blood, /obj/item/weapon/reagent_containers/hypospray/medipen, /obj/item/weapon/reagent_containers/food/snacks/deadmouse, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)
resistance_flags = FLAMMABLE
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index cc4bee233b..226cea104f 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -196,7 +196,7 @@
if(display_contents_with_number)
for(var/datum/numbered_display/ND in display_contents)
- ND.sample_object.mouse_opacity = 2
+ ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE
ND.sample_object.screen_loc = "[cx]:16,[cy]:16"
ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]"
ND.sample_object.layer = ABOVE_HUD_LAYER
@@ -207,7 +207,7 @@
cy--
else
for(var/obj/O in contents)
- O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip"
+ O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
O.screen_loc = "[cx]:16,[cy]:16"
O.maptext = ""
O.layer = ABOVE_HUD_LAYER
@@ -350,7 +350,7 @@
orient2hud(usr)
for(var/mob/M in can_see_contents())
show_to(M)
- W.mouse_opacity = 2 //So you can click on the area around the item to equip it, instead of having to pixel hunt
+ W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt
update_icon()
return 1
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 9eac23c55c..64fa2ee68e 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -319,7 +319,7 @@
desc = "A compacted ball of expansive resin, used to repair the atmosphere in a room, or seal off breaches."
icon = 'icons/effects/effects.dmi'
icon_state = "frozen_smoke_capsule"
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pass_flags = PASSTABLE
/obj/effect/resin_container/proc/Smoke()
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 9a25da9019..f6b044a0da 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -321,6 +321,6 @@
icon_state = "direction_bridge"
/obj/structure/sign/logo
- name = "station logo"
- desc = "A sign: SPACE STATION 13."
- icon_state = "ss13sign-1"
\ No newline at end of file
+ name = "nanotrasen logo"
+ desc = "The Nanotrasen corporate logo."
+ icon_state = "ss13sign-1"
diff --git a/code/game/objects/structures/signs.dm.rej b/code/game/objects/structures/signs.dm.rej
new file mode 100644
index 0000000000..51eea8f290
--- /dev/null
+++ b/code/game/objects/structures/signs.dm.rej
@@ -0,0 +1,11 @@
+diff a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm (rejected hunks)
+@@ -326,6 +326,6 @@
+ icon_state = "direction_bridge"
+
+ /obj/structure/sign/logo
+- name = "station logo"
+- desc = "A sign: SPACE STATION 13."
++ name = "nanotrasen logo"
++ desc = "The Nanotrasen corporate logo."
+ icon_state = "nanotrasen_sign1"
+\ No newline at end of file
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index c0b2ceaaf3..e0f98e03d1 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -209,7 +209,7 @@
icon_state = "mist"
layer = FLY_LAYER
anchored = TRUE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/machinery/shower/attack_hand(mob/M)
diff --git a/code/game/sound.dm b/code/game/sound.dm
index ff35915b08..86fdceb3c3 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -80,12 +80,13 @@
SEND_SOUND(src, S)
-/proc/sound_to_playing_players(sound, volume = 100, vary)
- sound = get_sfx(sound)
- for(var/M in GLOB.player_list)
- if(ismob(M) && !isnewplayer(M))
- var/mob/MO = M
- MO.playsound_local(MO, sound, volume, vary, pressure_affected = FALSE)
+/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, falloff = FALSE, channel = 0, pressure_affected = FALSE, sound/S)
+ if(!S)
+ S = sound(get_sfx(soundin))
+ for(var/m in GLOB.player_list)
+ if(ismob(m) && !isnewplayer(m))
+ var/mob/M = m
+ M.playsound_local(M, null, volume, vary, frequency, falloff, channel, pressure_affected, S)
/proc/open_sound_channel()
var/static/next_channel = 1 //loop through the available 1024 - (the ones we reserve) channels and pray that its not still being used
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index 9d6f6ade00..6cb00dba89 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -104,7 +104,18 @@
return
/turf/open/floor/plating/asteroid/singularity_pull(S, current_size)
- return
+ if(dug)
+ return
+ switch(current_size)
+ if(STAGE_THREE)
+ if(!prob(30))
+ gets_dug()
+ if(STAGE_FOUR)
+ if(prob(50))
+ gets_dug()
+ else
+ if(current_size >= STAGE_FIVE && prob(70))
+ gets_dug()
/turf/open/floor/plating/asteroid/basalt
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 63f01a60bd..99167b247a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -163,6 +163,12 @@
..()
if(explosion_level && AM.ex_check(explosion_id))
AM.ex_act(explosion_level)
+
+ // If an opaque movable atom moves around we need to potentially update visibility.
+ if (AM.opacity)
+ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case.
+ reconsider_lights()
+
/turf/open/Entered(atom/movable/AM)
..()
diff --git a/code/game/turfs/turf.dm.rej b/code/game/turfs/turf.dm.rej
index 1eafa7e8ae..d58adb0f78 100644
--- a/code/game/turfs/turf.dm.rej
+++ b/code/game/turfs/turf.dm.rej
@@ -1,10 +1 @@
-diff a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm (rejected hunks)
-@@ -323,7 +323,7 @@
- M.take_damage(damage*2, BRUTE, "melee", 1)
-
- /turf/proc/Bless()
-- flags |= NOJAUNT
-+ flags_1 |= NOJAUNT_1
-
- /turf/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
- if(src_object.contents.len)
+garbage
\ No newline at end of file
diff --git a/code/game/world.dm b/code/game/world.dm
new file mode 100644
index 0000000000..f5b45a46ca
--- /dev/null
+++ b/code/game/world.dm
@@ -0,0 +1,292 @@
+/world/New()
+ log_world("World loaded at [time_stamp()]")
+
+ SetupExternalRSC()
+
+ GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
+
+ make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
+
+ config = new
+
+ CheckSchemaVersion()
+ SetRoundID()
+
+ SetupLogs()
+
+ if(!RunningService()) //tgs2 support
+ GLOB.revdata.DownloadPRDetails()
+
+ load_motd()
+ load_admins()
+ LoadVerbs(/datum/verbs/menu)
+ if(config.usewhitelist)
+ load_whitelist()
+ LoadBans()
+
+ GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
+
+ Master.Initialize(10, FALSE)
+
+ if(config.irc_announce_new_game)
+ IRCBroadcast("New round starting on [SSmapping.config.map_name]!")
+
+/world/proc/SetupExternalRSC()
+#if (PRELOAD_RSC == 0)
+ external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
+ var/i=1
+ while(i<=external_rsc_urls.len)
+ if(external_rsc_urls[i])
+ i++
+ else
+ external_rsc_urls.Cut(i,i+1)
+#endif
+
+/world/proc/CheckSchemaVersion()
+ if(config.sql_enabled)
+ if(SSdbcore.Connect())
+ log_world("Database connection established.")
+ var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1")
+ query_db_version.Execute()
+ if(query_db_version.NextRow())
+ var/db_major = text2num(query_db_version.item[1])
+ var/db_minor = text2num(query_db_version.item[2])
+ if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION)
+ message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
+ log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
+ else
+ message_admins("Could not get schema version from database")
+ else
+ log_world("Your server failed to establish a connection with the database.")
+
+/world/proc/SetRoundID()
+ if(config.sql_enabled)
+ if(SSdbcore.Connect())
+ var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')")
+ query_round_start.Execute()
+ var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()")
+ query_round_last_id.Execute()
+ if(query_round_last_id.NextRow())
+ GLOB.round_id = query_round_last_id.item[1]
+
+/world/proc/SetupLogs()
+ GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+ if(GLOB.round_id)
+ GLOB.log_directory += "[GLOB.round_id]"
+ else
+ GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
+ GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
+ GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
+ GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log")
+ GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html")
+ WRITE_FILE(GLOB.world_game_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------")
+ WRITE_FILE(GLOB.world_attack_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------")
+ WRITE_FILE(GLOB.world_runtime_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------")
+ GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
+ if(fexists(GLOB.config_error_log))
+ fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
+ fdel(GLOB.config_error_log)
+
+ if(GLOB.round_id)
+ log_game("Round ID: [GLOB.round_id]")
+
+/world/Topic(T, addr, master, key)
+ var/list/input = params2list(T)
+
+ var/pinging = ("ping" in input)
+ var/playing = ("players" in input)
+
+ if(!pinging && !playing && config && config.log_world_topic)
+ WRITE_FILE(GLOB.world_game_log, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]")
+
+ if(input[SERVICE_CMD_PARAM_KEY])
+ return ServiceCommand(input)
+ var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
+
+ if(pinging)
+ var/x = 1
+ for (var/client/C in GLOB.clients)
+ x++
+ return x
+
+ else if(playing)
+ var/n = 0
+ for(var/mob/M in GLOB.player_list)
+ if(M.client)
+ n++
+ return n
+
+ else if("ircstatus" in input) //tgs2 support
+ var/static/last_irc_status = 0
+ if(world.time - last_irc_status < 50)
+ return
+ var/list/adm = get_admin_counts()
+ var/list/allmins = adm["total"]
+ var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
+ status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]."
+ send2irc("Status", status)
+ last_irc_status = world.time
+
+ else if("status" in input)
+ var/list/s = list()
+ s["version"] = GLOB.game_version
+ s["mode"] = GLOB.master_mode
+ s["respawn"] = config ? GLOB.abandon_allowed : 0
+ s["enter"] = GLOB.enter_allowed
+ s["vote"] = config.allow_vote_mode
+ s["ai"] = config.allow_ai
+ s["host"] = host ? host : null
+ s["active_players"] = get_active_player_count()
+ s["players"] = GLOB.clients.len
+ s["revision"] = GLOB.revdata.commit
+ s["revision_date"] = GLOB.revdata.date
+
+ var/list/adm = get_admin_counts()
+ var/list/presentmins = adm["present"]
+ var/list/afkmins = adm["afk"]
+ s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
+ s["gamestate"] = SSticker.current_state
+
+ s["map_name"] = SSmapping.config.map_name
+
+ if(key_valid && SSticker.HasRoundStarted())
+ s["real_mode"] = SSticker.mode.name
+ // Key-authed callers may know the truth behind the "secret"
+
+ s["security_level"] = get_security_level()
+ s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
+ // Amount of world's ticks in seconds, useful for calculating round duration
+
+ if(SSshuttle && SSshuttle.emergency)
+ s["shuttle_mode"] = SSshuttle.emergency.mode
+ // Shuttle status, see /__DEFINES/stat.dm
+ s["shuttle_timer"] = SSshuttle.emergency.timeLeft()
+ // Shuttle timer, in seconds
+
+ return list2params(s)
+
+ else if("announce" in input)
+ if(!key_valid)
+ return "Bad Key"
+ else
+ AnnouncePR(input["announce"], json_decode(input["payload"]))
+
+ else if("crossmessage" in input)
+ if(!key_valid)
+ return
+ else
+ if(input["crossmessage"] == "Ahelp")
+ relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]")
+ if(input["crossmessage"] == "Comms_Console")
+ minor_announce(input["message"], "Incoming message from [input["message_sender"]]")
+ for(var/obj/machinery/computer/communications/CM in GLOB.machines)
+ CM.overrideCooldown()
+ if(input["crossmessage"] == "News_Report")
+ minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
+
+ else if("adminmsg" in input) //tgs2 support
+ if(!key_valid)
+ return "Bad Key"
+ else
+ return IrcPm(input["adminmsg"],input["msg"],input["sender"])
+
+ else if("namecheck" in input) //tgs2 support
+ if(!key_valid)
+ return "Bad Key"
+ else
+ log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]")
+ message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]")
+ return keywords_lookup(input["namecheck"],1)
+ else if("adminwho" in input) //tgs2 support
+ if(!key_valid)
+ return "Bad Key"
+ else
+ return ircadminwho()
+ else if("server_hop" in input)
+ show_server_hop_transfer_screen(input["server_hop"])
+
+/world/proc/AnnouncePR(announcement, list/payload)
+ var/static/list/PRcounts = list() //PR id -> number of times announced this round
+ var/id = "[payload["pull_request"]["id"]]"
+ if(!PRcounts[id])
+ PRcounts[id] = 1
+ else
+ ++PRcounts[id]
+ if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
+ return
+
+ var/final_composed = "PR: [announcement]"
+ for(var/client/C in GLOB.clients)
+ C.AnnouncePR(final_composed)
+
+/world/Reboot(reason = 0, fast_track = FALSE)
+ ServiceReboot() //handles alternative actions if necessary
+ if (reason || fast_track) //special reboot, do none of the normal stuff
+ if (usr)
+ log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
+ message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
+ to_chat(world, "Rebooting World immediately due to host request")
+ else
+ to_chat(world, "Rebooting world...")
+ Master.Shutdown() //run SS shutdowns
+ log_world("World rebooted at [time_stamp()]")
+ ..()
+
+/world/proc/load_motd()
+ GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo()
+
+/world/proc/update_status()
+ var/s = ""
+
+ if (config && config.server_name)
+ s += "[config.server_name] — "
+
+ s += "[station_name()]";
+ s += " ("
+ s += "" //Change this to wherever you want the hub to link to.
+ s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version.
+ s += ""
+ s += ")"
+
+ var/list/features = list()
+
+ if(GLOB.master_mode)
+ features += GLOB.master_mode
+
+ if (!GLOB.enter_allowed)
+ features += "closed"
+
+ features += GLOB.abandon_allowed ? "respawn" : "no respawn"
+
+ if (config && config.allow_vote_mode)
+ features += "vote"
+
+ if (config && config.allow_ai)
+ features += "AI allowed"
+
+ var/n = 0
+ for (var/mob/M in GLOB.player_list)
+ if (M.client)
+ n++
+
+ if (n > 1)
+ features += "~[n] players"
+ else if (n > 0)
+ features += "~[n] player"
+
+ if (!host && config && config.hostedby)
+ features += "hosted by [config.hostedby]"
+
+ if (features)
+ s += ": [jointext(features, ", ")]"
+
+ status = s
+
+/world/proc/update_hub_visibility(new_visibility)
+ if(new_visibility == GLOB.hub_visibility)
+ return
+ GLOB.hub_visibility = new_visibility
+ if(GLOB.hub_visibility)
+ hub_password = "kMZy3U5jJHSiBQjr"
+ else
+ hub_password = "SORRYNOPASSWORD"
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index a095840b09..a83ced850e 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -52,8 +52,7 @@
/obj/machinery/vr_sleeper/Destroy()
open_machine()
cleanup_vr_human()
- qdel(sparks)
- sparks = null
+ QDEL_NULL(sparks)
return ..()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index a839b35b3c..b99f9228b9 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
+ /client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/
/client/proc/reload_admins,
/client/proc/reestablish_db_connection, /*reattempt a connection to the database*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
@@ -456,7 +457,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
mob.invisibility = INVISIBILITY_MAXIMUM //JUST IN CASE
mob.alpha = 0 //JUUUUST IN CASE
mob.name = " "
- mob.mouse_opacity = 0
+ mob.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]")
message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]")
SSblackbox.add_details("admin_verb","Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 66438d1fac..ad87a8e417 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -505,12 +505,13 @@ GLOBAL_PROTECT(AdminProcCallCount)
var/list/areas_with_LS = list()
var/list/areas_with_intercom = list()
var/list/areas_with_camera = list()
+ var/list/station_areas_blacklist = typecacheof(list(/area/holodeck/rec_center, /area/shuttle, /area/engine/supermatter, /area/science/test_area, /area/space, /area/solar, /area/mine, /area/ruin))
for(var/area/A in world)
if(on_station)
var/turf/picked = safepick(get_area_turfs(A.type))
if(picked && (picked.z == ZLEVEL_STATION))
- if(!(A.type in areas_all))
+ if(!(A.type in areas_all) && !is_type_in_typecache(A, station_areas_blacklist))
areas_all.Add(A.type)
else if(!(A.type in areas_all))
areas_all.Add(A.type)
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 12d012e3f8..a39a9059f3 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -45,7 +45,7 @@
//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile
/obj/effect/hotspot
anchored = TRUE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
icon = 'icons/effects/fire.dmi'
icon_state = "1"
layer = ABOVE_OPEN_TURF_LAYER
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index 60364086a5..2135b9fbd0 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -95,7 +95,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list("o2","n2","co2","plasma")) //the main fou
/obj/effect/overlay/gas
icon = 'icons/effects/tile_effects.dmi'
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
layer = FLY_LAYER
appearance_flags = TILE_BOUND
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index b55ed7e84f..9cc914057d 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -9,9 +9,10 @@
max_integrity = 350
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 30, acid = 30)
layer = ABOVE_WINDOW_LAYER
+ state_open = FALSE
+ circuit = /obj/item/weapon/circuitboard/machine/cryo_tube
var/on = FALSE
- state_open = FALSE
var/autoeject = FALSE
var/volume = 100
@@ -35,8 +36,6 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
. = ..()
initialize_directions = dir
- var/obj/item/weapon/circuitboard/machine/cryo_tube/B = new
- B.apply_default_parts(src)
radio = new(src)
radio.keyslot = new radio_key
@@ -44,16 +43,6 @@
radio.canhear_range = 0
radio.recalculateChannels()
-/obj/item/weapon/circuitboard/machine/cryo_tube
- name = "Cryotube (Machine Board)"
- build_path = /obj/machinery/atmospherics/components/unary/cryo_cell
- origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/stack/sheet/glass = 2)
-
/obj/machinery/atmospherics/components/unary/cryo_cell/on_construction()
..(dir, dir)
@@ -69,11 +58,8 @@
conduction_coefficient = initial(conduction_coefficient) * C
/obj/machinery/atmospherics/components/unary/cryo_cell/Destroy()
- qdel(radio)
- radio = null
- if(beaker)
- qdel(beaker)
- beaker = null
+ QDEL_NULL(radio)
+ QDEL_NULL(beaker)
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/contents_explosion(severity, target)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 32789011ae..9a981ae81b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -10,6 +10,7 @@
max_integrity = 300
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30)
layer = OBJ_LAYER
+ circuit = /obj/item/weapon/circuitboard/machine/thermomachine
var/on = FALSE
var/min_temperature = 0
@@ -18,49 +19,9 @@
var/heat_capacity = 0
var/interactive = TRUE // So mapmakers can disable interaction.
-/obj/machinery/atmospherics/components/unary/thermomachine/New()
- ..()
- initialize_directions = dir
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/thermomachine
- name = "Thermomachine (Machine Board)"
- desc = "You can use a screwdriver to switch between heater and freezer."
- origin_tech = "programming=3;plasmatech=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/micro_laser = 2,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/machine/thermomachine/Initialize()
+/obj/machinery/atmospherics/components/unary/thermomachine/Initialize()
. = ..()
- if(prob(50))
- name = "Freezer (Machine Board)"
- build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer
- else
- name = "Heater (Machine Board)"
- build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater
-
-/obj/item/weapon/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params)
- var/obj/item/weapon/circuitboard/machine/freezer = /obj/item/weapon/circuitboard/machine/thermomachine/freezer
- var/obj/item/weapon/circuitboard/machine/heater = /obj/item/weapon/circuitboard/machine/thermomachine/heater
- var/obj/item/weapon/circuitboard/machine/newtype
-
- if(istype(I, /obj/item/weapon/screwdriver))
- var/new_setting = "Heater"
- playsound(src.loc, I.usesound, 50, 1)
- if(build_path == initial(heater.build_path))
- newtype = freezer
- new_setting = "Freezer"
- else
- newtype = heater
- name = initial(newtype.name)
- build_path = initial(newtype.build_path)
- to_chat(user, "You change the circuitboard setting to \"[new_setting]\".")
- else
- return ..()
+ initialize_directions = dir
/obj/machinery/atmospherics/components/unary/thermomachine/on_construction()
..(dir,dir)
@@ -202,15 +163,7 @@
icon_state_open = "freezer-o"
max_temperature = T20C
min_temperature = 170
-
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine/freezer(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/thermomachine/freezer
- name = "Freezer (Machine Board)"
- build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer
+ circuit = /obj/item/weapon/circuitboard/machine/thermomachine/freezer
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts()
..()
@@ -227,15 +180,7 @@
icon_state_open = "heater-o"
max_temperature = 140
min_temperature = T20C
-
-/obj/machinery/atmospherics/components/unary/thermomachine/heater/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine/heater(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/thermomachine/heater
- name = "Heater (Machine Board)"
- build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater
+ circuit = /obj/item/weapon/circuitboard/machine/thermomachine/heater
/obj/machinery/atmospherics/components/unary/thermomachine/heater/RefreshParts()
..()
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 26c27c7be4..cca108757a 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -16,7 +16,7 @@
volume = 1000
/obj/machinery/portable_atmospherics/pump/Initialize()
- ..()
+ . = ..()
pump = new(src, FALSE)
pump.on = TRUE
pump.stat = 0
@@ -26,8 +26,7 @@
var/turf/T = get_turf(src)
T.assume_air(air_contents)
air_update_turf()
- qdel(pump)
- pump = null
+ QDEL_NULL(pump)
return ..()
/obj/machinery/portable_atmospherics/pump/update_icon()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 38e9b1f68a..8bcbc3a892 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -30,13 +30,11 @@
var/reset_path = /obj/effect/ctf/flag_reset
/obj/item/weapon/twohanded/ctf/Destroy()
- if(reset)
- qdel(reset)
- reset = null
- . = ..()
+ QDEL_NULL(reset)
+ return ..()
/obj/item/weapon/twohanded/ctf/Initialize()
- ..()
+ . = ..()
SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND)
if(!reset)
reset = new reset_path(get_turf(src))
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index e533d625cc..9983219e2e 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -22,7 +22,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
switch(dir)
if(SOUTH,SOUTHEAST,SOUTHWEST)
density = FALSE
- ..()
+ return ..()
/obj/machinery/gateway/proc/toggleoff()
for(var/obj/machinery/gateway/G in linked)
@@ -75,10 +75,13 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
/obj/machinery/gateway/proc/toggleon(mob/user)
return FALSE
-/obj/machinery/gateway/centerstation/New()
- ..()
+/obj/machinery/gateway/centerstation/Initialize()
+ . = ..()
if(!GLOB.the_gateway)
GLOB.the_gateway = src
+ update_icon()
+ wait = world.time + config.gateway_delay //+ thirty minutes default
+ awaygate = locate(/obj/machinery/gateway/centeraway)
/obj/machinery/gateway/centerstation/Destroy()
if(GLOB.the_gateway == src)
@@ -96,12 +99,6 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
var/obj/machinery/gateway/centeraway/awaygate = null
can_link = TRUE
-/obj/machinery/gateway/centerstation/Initialize()
- ..()
- update_icon()
- wait = world.time + config.gateway_delay //+ thirty minutes default
- awaygate = locate(/obj/machinery/gateway/centeraway)
-
/obj/machinery/gateway/centerstation/update_icon()
if(active)
icon_state = "oncenter"
@@ -182,7 +179,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
/obj/machinery/gateway/centeraway/Initialize()
- ..()
+ . = ..()
update_icon()
stationgate = locate(/obj/machinery/gateway/centerstation)
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 7926cfc34d..cd48386d62 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -18,8 +18,8 @@
circuit = /obj/item/weapon/circuitboard/computer/cargo/request
requestonly = TRUE
-/obj/machinery/computer/cargo/New()
- ..()
+/obj/machinery/computer/cargo/Initialize()
+ . = ..()
var/obj/item/weapon/circuitboard/computer/cargo/board = circuit
contraband = board.contraband
emagged = board.emagged
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 263b5c5d30..c9fe711b00 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1778,9 +1778,7 @@
name = "Shield System Control Board"
cost = 5000
special = TRUE
- contains = list(
- /obj/item/weapon/circuitboard/machine/computer/sat_control
- )
+ contains = list(/obj/item/weapon/circuitboard/computer/sat_control)
crate_name= "shield control board crate"
/datum/supply_pack/misc/bicycle
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 20b4440b97..637c3e2bec 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -72,9 +72,9 @@
to_chat(src, "Your previous action was ignored because you've done too many in a second")
return
- //Logs all hrefs
- WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
")
-
+ //Logs all hrefs, except chat pings
+ if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2))
+ WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
")
// Admin PM
if(href_list["priv_msg"])
cmd_admin_pm(href_list["priv_msg"],null)
diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej
new file mode 100644
index 0000000000..2b656938c4
--- /dev/null
+++ b/code/modules/client/client_procs.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks)
+@@ -73,7 +73,7 @@
+ return
+
+ //Logs all hrefs, except chat pings
+- if(href_list["proc"] != "ping")
++ if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2))
+ WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
")
+
+ // Admin PM
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 4c23db3f86..9104b3d767 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -431,7 +431,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("snout" in pref_species.mutant_bodyparts)
dat += "Snout: [features["snout"]]
"
if("horns" in pref_species.mutant_bodyparts)
- dat += "Snout: [features["horns"]]
"
+ dat += "Horns: [features["horns"]]
"
if("frills" in pref_species.mutant_bodyparts)
dat += "Frills: [features["frills"]]
"
if("spines" in pref_species.mutant_bodyparts)
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 3127bdef4c..bfaa8a55c6 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -245,7 +245,7 @@
anchored = TRUE
invisibility = INVISIBILITY_ABSTRACT
opacity = 0
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/mob/holder = null
var/phase_time = 0
var/phase_time_length = 3
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index dc318cd2a1..5fe3d018fb 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -314,7 +314,7 @@
anchored = TRUE
density = FALSE
layer = SPACEVINE_LAYER
- mouse_opacity = 2 //Clicking anywhere on the turf is good enough
+ mouse_opacity = MOUSE_OPACITY_OPAQUE //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
max_integrity = 50
var/energy = 0
diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm
index cedce76369..a480459f38 100644
--- a/code/modules/fields/peaceborg_dampener.dm
+++ b/code/modules/fields/peaceborg_dampener.dm
@@ -54,7 +54,7 @@
var/obj/effect/abstract/proximity_checker/advanced/F = edge_turfs[T]
F.appearance = I.appearance
F.invisibility = 0
- F.mouse_opacity = 0
+ F.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
F.layer = 5
/datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/T)
diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm
index e50be26ff1..c1efef1ed4 100644
--- a/code/modules/fields/turf_objects.dm
+++ b/code/modules/fields/turf_objects.dm
@@ -7,7 +7,7 @@
alpha = 0
invisibility = INVISIBILITY_ABSTRACT
flags = ABSTRACT|ON_BORDER
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/datum/proximity_monitor/advanced/parent = null
/obj/effect/abstract/proximity_checker/advanced/Initialize(mapload, _monitor)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 8f567c6a5c..14ed6280c4 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -31,7 +31,7 @@
if(!canconsume(M, user))
return 0
-
+
if (!is_open_container())
to_chat(user, "[src]'s lid hasn't been opened!")
return 0
@@ -47,7 +47,9 @@
return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("[user] feeds the contents of [src] to [M].", "[user] feeds the contents of [src] to [M].")
add_logs(user, M, "fed", reagentlist(src))
+
var/fraction = min(gulp_size/reagents.total_volume, 1)
+ checkLiked(fraction, M)
reagents.reaction(M, INGEST, fraction)
reagents.trans_to(M, gulp_size)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
@@ -56,7 +58,7 @@
/obj/item/weapon/reagent_containers/food/drinks/afterattack(obj/target, mob/user , proximity)
if(!proximity) return
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
-
+
if (!is_open_container())
to_chat(user, "[target]'s tab isn't open!")
return
@@ -97,10 +99,10 @@
to_chat(user, "You heat [src] with [I].")
reagents.handle_reactions()
..()
-
-
+
+
////////////////////////////////////////////////////////////////////////////////
@@ -200,19 +202,24 @@
name = "Dutch Hot Coco"
desc = "Made in Space South America."
list_reagents = list("hot_coco" = 30, "sugar" = 5)
+ foodtype = SUGAR
+
resistance_flags = FREEZE_PROOF
+
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen
name = "Cup Ramen"
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
icon_state = "ramen"
list_reagents = list("dry_ramen" = 30)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/drinks/beer
name = "Space Beer"
desc = "Beer. In space."
icon_state = "beer"
list_reagents = list("beer" = 30)
+ foodtype = GRAIN | ALCOHOL
/obj/item/weapon/reagent_containers/food/drinks/ale
name = "Magm-Ale"
@@ -220,6 +227,7 @@
icon_state = "alebottle"
item_state = "beer"
list_reagents = list("ale" = 30)
+ foodtype = GRAIN | ALCOHOL
/obj/item/weapon/reagent_containers/food/drinks/sillycup
name = "paper cup"
@@ -248,26 +256,32 @@
icon_state = "orangebox"
name = "orange juice box"
desc = "A great source of vitamins. Stay healthy!"
+ foodtype = FRUIT
if("milk")
icon_state = "milkbox"
name = "carton of milk"
desc = "An excellent source of calcium for growing space explorers."
+ foodtype = DAIRY
if("applejuice")
icon_state = "juicebox"
name = "apple juice box"
desc = "Sweet apple juice. Don't be late for school!"
+ foodtype = FRUIT
if("grapejuice")
icon_state = "grapebox"
name = "grape juice box"
desc = "Tasty grape juice in a fun little container. Non-alcoholic!"
+ foodtype = FRUIT
if("chocolate_milk")
icon_state = "chocolatebox"
name = "carton of chocolate milk"
desc = "Milk for cool kids!"
+ foodtype = SUGAR
if("eggnog")
icon_state = "nog2"
name = "carton of eggnog"
desc = "For enjoying the most wonderful time of the year."
+ foodtype = MEAT
else
icon_state = "juicebox"
name = "small carton"
@@ -334,7 +348,7 @@
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
container_type = 0
spillable = FALSE
-
+
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/attack(mob/M, mob/user)
if(M == user && !src.reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_selected == "head")
user.visible_message("[user] crushes the can of [src] on [user.p_their()] forehead!", "You crush the can of [src] on your forehead.")
@@ -343,7 +357,7 @@
crushed_can.icon_state = icon_state
qdel(src)
..()
-
+
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/attack_self(mob/user)
if(!is_open_container())
@@ -359,12 +373,14 @@
desc = "Cola. in space."
icon_state = "cola"
list_reagents = list("cola" = 30)
+ foodtype = SUGAR
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/tonic
name = "T-Borg's Tonic Water"
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
icon_state = "tonic"
list_reagents = list("tonic" = 50)
+ foodtype = ALCOHOL
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/sodawater
name = "Soda Water"
@@ -377,6 +393,7 @@
desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime"
list_reagents = list("lemon_lime" = 30)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime/New()
..()
@@ -387,30 +404,35 @@
desc = "Tastes like a hull breach in your mouth."
icon_state = "space-up"
list_reagents = list("space_up" = 30)
+ foodtype = SUGAR | JUNKFOOD
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist
name = "Star-kist"
desc = "The taste of a star in liquid form. And, a bit of tuna...?"
icon_state = "starkist"
list_reagents = list("cola" = 15, "orangejuice" = 15)
+ foodtype = SUGAR | FRUIT | JUNKFOOD
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind
name = "Space Mountain Wind"
desc = "Blows right through you like a space wind."
icon_state = "space_mountain_wind"
list_reagents = list("spacemountainwind" = 30)
+ foodtype = SUGAR | JUNKFOOD
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko
name = "Thirteen Loko"
desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly."
icon_state = "thirteen_loko"
list_reagents = list("thirteenloko" = 30)
+ foodtype = SUGAR | JUNKFOOD
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb
name = "Dr. Gibb"
desc = "A delicious mixture of 42 different flavors."
icon_state = "dr_gibb"
list_reagents = list("dr_gibb" = 30)
+ foodtype = SUGAR | JUNKFOOD
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game
name = "Pwr Game"
@@ -423,6 +445,7 @@
desc = "~Shake me up some of that Shambler's Juice!~"
icon_state = "shamblers"
list_reagents = list("shamblers" = 30)
+ foodtype = SUGAR | JUNKFOOD
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/air
name = "Canned Air"
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index dd9d914f18..73e20811e7 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -13,6 +13,7 @@
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
var/const/duration = 13 //Directly relates to the 'knockdown' duration. Lowered by armor (i.e. helmets)
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
+ foodtype = ALCOHOL
/obj/item/weapon/reagent_containers/food/drinks/bottle/throw_impact(atom/target,mob/thrower)
..()
@@ -174,6 +175,7 @@
desc = "A bottle filled with nothing."
icon_state = "bottleofnothing"
list_reagents = list("nothing" = 100)
+ foodtype = NONE
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron
name = "Wrapp Artiste Patron"
@@ -192,6 +194,7 @@
desc = "A flask of the chaplain's holy water."
icon_state = "holyflask"
list_reagents = list("holywater" = 100)
+ foodtype = NONE
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell
desc = "A flask of holy water...it's been sitting in the Necropolis a while though."
@@ -208,6 +211,7 @@
desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
icon_state = "kahluabottle"
list_reagents = list("kahlua" = 100)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager
name = "College Girl Goldschlager"
@@ -226,6 +230,7 @@
desc = "A faint aura of unease and asspainery surrounds the bottle."
icon_state = "winebottle"
list_reagents = list("wine" = 100)
+ foodtype = FRUIT | ALCOHOL
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe
name = "Extra-Strong Absinthe"
@@ -285,6 +290,7 @@
desc = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol. Inexplicably popular among command staff."
icon_state = "lizardwine"
list_reagents = list("lizardwine" = 100)
+ foodtype = FRUIT | ALCOHOL
/obj/item/weapon/reagent_containers/food/drinks/bottle/hcider
name = "Jian Hard Cider"
@@ -310,6 +316,7 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("orangejuice" = 100)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream
name = "Milk Cream"
@@ -320,6 +327,7 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("cream" = 100)
+ foodtype = DAIRY
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice
name = "Tomato Juice"
@@ -330,6 +338,7 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("tomatojuice" = 100)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice
name = "Lime Juice"
@@ -340,6 +349,7 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
isGlass = 0
list_reagents = list("limejuice" = 100)
+ foodtype = FRUIT
////////////////////////// MOLOTOV ///////////////////////
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 9d39e51e63..2a7ce2e8ec 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -6,8 +6,26 @@
volume = 50 //Sets the default container amount for all food items.
container_type = INJECTABLE
resistance_flags = FLAMMABLE
+ var/foodtype = NONE
+ var/last_check_time
/obj/item/weapon/reagent_containers/food/New()
..()
pixel_x = rand(-5, 5) //Randomizes postion slightly.
- pixel_y = rand(-5, 5)
\ No newline at end of file
+ pixel_y = rand(-5, 5)
+
+
+/obj/item/weapon/reagent_containers/food/proc/checkLiked(var/fraction, mob/M)
+ if(last_check_time + 50 < world.time)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(foodtype & H.dna.species.toxic_food)
+ to_chat(H,"What the hell was that thing?!")
+ H.adjust_disgust(25 + 30 * fraction)
+ else if(foodtype & H.dna.species.disliked_food)
+ to_chat(H,"That didn't taste very good...")
+ H.adjust_disgust(11 + 15 * fraction)
+ else if(foodtype & H.dna.species.liked_food)
+ to_chat(H,"I love this taste!")
+ H.adjust_disgust(-5 + -2.5 * fraction)
+ last_check_time = world.time
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 31baa1bd90..03de5129f6 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -53,6 +53,7 @@
ingredients += S
mix_filling_color(S)
S.reagents.trans_to(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
+ foodtype |= S.foodtype
update_overlays(S)
to_chat(user, "You add the [I.name] to the [name].")
update_name(S)
@@ -158,6 +159,7 @@
ingredients_placement = INGREDIENTS_STACKPLUSTOP
icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "bun"
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/customizable/bread
@@ -167,6 +169,7 @@
slices_num = 5
icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "tofubread"
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/customizable/cake
@@ -176,6 +179,7 @@
slices_num = 5
icon = 'icons/obj/food/piecake.dmi'
icon_state = "plaincake"
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/customizable/kebab
@@ -187,7 +191,6 @@
ingMax = 6
icon_state = "rod"
-
/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta
name = "spaghetti"
desc = "Noodles. With stuff. Delicious."
@@ -195,6 +198,7 @@
ingMax = 6
icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "spaghettiboiled"
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/customizable/pie
@@ -202,6 +206,7 @@
ingMax = 6
icon = 'icons/obj/food/piecake.dmi'
icon_state = "pie"
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/customizable/pizza
@@ -213,6 +218,7 @@
slices_num = 6
icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "pizzamargherita"
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/customizable/salad
@@ -231,6 +237,7 @@
icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "breadslice"
var/finished = 0
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/initialize_custom_food(obj/item/weapon/reagent_containers/BASE, obj/item/I, mob/user)
icon_state = BASE.icon_state
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 8964e7ebaa..c5a737232e 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -70,7 +70,6 @@
if(junkiness && M.satiety < -150 && M.nutrition > NUTRITION_LEVEL_STARVING + 50 )
to_chat(M, "You don't feel like eating any more junk food at the moment.")
return 0
-
else if(fullness <= 50)
to_chat(M, "You hungrily [eatverb] some of \the [src] and gobble it down!")
else if(fullness > 50 && fullness < 150)
@@ -107,12 +106,13 @@
M.satiety -= junkiness
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
if(reagents.total_volume)
- var/fraction = min(bitesize/reagents.total_volume, 1)
+ var/fraction = min(bitesize / reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
reagents.trans_to(M, bitesize)
bitecount++
On_Consume()
- return 1
+ checkLiked(fraction, M)
+ return 1
return 0
diff --git a/code/modules/food_and_drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm
index 73e99c9d1d..9ef2390002 100644
--- a/code/modules/food_and_drinks/food/snacks/dough.dm
+++ b/code/modules/food_and_drinks/food/snacks/dough.dm
@@ -11,6 +11,7 @@
list_reagents = list("nutriment" = 6)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("dough" = 1)
+ foodtype = GRAIN
// Dough + rolling pin = flat dough
@@ -38,6 +39,7 @@
list_reagents = list("nutriment" = 6)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("dough" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/pizzabread
name = "pizza bread"
@@ -48,6 +50,7 @@
list_reagents = list("nutriment" = 7)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("bread" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/doughslice
@@ -58,6 +61,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/bun
filling_color = "#CD853F"
tastes = list("dough" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/bun
@@ -69,6 +73,7 @@
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/burger
filling_color = "#CD853F"
tastes = list("bun" = 1) // the bun tastes of bun.
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/cakebatter
name = "cake batter"
@@ -79,6 +84,7 @@
list_reagents = list("nutriment" = 9)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("batter" = 1)
+ foodtype = GRAIN | DAIRY
// Cake batter + rolling pin = pie dough
/obj/item/weapon/reagent_containers/food/snacks/cakebatter/attackby(obj/item/I, mob/user, params)
@@ -103,6 +109,7 @@
list_reagents = list("nutriment" = 9)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("dough" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/rawpastrybase
name = "raw pastry base"
@@ -113,6 +120,7 @@
filling_color = "#CD853F"
list_reagents = list("nutriment" = 1)
tastes = list("raw pastry" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pastrybase
name = "pastry base"
@@ -122,4 +130,4 @@
list_reagents = list("nutriment" = 1)
filling_color = "#CD853F"
tastes = list("pastry" = 1)
-
+ foodtype = GRAIN | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index c1b5a55ac0..78d5ab9ac9 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -14,6 +14,7 @@
slices_num = 3
filling_color = "#FF0000"
tastes = list("meat" = 1)
+ foodtype = MEAT | RAW
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/slice, reagents_per_slice)
..()
@@ -36,6 +37,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human
tastes = list("tender meat" = 1)
+ foodtype = MEAT | RAW | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human/slice, reagents_per_slice)
..()
@@ -62,6 +64,7 @@
list_reagents = list("nutriment" = 3, "slimejelly" = 3)
filling_color = "#00FFFF"
tastes = list("slime" = 1, "jelly" = 1)
+ foodtype = MEAT | RAW | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem
icon_state = "golemmeat"
@@ -69,35 +72,41 @@
list_reagents = list("nutriment" = 3, "iron" = 3)
filling_color = "#A9A9A9"
tastes = list("rock" = 1)
+ foodtype = MEAT | RAW | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine
icon_state = "agolemmeat"
desc = "From the slime pen to the rune to the kitchen, science."
filling_color = "#66CDAA"
+ foodtype = MEAT | RAW | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard
icon_state = "lizardmeat"
desc = "Delicious dino damage"
filling_color = "#6B8E23"
tastes = list("meat" = 4, "scales" = 1)
+ foodtype = MEAT | RAW
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
icon_state = "plantmeat"
desc = "All the joys of healthy eating with all the fun of cannibalism."
filling_color = "#E9967A"
tastes = list("salad" = 1, "wood" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
icon_state = "shadowmeat"
desc = "Ow, the edge"
filling_color = "#202020"
tastes = list("darkness" = 1, "meat" = 1)
+ foodtype = MEAT | RAW
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly
icon_state = "flymeat"
desc = "Nothing says tasty like maggot filled radioactive mutant flesh."
list_reagents = list("nutriment" = 3, "uranium" = 3)
tastes = list("maggots" = 1, "the inside of a reactor" = 1)
+ foodtype = MEAT | RAW | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
name = "-bone"
@@ -106,6 +115,7 @@
filling_color = "#F0F0F0"
tastes = list("bone" = 1)
slice_path = null //can't slice a bone into cutlets
+ foodtype = GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
name = " meat (rotten)"
@@ -113,6 +123,7 @@
desc = "Halfway to becoming fertilizer for your garden."
filling_color = "#6B8E23"
tastes = list("brains" = 1, "meat" = 1)
+ foodtype = RAW | MEAT | TOXIC
@@ -122,22 +133,27 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/synthmeat
name = "synthmeat"
desc = "A synthetic slab of meat."
+ foodtype = RAW | MEAT //hurr durr chemicals we're harmed in the production of this meat thus its non-vegan.
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct
name = "meat product"
desc = "A slab of station reclaimed and chemically processed meat product."
+ foodtype = RAW | MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey
name = "monkey meat"
+ foodtype = RAW | MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
name = "corgi meat"
desc = "Tastes like... well you know..."
tastes = list("meat" = 4, "a fondness for wearing hats" = 1)
+ foodtype = RAW | MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug
name = "pug meat"
desc = "Tastes like... well you know..."
+ foodtype = RAW | MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/killertomato
name = "killer tomato meat"
@@ -148,6 +164,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/killertomato
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/killertomato
tastes = list("tomato" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear
name = "bear meat"
@@ -158,6 +175,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/bear
tastes = list("meat" = 1, "salmon" = 1)
+ foodtype = RAW | MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
@@ -170,6 +188,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/xeno
tastes = list("meat" = 1, "acid" = 1)
+ foodtype = RAW | MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/spider
name = "spider meat"
@@ -180,6 +199,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/spider
slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider
tastes = list("cobwebs" = 1)
+ foodtype = RAW | MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath
@@ -188,6 +208,7 @@
list_reagents = list("nutriment" = 3, "toxin" = 5)
icon_state = "goliathmeat"
tastes = list("meat" = 1)
+ foodtype = RAW | MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath/burn()
visible_message("[src] finishes cooking!")
@@ -202,6 +223,7 @@
icon_state = "meatwheat_clump"
bitesize = 4
tastes = list("meat" = 1, "wheat" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/meat/rawbacon
name = "raw piece of bacon"
@@ -212,6 +234,7 @@
list_reagents = list("nutriment" = 1)
filling_color = "#B22222"
tastes = list("bacon" = 1)
+ foodtype = RAW | MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/bacon
name = "piece of bacon"
@@ -221,6 +244,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#854817"
tastes = list("bacon" = 1)
+ foodtype = MEAT
////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
@@ -233,16 +257,20 @@
bonus_reagents = list("nutriment" = 2, "vitamin" = 1)
trash = /obj/item/trash/plate
filling_color = "#B22222"
+ foodtype = MEAT
tastes = list("meat" = 1)
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human
tastes = list("tender meat" = 1)
+ foodtype = MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/killertomato
name = "killer tomato steak"
tastes = list("tomato" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear
name = "bear steak"
@@ -263,6 +291,7 @@
icon_state = "goliathsteak"
trash = null
tastes = list("meat" = 1, "rock" = 1)
+ foodtype = MEAT
//////////////////////////////// MEAT CUTLETS ///////////////////////////////////////////////////////
@@ -278,6 +307,7 @@
filling_color = "#B22222"
tastes = list("meat" = 1)
var/meat_type = "meat"
+ foodtype = MEAT | RAW
/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency)
..()
@@ -285,10 +315,12 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain/human
tastes = list("tender meat" = 1)
+ foodtype = MEAT | RAW | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency)
..()
@@ -301,6 +333,7 @@
name = "raw killer tomato cutlet"
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/killertomato
tastes = list("tomato" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/bear
name = "raw bear cutlet"
@@ -328,15 +361,18 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#B22222"
tastes = list("meat" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain/human
tastes = list("tender meat" = 1)
+ foodtype = MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/killertomato
name = "killer tomato cutlet"
tastes = list("tomato" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/bear
name = "bear cutlet"
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
index b76b896803..16d11c5f29 100644
--- a/code/modules/food_and_drinks/food/snacks_bread.dm
+++ b/code/modules/food_and_drinks/food/snacks_bread.dm
@@ -4,6 +4,7 @@
volume = 80
slices_num = 5
tastes = list("bread" = 10)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/breadslice
@@ -14,6 +15,7 @@
list_reagents = list("nutriment" = 2)
slot_flags = SLOT_HEAD
customfoodfilling = 0 //to avoid infinite bread-ception
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain
name = "bread"
@@ -24,12 +26,14 @@
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/bread
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain
tastes = list("bread" = 10)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain
name = "bread slice"
desc = "A slice of home."
icon_state = "breadslice"
customfoodfilling = 1
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/store/bread/meat
name = "meatbread loaf"
@@ -39,11 +43,13 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
list_reagents = list("nutriment" = 30, "vitamin" = 5)
tastes = list("bread" = 10, "meat" = 10)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/breadslice/meat
name = "meatbread slice"
desc = "A slice of delicious meatbread."
icon_state = "meatbreadslice"
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/store/bread/xenomeat
name = "xenomeatbread loaf"
@@ -53,6 +59,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
list_reagents = list("nutriment" = 30, "vitamin" = 5)
tastes = list("bread" = 10, "acid" = 10)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/breadslice/xenomeat
name = "xenomeatbread slice"
@@ -60,6 +67,7 @@
icon_state = "xenobreadslice"
filling_color = "#32CD32"
list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat
name = "spider meat loaf"
@@ -69,6 +77,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
list_reagents = list("nutriment" = 30, "toxin" = 15, "vitamin" = 5)
tastes = list("bread" = 10, "cobwebs" = 5)
+ foodtype = GRAIN | MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/breadslice/spidermeat
name = "spider meat bread slice"
@@ -76,6 +85,7 @@
icon_state = "xenobreadslice"
filling_color = "#7CFC00"
list_reagents = list("nutriment" = 6, "toxin" = 3, "vitamin" = 1)
+ foodtype = GRAIN | MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/store/bread/banana
name = "banana-nut bread"
@@ -85,6 +95,7 @@
bonus_reagents = list("nutriment" = 5, "banana" = 20)
list_reagents = list("nutriment" = 20, "banana" = 20)
tastes = list("bread" = 10) // bananjuice will also flavour
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/breadslice/banana
@@ -93,6 +104,7 @@
icon_state = "bananabreadslice"
filling_color = "#FFD700"
list_reagents = list("nutriment" = 4, "banana" = 4)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/store/bread/tofu
name = "Tofubread"
@@ -102,6 +114,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
list_reagents = list("nutriment" = 20, "vitamin" = 5)
tastes = list("bread" = 10, "tofu" = 10)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/breadslice/tofu
name = "tofubread slice"
@@ -109,6 +122,7 @@
icon_state = "tofubreadslice"
filling_color = "#FF8C00"
list_reagents = list("nutriment" = 4, "vitamin" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese
name = "cream cheese bread"
@@ -118,6 +132,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 20, "vitamin" = 5)
tastes = list("bread" = 10, "cheese" = 10)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/breadslice/creamcheese
name = "cream cheese bread slice"
@@ -125,6 +140,7 @@
icon_state = "creamcheesebreadslice"
filling_color = "#FF8C00"
list_reagents = list("nutriment" = 4, "vitamin" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana
name = "mimana bread"
@@ -134,6 +150,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 20, "mutetoxin" = 5, "nothing" = 5, "vitamin" = 5)
tastes = list("bread" = 10, "silence" = 10)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/breadslice/mimana
name = "mimana bread slice"
@@ -141,11 +158,13 @@
icon_state = "mimanabreadslice"
filling_color = "#C0C0C0"
list_reagents = list("nutriment" = 2, "mutetoxin" = 1, "nothing" = 1, "vitamin" = 1)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/breadslice/custom
name = "bread slice"
icon_state = "tofubreadslice"
filling_color = "#FFFFFF"
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/baguette
name = "baguette"
@@ -157,6 +176,7 @@
bitesize = 3
w_class = WEIGHT_CLASS_NORMAL
tastes = list("bread" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/deepfryholder
name = "Deep Fried Foods Holder Obj"
diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm
index 16e96435d2..5c1f3b0da3 100644
--- a/code/modules/food_and_drinks/food/snacks_burgers.dm
+++ b/code/modules/food_and_drinks/food/snacks_burgers.dm
@@ -5,11 +5,13 @@
bitesize = 3
list_reagents = list("nutriment" = 6, "vitamin" = 1)
tastes = list("bun" = 4)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/plain
name = "burger"
desc = "The cornerstone of every nutritious breakfast."
bonus_reagents = list("vitamin" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/human
var/subjectname = ""
@@ -17,6 +19,7 @@
name = "human burger"
desc = "A bloody burger."
bonus_reagents = list("vitamin" = 4)
+ foodtype = MEAT | GRAIN | GROSS
/obj/item/weapon/reagent_containers/food/snacks/burger/human/CheckParts(list/parts_list)
..()
@@ -35,6 +38,7 @@
name = "corgi burger"
desc = "You monster."
bonus_reagents = list("vitamin" = 1)
+ foodtype = GRAIN | MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/burger/appendix
name = "appendix burger"
@@ -42,6 +46,7 @@
bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
icon_state = "appendixburger"
tastes = list("bun" = 4, "grass" = 2)
+ foodtype = GRAIN | MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/burger/fish
name = "fillet -o- carp sandwich"
@@ -49,6 +54,7 @@
icon_state = "fishburger"
bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
tastes = list("bun" = 4, "fish" = 4)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/tofu
name = "tofu burger"
@@ -56,6 +62,7 @@
icon_state = "tofuburger"
bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
tastes = list("bun" = 4, "tofu" = 4)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/burger/roburger
name = "roburger"
@@ -64,6 +71,7 @@
bonus_reagents = list("nutriment" = 2, "nanomachines" = 2, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "nanomachines" = 5, "vitamin" = 1)
tastes = list("bun" = 4, "lettuce" = 2, "sludge" = 1)
+ foodtype = GRAIN | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/burger/roburgerbig
name = "roburger"
@@ -73,6 +81,7 @@
bonus_reagents = list("nutriment" = 5, "nanomachines" = 70, "vitamin" = 10)
list_reagents = list("nutriment" = 6, "nanomachines" = 70, "vitamin" = 5)
tastes = list("bun" = 4, "lettuce" = 2, "sludge" = 1)
+ foodtype = GRAIN | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/burger/xeno
name = "xenoburger"
@@ -80,24 +89,28 @@
icon_state = "xburger"
bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
tastes = list("bun" = 4, "acid" = 4)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/bearger
name = "bearger"
desc = "Best served rawr."
icon_state = "bearger"
bonus_reagents = list("nutriment" = 3, "vitamin" = 6)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/clown
name = "clown burger"
desc = "This tastes funny..."
icon_state = "clownburger"
bonus_reagents = list("nutriment" = 4, "vitamin" = 6, "banana" = 6)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/burger/mime
name = "mime burger"
desc = "Its taste defies language."
icon_state = "mimeburger"
bonus_reagents = list("nutriment" = 4, "vitamin" = 6, "nothing" = 6)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/burger/brain
name = "brainburger"
@@ -106,6 +119,7 @@
bonus_reagents = list("nutriment" = 6, "mannitol" = 6, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "mannitol" = 5, "vitamin" = 1)
tastes = list("bun" = 4, "brains" = 2)
+ foodtype = GRAIN | MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/burger/ghost
name = "ghost burger"
@@ -113,6 +127,7 @@
alpha = 125
bonus_reagents = list("nutriment" = 5, "vitamin" = 12)
tastes = list("bun" = 4, "ectoplasm" = 2)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/burger/red
name = "red burger"
@@ -120,6 +135,7 @@
icon_state = "cburger"
color = "#DA0000FF"
bonus_reagents = list("redcrayonpowder" = 10, "vitamin" = 5)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/orange
name = "orange burger"
@@ -127,6 +143,7 @@
icon_state = "cburger"
color = "#FF9300FF"
bonus_reagents = list("orangecrayonpowder" = 10, "vitamin" = 5)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/yellow
name = "yellow burger"
@@ -134,6 +151,7 @@
icon_state = "cburger"
color = "#FFF200FF"
bonus_reagents = list("yellowcrayonpowder" = 10, "vitamin" = 5)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/green
name = "green burger"
@@ -141,6 +159,7 @@
icon_state = "cburger"
color = "#A8E61DFF"
bonus_reagents = list("greencrayonpowder" = 10, "vitamin" = 5)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/blue
name = "blue burger"
@@ -148,6 +167,7 @@
icon_state = "cburger"
color = "#00B7EFFF"
bonus_reagents = list("bluecrayonpowder" = 10, "vitamin" = 5)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/purple
name = "purple burger"
@@ -155,6 +175,7 @@
icon_state = "cburger"
color = "#DA00FFFF"
bonus_reagents = list("purplecrayonpowder" = 10, "vitamin" = 5)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/spell
name = "spell burger"
@@ -162,6 +183,7 @@
icon_state = "spellburger"
bonus_reagents = list("nutriment" = 6, "vitamin" = 10)
tastes = list("bun" = 4, "magic" = 2)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/bigbite
name = "big bite burger"
@@ -170,20 +192,24 @@
bonus_reagents = list("vitamin" = 6)
list_reagents = list("nutriment" = 10, "vitamin" = 2)
w_class = WEIGHT_CLASS_NORMAL
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/jelly
name = "jelly burger"
desc = "Culinary delight..?"
icon_state = "jellyburger"
tastes = list("bun" = 4, "jelly" = 2)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime
bonus_reagents = list("slimejelly" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "slimejelly" = 5, "vitamin" = 1)
+ foodtype = GRAIN | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry
bonus_reagents = list("cherryjelly" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "cherryjelly" = 5, "vitamin" = 1)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/burger/superbite
name = "super bite burger"
@@ -195,6 +221,7 @@
bitesize = 7
volume = 100
tastes = list("bun" = 4, "type two diabetes" = 10)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm
name = "five alarm burger"
@@ -202,18 +229,21 @@
icon_state = "fivealarmburger"
bonus_reagents = list("nutriment" = 2, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "capsaicin" = 5, "condensedcapsaicin" = 5, "vitamin" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/burger/rat
name = "rat burger"
desc = "Pretty much what you'd expect..."
icon_state = "ratburger"
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ foodtype = GRAIN | MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/burger/baseball
name = "home run baseball burger"
desc = "It's still warm. The steam coming off of it looks like baseball."
icon_state = "baseball"
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ foodtype = GRAIN | GROSS
/obj/item/weapon/reagent_containers/food/snacks/burger/baconburger
name = "bacon burger"
@@ -221,3 +251,4 @@
icon_state = "baconburger"
bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
tastes = list("bun" = 4, "bacon" = 2)
+ foodtype = GRAIN | MEAT
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index 2cac29be96..674c273de6 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -6,6 +6,7 @@
volume = 80
list_reagents = list("nutriment" = 20, "vitamin" = 5)
tastes = list("cake" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/cakeslice
icon = 'icons/obj/food/piecake.dmi'
@@ -13,6 +14,7 @@
list_reagents = list("nutriment" = 4, "vitamin" = 1)
customfoodfilling = 0 //to avoid infinite cake-ception
tastes = list("cake" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain
name = "vanilla cake"
@@ -21,6 +23,7 @@
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/cake
bonus_reagents = list("nutriment" = 10, "vitamin" = 2)
tastes = list("vanilla" = 1, "sweetness" = 2,"cake" = 5)
+ foodtype = GRAIN | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/plain
name = "vanilla cake slice"
@@ -29,6 +32,7 @@
filling_color = "#FFD700"
customfoodfilling = 1
tastes = list("vanilla" = 1, "sweetness" = 2,"cake" = 5)
+ foodtype = GRAIN | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/carrot
name = "carrot cake"
@@ -39,6 +43,7 @@
bonus_reagents = list("nutriment" = 3, "oculine" = 5, "vitamin" = 10)
list_reagents = list("nutriment" = 20, "oculine" = 10, "vitamin" = 5)
tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/carrot
name = "carrot cake slice"
@@ -47,6 +52,7 @@
filling_color = "#FFA500"
list_reagents = list("nutriment" = 4, "oculine" = 2, "vitamin" = 1)
tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/brain
@@ -58,6 +64,7 @@
bonus_reagents = list("nutriment" = 5, "mannitol" = 10, "vitamin" = 10)
list_reagents = list("nutriment" = 20, "mannitol" = 10, "vitamin" = 5)
tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
+ foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/brain
@@ -67,6 +74,7 @@
filling_color = "#FF69B4"
list_reagents = list("nutriment" = 4, "mannitol" = 2, "vitamin" = 1)
tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
+ foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/cheese
name = "cheese cake"
@@ -76,6 +84,7 @@
slices_num = 5
bonus_reagents = list("vitamin" = 10)
tastes = list("cake" = 4, "cream cheese" = 3)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/cheese
@@ -84,6 +93,7 @@
icon_state = "cheesecake_slice"
filling_color = "#FFFACD"
tastes = list("cake" = 4, "cream cheese" = 3)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/store/cake/orange
@@ -94,6 +104,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/orange
name = "orange cake slice"
@@ -101,6 +112,7 @@
icon_state = "orangecake_slice"
filling_color = "#FFA500"
tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/lime
name = "lime cake"
@@ -110,6 +122,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/lime
name = "lime cake slice"
@@ -117,6 +130,7 @@
icon_state = "limecake_slice"
filling_color = "#00FF00"
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/lemon
@@ -127,6 +141,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/lemon
@@ -135,6 +150,7 @@
icon_state = "lemoncake_slice"
filling_color = "#FFEE00"
tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/chocolate
@@ -145,6 +161,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/chocolate
@@ -153,6 +170,7 @@
icon_state = "chocolatecake_slice"
filling_color = "#A0522D"
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday
@@ -164,6 +182,7 @@
bonus_reagents = list("nutriment" = 7, "sprinkles" = 10, "vitamin" = 5)
list_reagents = list("nutriment" = 20, "sprinkles" = 10, "vitamin" = 5)
tastes = list("cake" = 5, "sweetness" = 1)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday
name = "birthday cake slice"
@@ -172,6 +191,7 @@
filling_color = "#DC143C"
list_reagents = list("nutriment" = 4, "sprinkles" = 2, "vitamin" = 1)
tastes = list("cake" = 5, "sweetness" = 1)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/apple
@@ -182,6 +202,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/apple
name = "apple cake slice"
@@ -189,11 +210,13 @@
icon_state = "applecakeslice"
filling_color = "#FF4500"
tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/custom
name = "cake slice"
icon_state = "plaincake_slice"
filling_color = "#FFFFFF"
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake
name = "Slime cake"
@@ -202,6 +225,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/slimecake
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/slimecake
name = "slime cake slice"
@@ -209,6 +233,7 @@
icon_state = "slimecake_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice
name = "pumpkin spice cake"
@@ -217,6 +242,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/pumpkinspice
bonus_reagents = list("nutriment" = 3, "vitamin" = 5)
tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/pumpkinspice
name = "pumpkin spice cake slice"
@@ -224,3 +250,5 @@
icon_state = "pumpkinspicecakeslice"
filling_color = "#FFD700"
tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
+
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index a0b2b34740..68cdcb7b7e 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -9,6 +9,7 @@
list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
filling_color = "#A0522D"
tastes = list("chocolate" = 4, "sweetness" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/egg
name = "egg"
@@ -18,6 +19,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledegg
filling_color = "#F0E68C"
tastes = list("egg" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom)
if(!..()) //was it caught by a mob?
@@ -90,6 +92,7 @@
filling_color = "#FFFFF0"
list_reagents = list("nutriment" = 3)
tastes = list("egg" = 4, "salt" = 1, "pepper" = 1)
+ foodtype = MEAT | FRIED
/obj/item/weapon/reagent_containers/food/snacks/boiledegg
name = "boiled egg"
@@ -99,6 +102,7 @@
filling_color = "#FFFFF0"
list_reagents = list("nutriment" = 2, "vitamin" = 1)
tastes = list("egg" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/omelette //FUCK THIS
name = "omelette du fromage"
@@ -110,6 +114,7 @@
bitesize = 1
w_class = WEIGHT_CLASS_NORMAL
tastes = list("egg" = 1, "cheese" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/kitchen/fork))
@@ -138,3 +143,5 @@
w_class = WEIGHT_CLASS_NORMAL
list_reagents = list("nutriment" = 6, "vitamin" = 4)
tastes = list("egg" = 1, "bacon" = 1, "bun" = 1)
+
+ foodtype = MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index e050ecd72b..4c9e69ed45 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -13,6 +13,7 @@
filling_color = "#CD853F"
list_reagents = list("nutriment" = 6, "capsaicin" = 1)
tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/carpmeat
name = "carp fillet"
@@ -22,6 +23,7 @@
bitesize = 6
filling_color = "#FA8072"
tastes = list("fish" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/carpmeat/New()
..()
@@ -40,6 +42,7 @@
bitesize = 1
filling_color = "#CD853F"
tastes = list("fish" = 1, "breadcrumbs" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/fishandchips
name = "fish and chips"
@@ -49,6 +52,7 @@
list_reagents = list("nutriment" = 6)
filling_color = "#FA8072"
tastes = list("fish" = 1, "chips" = 1)
+ foodtype = MEAT | VEGETABLES | FRIED
////////////////////////////////////////////MEATS AND ALIKE////////////////////////////////////////////
@@ -59,6 +63,7 @@
list_reagents = list("nutriment" = 2)
filling_color = "#F0E68C"
tastes = list("tofu" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/spiderleg
name = "spider leg"
@@ -68,6 +73,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledspiderleg
filling_color = "#000000"
tastes = list("cobwebs" = 1)
+ foodtype = MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/cornedbeef
name = "corned beef and cabbage"
@@ -77,6 +83,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
list_reagents = list("nutriment" = 5)
tastes = list("meat" = 1, "cabbage" = 1)
+ foodtype = MEAT | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/bearsteak
name = "Filet migrawr"
@@ -86,6 +93,7 @@
bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
list_reagents = list("nutriment" = 2, "vitamin" = 5, "manlydorf" = 5)
tastes = list("meat" = 1, "salmon" = 1)
+ foodtype = MEAT | ALCOHOL
/obj/item/weapon/reagent_containers/food/snacks/faggot
name = "faggot"
@@ -94,6 +102,7 @@
list_reagents = list("nutriment" = 4, "vitamin" = 1)
filling_color = "#800000"
tastes = list("meat" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/sausage
name = "sausage"
@@ -103,6 +112,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
list_reagents = list("nutriment" = 6, "vitamin" = 1)
tastes = list("meat" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/sausage/New()
..()
@@ -114,30 +124,35 @@
w_class = WEIGHT_CLASS_NORMAL
list_reagents = list("nutriment" = 8)
tastes = list("meat" = 3, "metal" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/kebab/human
name = "human-kebab"
desc = "A human meat, on a stick."
bonus_reagents = list("nutriment" = 1, "vitamin" = 6)
tastes = list("tender meat" = 3, "metal" = 1)
+ foodtype = MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/kebab/monkey
name = "meat-kebab"
desc = "Delicious meat, on a stick."
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
tastes = list("meat" = 3, "metal" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/kebab/tofu
name = "tofu-kebab"
desc = "Vegan meat, on a stick."
bonus_reagents = list("nutriment" = 1)
tastes = list("tofu" = 3, "metal" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/kebab/tail
name = "lizard-tail kebab"
desc = "Severed lizard tail on a stick."
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
tastes = list("meat" = 8, "metal" = 4, "scales" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/rawkhinkali
name = "raw khinkali"
@@ -146,6 +161,7 @@
list_reagents = list("nutriment" = 1, "vitamin" = 1)
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/khinkali
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/khinkali
name = "khinkali"
@@ -155,6 +171,7 @@
bitesize = 3
filling_color = "#F0F0F0"
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
name = "monkey cube"
@@ -164,6 +181,7 @@
list_reagents = list("nutriment" = 2)
filling_color = "#CD853F"
tastes = list("the jungle" = 1, "bananas" = 1)
+ foodtype = MEAT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
visible_message("[src] expands!")
@@ -179,6 +197,7 @@
filling_color = "#FFA07A"
list_reagents = list("nutriment" = 8, "capsaicin" = 6)
tastes = list("hot peppers" = 1, "meat" = 3, "cheese" = 1, "sour cream" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
name = "stewed soy meat"
@@ -189,6 +208,7 @@
list_reagents = list("nutriment" = 8)
filling_color = "#D2691E"
tastes = list("soy" = 1, "vegetables" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New()
..()
@@ -203,6 +223,7 @@
list_reagents = list("nutriment" = 3, "capsaicin" = 2)
filling_color = "#000000"
tastes = list("hot peppers" = 1, "cobwebs" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/spidereggsham
name = "green eggs and ham"
@@ -214,6 +235,7 @@
bitesize = 4
filling_color = "#7FFF00"
tastes = list("meat" = 1, "the colour green" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/sashimi
name = "carp sashimi"
@@ -223,6 +245,7 @@
list_reagents = list("nutriment" = 6, "capsaicin" = 5)
filling_color = "#FA8072"
tastes = list("fish" = 1, "hot peppers" = 1)
+ foodtype = MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/nugget
name = "chicken nugget"
@@ -230,6 +253,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
list_reagents = list("nutriment" = 2)
tastes = list("\"chicken\"" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/nugget/New()
..()
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 3cce0f46c9..8ebdbe00a0 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -10,6 +10,7 @@
list_reagents = list("nutriment" = 15, "vitamin" = 5)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("cheese" = 1)
+ foodtype = DAIRY
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge
name = "cheese wedge"
@@ -18,6 +19,7 @@
filling_color = "#FFD700"
list_reagents = list("nutriment" = 3, "vitamin" = 1)
tastes = list("cheese" = 1)
+ foodtype = DAIRY
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice
name = "watermelon slice"
@@ -25,6 +27,7 @@
icon_state = "watermelonslice"
filling_color = "#FF1493"
tastes = list("watermelon" = 1)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/candy_corn
name = "candy corn"
@@ -33,6 +36,7 @@
list_reagents = list("nutriment" = 4, "sugar" = 2)
filling_color = "#FF8C00"
tastes = list("candy corn" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
name = "chocolate bar"
@@ -41,6 +45,7 @@
list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2)
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
name = "huge mushroom slice"
@@ -48,6 +53,7 @@
icon_state = "hugemushroomslice"
list_reagents = list("nutriment" = 3, "vitamin" = 1)
tastes = list("mushroom" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/popcorn
name = "popcorn"
@@ -58,6 +64,7 @@
bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0
filling_color = "#FFEFD5"
tastes = list("popcorn" = 3, "butter" = 1)
+ foodtype = JUNKFOOD
/obj/item/weapon/reagent_containers/food/snacks/popcorn/New()
..()
@@ -71,6 +78,7 @@
list_reagents = list("nutriment" = 6)
filling_color = "#D2B48C"
tastes = list("potato" = 1)
+ foodtype = VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/fries
name = "space fries"
@@ -80,6 +88,7 @@
list_reagents = list("nutriment" = 4)
filling_color = "#FFD700"
tastes = list("fries" = 3, "salt" = 1)
+ foodtype = VEGETABLES | GRAIN | FRIED
/obj/item/weapon/reagent_containers/food/snacks/tatortot
name = "tator tot"
@@ -88,6 +97,7 @@
list_reagents = list("nutriment" = 4)
filling_color = "FFD700"
tastes = list("potato" = 3, "valids" = 1)
+ foodtype = FRIED | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soydope
name = "soy dope"
@@ -97,6 +107,7 @@
list_reagents = list("nutriment" = 2)
filling_color = "#DEB887"
tastes = list("soy" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/cheesyfries
name = "cheesy fries"
@@ -107,6 +118,7 @@
list_reagents = list("nutriment" = 6)
filling_color = "#FFD700"
tastes = list("fries" = 3, "cheese" = 1)
+ foodtype = VEGETABLES | GRAIN
/obj/item/weapon/reagent_containers/food/snacks/badrecipe
name = "burned mess"
@@ -114,6 +126,7 @@
icon_state = "badrecipe"
list_reagents = list("bad_food" = 30)
filling_color = "#8B4513"
+ foodtype = GROSS
/obj/item/weapon/reagent_containers/food/snacks/carrotfries
name = "carrot fries"
@@ -123,6 +136,7 @@
list_reagents = list("nutriment" = 3, "oculine" = 3, "vitamin" = 2)
filling_color = "#FFA500"
tastes = list("carrots" = 3, "salt" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/candiedapple
name = "candied apple"
@@ -133,6 +147,7 @@
list_reagents = list("nutriment" = 3, "sugar" = 2)
filling_color = "#FF4500"
tastes = list("apple" = 2, "sweetness" = 2)
+ foodtype = JUNKFOOD | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/mint
name = "mint"
@@ -142,6 +157,7 @@
trash = /obj/item/trash/plate
list_reagents = list("minttoxin" = 1)
filling_color = "#800000"
+ foodtype = TOXIC | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/eggwrap
name = "egg wrap"
@@ -151,6 +167,7 @@
list_reagents = list("nutriment" = 5)
filling_color = "#F0E68C"
tastes = list("egg" = 1)
+ foodtype = MEAT | GRAIN
/obj/item/weapon/reagent_containers/food/snacks/beans
name = "tin of beans"
@@ -160,6 +177,7 @@
list_reagents = list("nutriment" = 10)
filling_color = "#B22222"
tastes = list("beans" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/spidereggs
name = "spider eggs"
@@ -168,6 +186,7 @@
list_reagents = list("nutriment" = 2, "toxin" = 2)
filling_color = "#008000"
tastes = list("cobwebs" = 1)
+ foodtype = MEAT | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/chococoin
name = "chocolate coin"
@@ -177,6 +196,7 @@
list_reagents = list("nutriment" = 3, "cocoa" = 1)
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/fudgedice
name = "fudge dice"
@@ -187,6 +207,7 @@
filling_color = "#A0522D"
trash = /obj/item/weapon/dice/fudge
tastes = list("fudge" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/chocoorange
name = "chocolate orange"
@@ -196,6 +217,7 @@
list_reagents = list("nutriment" = 3, "sugar" = 1)
filling_color = "#A0522D"
tastes = list("chocolate" = 3, "oranges" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/eggplantparm
name = "eggplant parmigiana"
@@ -206,6 +228,7 @@
list_reagents = list("nutriment" = 6, "vitamin" = 2)
filling_color = "#BA55D3"
tastes = list("eggplant" = 3, "cheese" = 1)
+ foodtype = VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/tortilla
name = "tortilla"
@@ -215,6 +238,7 @@
list_reagents = list("nutriment" = 3, "vitamin" = 1)
filling_color = "#FFEFD5"
tastes = list("tortilla" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/burrito
name = "burrito"
@@ -224,6 +248,7 @@
list_reagents = list("nutriment" = 4, "vitamin" = 1)
filling_color = "#FFEFD5"
tastes = list("torilla" = 2, "meat" = 3)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/cheesyburrito
name = "cheesy burrito"
@@ -233,6 +258,7 @@
list_reagents = list("nutriment" = 4, "vitamin" = 2)
filling_color = "#FFD800"
tastes = list("torilla" = 2, "meat" = 3, "cheese" = 1)
+ foodtype = GRAIN | MEAT | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/carneburrito
name = "carne asada burrito"
@@ -242,6 +268,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 1)
filling_color = "#A0522D"
tastes = list("torilla" = 2, "meat" = 4)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito
name = "fuego plasma burrito"
@@ -251,6 +278,7 @@
list_reagents = list("nutriment" = 4, "capsaicin" = 5, "vitamin" = 3)
filling_color = "#FF2000"
tastes = list("torilla" = 2, "meat" = 3, "hot peppers" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/yakiimo
name = "yaki imo"
@@ -260,6 +288,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 4)
filling_color = "#8B1105"
tastes = list("sweet potato" = 1)
+ foodtype = GRAIN | VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/roastparsnip
name = "roast parsnip"
@@ -269,6 +298,7 @@
list_reagents = list("nutriment" = 3, "vitamin" = 4)
filling_color = "#FF5500"
tastes = list("parsnip" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl
name = "melon fruit bowl"
@@ -279,6 +309,7 @@
filling_color = "#FF5500"
w_class = WEIGHT_CLASS_NORMAL
tastes = list("melon" = 1)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/spacefreezy
name = "space freezy"
@@ -288,6 +319,7 @@
list_reagents = list("nutriment" = 6, "bluecherryjelly" = 5, "vitamin" = 4)
filling_color = "#87CEFA"
tastes = list("blue cherries" = 2, "ice cream" = 2)
+ foodtype = FRUIT | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/sundae
name = "sundae"
@@ -297,6 +329,7 @@
list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "banana" = 1)
+ foodtype = FRUIT | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/honkdae
name = "honkdae"
@@ -306,6 +339,7 @@
list_reagents = list("nutriment" = 6, "banana" = 10, "vitamin" = 4)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1)
+ foodtype = FRUIT | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/nachos
name = "nachos"
@@ -315,6 +349,7 @@
list_reagents = list("nutriment" = 6, "vitamin" = 2)
filling_color = "#F4A460"
tastes = list("nachos" = 1)
+ foodtype = VEGETABLES | FRIED
/obj/item/weapon/reagent_containers/food/snacks/cheesynachos
name = "cheesy nachos"
@@ -324,6 +359,7 @@
list_reagents = list("nutriment" = 6, "vitamin" = 3)
filling_color = "#FFD700"
tastes = list("nachos" = 2, "cheese" = 1)
+ foodtype = VEGETABLES | FRIED | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/cubannachos
name = "cuban nachos"
@@ -333,6 +369,7 @@
list_reagents = list("nutriment" = 7, "capsaicin" = 8, "vitamin" = 4)
filling_color = "#DC143C"
tastes = list("nachos" = 2, "hot pepper" = 1)
+ foodtype = VEGETABLES | FRIED | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/melonkeg
name = "melon keg"
@@ -344,6 +381,7 @@
volume = 80
bitesize = 5
tastes = list("grain alcohol" = 1, "fruit" = 1)
+ foodtype = FRUIT | ALCOHOL
/obj/item/weapon/reagent_containers/food/snacks/honeybar
name = "honey nut bar"
@@ -353,6 +391,7 @@
list_reagents = list("nutriment" = 5, "honey" = 5)
filling_color = "#F2CE91"
tastes = list("oats" = 3, "nuts" = 2, "honey" = 1)
+ foodtype = FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/stuffedlegion
name = "stuffed legion"
@@ -361,6 +400,7 @@
bonus_reagents = list("vitamin" = 3, "capsaicin" = 1, "tricordrazine" = 5)
list_reagents = list("nutriment" = 5, "vitamin" = 5, "capsaicin" = 2, "tricordrazine" = 10)
tastes = list("death" = 2, "rock" = 1, "meat" = 1, "hot peppers" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/powercrepe
@@ -376,6 +416,7 @@
attack_verb = list("slapped", "slathered")
w_class = WEIGHT_CLASS_BULKY
tastes = list("cherry" = 1, "crepe" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/lollipop
name = "lollipop"
@@ -386,6 +427,7 @@
var/mutable_appearance/head
var/headcolor = rgb(0, 0, 0)
tastes = list("candy" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/lollipop/New()
..()
@@ -425,6 +467,7 @@
icon_state = "gumball"
list_reagents = list("sugar" = 5, "bicaridine" = 2, "kelotane" = 2) //Kek
tastes = list("candy")
+ foodtype = JUNKFOOD
/obj/item/weapon/reagent_containers/food/snacks/gumball/New()
..()
@@ -453,6 +496,7 @@
list_reagents = list("nutriment" = 4, "vitamin" = 2)
filling_color = "F0D830"
tastes = list("taco" = 4, "meat" = 2, "cheese" = 2, "lettuce" = 1)
+ foodtype = MEAT | DAIRY | GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/taco/plain
desc = "A traditional taco with meat and cheese, minus the rabbit food."
@@ -460,6 +504,7 @@
bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
list_reagents = list("nutriment" = 3, "vitamin" = 1)
tastes = list("taco" = 4, "meat" = 2, "cheese" = 2)
+ foodtype = MEAT | DAIRY | GRAIN
/obj/item/weapon/reagent_containers/food/snacks/branrequests
name = "Bran Requests Cereal"
@@ -468,6 +513,7 @@
list_reagents = list("nutriment" = 3, "vitamin" = 2, "sodiumchloride" = 5)
bonus_reagents = list("sodiumchloride" = 10)
tastes = list("bran" = 4, "raisins" = 3, "salt" = 1)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/butter
name = "stick of butter"
@@ -476,6 +522,7 @@
list_reagents = list("nutriment" = 5)
filling_color = "#FFD700"
tastes = list("butter" = 1)
+ foodtype = DAIRY
/obj/item/weapon/reagent_containers/food/snacks/onionrings
name = "onion rings"
@@ -484,4 +531,5 @@
list_reagents = list("nutriment" = 3)
filling_color = "#C0C9A0"
gender = PLURAL
- tastes = list("batter" = 3, "onion" = 1)
\ No newline at end of file
+ tastes = list("batter" = 3, "onion" = 1)
+ foodtype = VEGETABLES
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 6081838669..8f52a5b40d 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -12,6 +12,7 @@
var/extra_reagent = null
filling_color = "#D2691E"
tastes = list("donut" = 1)
+ foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/donut/Initialize()
. = ..()
@@ -47,6 +48,7 @@
bonus_reagents = list("sugar" = 1, "vitamin" = 1)
extra_reagent = "berryjuice"
tastes = list("jelly" = 1, "donut" = 3)
+ foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/Initialize()
. = ..()
@@ -64,12 +66,14 @@
desc = "You jelly?"
icon_state = "jdonut1"
extra_reagent = "slimejelly"
+ foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/cherryjelly
name = "jelly donut"
desc = "You jelly?"
icon_state = "jdonut1"
extra_reagent = "cherryjelly"
+ foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT
////////////////////////////////////////////MUFFINS////////////////////////////////////////////
@@ -81,12 +85,14 @@
list_reagents = list("nutriment" = 6)
filling_color = "#F4A460"
tastes = list("muffin" = 1)
+ foodtype = GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/muffin/berry
name = "berry muffin"
icon_state = "berrymuffin"
desc = "A delicious and spongy little cake, with berries."
tastes = list("muffin" = 3, "berry" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/muffin/booberry
name = "booberry muffin"
@@ -94,6 +100,7 @@
alpha = 125
desc = "My stomach is a graveyard! No living being can quench my bloodthirst!"
tastes = list("muffin" = 3, "spookiness" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/chawanmushi
name = "chawanmushi"
@@ -103,6 +110,7 @@
list_reagents = list("nutriment" = 5)
filling_color = "#FFE4E1"
tastes = list("custard" = 1)
+ foodtype = GRAIN | MEAT | VEGETABLES
////////////////////////////////////////////WAFFLES////////////////////////////////////////////
@@ -115,6 +123,7 @@
list_reagents = list("nutriment" = 8, "vitamin" = 1)
filling_color = "#D2691E"
tastes = list("waffles" = 1)
+ foodtype = GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen
name = "\improper Soylent Green"
@@ -125,6 +134,7 @@
list_reagents = list("nutriment" = 10, "vitamin" = 1)
filling_color = "#9ACD32"
tastes = list("waffles" = 7, "people" = 1)
+ foodtype = GRAIN | GROSS | MEAT
/obj/item/weapon/reagent_containers/food/snacks/soylenviridians
name = "\improper Soylent Virdians"
@@ -135,6 +145,7 @@
list_reagents = list("nutriment" = 10, "vitamin" = 1)
filling_color = "#9ACD32"
tastes = list("waffles" = 7, "the colour green" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
name = "roffle waffles"
@@ -146,6 +157,7 @@
list_reagents = list("nutriment" = 8, "mushroomhallucinogen" = 2, "vitamin" = 2)
filling_color = "#00BFFF"
tastes = list("waffle" = 1, "mushrooms" = 1)
+ foodtype = GRAIN | VEGETABLES | TOXIC | SUGAR
////////////////////////////////////////////OTHER////////////////////////////////////////////
@@ -158,6 +170,7 @@
list_reagents = list("nutriment" = 1)
filling_color = "#F0E68C"
tastes = list("cookie" = 1)
+ foodtype = GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/donkpocket
name = "\improper Donk-pocket"
@@ -167,6 +180,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm
name = "warm Donk-pocket"
@@ -174,6 +188,7 @@
bonus_reagents = list("omnizine" = 3)
list_reagents = list("nutriment" = 4, "omnizine" = 3)
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/dankpocket
name = "\improper Dank-pocket"
@@ -182,6 +197,7 @@
list_reagents = list("lipolicide" = 3, "space_drugs" = 3, "nutriment" = 4)
filling_color = "#00FF00"
tastes = list("meat" = 2, "dough" = 2)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
name = "fortune cookie"
@@ -191,6 +207,7 @@
list_reagents = list("nutriment" = 3)
filling_color = "#F4A460"
tastes = list("cookie" = 1)
+ foodtype = GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel
name = "poppy pretzel"
@@ -200,6 +217,7 @@
list_reagents = list("nutriment" = 5)
filling_color = "#F0E68C"
tastes = list("pretzel" = 1)
+ foodtype = GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
name = "plump helmet biscuit"
@@ -209,6 +227,7 @@
list_reagents = list("nutriment" = 5)
filling_color = "#F0E68C"
tastes = list("mushroom" = 1, "biscuit" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize()
var/fey = prob(10)
@@ -229,6 +248,7 @@
list_reagents = list("nutriment" = 1)
filling_color = "#F0E68C"
tastes = list("cracker" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/hotdog
name = "hotdog"
@@ -239,6 +259,7 @@
list_reagents = list("nutriment" = 6, "ketchup" = 3, "vitamin" = 3)
filling_color = "#8B0000"
tastes = list("bun" = 3, "meat" = 2)
+ foodtype = GRAIN | MEAT | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meatbun
name = "meat bun"
@@ -248,6 +269,7 @@
list_reagents = list("nutriment" = 6, "vitamin" = 2)
filling_color = "#8B0000"
tastes = list("bun" = 3, "meat" = 2)
+ foodtype = GRAIN | MEAT | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/khachapuri
name = "khachapuri"
@@ -256,6 +278,7 @@
list_reagents = list("nutriment" = 12, "vitamin" = 2)
filling_color = "#FFFF4D"
tastes = list("bread" = 1, "egg" = 1, "cheese" = 1)
+ foodtype = GRAIN | MEAT | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie
@@ -266,6 +289,7 @@
list_reagents = list("nutriment" = 3, "sugar" = 3)
filling_color = "#CD853F"
tastes = list("sweetness" = 1)
+ foodtype = GRAIN | JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/chococornet
name = "chocolate cornet"
@@ -275,6 +299,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 1)
filling_color = "#FFE4C4"
tastes = list("biscuit" = 3, "chocolate" = 1)
+ foodtype = GRAIN | JUNKFOOD
/obj/item/weapon/reagent_containers/food/snacks/oatmealcookie
name = "oatmeal cookie"
@@ -284,6 +309,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 1)
filling_color = "#D2691E"
tastes = list("cookie" = 2, "oat" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/raisincookie
name = "raisin cookie"
@@ -293,6 +319,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 1)
filling_color = "#F0E68C"
tastes = list("cookie" = 1, "raisins" = 1)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/cherrycupcake
name = "cherry cupcake"
@@ -302,6 +329,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 1)
filling_color = "#F0E68C"
tastes = list("cake" = 3, "cherry" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake
name = "blue cherry cupcake"
@@ -311,6 +339,7 @@
list_reagents = list("nutriment" = 5, "vitamin" = 1)
filling_color = "#F0E68C"
tastes = list("cake" = 3, "blue cherry" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/honeybun
name = "honey bun"
@@ -320,3 +349,4 @@
list_reagents = list("nutriment" = 5, "honey" = 5)
filling_color = "#F2CE91"
tastes = list("pastry" = 1, "sweetness" = 1)
+ foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 13f22851b1..46106ee715 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -7,6 +7,7 @@
volume = 80
list_reagents = list("nutriment" = 10, "vitamin" = 2)
tastes = list("pie" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/pie/plain
name = "plain pie"
@@ -15,6 +16,7 @@
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/pie
bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
tastes = list("pie" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/pie/cream
name = "banana cream pie"
@@ -24,6 +26,7 @@
bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
tastes = list("pie" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom)
. = ..()
@@ -58,6 +61,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
list_reagents = list("nutriment" = 10, "berryjuice" = 5, "vitamin" = 2)
tastes = list("pie" = 1, "blackberries" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/bearypie
name = "beary pie"
@@ -66,6 +70,7 @@
bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
list_reagents = list("nutriment" = 2, "vitamin" = 3)
tastes = list("pie" = 1, "meat" = 1, "salmon" = 1)
+ foodtype = GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/meatpie
name = "meat-pie"
@@ -73,6 +78,7 @@
desc = "An old barber recipe, very delicious!"
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
tastes = list("pie" = 1, "meat" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/pie/tofupie
@@ -81,6 +87,7 @@
desc = "A delicious tofu pie."
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
tastes = list("pie" = 1, "tofu" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/pie/amanita_pie
@@ -91,6 +98,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
list_reagents = list("nutriment" = 6, "amatoxin" = 3, "mushroomhallucinogen" = 1, "vitamin" = 4)
tastes = list("pie" = 1, "mushroom" = 1)
+ foodtype = GRAIN | VEGETABLES | TOXIC | GROSS
/obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie
@@ -99,6 +107,7 @@
icon_state = "plump_pie"
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
tastes = list("pie" = 1, "mushroom" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie/New()
@@ -119,6 +128,7 @@
trash = /obj/item/trash/plate
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
tastes = list("pie" = 1, "meat" = 1, "acid" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/pie/applepie
@@ -127,6 +137,7 @@
icon_state = "applepie"
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
tastes = list("pie" = 1, "apple" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
@@ -136,6 +147,7 @@
icon_state = "cherrypie"
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
tastes = list("pie" = 7, "Nicole Paige Brooks" = 2)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie
@@ -146,6 +158,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
tastes = list("pie" = 1, "pumpkin" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
name = "pumpkin pie slice"
@@ -156,6 +169,7 @@
filling_color = "#FFA500"
list_reagents = list("nutriment" = 2)
tastes = list("pie" = 1, "pumpkin" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pie/appletart
name = "golden apple streusel tart"
@@ -164,6 +178,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4)
tastes = list("pie" = 1, "apple" = 1, "expensive metal" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/grapetart
name = "grape tart"
@@ -172,6 +187,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
list_reagents = list("nutriment" = 4, "vitamin" = 4)
tastes = list("pie" = 1, "grape" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie
name = "blumpkin pie"
@@ -181,6 +197,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 3, "vitamin" = 6)
tastes = list("pie" = 1, "a mouthful of pool water" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/blumpkinpieslice
name = "blumpkin pie slice"
@@ -191,6 +208,7 @@
filling_color = "#1E90FF"
list_reagents = list("nutriment" = 2)
tastes = list("pie" = 1, "a mouthful of pool water" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata
name = "dulce de batata"
@@ -200,6 +218,7 @@
slices_num = 5
bonus_reagents = list("nutriment" = 4, "vitamin" = 8)
tastes = list("jelly" = 1, "sweet potato" = 1)
+ foodtype = GRAIN | VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/dulcedebatataslice
name = "dulce de batata slice"
@@ -210,6 +229,7 @@
filling_color = "#8B4513"
list_reagents = list("nutriment" = 2)
tastes = list("jelly" = 1, "sweet potato" = 1)
+ foodtype = GRAIN | VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/pie/frostypie
name = "frosty pie"
@@ -217,3 +237,4 @@
icon_state = "frostypie"
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
tastes = list("mint" = 1, "pie" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
index ab476c1044..f171f15381 100644
--- a/code/modules/food_and_drinks/food/snacks_pizza.dm
+++ b/code/modules/food_and_drinks/food/snacks_pizza.dm
@@ -8,10 +8,12 @@
volume = 80
list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice
icon = 'icons/obj/food/pizzaspaghetti.dmi'
list_reagents = list("nutriment" = 5)
+ foodtype = GRAIN | DAIRY | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pizza/margherita
name = "margherita"
@@ -20,6 +22,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/margherita
bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/margherita
name = "margherita slice"
@@ -27,6 +30,7 @@
icon_state = "pizzamargheritaslice"
filling_color = "#FFA500"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/pizza/meat
name = "meatpizza"
@@ -36,6 +40,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 8)
list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 8)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ foodtype = GRAIN | VEGETABLES| DAIRY | MEAT
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meat
name = "meatpizza slice"
@@ -43,6 +48,7 @@
icon_state = "meatpizzaslice"
filling_color = "#A52A2A"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY | MEAT
/obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom
name = "mushroom pizza"
@@ -52,6 +58,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 30, "vitamin" = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushroom" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom
name = "mushroom pizza slice"
@@ -59,6 +66,7 @@
icon_state = "mushroompizzaslice"
filling_color = "#FFE4C4"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushroom" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable
name = "vegetable pizza"
@@ -68,6 +76,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5)
tastes = list("crust" = 1, "tomato" = 2, "cheese" = 1, "carrot" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetable
name = "vegetable pizza slice"
@@ -75,6 +84,7 @@
icon_state = "vegetablepizzaslice"
filling_color = "#FFA500"
tastes = list("crust" = 1, "tomato" = 2, "cheese" = 1, "carrot" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket
name = "donkpocket pizza"
@@ -84,6 +94,7 @@
bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "omnizine" = 10, "vitamin" = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/donkpocket
name = "donkpocket pizza slice"
@@ -91,6 +102,7 @@
icon_state = "donkpocketpizzaslice"
filling_color = "#FFA500"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
/obj/item/weapon/reagent_containers/food/snacks/pizza/dank
name = "dank pizza"
@@ -100,6 +112,7 @@
bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
list_reagents = list("nutriment" = 25, "doctorsdelight" = 5, "tomatojuice" = 6, "vitamin" = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/dank
name = "dank pizza slice"
@@ -107,6 +120,7 @@
icon_state = "dankpizzaslice"
filling_color = "#2E8B57"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage
name = "sassysage pizza"
@@ -115,6 +129,7 @@
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/sassysage
bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/sassysage
name = "sassysage pizza slice"
@@ -122,8 +137,10 @@
icon_state = "sassysagepizzaslice"
filling_color = "#FF4500"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/custom
name = "pizza slice"
icon_state = "pizzamargheritaslice"
filling_color = "#FFFFFF"
+ foodtype = GRAIN | VEGETABLES
diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm
index f167452ef0..324b69e53f 100644
--- a/code/modules/food_and_drinks/food/snacks_salad.dm
+++ b/code/modules/food_and_drinks/food/snacks_salad.dm
@@ -7,6 +7,7 @@
w_class = WEIGHT_CLASS_NORMAL
list_reagents = list("nutriment" = 7, "vitamin" = 2)
tastes = list("leaves" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/salad/New()
..()
@@ -19,6 +20,7 @@
bonus_reagents = list("omnizine" = 2, "vitamin" = 6)
list_reagents = list("nutriment" = 8, "omnizine" = 8, "vitamin" = 6)
tastes = list("leaves" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/salad/herbsalad
name = "herb salad"
@@ -27,6 +29,7 @@
bonus_reagents = list("vitamin" = 4)
list_reagents = list("nutriment" = 8, "vitamin" = 2)
tastes = list("leaves" = 1, "apple" = 1)
+ foodtype = VEGETABLES | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/salad/validsalad
name = "valid salad"
@@ -35,6 +38,7 @@
bonus_reagents = list("doctorsdelight" = 5, "vitamin" = 4)
list_reagents = list("nutriment" = 8, "doctorsdelight" = 5, "vitamin" = 2)
tastes = list("leaves" = 1, "potato" = 1, "meat" = 1, "valids" = 1)
+ foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal
name = "oatmeal"
@@ -43,6 +47,7 @@
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
list_reagents = list("nutriment" = 7, "milk" = 10, "vitamin" = 2)
tastes = list("oats" = 1, "milk" = 1)
+ foodtype = DAIRY | GRAIN
/obj/item/weapon/reagent_containers/food/snacks/salad/fruit
name = "fruit salad"
@@ -50,6 +55,7 @@
icon_state = "fruitsalad"
bonus_reagents = list("nutriment" = 2, "vitamin" = 4)
tastes = list("fruit" = 1)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/salad/jungle
name = "jungle salad"
@@ -58,6 +64,7 @@
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
list_reagents = list("nutriment" = 7, "banana" = 5, "vitamin" = 4)
tastes = list("fruit" = 1, "the jungle" = 1)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight
name = "citrus delight"
@@ -66,6 +73,7 @@
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
list_reagents = list("nutriment" = 7, "vitamin" = 5)
tastes = list("sourness" = 1, "leaves" = 1)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/salad/ricebowl
name = "ricebowl"
@@ -74,6 +82,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice
list_reagents = list("nutriment" = 4)
tastes = list("rice" = 1)
+ foodtype = GRAIN | RAW
/obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice
name = "boiled rice"
@@ -82,6 +91,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
list_reagents = list("nutriment" = 5, "vitamin" = 1)
tastes = list("rice" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding
name = "rice pudding"
@@ -89,6 +99,7 @@
icon_state = "ricepudding"
bonus_reagents = list("nutriment" = 4, "vitamin" = 2)
tastes = list("rice" = 1, "sweetness" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/salad/ricepork
name = "rice and pork"
@@ -96,6 +107,7 @@
icon_state = "riceporkbowl"
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
tastes = list("rice" = 1, "meat" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl
name = "egg bowl"
@@ -103,3 +115,4 @@
icon_state = "eggbowl"
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
tastes = list("rice" = 1, "egg" = 1)
+ foodtype = GRAIN | MEAT //EGG = MEAT -NinjaNomNom 2017
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 9618ad2875..f1b9febf82 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -8,6 +8,7 @@
list_reagents = list("nutriment" = 6, "vitamin" = 1)
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich
tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich
name = "toasted sandwich"
@@ -18,6 +19,7 @@
bonus_reagents = list("nutriment" = 1, "carbon" = 2)
list_reagents = list("nutriment" = 6, "carbon" = 2)
tastes = list("toast" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/grilledcheese
name = "grilled cheese sandwich"
@@ -28,6 +30,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
list_reagents = list("nutriment" = 7, "vitamin" = 1)
tastes = list("toast" = 1, "cheese" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich
name = "jelly sandwich"
@@ -37,14 +40,17 @@
trash = /obj/item/trash/plate
bitesize = 3
tastes = list("bread" = 1, "jelly" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
bonus_reagents = list("slimejelly" = 5, "vitamin" = 2)
list_reagents = list("nutriment" = 2, "slimejelly" = 5, "vitamin" = 2)
+ foodtype = GRAIN | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
bonus_reagents = list("cherryjelly" = 5, "vitamin" = 2)
list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
+ foodtype = GRAIN | FRUIT
/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich
name = "icecream sandwich"
@@ -54,6 +60,7 @@
bonus_reagents = list("nutriment" = 1, "ice" = 2)
list_reagents = list("nutriment" = 2, "ice" = 2)
tastes = list("ice cream" = 1)
+ foodtype = GRAIN | DAIRY
/obj/item/weapon/reagent_containers/food/snacks/notasandwich
name = "not-a-sandwich"
@@ -64,6 +71,7 @@
bonus_reagents = list("vitamin" = 6)
list_reagents = list("nutriment" = 6, "vitamin" = 6)
tastes = list("nothing suspicious" = 1)
+ foodtype = GRAIN | GROSS
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast
name = "jellied toast"
@@ -73,14 +81,17 @@
trash = /obj/item/trash/plate
bitesize = 3
tastes = list("toast" = 1, "jelly" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry
bonus_reagents = list("cherryjelly" = 5, "vitamin" = 2)
list_reagents = list("nutriment" = 1, "cherryjelly" = 5, "vitamin" = 2)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime
bonus_reagents = list("slimejelly" = 5, "vitamin" = 2)
list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
+ foodtype = GRAIN | TOXIC | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/twobread
name = "two bread"
@@ -90,3 +101,4 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
list_reagents = list("nutriment" = 2, "vitamin" = 2)
tastes = list("bread" = 2)
+ foodtype = GRAIN
diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm
index e11231fdfc..2e7e538915 100644
--- a/code/modules/food_and_drinks/food/snacks_soup.dm
+++ b/code/modules/food_and_drinks/food/snacks_soup.dm
@@ -6,6 +6,7 @@
volume = 80
list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
tastes = list("tasteless soup" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/New()
..()
@@ -27,6 +28,7 @@
if(wish_true)
reagents.add_reagent("nutriment", 9)
reagents.add_reagent("vitamin", 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/meatball
name = "meatball soup"
@@ -34,6 +36,7 @@
icon_state = "meatballsoup"
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
tastes = list("meat" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/soup/slime
name = "slime soup"
@@ -42,6 +45,7 @@
bonus_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 5)
list_reagents = list("nutriment" = 5, "slimejelly" = 5, "water" = 5, "vitamin" = 4)
tastes = list("slime" = 1)
+ foodtype = TOXIC | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/soup/blood
name = "tomato soup"
@@ -50,6 +54,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 6)
list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4)
tastes = list("iron" = 1)
+ foodtype = GROSS
/obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu
name = "wing fang chu"
@@ -59,6 +64,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2)
tastes = list("soy" = 1)
+ foodtype = MEAT
/obj/item/weapon/reagent_containers/food/snacks/soup/clownstears
name = "clown's tears"
@@ -67,6 +73,7 @@
bonus_reagents = list("nutriment" = 1, "banana" = 5, "vitamin" = 8)
list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 5, "vitamin" = 8)
tastes = list("a bad joke" = 1)
+ foodtype = FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/soup/vegetable
name = "vegetable soup"
@@ -74,6 +81,7 @@
icon_state = "vegetablesoup"
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
tastes = list("vegetables" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/nettle
name = "nettle soup"
@@ -81,6 +89,7 @@
icon_state = "nettlesoup"
bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 5)
tastes = list("nettles" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/mystery
name = "mystery soup"
@@ -103,6 +112,7 @@
bonus_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2)
list_reagents = list("nutriment" = 5, "capsaicin" = 1, "tomatojuice" = 2, "vitamin" = 2)
tastes = list("hot peppers" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/coldchili
name = "cold chili"
@@ -111,6 +121,7 @@
bonus_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2)
list_reagents = list("nutriment" = 5, "frostoil" = 1, "tomatojuice" = 2, "vitamin" = 2)
tastes = list("tomato" = 1, "mint" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight
name = "monkey's delight"
@@ -119,6 +130,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
list_reagents = list("nutriment" = 10, "banana" = 5, "vitamin" = 5)
tastes = list("the jungle" = 1, "banana" = 1)
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/soup/tomato
name = "tomato soup"
@@ -127,6 +139,7 @@
bonus_reagents = list("nutriment" = 1, "tomatojuice" = 10, "vitamin" = 3)
list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3)
tastes = list("tomato" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball
name = "eyeball soup"
@@ -134,6 +147,7 @@
icon_state = "eyeballsoup"
bonus_reagents = list("nutriment" = 1, "liquidgibs" = 3)
tastes = list("tomato" = 1, "squirming" = 1)
+ foodtype = MEAT | GROSS
/obj/item/weapon/reagent_containers/food/snacks/soup/milo
name = "milosoup"
@@ -141,6 +155,7 @@
icon_state = "milosoup"
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
tastes = list("milo" = 1) // wtf is milo
+ foodtype = GROSS
/obj/item/weapon/reagent_containers/food/snacks/soup/mushroom
name = "chantrelle soup"
@@ -149,12 +164,14 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
list_reagents = list("nutriment" = 8, "vitamin" = 4)
tastes = list("mushroom" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/beet
name = "beet soup"
desc = "Wait, how do you spell it again..?"
icon_state = "beetsoup"
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/beet/New()
..()
@@ -170,6 +187,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "mushroomhallucinogen" = 6)
tastes = list("jelly" = 1, "mushroom" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly
name = "amanita jelly"
@@ -179,6 +197,7 @@
bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
list_reagents = list("nutriment" = 6, "mushroomhallucinogen" = 3, "amatoxin" = 6)
tastes = list("jelly" = 1, "mushroom" = 1)
+ foodtype = VEGETABLES | TOXIC
/obj/item/weapon/reagent_containers/food/snacks/soup/stew
name = "stew"
@@ -189,6 +208,7 @@
bitesize = 7
volume = 100
tastes = list("tomato" = 1, "carrot" = 1)
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato
name = "sweet potato soup"
@@ -196,6 +216,7 @@
icon_state = "sweetpotatosoup"
bonus_reagents = list("nutriment" = 4, "vitamin" = 5)
tastes = list("sweet potato" = 1)
+ foodtype = VEGETABLES | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/soup/beet/red
name = "red beet soup"
@@ -203,3 +224,4 @@
icon_state = "redbeetsoup"
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
tastes = list("beet" = 1)
+ foodtype = VEGETABLES
diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
index 8cd4665918..e137d9702c 100644
--- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm
+++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
@@ -8,6 +8,7 @@
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti
filling_color = "#F0E68C"
tastes = list("pasta" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti
name = "boiled spaghetti"
@@ -20,6 +21,7 @@
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/pasta
filling_color = "#F0E68C"
tastes = list("pasta" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/pastatomato
name = "spaghetti"
@@ -32,6 +34,7 @@
list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4)
filling_color = "#DC143C"
tastes = list("pasta" = 1, "tomato" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/copypasta
name = "copypasta"
@@ -44,6 +47,7 @@
list_reagents = list("nutriment" = 12, "tomatojuice" = 20, "vitamin" = 8)
filling_color = "#DC143C"
tastes = list("pasta" = 1, "tomato" = 1)
+ foodtype = GRAIN | VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti
name = "spaghetti and meatballs"
@@ -55,6 +59,7 @@
list_reagents = list("nutriment" = 8, "vitamin" = 4)
filling_color = "#F0E68C"
tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/spesslaw
name = "spesslaw"
@@ -66,6 +71,7 @@
list_reagents = list("nutriment" = 8, "vitamin" = 6)
filling_color = "#F0E68C"
tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/chowmein
name = "chow mein"
@@ -76,6 +82,7 @@
bonus_reagents = list("nutriment" = 3, "vitamin" = 4)
list_reagents = list("nutriment" = 7, "vitamin" = 6)
tastes = list("noodle" = 1, "tomato" = 1)
+ foodtype = GRAIN
/obj/item/weapon/reagent_containers/food/snacks/beefnoodle
name = "beef noodle"
@@ -85,6 +92,7 @@
trash = /obj/item/weapon/reagent_containers/glass/bowl
bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "liquidgibs" = 3)
tastes = list("noodle" = 1, "meat" = 1)
+ foodtype = GRAIN | MEAT
/obj/item/weapon/reagent_containers/food/snacks/butternoodles
name = "butter noodles"
@@ -94,3 +102,4 @@
trash = /obj/item/trash/plate
bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
tastes = list("noodle" = 1, "butter" = 1)
+ foodtype = GRAIN | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
index 200659ac0e..8485e879f9 100644
--- a/code/modules/food_and_drinks/food/snacks_vend.dm
+++ b/code/modules/food_and_drinks/food/snacks_vend.dm
@@ -11,6 +11,7 @@
junkiness = 25
filling_color = "#D2691E"
tastes = list("candy" = 1)
+ foodtype = JUNKFOOD | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/sosjerky
name = "\improper Scaredy's Private Reserve Beef Jerky"
@@ -21,6 +22,7 @@
junkiness = 25
filling_color = "#8B0000"
tastes = list("dried meat" = 1)
+ foodtype = JUNKFOOD | MEAT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/sosjerky/healthy
name = "homemade beef jerky"
@@ -38,6 +40,7 @@
junkiness = 20
filling_color = "#FFD700"
tastes = list("salt" = 1, "crisps" = 1)
+ foodtype = JUNKFOOD | FRIED
/obj/item/weapon/reagent_containers/food/snacks/no_raisin
name = "4no raisins"
@@ -48,12 +51,14 @@
junkiness = 25
filling_color = "#8B0000"
tastes = list("dried raisins" = 1)
+ foodtype = JUNKFOOD | FRUIT | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/no_raisin/healthy
name = "homemade raisins"
desc = "homemade raisins, the best in all of spess."
list_reagents = list("nutriment" = 3, "vitamin" = 2)
junkiness = 0
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie
name = "space twinkie"
@@ -62,6 +67,7 @@
list_reagents = list("sugar" = 4)
junkiness = 25
filling_color = "#FFD700"
+ foodtype = JUNKFOOD | GRAIN | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers
name = "cheesie honkers"
@@ -72,6 +78,7 @@
junkiness = 25
filling_color = "#FFD700"
tastes = list("cheese" = 5, "crisps" = 2)
+ foodtype = JUNKFOOD | DAIRY | SUGAR
/obj/item/weapon/reagent_containers/food/snacks/syndicake
name = "syndi-cakes"
@@ -81,3 +88,4 @@
list_reagents = list("nutriment" = 4, "doctorsdelight" = 5)
filling_color = "#F5F5DC"
tastes = list("sweetness" = 3, "cake" = 1)
+ foodtype = GRAIN | FRUIT | VEGETABLES
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index e21bda82ed..e2f38141f3 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -18,7 +18,7 @@ insert ascii eagle on american flag background here
container_type = OPENCONTAINER
var/obj/item/frying = null //What's being fried RIGHT NOW?
var/cook_time = 0
- var/static/list/blacklisted_items = typecacheof(list(
+ var/static/list/deepfry_blacklisted_items = typecacheof(list(
/obj/item/weapon/screwdriver,
/obj/item/weapon/crowbar,
/obj/item/weapon/wrench,
@@ -28,14 +28,8 @@ insert ascii eagle on american flag background here
/obj/item/weapon/reagent_containers/glass,
/obj/item/weapon/storage/part_replacer))
-/obj/item/weapon/circuitboard/machine/deep_fryer
- name = "circuit board (Deep Fryer)"
- build_path = /obj/machinery/deepfryer
- origin_tech = "programming=1"
- req_components = list(/obj/item/weapon/stock_parts/micro_laser = 1)
-
-/obj/machinery/deepfryer/New()
- ..()
+/obj/machinery/deepfryer/Initialize()
+ . = ..()
create_reagents(50)
reagents.add_reagent("nutriment", 25)
component_parts = list()
@@ -62,7 +56,7 @@ insert ascii eagle on american flag background here
else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?!
return
else
- if(is_type_in_typecache(I, blacklisted_items))
+ if(is_type_in_typecache(I, deepfry_blacklisted_items))
. = ..()
else if(user.drop_item() && !frying)
to_chat(user, "You put [I] into [src].")
@@ -112,6 +106,7 @@ insert ascii eagle on american flag background here
S.name = "the physical manifestation of the very concept of fried foods"
S.desc = "A heavily fried...something. Who can tell anymore?"
S.filling_color = S.color
+ S.foodtype |= FRIED
if(istype(frying, /obj/item/weapon/reagent_containers/food/snacks/))
qdel(frying)
else
diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
index 267b77f0c5..c657787f9d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
@@ -18,17 +18,15 @@
container_type = OPENCONTAINER
var/obj/item/weapon/reagent_containers/mixer
-/obj/machinery/food_cart/New()
- ..()
+/obj/machinery/food_cart/Initialize()
+ . = ..()
create_reagents(LIQUID_CAPACIY)
reagents.set_reacting(FALSE)
mixer = new /obj/item/weapon/reagent_containers(src, MIXER_CAPACITY)
mixer.name = "Mixer"
/obj/machinery/food_cart/Destroy()
- if(mixer)
- qdel(mixer)
- mixer = null
+ QDEL_NULL(mixer)
return ..()
/obj/machinery/food_cart/attack_hand(mob/user)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 2d6bc81f0b..c3d4a1802b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -6,58 +6,21 @@
icon_state = "grinder"
density = TRUE
anchored = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 2
+ active_power_usage = 500
+ circuit = /obj/item/weapon/circuitboard/machine/gibber
+
var/operating = FALSE //Is it on?
var/dirty = 0 // Does it need cleaning?
var/gibtime = 40 // Time from starting until meat appears
var/meat_produced = 0
var/ignore_clothing = 0
- use_power = IDLE_POWER_USE
- idle_power_usage = 2
- active_power_usage = 500
-
-//auto-gibs anything that bumps into it
-/obj/machinery/gibber/autogibber
- var/turf/input_plate
-
-/obj/machinery/gibber/autogibber/Initialize()
- . = ..()
- for(var/i in GLOB.cardinals)
- var/obj/machinery/mineral/input/input_obj = locate() in get_step(loc, i)
- if(input_obj)
- if(isturf(input_obj.loc))
- input_plate = input_obj.loc
- qdel(input_obj)
- break
-
- if(!input_plate)
- CRASH("Didn't find an input plate.")
- return
-
-/obj/machinery/gibber/autogibber/CollidedWith(atom/movable/AM)
- if(!input_plate)
- return
-
- if(ismob(AM))
- var/mob/M = AM
-
- if(M.loc == input_plate)
- M.loc = src
- M.gib()
/obj/machinery/gibber/Initialize()
. = ..()
add_overlay("grjam")
- var/obj/item/weapon/circuitboard/machine/gibber/B = new
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/gibber
- name = "Gibber (Machine Board)"
- build_path = /obj/machinery/gibber
- origin_tech = "programming=2;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/gibber/RefreshParts()
var/gib_time = 40
@@ -234,3 +197,32 @@
pixel_x = initial(pixel_x) //return to its spot after shaking
operating = FALSE
update_icon()
+
+//auto-gibs anything that bumps into it
+/obj/machinery/gibber/autogibber
+ var/turf/input_plate
+
+/obj/machinery/gibber/autogibber/Initialize()
+ . = ..()
+ for(var/i in GLOB.cardinals)
+ var/obj/machinery/mineral/input/input_obj = locate() in get_step(loc, i)
+ if(input_obj)
+ if(isturf(input_obj.loc))
+ input_plate = input_obj.loc
+ qdel(input_obj)
+ break
+
+ if(!input_plate)
+ CRASH("Didn't find an input plate.")
+ return
+
+/obj/machinery/gibber/autogibber/CollidedWith(atom/movable/AM)
+ if(!input_plate)
+ return
+
+ if(ismob(AM))
+ var/mob/M = AM
+
+ if(M.loc == input_plate)
+ M.forceMove(src)
+ M.gib()
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index 95bbf1f138..d4fa73c74a 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -14,11 +14,19 @@
anchored = FALSE
use_power = NO_POWER_USE
layer = BELOW_OBJ_LAYER
+ container_type = OPENCONTAINER
+ max_integrity = 300
var/list/product_types = list()
var/dispense_flavour = ICECREAM_VANILLA
var/flavour_name = "vanilla"
- container_type = OPENCONTAINER
- max_integrity = 300
+ var/static/list/icecream_vat_reagents = list(
+ "milk" = 5,
+ "flour" = 5,
+ "sugar" = 5,
+ "ice" = 5,
+ "cocoa" = 5,
+ "berryjuice" = 5,
+ "singulo" = 5)
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -52,19 +60,14 @@
return "vanilla"
-/obj/machinery/icecream_vat/New()
- ..()
+/obj/machinery/icecream_vat/Initialize()
+ . = ..()
while(product_types.len < 6)
product_types.Add(5)
create_reagents()
reagents.set_reacting(FALSE)
- reagents.add_reagent("milk", 5)
- reagents.add_reagent("flour", 5)
- reagents.add_reagent("sugar", 5)
- reagents.add_reagent("ice", 5)
- reagents.add_reagent("cocoa", 5)
- reagents.add_reagent("berryjuice", 5)
- reagents.add_reagent("singulo", 5)
+ for(var/reagent in icecream_vat_reagents)
+ reagents.add_reagent(reagent, icecream_vat_reagents[reagent])
/obj/machinery/icecream_vat/attack_hand(mob/user)
user.set_machine(src)
@@ -177,6 +180,7 @@
var/ice_creamed = 0
var/cone_type
bitesize = 3
+ foodtype = DAIRY
/obj/item/weapon/reagent_containers/food/snacks/icecream/Initialize()
. = ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 61c4b9eace..40a52b0d3b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -9,6 +9,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
+ circuit = /obj/item/weapon/circuitboard/machine/microwave
var/operating = FALSE // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
@@ -21,22 +22,9 @@
* Initialising
********************/
-/obj/machinery/microwave/New()
+/obj/machinery/microwave/Initialize()
+ . = ..()
create_reagents(100)
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/microwave(null)
- B.apply_default_parts(src)
- ..()
-
-/obj/item/weapon/circuitboard/machine/microwave
- name = "Microwave (Machine Board)"
- build_path = /obj/machinery/microwave
- origin_tech = "programming=2;magnets=2"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/stack/sheet/glass = 1)
/obj/machinery/microwave/RefreshParts()
var/E
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index 5b695cfd4b..0a86f155a4 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -9,24 +9,11 @@
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 50
+ circuit = /obj/item/weapon/circuitboard/machine/monkey_recycler
var/grinded = 0
var/required_grind = 5
var/cube_production = 1
-
-/obj/machinery/monkey_recycler/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/monkey_recycler(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/monkey_recycler
- name = "Monkey Recycler (Machine Board)"
- build_path = /obj/machinery/monkey_recycler
- origin_tech = "programming=1;biotech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
/obj/machinery/monkey_recycler/RefreshParts()
var/req_grind = 5
var/cubes_made = 1
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 71f8d727fc..018e6cfc79 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -7,44 +7,15 @@
layer = BELOW_OBJ_LAYER
density = TRUE
anchored = TRUE
- var/broken = 0
- var/processing = FALSE
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 50
+ circuit = /obj/item/weapon/circuitboard/machine/processor
+ var/broken = FALSE
+ var/processing = FALSE
var/rating_speed = 1
var/rating_amount = 1
-/obj/machinery/processor/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/processor(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/processor
- name = "Food Processor (Machine Board)"
- build_path = /obj/machinery/processor
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
-/obj/item/weapon/circuitboard/machine/processor
- name = "Food Processor (Machine Board)"
- build_path = /obj/machinery/processor
-
-/obj/item/weapon/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- if(build_path == /obj/machinery/processor)
- name = "Slime Processor (Machine Board)"
- build_path = /obj/machinery/processor/slime
- to_chat(user, "Name protocols successfully updated.")
- else
- name = "Food Processor (Machine Board)"
- build_path = /obj/machinery/processor
- to_chat(user, "Defaulting name protocols.")
- else
- return ..()
-
/obj/machinery/processor/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
rating_amount = B.rating
@@ -300,11 +271,7 @@
name = "Slime processor"
desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating."
-/obj/machinery/processor/slime/New()
- ..()
+/obj/machinery/processor/slime/Initialize()
+ . = ..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/processor/slime(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/processor/slime
- name = "Slime Processor (Machine Board)"
- build_path = /obj/machinery/processor/slime
+ B.apply_default_parts(src)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 2cb0631cb2..c1e1aa7b81 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -12,13 +12,14 @@
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
+ circuit = /obj/item/weapon/circuitboard/machine/smartfridge
var/max_n_of_items = 1500
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
var/list/initial_contents
/obj/machinery/smartfridge/Initialize()
- ..()
+ . = ..()
create_reagents()
reagents.set_reacting(FALSE)
@@ -30,40 +31,6 @@
for(var/i in 1 to amount)
load(new typekey(src))
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smartfridge(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/smartfridge
- name = "Smartfridge (Machine Board)"
- build_path = /obj/machinery/smartfridge
- origin_tech = "programming=1"
- req_components = list(/obj/item/weapon/stock_parts/matter_bin = 1)
- var/static/list/fridges = list(/obj/machinery/smartfridge = "plant produce",
- /obj/machinery/smartfridge/food = "food",
- /obj/machinery/smartfridge/drinks = "drinks",
- /obj/machinery/smartfridge/extract = "slimes",
- /obj/machinery/smartfridge/chemistry = "chems",
- /obj/machinery/smartfridge/chemistry/virology = "viruses",
- /obj/machinery/smartfridge/disks = "disks")
-
-/obj/item/weapon/circuitboard/machine/smartfridge/New(loc, new_type)
- if(new_type)
- build_path = new_type
- ..()
-
-/obj/item/weapon/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- var/position = fridges.Find(build_path, fridges)
- position = (position == fridges.len) ? 1 : (position + 1)
- build_path = fridges[position]
- to_chat(user, "You set the board to [fridges[build_path]].")
- else
- return ..()
-
-/obj/item/weapon/circuitboard/machine/smartfridge/examine(mob/user)
- ..()
- to_chat(user, "[src] is set to [fridges[build_path]]. You can use a screwdriver to reconfigure it.")
-
/obj/machinery/smartfridge/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
max_n_of_items = 1500 * B.rating
@@ -255,8 +222,8 @@
icon_off = "drying_rack"
var/drying = FALSE
-/obj/machinery/smartfridge/drying_rack/New()
- ..()
+/obj/machinery/smartfridge/drying_rack/Initialize()
+ . = ..()
if(component_parts && component_parts.len)
component_parts.Cut()
component_parts = null
diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm
index 17662feb6e..bfa8b8bebd 100644
--- a/code/modules/food_and_drinks/recipes/food_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm
@@ -13,7 +13,7 @@
id = "tofu"
required_reagents = list("soymilk" = 10)
required_catalysts = list("enzyme" = 5)
- mob_react=1
+ mob_react = FALSE
/datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -37,7 +37,7 @@
name = "Chocolate Bar"
id = "chocolate_bar"
required_reagents = list("chocolate_milk" = 4, "sugar" = 2)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -91,7 +91,7 @@
name = "synthmeat"
id = "synthmeat"
required_reagents = list("blood" = 5, "cryoxadone" = 1)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/synthmeat/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index 4a150faad7..313199c053 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -248,7 +248,7 @@
/datum/crafting_recipe/food/ratburger
name = "Rat burger"
reqs = list(
- /obj/item/trash/deadmouse = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/deadmouse = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/rat
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 7c42972a10..36640db74e 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -371,6 +371,9 @@ h1.alert, h2.alert {color: #000000;}
.swarmer {color: #2C75FF;}
.resonate {color: #298F85;}
+.love {color: #FF69Bf;}
+.lovebold {color: #FF69Bf; font-weight: bold;}
+
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: blue; font-weight: bold;}
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index a5c05d4607..eec6634d0d 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -7,6 +7,7 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 40
+ circuit = /obj/item/weapon/circuitboard/machine/biogenerator
var/processing = FALSE
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/points = 0
@@ -18,17 +19,13 @@
var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth")
var/list/timesFiveCategories = list("Food", "Botany Chemicals")
-/obj/machinery/biogenerator/New()
- ..()
+/obj/machinery/biogenerator/Initialize()
+ . = ..()
files = new /datum/research/biogenerator(src)
create_reagents(1000)
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/biogenerator(null)
- B.apply_default_parts(src)
/obj/machinery/biogenerator/Destroy()
- if(beaker)
- qdel(beaker)
- beaker = null
+ QDEL_NULL(beaker)
return ..()
/obj/machinery/biogenerator/contents_explosion(severity, target)
@@ -43,16 +40,6 @@
update_icon()
updateUsrDialog()
-/obj/item/weapon/circuitboard/machine/biogenerator
- name = "Biogenerator (Machine Board)"
- build_path = /obj/machinery/biogenerator
- origin_tech = "programming=2;biotech=3;materials=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
/obj/machinery/biogenerator/RefreshParts()
var/E = 0
var/P = 0
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index eef8b6b27c..6e27e4f922 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -5,6 +5,7 @@
icon_state = "dnamod"
density = TRUE
anchored = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/plantgenes
var/obj/item/seeds/seed
var/obj/item/weapon/disk/plantgene/disk
@@ -22,21 +23,6 @@
var/min_wchance = 67
var/min_wrate = 10
-/obj/machinery/plantgenes/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/plantgenes(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/plantgenes
- name = "Plant DNA Manipulator (Machine Board)"
- build_path = /obj/machinery/plantgenes
- origin_tech = "programming=3;biotech=3"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/scanning_module = 1)
-
/obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer.
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
if(M.rating > 3)
@@ -421,23 +407,9 @@
seed.name = "experimental " + seed.name
seed.icon_state = "seed-x"
-
-
// Gene modder for seed vault ship, built with high tech alien parts.
-/obj/machinery/plantgenes/seedvault/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/plantgenes/vault(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/plantgenes/vault
- name = "alien board (Plant DNA Manipulator)"
- icon_state = "abductor_mod"
- origin_tech = "programming=5;biotech=5"
- // It wasn't made by actual abductors race, so no abductor tech here.
- def_components = list(
- /obj/item/weapon/stock_parts/manipulator = /obj/item/weapon/stock_parts/manipulator/femto,
- /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra,
- /obj/item/weapon/stock_parts/scanning_module = /obj/item/weapon/stock_parts/scanning_module/triphasic)
+/obj/machinery/plantgenes/seedvault
+ circuit = /obj/item/weapon/circuitboard/machine/plantgenes/vault
/*
* Plant DNA disk
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index 51b8f3c43e..702302dadf 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -7,6 +7,7 @@
slot_flags = SLOT_HEAD
filling_color = "#008000"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Ambrosia Vulgaris
/obj/item/seeds/ambrosia
diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm
index 4d4712e093..f5b4e7ab76 100644
--- a/code/modules/hydroponics/grown/apple.dm
+++ b/code/modules/hydroponics/grown/apple.dm
@@ -23,6 +23,7 @@
icon_state = "apple"
filling_color = "#FF4500"
bitesize = 100 // Always eat the apple in one bite
+ foodtype = FRUIT
// Posioned Apple
/obj/item/seeds/apple/poisoned
@@ -33,6 +34,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/poisoned
seed = /obj/item/seeds/apple/poisoned
+ foodtype = FRUIT | TOXIC
// Gold Apple
/obj/item/seeds/apple/gold
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 91b096bc38..e2dce252e7 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -23,6 +23,7 @@
trash = /obj/item/weapon/grown/bananapeel
filling_color = "#FFFF00"
bitesize = 5
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
user.visible_message("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm
index 277dfd0629..756c23ff14 100644
--- a/code/modules/hydroponics/grown/beans.dm
+++ b/code/modules/hydroponics/grown/beans.dm
@@ -25,6 +25,7 @@
icon_state = "soybeans"
filling_color = "#F0E68C"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Koibean
/obj/item/seeds/soya/koi
@@ -45,4 +46,5 @@
desc = "Something about these seems fishy."
icon_state = "koibeans"
filling_color = "#F0E68C"
- bitesize_mod = 2
\ No newline at end of file
+ bitesize_mod = 2
+ foodtype = VEGETABLES
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index 6ab8a98ac6..b12685557e 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -25,6 +25,7 @@
gender = PLURAL
filling_color = "#FF00FF"
bitesize_mod = 2
+ foodtype = FRUIT
// Poison Berries
/obj/item/seeds/berry/poison
@@ -44,6 +45,7 @@
desc = "Taste so good, you could die!"
icon_state = "poisonberrypile"
filling_color = "#C71585"
+ foodtype = FRUIT | TOXIC
// Death Berries
/obj/item/seeds/berry/death
@@ -65,6 +67,7 @@
desc = "Taste so good, you could die!"
icon_state = "deathberrypile"
filling_color = "#708090"
+ foodtype = FRUIT | TOXIC
// Glow Berries
/obj/item/seeds/berry/glow
@@ -88,6 +91,7 @@
icon_state = "glowberrypile"
filling_color = "#7CFC00"
origin_tech = "plasmatech=6"
+ foodtype = FRUIT
// Cherries
/obj/item/seeds/cherry
@@ -117,6 +121,7 @@
gender = PLURAL
filling_color = "#FF0000"
bitesize_mod = 2
+ foodtype = FRUIT
// Blue Cherries
/obj/item/seeds/cherry/blue
@@ -137,6 +142,7 @@
icon_state = "bluecherry"
filling_color = "#6495ED"
bitesize_mod = 2
+ foodtype = FRUIT
// Grapes
/obj/item/seeds/grape
@@ -167,6 +173,7 @@
dried_type = /obj/item/weapon/reagent_containers/food/snacks/no_raisin/healthy
filling_color = "#FF1493"
bitesize_mod = 2
+ foodtype = FRUIT
// Green Grapes
/obj/item/seeds/grape/green
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
index 2788e0ba13..0afb4d4d9c 100644
--- a/code/modules/hydroponics/grown/cannabis.dm
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -90,6 +90,7 @@
icon_state = "cannabis"
filling_color = "#00FF00"
bitesize_mod = 2
+ foodtype = VEGETABLES //i dont really know what else weed could be to be honest
/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis/rainbow
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
index 66c5a17a84..0a6e0d255d 100644
--- a/code/modules/hydroponics/grown/cereals.dm
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -21,6 +21,7 @@
icon_state = "wheat"
filling_color = "#F0E68C"
bitesize_mod = 2
+ foodtype = GRAIN
// Oat
/obj/item/seeds/wheat/oat
@@ -40,6 +41,7 @@
icon_state = "oat"
filling_color = "#556B2F"
bitesize_mod = 2
+ foodtype = GRAIN
// Rice
/obj/item/seeds/wheat/rice
@@ -60,6 +62,7 @@
icon_state = "rice"
filling_color = "#FAFAD2"
bitesize_mod = 2
+ foodtype = GRAIN
//Meatwheat - grows into synthetic meat
/obj/item/seeds/wheat/meat
@@ -79,6 +82,7 @@
filling_color = rgb(150, 0, 0)
bitesize_mod = 2
seed = /obj/item/seeds/wheat/meat
+ foodtype = MEAT | GRAIN
/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user)
user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.")
diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm
index 66bd823a89..9fa27e6476 100644
--- a/code/modules/hydroponics/grown/chili.dm
+++ b/code/modules/hydroponics/grown/chili.dm
@@ -25,6 +25,7 @@
icon_state = "chilipepper"
filling_color = "#FF0000"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Ice Chili
/obj/item/seeds/chili/ice
@@ -49,6 +50,7 @@
filling_color = "#0000CD"
bitesize_mod = 2
origin_tech = "biotech=4"
+ foodtype = VEGETABLES
// Ghost Chili
/obj/item/seeds/chili/ghost
@@ -75,6 +77,7 @@
filling_color = "#F8F8FF"
bitesize_mod = 4
origin_tech = "biotech=4;magnets=5"
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user)
..()
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index 133d0d71f4..a6e7ef9211 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -5,6 +5,7 @@
desc = "It's so sour, your face will twist."
icon_state = "lime"
bitesize_mod = 2
+ foodtype = FRUIT
// Lime
/obj/item/seeds/lime
@@ -104,6 +105,7 @@
desc = "Made for burning houses down."
icon_state = "firelemon"
bitesize_mod = 2
+ foodtype = FRUIT
/obj/item/weapon/reagent_containers/food/snacks/grown/firelemon/attack_self(mob/living/user)
var/area/A = get_area(user)
diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm
index 6e04bdaf97..35fb9b1eaf 100644
--- a/code/modules/hydroponics/grown/cocoa_vanilla.dm
+++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm
@@ -25,6 +25,7 @@
icon_state = "cocoapod"
filling_color = "#FFD700"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Vanilla Pod
/obj/item/seeds/cocoapod/vanillapod
@@ -43,4 +44,5 @@
name = "vanilla pod"
desc = "Fattening... Mmmmm... vanilla."
icon_state = "vanillapod"
- filling_color = "#FFD700"
\ No newline at end of file
+ filling_color = "#FFD700"
+ foodtype = VEGETABLES
diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm
index 59e7a0c008..9c0a12bc4b 100644
--- a/code/modules/hydroponics/grown/corn.dm
+++ b/code/modules/hydroponics/grown/corn.dm
@@ -24,6 +24,7 @@
filling_color = "#FFFF00"
trash = /obj/item/weapon/grown/corncob
bitesize_mod = 2
+ foodtype = VEGETABLES
/obj/item/weapon/grown/corncob
name = "corn cob"
@@ -79,4 +80,4 @@
snap_pops -= 1
if(!snap_pops)
new /obj/item/weapon/grown/corncob(user.loc)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm
index 8ec46ff77d..1cad3917f2 100644
--- a/code/modules/hydroponics/grown/eggplant.dm
+++ b/code/modules/hydroponics/grown/eggplant.dm
@@ -22,6 +22,7 @@
icon_state = "eggplant"
filling_color = "#800080"
bitesize_mod = 2
+ foodtype = FRUIT
// Egg-Plant
/obj/item/seeds/eggplant/eggy
@@ -41,4 +42,5 @@
icon_state = "eggyplant"
trash = /obj/item/weapon/reagent_containers/food/snacks/egg
filling_color = "#F8F8FF"
- bitesize_mod = 2
\ No newline at end of file
+ bitesize_mod = 2
+ foodtype = MEAT
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 881e47238e..9d1e3037ad 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -25,6 +25,7 @@
slot_flags = SLOT_HEAD
filling_color = "#FF6347"
bitesize_mod = 3
+ foodtype = VEGETABLES | GROSS
// Lily
/obj/item/seeds/poppy/lily
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index 45269743a5..ad32be14d5 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -99,4 +99,5 @@
desc = "Pueraria Virallis: An invasive species with vines that rapidly creep and wrap around whatever they contact."
icon_state = "kudzupod"
filling_color = "#6B8E23"
- bitesize_mod = 2
\ No newline at end of file
+ bitesize_mod = 2
+ foodtype = VEGETABLES | GROSS
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index 4c6fa15b04..3cbbe49451 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -25,6 +25,7 @@
w_class = WEIGHT_CLASS_NORMAL
filling_color = "#008000"
bitesize_mod = 3
+ foodtype = FRUIT
// Holymelon
/obj/item/seeds/watermelon/holy
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index f96f7d821b..54b53c9a95 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -54,6 +54,7 @@
icon_state = "cabbage"
filling_color = "#90EE90"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Sugarcane
@@ -79,6 +80,7 @@
icon_state = "sugarcane"
filling_color = "#FFD700"
bitesize_mod = 2
+ foodtype = VEGETABLES | SUGAR
// Gatfruit
@@ -109,6 +111,7 @@
origin_tech = "combat=6"
trash = /obj/item/weapon/gun/ballistic/revolver
bitesize_mod = 2
+ foodtype = FRUIT
//Cherry Bombs
/obj/item/seeds/cherry/bomb
@@ -164,4 +167,4 @@
plantname = "Fruiting Cactus"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
- growthstages = 2
\ No newline at end of file
+ growthstages = 2
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 18f6353ba2..088a9aa144 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -1,6 +1,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
name = "mushroom"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Reishi
@@ -22,6 +23,9 @@
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
reagents_add = list("morphine" = 0.35, "charcoal" = 0.35, "nutriment" = 0)
+
+
+
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi
seed = /obj/item/seeds/reishi
name = "reishi"
@@ -29,7 +33,6 @@
icon_state = "reishi"
filling_color = "#FF4500"
-
// Fly Amanita
/obj/item/seeds/amanita
name = "pack of fly amanita mycelium"
diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm
index 12d8e46ccd..95cadfe979 100644
--- a/code/modules/hydroponics/grown/potato.dm
+++ b/code/modules/hydroponics/grown/potato.dm
@@ -25,6 +25,7 @@
icon_state = "potato"
filling_color = "#E9967A"
bitesize = 100
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
@@ -61,4 +62,4 @@
seed = /obj/item/seeds/potato/sweet
name = "sweet potato"
desc = "It's sweet."
- icon_state = "sweetpotato"
\ No newline at end of file
+ icon_state = "sweetpotato"
diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm
index 1354edbcaa..4e7bc179d3 100644
--- a/code/modules/hydroponics/grown/pumpkin.dm
+++ b/code/modules/hydroponics/grown/pumpkin.dm
@@ -23,6 +23,7 @@
icon_state = "pumpkin"
filling_color = "#FFA500"
bitesize_mod = 2
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(W.is_sharp())
@@ -52,3 +53,4 @@
icon_state = "blumpkin"
filling_color = "#87CEFA"
bitesize_mod = 2
+ foodtype = VEGETABLES
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index 7794148f0e..7a4547bd1d 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -21,6 +21,7 @@
icon_state = "carrot"
filling_color = "#FFA500"
bitesize_mod = 2
+ foodtype = VEGETABLES
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot/attackby(obj/item/I, mob/user, params)
if(I.is_sharp())
@@ -50,6 +51,7 @@
desc = "Closely related to carrots."
icon_state = "parsnip"
bitesize_mod = 2
+ foodtype = VEGETABLES
// White-Beet
@@ -75,6 +77,7 @@
icon_state = "whitebeet"
filling_color = "#F4A460"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Red Beet
/obj/item/seeds/redbeet
@@ -98,3 +101,4 @@
desc = "You can't beat red beet."
icon_state = "redbeet"
bitesize_mod = 2
+ foodtype = VEGETABLES
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index 4a8faa6829..24780216a2 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -22,6 +22,7 @@
splat_type = /obj/effect/decal/cleanable/tomato_smudge
filling_color = "#FF6347"
bitesize_mod = 2
+ foodtype = VEGETABLES
// Blood Tomato
/obj/item/seeds/tomato/blood
@@ -43,7 +44,7 @@
splat_type = /obj/effect/gibspawner/generic
filling_color = "#FF0000"
origin_tech = "biotech=5"
-
+ foodtype = VEGETABLES | GROSS
// Blue Tomato
/obj/item/seeds/tomato/blue
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 499fc4bd64..e05110657f 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -6,6 +6,7 @@
anchored = TRUE
pixel_y = 8
unique_rename = 1
+ circuit = /obj/item/weapon/circuitboard/machine/hydroponics
var/waterlevel = 100 //The amount of water in the tray (max 100)
var/maxwater = 100 //The maximum amount of water in the tray
var/nutrilevel = 10 //The amount of nutrient in the tray (max 10)
@@ -37,20 +38,6 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "hydrotray3"
-/obj/machinery/hydroponics/constructable/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/hydroponics(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/hydroponics
- name = "Hydroponics Tray (Machine Board)"
- build_path = /obj/machinery/hydroponics/constructable
- origin_tech = "programming=1;biotech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
/obj/machinery/hydroponics/constructable/RefreshParts()
var/tmp_capacity = 0
for (var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 65fa87c658..ce067ed584 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -44,23 +44,11 @@
icon_state = "sextractor"
density = TRUE
anchored = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/seed_extractor
var/piles = list()
var/max_seeds = 1000
var/seed_multiplier = 1
-/obj/machinery/seed_extractor/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/seed_extractor(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/seed_extractor
- name = "Seed Extractor (Machine Board)"
- build_path = /obj/machinery/seed_extractor
- origin_tech = "programming=1"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
-
/obj/machinery/seed_extractor/RefreshParts()
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
max_seeds = 1000 * B.rating
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index c38c08ca0b..5c94ae750e 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -193,8 +193,8 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
libcomp_menu[page] = ""
libcomp_menu[page] += "| [C.author] | [C.title] | [C.category] | \[Order\] |
\n"
-/obj/machinery/computer/libraryconsole/bookmanagement/New()
- ..()
+/obj/machinery/computer/libraryconsole/bookmanagement/Initialize()
+ . = ..()
if(circuit)
circuit.name = "Book Inventory Management Console (Machine Board)"
circuit.build_path = /obj/machinery/computer/libraryconsole/bookmanagement
diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm
index b5d5a2bab1..d0fbf029b8 100644
--- a/code/modules/lighting/lighting_object.dm
+++ b/code/modules/lighting/lighting_object.dm
@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
icon_state = "transparent"
color = LIGHTING_BASE_MATRIX
plane = LIGHTING_PLANE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
layer = LIGHTING_LAYER
invisibility = INVISIBILITY_LIGHTING
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
index 3aca57c4bf..fc03cfb8c0 100644
--- a/code/modules/lighting/lighting_turf.dm
+++ b/code/modules/lighting/lighting_turf.dm
@@ -95,14 +95,6 @@
has_opaque_atom = TRUE
break
-// If an opaque movable atom moves around we need to potentially update visibility.
-/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc)
- . = ..()
-
- if (Obj && Obj.opacity)
- has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case.
- reconsider_lights()
-
/turf/Exited(var/atom/movable/Obj, var/atom/newloc)
. = ..()
diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm
index 90248bce2e..308f8743bc 100644
--- a/code/modules/mining/aux_base.dm
+++ b/code/modules/mining/aux_base.dm
@@ -26,10 +26,9 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
var/obj/item/device/gps/internal/base/locator
circuit = /obj/item/weapon/circuitboard/computer/auxillary_base
-/obj/machinery/computer/auxillary_base/New(location, obj/item/weapon/circuitboard/computer/shuttle/C)
- ..()
- locator = new /obj/item/device/gps/internal/base(src)
-
+/obj/machinery/computer/auxillary_base/Initialize()
+ . = ..()
+ locator = new(src)
/obj/machinery/computer/auxillary_base/attack_hand(mob/user)
if(..(user))
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index 62702fc202..b64c6b9989 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -49,9 +49,9 @@
light_color = LIGHT_COLOR_PINK
-/obj/machinery/computer/camera_advanced/base_construction/New()
- ..()
- RCD = new /obj/item/weapon/construction/rcd/internal(src)
+/obj/machinery/computer/camera_advanced/base_construction/Initialize()
+ . = ..()
+ RCD = new(src)
/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload)
..()
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 96c7cbf6fe..981b97940c 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -199,18 +199,9 @@
max_n_of_items = 10
pixel_y = -4
flags = NODECONSTRUCT
+ var/empty = FALSE
-/obj/machinery/smartfridge/survival_pod/empty
- name = "dusty survival pod storage"
- desc = "A heated storage unit. This one's seen better days."
-
-/obj/machinery/smartfridge/survival_pod/empty/Initialize(mapload)
- ..(mapload, TRUE)
-
-/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
- return isitem(O)
-
-/obj/machinery/smartfridge/survival_pod/Initialize(mapload, empty)
+/obj/machinery/smartfridge/survival_pod/Initialize(mapload)
. = ..()
if(empty)
return
@@ -224,6 +215,14 @@
var/obj/item/device/instrument/guitar/G = new(src)
load(G)
+/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
+ return isitem(O)
+
+/obj/machinery/smartfridge/survival_pod/empty
+ name = "dusty survival pod storage"
+ desc = "A heated storage unit. This one's seen better days."
+ empty = TRUE
+
//Fans
/obj/structure/fans
icon = 'icons/obj/lavaland/survival_pod.dmi'
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index e9961d7b3b..4332343a9b 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -15,11 +15,11 @@
var/obj/item/device/radio/Radio //needed to send messages to sec radio
-/obj/machinery/mineral/labor_claim_console/New()
- ..()
+/obj/machinery/mineral/labor_claim_console/Initialize()
+ . = ..()
Radio = new/obj/item/device/radio(src)
- Radio.listening = 0
- addtimer(CALLBACK(src, .proc/locate_stacking_machine), 7)
+ Radio.listening = FALSE
+ locate_stacking_machine()
/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card/id/prisoner))
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 1dbe2fdce7..f7dabb40aa 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -249,7 +249,7 @@
blue.linked = src
/obj/effect/warp_cube
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/warp_cube/ex_act(severity, target)
return
diff --git a/code/modules/mining/machine_input_output_plates.dm b/code/modules/mining/machine_input_output_plates.dm
index 79a514bcc2..b6f68d4c89 100644
--- a/code/modules/mining/machine_input_output_plates.dm
+++ b/code/modules/mining/machine_input_output_plates.dm
@@ -7,7 +7,8 @@
density = FALSE
anchored = TRUE
-/obj/machinery/mineral/input/New()
+/obj/machinery/mineral/input/Initialize()
+ . = ..()
icon_state = "blank"
/obj/machinery/mineral/output
@@ -17,7 +18,8 @@
density = FALSE
anchored = TRUE
-/obj/machinery/mineral/output/New()
+/obj/machinery/mineral/output/Initialize()
+ . = ..()
icon_state = "blank"
/obj/machinery/mineral
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 0232da4e83..e8d24e223f 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -11,6 +11,8 @@
input_dir = NORTH
output_dir = SOUTH
req_access = list(ACCESS_MINERAL_STOREROOM)
+ speed_process = 1
+ circuit = /obj/item/weapon/circuitboard/machine/ore_redemption
var/req_access_reclaim = ACCESS_MINING_STATION
var/obj/item/weapon/card/id/inserted_id
var/points = 0
@@ -18,7 +20,6 @@
var/sheet_per_ore = 1
var/point_upgrade = 1
var/list/ore_values = list(MAT_GLASS = 1, MAT_METAL = 1, MAT_PLASMA = 15, MAT_SILVER = 16, MAT_GOLD = 18, MAT_TITANIUM = 30, MAT_URANIUM = 30, MAT_DIAMOND = 50, MAT_BLUESPACE = 50, MAT_BANANIUM = 60)
- speed_process = 1
var/message_sent = FALSE
var/list/ore_buffer = list()
var/datum/material_container/materials
@@ -27,8 +28,6 @@
/obj/machinery/mineral/ore_redemption/Initialize()
. = ..()
- var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new
- B.apply_default_parts(src)
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
files = new /datum/research/smelter(src)
@@ -37,17 +36,6 @@
QDEL_NULL(files)
return ..()
-/obj/item/weapon/circuitboard/machine/ore_redemption
- name = "Ore Redemption (Machine Board)"
- build_path = /obj/machinery/mineral/ore_redemption
- origin_tech = "programming=1;engineering=2"
- req_components = list(
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/device/assembly/igniter = 1)
-
/obj/machinery/mineral/ore_redemption/RefreshParts()
var/ore_pickup_rate_temp = 15
var/point_upgrade_temp = 1
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 875380aea8..80965d3cfc 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -7,6 +7,7 @@
icon_state = "mining"
density = TRUE
anchored = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor
var/obj/item/weapon/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, use tabs and not spaces.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
@@ -67,19 +68,6 @@
src.equipment_path = path
src.cost = cost
-/obj/machinery/mineral/equipment_vendor/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/mining_equipment_vendor
- name = "Mining Equipment Vendor (Machine Board)"
- build_path = /obj/machinery/mineral/equipment_vendor
- origin_tech = "programming=1;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/matter_bin = 3)
-
/obj/machinery/mineral/equipment_vendor/power_change()
..()
update_icon()
@@ -207,9 +195,10 @@
/obj/machinery/mineral/equipment_vendor/golem
name = "golem ship equipment vendor"
+ circuit = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem
-/obj/machinery/mineral/equipment_vendor/golem/New()
- ..()
+/obj/machinery/mineral/equipment_vendor/golem/Initialize()
+ . = ..()
desc += "\nIt seems a few selections have been added."
prize_list += list(
new /datum/data/mining_equipment("Extra Id", /obj/item/weapon/card/id/mining, 250),
@@ -223,14 +212,6 @@
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/weapon/bedsheet/rd/royal_cape, 500)
)
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem
- name = "Golem Ship Equipment Vendor (Machine Board)"
- build_path = /obj/machinery/mineral/equipment_vendor/golem
-
-
/**********************Mining Equipment Vendor Items**************************/
/**********************Mining Equipment Voucher**********************/
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 8029cc1416..aa2c85cb8f 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -9,7 +9,7 @@
icon_state = "mining_drone"
icon_living = "mining_drone"
status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
faction = list("neutral")
a_intent = INTENT_HARM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index 9a4eae0a41..0ee136f4a9 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -15,18 +15,16 @@
speed_process = 1
-/obj/machinery/mineral/mint/New()
- ..()
+/obj/machinery/mineral/mint/Initialize()
+ . = ..()
materials = new /datum/material_container(src,
list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM),
max_amt = MINERAL_MATERIAL_AMOUNT*50)
/obj/machinery/mineral/mint/Destroy()
- qdel(materials)
- materials = null
+ QDEL_NULL(materials)
return ..()
-
/obj/machinery/mineral/mint/process()
var/turf/T = get_step(src, input_dir)
if(!T)
diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm
index be0daebbd9..e058782be1 100644
--- a/code/modules/mob/camera/camera.dm
+++ b/code/modules/mob/camera/camera.dm
@@ -5,7 +5,7 @@
density = FALSE
anchored = TRUE
status_flags = GODMODE // You can't damage it.
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
see_in_dark = 7
invisibility = INVISIBILITY_ABSTRACT // No one can see us
sight = SEE_SELF
diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm
index 0b21852a8e..ab4b044cb9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm
@@ -122,7 +122,7 @@
/datum/sprite_accessory/tails/human/shark
name = "Shark"
icon_state = "shark"
- color_src = 0
+ color_src = MUTCOLORS
icon = 'icons/mob/mam_bodyparts.dmi'
/datum/sprite_accessory/tails/human/shark/datashark
@@ -150,8 +150,7 @@
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
- hasinner = 1
- icon = 'icons/mob/mam_bodyparts.dmi'
+ extra = 1
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
@@ -191,6 +190,7 @@
/datum/sprite_accessory/mam_tails_animated
icon = 'icons/mob/mam_bodyparts.dmi'
+
/datum/sprite_accessory/mam_tails_animated/none
name = "None"
@@ -326,7 +326,6 @@
/datum/sprite_accessory/mam_ears/husky
name = "Husky"
icon_state = "wolf"
- hasinner = 1
icon = 'icons/mob/mam_bodyparts.dmi'
extra = 1
@@ -390,7 +389,7 @@
/datum/sprite_accessory/mam_tails/shark
name = "Shark"
icon_state = "shark"
- color_src = 0
+ color_src = MUTCOLORS
/datum/sprite_accessory/mam_tails_animated/shark
name = "Shark"
@@ -436,7 +435,7 @@
/datum/sprite_accessory/mam_ears/wolf
name = "Wolf"
icon_state = "wolf"
- hasinner = 1
+ extra = 1
/datum/sprite_accessory/mam_tails/wolf
name = "Wolf"
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
index 44f8810b56..175e04dcac 100644
--- a/code/modules/mob/living/brain/posibrain.dm
+++ b/code/modules/mob/living/brain/posibrain.dm
@@ -37,7 +37,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
/obj/item/device/mmi/posibrain/proc/ping_ghosts(msg, newlymade)
if(newlymade || GLOB.posibrain_notify_cooldown <= world.time)
- notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/effects/ghost2.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
+ notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
if(!newlymade)
GLOB.posibrain_notify_cooldown = world.time + askDelay
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 9445803adf..56e3f0082a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -171,6 +171,7 @@
if(thrown_thing)
visible_message("[src] has thrown [thrown_thing].")
+ add_logs(src, thrown_thing, "has thrown")
newtonian_move(get_dir(target, src))
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index fec1422ff1..a6055c7d70 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -11,6 +11,8 @@
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ var/disgust = 0
+
//inventory slots
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
@@ -47,4 +49,4 @@
var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
var/icon_render_key = ""
- var/static/list/limb_icon_cache = list()
\ No newline at end of file
+ var/static/list/limb_icon_cache = list()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 11c01bbbce..41ba685cc6 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -225,6 +225,14 @@
else
msg += "[t_He] [t_is] quite chubby.\n"
+ switch(disgust)
+ if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS)
+ msg += "[t_He] looks a bit grossed out.\n"
+ if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED)
+ msg += "[t_He] looks really grossed out.\n"
+ if(DISGUST_LEVEL_DISGUSTED to INFINITY)
+ msg += "[t_He] looks disgusted.\n"
+
if(blood_volume < BLOOD_VOLUME_SAFE)
msg += "[t_He] [t_has] pale skin.\n"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index a23f703185..df5a76b552 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -10,9 +10,9 @@
/datum/species
- var/id = null // if the game needs to manually check your race to do something not included in a proc here, it will use this
- var/limbs_id = null //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans.
- var/name = null // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever
+ var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this
+ var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans.
+ var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever
var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?)
var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race
@@ -21,17 +21,21 @@
var/face_y_offset = 0
var/hair_y_offset = 0
- var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
+ var/hair_color // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
+
var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans)
var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id.
var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc)
var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing
- var/skinned_type = null
+ var/skinned_type
+ var/liked_food = NONE
+ var/disliked_food = GROSS
+ var/toxic_food = TOXIC
var/list/no_equip = list() // slots the race can't equip stuff to
var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids
var/blacklisted = 0 //Flag to exclude from green slime core species.
- var/dangerous_existence = null //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
+ var/dangerous_existence //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
var/say_mod = "says" // affects the speech message
var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have.
var/list/mutant_bodyparts = list() // Parts of the body that are diferent enough from the standard human model that they cause clipping with some equipment
@@ -67,23 +71,21 @@
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
+ var/obj/item/mutanthands
var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue
-
+
var/obj/item/organ/liver/mutantliver
var/obj/item/organ/stomach/mutantstomach
- //Hands
- var/obj/item/mutanthands = null
-
//Citadel snowflake
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
var/whitelisted = 0 //Is this species restricted to certain players?
var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
- ///////////
- // PROCS //
- ///////////
+///////////
+// PROCS //
+///////////
/datum/species/New()
@@ -411,6 +413,7 @@
standing += wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER)
else
standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
+
if(H.socks && H.get_num_legs() >= 2 && !(DIGITIGRADE in species_traits))
var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
if(socks)
@@ -1321,7 +1324,6 @@
target.apply_effect(40, KNOCKDOWN, target.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
target.forcesay(GLOB.hit_appends)
add_logs(user, target, "disarmed", " pushing them to the ground")
-
return
if(randn <= 60)
@@ -1329,7 +1331,6 @@
if(target.pulling)
to_chat(target, "[user] has broken [target]'s grip on [target.pulling]!")
target.stop_pulling()
-
else
I = target.get_active_held_item()
if(target.drop_item())
@@ -1587,6 +1588,7 @@
else
H.throw_alert("temp", /obj/screen/alert/cold, 3)
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod, BURN)
+
else
H.clear_alert("temp")
@@ -1695,9 +1697,9 @@
return
-////////
+////////////
//Stun//
-////////
+////////////
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
. = stunmod * amount
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 804f9bf3a2..07a6ddee47 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -6,6 +6,8 @@
mutantliver = /obj/item/organ/liver/fly
mutantstomach = /obj/item/organ/stomach/fly
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly
+ disliked_food = null
+ liked_food = GROSS
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "pestkiller")
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index d7ff8df172..70df503ff4 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -1,25 +1,27 @@
-/datum/species/human
- name = "Human"
- id = "human"
- default_color = "FFFFFF"
- species_traits = list(MUTCOLORS_PARTSONLY,EYECOLOR,HAIR,FACEHAIR,LIPS)
- mutant_bodyparts = list("tail_human", "ears", "taur")
- default_features = list("tail_human" = "None", "ears" = "None", "taur" = "none")
- use_skintones = 1
- skinned_type = /obj/item/stack/sheet/animalhide/human
-
-
-/datum/species/human/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//Curiosity killed the cat's wagging tail.
-/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- H.endTailWag()
-
-/datum/species/human/space_move(mob/living/carbon/human/H)
- var/obj/item/device/flightpack/F = H.get_flightpack()
- if(istype(F) && (F.flight) && F.allow_thrust(0.01, src))
+/datum/species/human
+ name = "Human"
+ id = "human"
+ default_color = "FFFFFF"
+ species_traits = list(MUTCOLORS_PARTSONLY,EYECOLOR,HAIR,FACEHAIR,LIPS)
+ mutant_bodyparts = list("tail_human", "ears", "taur")
+ default_features = list("tail_human" = "None", "ears" = "None", "taur" = "none")
+ use_skintones = 1
+ skinned_type = /obj/item/stack/sheet/animalhide/human
+ disliked_food = GROSS | RAW
+ liked_food = JUNKFOOD | FRIED
+
+
+/datum/species/human/qualifies_for_rank(rank, list/features)
+ return TRUE
+
+//Curiosity killed the cat's wagging tail.
+/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
+ if(H)
+ H.endTailWag()
+
+/datum/species/human/space_move(mob/living/carbon/human/H)
+ var/obj/item/device/flightpack/F = H.get_flightpack()
+ if(istype(F) && (F.flight) && F.allow_thrust(0.01, src))
return TRUE
datum/species/human/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
@@ -28,4 +30,4 @@ datum/species/human/on_species_gain(mob/living/carbon/human/H, datum/species/old
if(H.dna.features["tail_human"] == "Cat")
var/tail = /obj/item/organ/tail/cat
mutant_organs += tail
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 59bf481369..4fa5193b40 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -9,6 +9,8 @@
exotic_blood = "slimejelly"
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
+ toxic_food = MEAT | DAIRY
+ liked_food = TOXIC
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
if(regenerate_limbs)
@@ -324,4 +326,4 @@
M.transfer_to(dupe)
dupe.visible_message("[dupe] blinks and looks \
around.",
- "...and move this one instead.")
\ No newline at end of file
+ "...and move this one instead.")
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 8adc1f19f3..822bd03a21 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -16,6 +16,8 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard
skinned_type = /obj/item/stack/sheet/animalhide/lizard
exotic_bloodtype = "L"
+ disliked_food = GRAIN | DAIRY
+ liked_food = GROSS | MEAT
/datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H)
H.grant_language(/datum/language/draconic)
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 89bd803e12..028d277569 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -17,6 +17,8 @@
speedmod = 1
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
var/internal_fire = FALSE //If the bones themselves are burning clothes won't help you much
+ disliked_food = FRUIT
+ liked_food = VEGETABLES
/datum/species/plasmaman/spec_life(mob/living/carbon/human/H)
var/datum/gas_mixture/environment = H.loc.return_air()
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index cdfa938456..10be1eb2b8 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -10,6 +10,8 @@
burnmod = 1.25
heatmod = 1.5
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
+ disliked_food = MEAT | DAIRY
+ liked_food = VEGETABLES | FRUIT | GRAIN
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index df91f19bb0..8246d5a949 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -8,4 +8,6 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/bone)
- damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
\ No newline at end of file
+ damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
+ disliked_food = NONE
+ liked_food = GROSS | MEAT | RAW
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 3916f64fbb..c6fba442de 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -118,4 +118,4 @@
else
return ..()
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index e75f862f58..01c63db0c1 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -9,6 +9,8 @@
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/zombie)
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
+ disliked_food = NONE
+ liked_food = GROSS | MEAT | RAW
/datum/species/zombie/infectious
name = "Infectious Zombie"
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 1aef45aff8..a9d6bda10a 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -521,8 +521,21 @@ generate/load female uniform sprites matching all previously decided variables
. += "-[gender]"
+
+ var/is_taur = FALSE
+ var/mob/living/carbon/human/H = src
+ if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
+ is_taur = TRUE
+
+
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
+
+ if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg))
+ if(is_taur)
+ continue
+
+
. += "-[BP.body_zone]"
if(BP.status == BODYPART_ORGANIC)
. += "-organic"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 5a618544f0..f1a6998523 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -431,4 +431,3 @@
adjustToxLoss(8)
if(prob(30))
to_chat(src, "You feel confused and nauseous...")//actual symptoms of liver failure
-
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index 0216c63942..ce14664a0e 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -63,6 +63,17 @@
clear_fullscreen("high")
clear_alert("high")
+/mob/living/carbon/adjust_disgust(amount)
+ var/old_disgust = disgust
+ if(amount>0)
+ disgust = min(disgust+amount, DISGUST_LEVEL_MAXEDOUT)
+
+ else if(old_disgust)
+ disgust = max(disgust+amount, 0)
+
+/mob/living/carbon/set_disgust(amount)
+ if(amount >= 0)
+ disgust = amount
/mob/living/carbon/cure_blind()
if(disabilities & BLIND)
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 46f9efad07..d2013f458d 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -234,11 +234,22 @@
if(limb_icon_cache[icon_render_key])
load_limb_from_cache()
return
+ //Taur code goes here, since humans just inherit this proc
+ var/is_taur = FALSE
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
+ is_taur = TRUE
//GENERATE NEW LIMBS
var/list/new_limbs = list()
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
+
+ if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg))
+ if(is_taur)
+ continue
+
new_limbs += BP.get_limb_icon()
if(new_limbs.len)
overlays_standing[BODYPARTS_LAYER] = new_limbs
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 63a3c3dfa6..40219161c6 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -61,6 +61,7 @@
if(!gibbed)
GLOB.dead_mob_list += src
set_drugginess(0)
+ set_disgust(0)
SetSleeping(0, 0)
blind_eyes(1)
reset_perspective(null)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index ff37b85800..d81c4ae0cd 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -465,7 +465,6 @@
/datum/emote/living/spin
key = "spin"
key_third_person = "spins"
- message = "spins around dizzily!"
/datum/emote/living/spin/run_emote(mob/user)
user.spin(20, 1)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 567061e1a4..16580ab64e 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -374,6 +374,7 @@
setBrainLoss(0)
setStaminaLoss(0, 0)
SetUnconscious(0, FALSE)
+ set_disgust(0)
SetStun(0, FALSE)
SetKnockdown(0, FALSE)
SetSleeping(0, FALSE)
@@ -550,6 +551,7 @@
if(!restrained(ignore_grab = 1) && pulledby)
visible_message("[src] resists against [pulledby]'s grip!")
resist_grab()
+ add_logs(pulledby, src, "resisted grab")
return
//unbuckling yourself
@@ -587,6 +589,7 @@
if(pulledby.grab_state)
if(prob(30/pulledby.grab_state))
visible_message("[src] has broken free of [pulledby]'s grip!")
+ add_logs(pulledby, src, "broke grab")
pulledby.stop_pulling()
return 0
if(moving_resist && client) //we resisted by trying to move
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 2cf7803294..a4c49ccc7e 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -89,7 +89,7 @@
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration)
apply_damage(I.throwforce, dtype, zone, armor)
if(I.thrownby)
- add_logs(I.thrownby, src, "hit", I)
+ add_logs(I.thrownby, src, "threw and hit", I)
else
return 1
else
@@ -150,6 +150,7 @@
var/grab_upgrade_time = 30
visible_message("[user] starts to tighten [user.p_their()] grip on [src]!", \
"[user] starts to tighten [user.p_their()] grip on you!")
+ add_logs(user, src, "attempted to strangle", addition="grab")
if(!do_mob(user, src, grab_upgrade_time))
return 0
if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB)
@@ -157,18 +158,20 @@
user.grab_state++
switch(user.grab_state)
if(GRAB_AGGRESSIVE)
- add_logs(user, src, "grabbed", addition="aggressively")
+ add_logs(user, src, "grabbed", addition="aggressive grab")
visible_message("[user] has grabbed [src] aggressively!", \
"[user] has grabbed [src] aggressively!")
drop_all_held_items()
stop_pulling()
if(GRAB_NECK)
+ add_logs(user, src, "grabbed", addition="neck grab")
visible_message("[user] has grabbed [src] by the neck!",\
"[user] has grabbed you by the neck!")
update_canmove() //we fall down
if(!buckled && !density)
Move(user.loc)
if(GRAB_KILL)
+ add_logs(user, src, "strangled", addition="grab")
visible_message("[user] is strangling [src]!", \
"[user] is strangling you!")
update_canmove() //we fall down
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index c6dd372532..e3186005c7 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -4,7 +4,7 @@
var/obj/machinery/camera/current = null
icon = 'icons/mob/pai.dmi'
icon_state = "repairbot"
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
density = FALSE
luminosity = 0
pass_flags = PASSTABLE | PASSMOB
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 85add99704..eeeb39e44b 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -11,7 +11,7 @@
/mob/living/silicon/robot/proc/uneq_module(obj/item/O)
if(!O)
return 0
- O.mouse_opacity = 2
+ O.mouse_opacity = MOUSE_OPACITY_OPAQUE
if(istype(O, /obj/item/borg/sight))
var/obj/item/borg/sight/S = O
sight_mode &= ~S.sight_mode
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 8df0780d97..532d0c6edb 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -122,7 +122,7 @@
I.forceMove(src)
modules += I
I.flags |= NODROP
- I.mouse_opacity = 2
+ I.mouse_opacity = MOUSE_OPACITY_OPAQUE
if(nonstandard)
added_modules += I
if(requires_rebuild)
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 75a1759e1d..5728c8714c 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -43,7 +43,7 @@
/mob/living/simple_animal/mouse/death(gibbed, toast)
if(!ckey)
..(1)
- var/obj/item/trash/deadmouse/M = new(src.loc)
+ var/obj/item/weapon/reagent_containers/food/snacks/deadmouse/M = new(loc)
M.icon_state = icon_dead
M.name = name
if(toast)
@@ -101,8 +101,12 @@
response_harm = "splats"
gold_core_spawnable = 0
-/obj/item/trash/deadmouse
+/obj/item/weapon/reagent_containers/food/snacks/deadmouse
name = "dead mouse"
- desc = "It looks like somebody dropped the bass on it."
+ desc = "It looks like somebody dropped the bass on it. A lizard's favorite meal."
icon = 'icons/mob/animal.dmi'
icon_state = "mouse_gray_dead"
+ bitesize = 3
+ eatverb = "devours"
+ list_reagents = list("nutriment" = 3, "vitamin" = 2)
+ foodtype = GROSS | MEAT | RAW
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index d70055779c..f59b5332da 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -32,7 +32,7 @@
move_to_delay = 0
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
movement_type = FLYING
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index fad110c955..bf40a95070 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -262,14 +262,14 @@ Difficulty: Very Hard
return FALSE
return TRUE
-/obj/machinery/smartfridge/black_box/New()
+/obj/machinery/smartfridge/black_box/Initialize()
+ . = ..()
var/static/obj/machinery/smartfridge/black_box/current
if(current && current != src)
qdel(src, force=TRUE)
return
current = src
ReadMemory()
- . = ..()
/obj/machinery/smartfridge/black_box/process()
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index f9a6575d1e..fa79630c28 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -197,7 +197,7 @@ Difficulty: Medium
return
animate(src, alpha = 100, transform = matrix()*0.7, time = 7)
swooping |= SWOOP_INVULNERABLE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
sleep(7)
var/list/flame_hit = list()
while(swoop_duration > 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index dc20e97e0d..620dd19706 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -49,7 +49,7 @@ Difficulty: Medium
elimination = 1
idle_vision_range = 13
appearance_flags = 0
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
/mob/living/simple_animal/hostile/megafauna/legion/Initialize()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 3e2be10d79..c214ee0490 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -44,7 +44,7 @@
anchored = TRUE
mob_size = MOB_SIZE_LARGE
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
- mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
+ mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
/mob/living/simple_animal/hostile/megafauna/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index cf2dd5c1f9..fb91af84f6 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -8,7 +8,7 @@
icon_aggro = "Goliath_alert"
icon_dead = "Goliath_dead"
icon_gib = "syndicate_gib"
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
move_to_delay = 40
ranged = 1
ranged_cooldown_time = 120
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 7f38bebcfb..bfc7979cb3 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -7,7 +7,7 @@
icon_aggro = "Hivelord_alert"
icon_dead = "Hivelord_dead"
icon_gib = "syndicate_gib"
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
move_to_delay = 14
ranged = 1
vision_range = 5
@@ -50,7 +50,7 @@
loot += crusher_loot //we don't butcher
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
..(gibbed)
//A fragile but rapidly produced creature
@@ -63,7 +63,7 @@
icon_aggro = "Hivelordbrood"
icon_dead = "Hivelordbrood"
icon_gib = "syndicate_gib"
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
move_to_delay = 1
friendly = "buzzes near"
vision_range = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 74bfff8456..ceb6e814a7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -22,7 +22,7 @@
faction = list("mushroom")
environment_smash = ENVIRONMENT_SMASH_NONE
stat_attack = 2
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
speed = 1
ventcrawler = VENTCRAWLER_ALWAYS
robust_searching = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index cff532b62b..8355bd2e27 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -33,7 +33,7 @@
/obj/effect/ebeam/vine
name = "thick vine"
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
desc = "A thick vine, painful to the touch."
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index 8266903dfa..fff5781405 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -8,7 +8,7 @@
icon_aggro = "Fugu"
icon_dead = "Fugu_dead"
icon_gib = "syndicate_gib"
- mouse_opacity = 2
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
move_to_delay = 5
friendly = "floats near"
speak_emote = list("puffs")
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 0941ef9816..7f2ba4bdb2 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -327,6 +327,7 @@
if(AM.pulledby)
if(!supress_message)
visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.")
+ add_logs(AM, AM.pulledby, "pulled from", src)
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
pulling = AM
@@ -337,6 +338,7 @@
if(ismob(AM))
var/mob/M = AM
+ add_logs(src, M, "grabbed", addition="passive grab")
if(!supress_message)
visible_message("[src] has grabbed [M] passively!")
if(!iscarbon(src))
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index f25a01b9fe..bd938cf598 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -219,6 +219,14 @@
/mob/proc/set_drugginess(amount)
return
+/////////////////////////////////// GROSSED OUT ////////////////////////////////////
+
+/mob/proc/adjust_disgust(amount)
+ return
+
+/mob/proc/set_disgust(amount)
+ return
+
/////////////////////////////////// BLIND DISABILITY ////////////////////////////////////
/mob/proc/cure_blind() //when we want to cure the BLIND disability only.
diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm
index 18b96d033e..3b1d2c03fb 100644
--- a/code/modules/modular_computers/NTNet/NTNet_relay.dm
+++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm
@@ -9,6 +9,7 @@
icon_state = "bus"
anchored = TRUE
density = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/ntnet_relay
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
var/enabled = 1 // Set to 0 if the relay was turned off
var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
@@ -95,18 +96,16 @@
/obj/machinery/ntnet_relay/attack_hand(mob/living/user)
ui_interact(user)
-/obj/machinery/ntnet_relay/New()
+/obj/machinery/ntnet_relay/Initialize()
uid = gl_uid
gl_uid++
component_parts = list()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/ntnet_relay(null)
- B.apply_default_parts(src)
if(GLOB.ntnet_global)
GLOB.ntnet_global.relays.Add(src)
NTNet = GLOB.ntnet_global
GLOB.ntnet_global.add_log("New quantum relay activated. Current amount of linked relays: [NTNet.relays.len]")
- ..()
+ . = ..()
/obj/machinery/ntnet_relay/Destroy()
if(GLOB.ntnet_global)
@@ -118,12 +117,4 @@
D.target = null
D.error = "Connection to quantum relay severed"
- return ..()
-
-/obj/item/weapon/circuitboard/machine/ntnet_relay
- name = "NTNet Relay (Machine Board)"
- build_path = /obj/machinery/ntnet_relay
- origin_tech = "programming=3;bluespace=3;magnets=2"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 49dedd0cd3..76cacc00ef 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -11,7 +11,7 @@ It is possible to destroy the net by the occupant or someone else.
density = TRUE//Can't pass through.
opacity = 0//Can see through.
- mouse_opacity = 1//So you can hit it with stuff.
+ mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff.
anchored = TRUE//Can't drag/grab the trapped mob.
layer = ABOVE_ALL_MOB_LAYER
max_integrity = 25 //How much health it has.
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index 3fcec8b3bf..d12dcc3623 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -29,8 +29,8 @@
var/stored_power = 0//Power to deploy per tick
-/obj/machinery/power/am_control_unit/New()
- ..()
+/obj/machinery/power/am_control_unit/Initialize()
+ . = ..()
linked_shielding = list()
linked_cores = list()
@@ -39,8 +39,7 @@
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
AMS.control_unit = null
qdel(AMS)
- qdel(fueljar)
- fueljar = null
+ QDEL_NULL(fueljar)
return ..()
diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm
index 8437738586..ee613108d6 100644
--- a/code/modules/power/monitor.dm
+++ b/code/modules/power/monitor.dm
@@ -16,8 +16,8 @@
var/record_interval = 50
var/next_record = 0
-/obj/machinery/computer/monitor/New()
- ..()
+/obj/machinery/computer/monitor/Initialize()
+ . = ..()
search()
history["supply"] = list()
history["demand"] = list()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index c5fcc2b018..0dec9eaf09 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -54,11 +54,11 @@
/obj/machinery/power/port_gen/pacman
name = "\improper P.A.C.M.A.N.-type portable generator"
+ circuit = /obj/item/weapon/circuitboard/machine/pacman
var/sheets = 0
var/max_sheets = 100
var/sheet_name = ""
var/sheet_path = /obj/item/stack/sheet/mineral/plasma
- var/board_path = /obj/item/weapon/circuitboard/machine/pacman
var/sheet_left = 0 // How much is left of the sheet
var/time_per_sheet = 260
var/current_heat = 0
@@ -68,34 +68,12 @@
if(anchored)
connect_to_network()
-/obj/machinery/power/port_gen/pacman/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new board_path(null)
- B.apply_default_parts(src)
+/obj/machinery/power/port_gen/pacman/Initialize()
+ . = ..()
var/obj/sheet = new sheet_path(null)
sheet_name = sheet.name
-/obj/item/weapon/circuitboard/machine/pacman
- name = "PACMAN-type Generator (Machine Board)"
- build_path = /obj/machinery/power/port_gen/pacman
- origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/capacitor = 1)
-
-/obj/item/weapon/circuitboard/machine/pacman/super
- name = "SUPERPACMAN-type Generator (Machine Board)"
- build_path = /obj/machinery/power/port_gen/pacman/super
- origin_tech = "programming=3;powerstorage=4;engineering=4"
-
-/obj/item/weapon/circuitboard/machine/pacman/mrs
- name = "MRSPACMAN-type Generator (Machine Board)"
- build_path = "/obj/machinery/power/port_gen/pacman/mrs"
- origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4"
-
/obj/machinery/power/port_gen/pacman/Destroy()
DropFuel()
return ..()
@@ -294,10 +272,10 @@
name = "\improper S.U.P.E.R.P.A.C.M.A.N.-type portable generator"
icon_state = "portgen1_0"
base_icon = "portgen1"
+ circuit = /obj/item/weapon/circuitboard/machine/pacman/super
sheet_path = /obj/item/stack/sheet/mineral/uranium
power_gen = 15000
time_per_sheet = 85
- board_path = /obj/item/weapon/circuitboard/machine/pacman/super
/obj/machinery/power/port_gen/pacman/super/overheat()
explosion(src.loc, 3, 3, 3, -1)
@@ -306,10 +284,10 @@
name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator"
base_icon = "portgen2"
icon_state = "portgen2_0"
+ circuit = /obj/item/weapon/circuitboard/machine/pacman/mrs
sheet_path = /obj/item/stack/sheet/mineral/diamond
power_gen = 40000
time_per_sheet = 80
- board_path = /obj/item/weapon/circuitboard/machine/pacman/mrs
/obj/machinery/power/port_gen/pacman/mrs/overheat()
explosion(src.loc, 4, 4, 4, -1)
diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm
index 9ec0e46da1..84fa86c180 100644
--- a/code/modules/power/rtg.dm
+++ b/code/modules/power/rtg.dm
@@ -9,6 +9,7 @@
density = TRUE
anchored = TRUE
use_power = NO_POWER_USE
+ circuit = /obj/item/weapon/circuitboard/machine/rtg
// You can buckle someone to RTG, then open its panel. Fun stuff.
can_buckle = TRUE
@@ -16,23 +17,9 @@
buckle_requires_restraints = TRUE
var/power_gen = 1000 // Enough to power a single APC. 4000 output with T4 capacitor.
- var/board_path = /obj/item/weapon/circuitboard/machine/rtg
+
var/irradiate = TRUE // RTGs irradiate surroundings, but only when panel is open.
-/obj/machinery/power/rtg/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new board_path(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/rtg
- name = "RTG (Machine Board)"
- build_path = /obj/machinery/power/rtg
- origin_tech = "programming=2;materials=4;powerstorage=3;engineering=2"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it.
-
/obj/machinery/power/rtg/Initialize()
. = ..()
connect_to_network()
@@ -68,20 +55,7 @@
/obj/machinery/power/rtg/advanced
desc = "An advanced RTG capable of moderating isotope decay, increasing power output but reducing lifetime. It uses plasma-fueled radiation collectors to increase output even further."
power_gen = 1250 // 2500 on T1, 10000 on T4.
- board_path = /obj/item/weapon/circuitboard/machine/rtg/advanced
-
-/obj/item/weapon/circuitboard/machine/rtg/advanced
- name = "Advanced RTG (Machine Board)"
- build_path = /obj/machinery/power/rtg/advanced
- origin_tech = "programming=3;materials=5;powerstorage=4;engineering=3;plasmatech=3"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/stack/sheet/mineral/uranium = 10,
- /obj/item/stack/sheet/mineral/plasma = 5)
-
-
+ circuit = /obj/item/weapon/circuitboard/machine/rtg/advanced
// Void Core, power source for Abductor ships and bases.
// Provides a lot of power, but tends to explode when mistreated.
@@ -91,25 +65,13 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "core"
desc = "An alien power source that produces energy seemingly out of nowhere."
- board_path = /obj/item/weapon/circuitboard/machine/abductor/core
+ circuit = /obj/item/weapon/circuitboard/machine/abductor/core
power_gen = 20000 // 280 000 at T1, 400 000 at T4. Starts at T4.
irradiate = FALSE // Green energy!
can_buckle = FALSE
pixel_y = 7
var/going_kaboom = FALSE // Is it about to explode?
-/obj/item/weapon/circuitboard/machine/abductor/core
- name = "alien board (Void Core)"
- build_path = /obj/machinery/power/rtg/abductor
- origin_tech = "programming=5;abductor=5;powerstorage=8;engineering=8"
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/cell/infinite/abductor = 1)
- def_components = list(
- /obj/item/weapon/stock_parts/capacitor = /obj/item/weapon/stock_parts/capacitor/quadratic,
- /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra)
-
/obj/machinery/power/rtg/abductor/proc/overload()
if(going_kaboom)
return
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 126012542b..553b932d53 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -21,8 +21,8 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/anchored
anchored = TRUE
-/obj/machinery/power/rad_collector/New()
- ..()
+/obj/machinery/power/rad_collector/Initialize()
+ . = ..()
GLOB.rad_collectors += src
/obj/machinery/power/rad_collector/Destroy()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 6e4942807f..1e4baee4be 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -3,20 +3,17 @@
desc = "A heavy-duty industrial laser, often used in containment fields and power generation.\nAlt-click to rotate it clockwise."
icon = 'icons/obj/singularity.dmi'
icon_state = "emitter"
- var/icon_state_on = "emitter_+a"
+
anchored = FALSE
density = TRUE
req_access = list(ACCESS_ENGINE_EQUIP)
-
- // The following 3 vars are mostly for the prototype
- var/manual = FALSE
- var/charge = 0
- var/atom/target = null
+ circuit = /obj/item/weapon/circuitboard/machine/emitter
use_power = NO_POWER_USE
idle_power_usage = 10
active_power_usage = 300
+ var/icon_state_on = "emitter_+a"
var/active = 0
var/powered = 0
var/fire_delay = 100
@@ -33,6 +30,11 @@
var/datum/effect_system/spark_spread/sparks
+ // The following 3 vars are mostly for the prototype
+ var/manual = FALSE
+ var/charge = 0
+ var/atom/target
+
/obj/machinery/power/emitter/anchored
anchored = TRUE
@@ -46,20 +48,16 @@
state = 2
use_power = FALSE
-/obj/machinery/power/emitter/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null)
- B.apply_default_parts(src)
+/obj/machinery/power/emitter/Initialize()
+ . = ..()
RefreshParts()
wires = new /datum/wires/emitter(src)
+ if(state == 2 && anchored)
+ connect_to_network()
-/obj/item/weapon/circuitboard/machine/emitter
- name = "Emitter (Machine Board)"
- build_path = /obj/machinery/power/emitter
- origin_tech = "programming=3;powerstorage=4;engineering=4"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/manipulator = 1)
+ sparks = new
+ sparks.attach(src)
+ sparks.set_up(5, TRUE, src)
/obj/machinery/power/emitter/RefreshParts()
var/max_firedelay = 120
@@ -100,15 +98,6 @@
else
rotate()
-/obj/machinery/power/emitter/Initialize()
- . = ..()
- if(state == 2 && anchored)
- connect_to_network()
-
- sparks = new
- sparks.attach(src)
- sparks.set_up(5, TRUE, src)
-
/obj/machinery/power/emitter/Destroy()
if(SSticker.IsRoundInProgress())
var/turf/T = get_turf(src)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index af62860218..90566dffda 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -49,8 +49,8 @@ field_generator power level display
add_overlay("+p[power_level]")
-/obj/machinery/field/generator/New()
- ..()
+/obj/machinery/field/generator/Initialize()
+ . = ..()
fields = list()
connected_gens = list()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 697a80d7cd..b8b26e9447 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -19,10 +19,10 @@
var/powered = 0
mouse_opacity = 2
-/obj/machinery/particle_accelerator/control_box/New()
+/obj/machinery/particle_accelerator/control_box/Initialize()
+ . = ..()
wires = new /datum/wires/particle_accelerator/control_box(src)
connected_parts = list()
- ..()
/obj/machinery/particle_accelerator/control_box/Destroy()
if(active)
@@ -31,8 +31,7 @@
var/obj/structure/particle_accelerator/part = CP
part.master = null
connected_parts.Cut()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user)
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm.rej b/code/modules/power/singularity/particle_accelerator/particle_control.dm.rej
new file mode 100644
index 0000000000..c8e42a734f
--- /dev/null
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm (rejected hunks)
+@@ -17,7 +17,7 @@
+ var/active = 0
+ var/strength = 0
+ var/powered = 0
+- mouse_opacity = 2
++ mouse_opacity = MOUSE_OPACITY_OPAQUE
+
+ /obj/machinery/particle_accelerator/control_box/Initialize()
+ . = ..()
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 50f01f4259..452a793bd6 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -21,6 +21,7 @@
density = TRUE
anchored = TRUE
use_power = NO_POWER_USE
+ circuit = /obj/item/weapon/circuitboard/machine/smes
var/capacity = 5e6 // maximum charge
var/charge = 0 // actual charge
@@ -43,36 +44,21 @@
if(!terminal)
to_chat(user, "This SMES has no power terminal!")
-/obj/machinery/power/smes/New()
+/obj/machinery/power/smes/Initialize()
..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smes(null)
- B.apply_default_parts(src)
-
- spawn(5)
- dir_loop:
- for(var/d in GLOB.cardinals)
- var/turf/T = get_step(src, d)
- for(var/obj/machinery/power/terminal/term in T)
- if(term && term.dir == turn(d, 180))
- terminal = term
- break dir_loop
+ dir_loop:
+ for(var/d in GLOB.cardinals)
+ var/turf/T = get_step(src, d)
+ for(var/obj/machinery/power/terminal/term in T)
+ if(term && term.dir == turn(d, 180))
+ terminal = term
+ break dir_loop
if(!terminal)
stat |= BROKEN
return
terminal.master = src
update_icon()
- return
-
-/obj/item/weapon/circuitboard/machine/smes
- name = "SMES (Machine Board)"
- build_path = /obj/machinery/power/smes
- origin_tech = "programming=3;powerstorage=3;engineering=3"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/cell = 5,
- /obj/item/weapon/stock_parts/capacitor = 1)
- def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high/empty)
/obj/machinery/power/smes/RefreshParts()
var/IO = 0
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index b00bcb0c28..1d795b3307 100644
--- a/code/modules/power/terminal.dm
+++ b/code/modules/power/terminal.dm
@@ -13,15 +13,16 @@
layer = WIRE_TERMINAL_LAYER //a bit above wires
-/obj/machinery/power/terminal/New()
- ..()
- var/turf/T = src.loc
- if(level==1) hide(T.intact)
- return
+/obj/machinery/power/terminal/Initialize()
+ . = ..()
+ var/turf/T = get_turf(src)
+ if(level == 1)
+ hide(T.intact)
/obj/machinery/power/terminal/Destroy()
if(master)
master.disconnect_terminal()
+ master = null
return ..()
/obj/machinery/power/terminal/hide(i)
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index ee135b13b5..01e8e18659 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -11,23 +11,17 @@
buckle_lying = FALSE
buckle_requires_restraints = TRUE
+ circuit = /obj/item/weapon/circuitboard/machine/tesla_coil
+
var/power_loss = 2
var/input_power_multiplier = 1
var/zap_cooldown = 100
var/last_zap = 0
-/obj/machinery/power/tesla_coil/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/tesla_coil(null)
- B.apply_default_parts(src)
+/obj/machinery/power/tesla_coil/Initialize()
+ . = ..()
wires = new /datum/wires/tesla_coil(src)
-/obj/item/weapon/circuitboard/machine/tesla_coil
- name = "Tesla Coil (Machine Board)"
- build_path = /obj/machinery/power/tesla_coil
- origin_tech = "programming=3;magnets=3;powerstorage=3"
- req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
-
/obj/machinery/power/tesla_coil/RefreshParts()
var/power_multiplier = 0
zap_cooldown = 100
@@ -109,16 +103,7 @@
buckle_lying = FALSE
buckle_requires_restraints = TRUE
-/obj/machinery/power/grounding_rod/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/grounding_rod(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/grounding_rod
- name = "Grounding Rod (Machine Board)"
- build_path = /obj/machinery/power/grounding_rod
- origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2"
- req_components = list(/obj/item/weapon/stock_parts/capacitor = 1)
+ circuit = /obj/item/weapon/circuitboard/machine/grounding_rod
/obj/machinery/power/grounding_rod/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
. = ..()
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 650b320bdb..9137a8731a 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -18,8 +18,8 @@
var/sun_angle = 0 // sun angle as set by sun datum
var/obj/machinery/power/solar_control/control = null
-/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S)
- ..(loc)
+/obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S)
+ . = ..()
Make(S)
connect_to_network()
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index ea4dfd95db..ed7c6824eb 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -31,6 +31,7 @@
density = TRUE
resistance_flags = FIRE_PROOF
CanAtmosPass = ATMOS_PASS_DENSITY
+ circuit = /obj/item/weapon/circuitboard/machine/power_compressor
var/obj/machinery/power/turbine/turbine
var/datum/gas_mixture/gas_contained
var/turf/inturf
@@ -51,6 +52,7 @@
density = TRUE
resistance_flags = FIRE_PROOF
CanAtmosPass = ATMOS_PASS_DENSITY
+ circuit = /obj/item/weapon/circuitboard/machine/power_turbine
var/opened = 0
var/obj/machinery/power/compressor/compressor
var/turf/outturf
@@ -68,25 +70,12 @@
// the inlet stage of the gas turbine electricity generator
-/obj/machinery/power/compressor/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/power_compressor(null)
- B.apply_default_parts(src)
-// The inlet of the compressor is the direction it faces
-
+/obj/machinery/power/compressor/Initialize()
+ . = ..()
+ // The inlet of the compressor is the direction it faces
gas_contained = new
inturf = get_step(src, dir)
-/obj/item/weapon/circuitboard/machine/power_compressor
- name = "Power Compressor (Machine Board)"
- build_path = /obj/machinery/power/compressor
- origin_tech = "programming=4;powerstorage=4;engineering=4"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/manipulator = 6)
-
-/obj/machinery/power/compressor/Initialize()
- . = ..()
locate_machinery()
if(!turbine)
stat |= BROKEN
@@ -186,23 +175,10 @@
#define TURBGENQ 100000
#define TURBGENG 0.5
-/obj/machinery/power/turbine/New()
- ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/power_turbine(null)
- B.apply_default_parts(src)
-// The outlet is pointed at the direction of the turbine component
- outturf = get_step(src, dir)
-
-/obj/item/weapon/circuitboard/machine/power_turbine
- name = "Power Turbine (Machine Board)"
- build_path = /obj/machinery/power/turbine
- origin_tech = "programming=4;powerstorage=4;engineering=4"
- req_components = list(
- /obj/item/stack/cable_coil = 5,
- /obj/item/weapon/stock_parts/capacitor = 6)
-
/obj/machinery/power/turbine/Initialize()
. = ..()
+// The outlet is pointed at the direction of the turbine component
+ outturf = get_step(src, dir)
locate_machinery()
if(!compressor)
stat |= BROKEN
diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm
index 7617c57100..ac9508138c 100644
--- a/code/modules/projectiles/guns/beam_rifle.dm
+++ b/code/modules/projectiles/guns/beam_rifle.dm
@@ -714,7 +714,7 @@
light_power = 1
light_range = 2
light_color = "#00ffff"
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
flags = ABSTRACT
appearance_flags = 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 75435885b8..28d2cd7f45 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -6,7 +6,7 @@
anchored = TRUE
flags = ABSTRACT
pass_flags = PASSTABLE
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
hitsound = 'sound/weapons/pierce.ogg'
var/hitsound_wall = ""
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index a062d5c614..54d17497f3 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -370,9 +370,8 @@
else
if(cached_my_atom.type == C.required_container)
matching_container = 1
- if (isliving(cached_my_atom)) //Makes it so certain chemical reactions don't occur in mobs
- if (C.mob_react)
- return
+ if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs
+ return
if(!C.required_other)
matching_other = 1
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 3811512a02..716943e7f4 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -229,6 +229,7 @@
amount = 5
recharge_delay = 30
dispensable_reagents = list()
+ circuit = /obj/item/weapon/circuitboard/machine/chem_dispenser
var/list/dispensable_reagent_tiers = list(
list(
"hydrogen",
@@ -272,23 +273,6 @@
)
)
-/obj/machinery/chem_dispenser/constructable/Initialize()
- . = ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_dispenser(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/chem_dispenser
- name = "Portable Chem Dispenser (Machine Board)"
- build_path = /obj/machinery/chem_dispenser/constructable
- origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/capacitor = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1,
- /obj/item/weapon/stock_parts/cell = 1)
- def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high)
-
/obj/machinery/chem_dispenser/constructable/RefreshParts()
var/time = 0
var/i
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 3d1c2b4a9c..b43841c43b 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -7,24 +7,12 @@
use_power = IDLE_POWER_USE
idle_power_usage = 40
resistance_flags = FIRE_PROOF | ACID_PROOF
+ circuit = /obj/item/weapon/circuitboard/machine/chem_heater
var/obj/item/weapon/reagent_containers/beaker = null
var/target_temperature = 300
var/heater_coefficient = 0.10
var/on = FALSE
-/obj/machinery/chem_heater/Initialize()
- . = ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_heater(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/chem_heater
- name = "Chemical Heater (Machine Board)"
- build_path = /obj/machinery/chem_heater
- origin_tech = "programming=2;engineering=2;biotech=2"
- req_components = list(
- /obj/item/weapon/stock_parts/micro_laser = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
/obj/machinery/chem_heater/RefreshParts()
heater_coefficient = 0.10
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index d902ed7b13..c0d5fef9cc 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -3,11 +3,13 @@
desc = "Used to separate chemicals and distribute them in a variety of forms."
density = TRUE
anchored = TRUE
+ layer = BELOW_OBJ_LAYER
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0"
use_power = IDLE_POWER_USE
idle_power_usage = 20
resistance_flags = FIRE_PROOF | ACID_PROOF
+ circuit = /obj/item/weapon/circuitboard/machine/chem_master
var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/bottle = null
var/mode = 1
@@ -15,39 +17,12 @@
var/screen = "home"
var/analyzeVars[0]
var/useramount = 30 // Last used amount
- layer = BELOW_OBJ_LAYER
/obj/machinery/chem_master/Initialize()
create_reagents(100)
add_overlay("waitlight")
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_master(null)
- B.apply_default_parts(src)
. = ..()
-/obj/item/weapon/circuitboard/machine/chem_master
- name = "ChemMaster 3000 (Machine Board)"
- build_path = /obj/machinery/chem_master
- origin_tech = "materials=3;programming=2;biotech=3"
- req_components = list(
- /obj/item/weapon/reagent_containers/glass/beaker = 2,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/console_screen = 1)
-
-/obj/item/weapon/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/screwdriver))
- var/new_name = "ChemMaster"
- var/new_path = /obj/machinery/chem_master
-
- if(build_path == /obj/machinery/chem_master)
- new_name = "CondiMaster"
- new_path = /obj/machinery/chem_master/condimaster
-
- build_path = new_path
- name = "[new_name] 3000 (Machine Board)"
- to_chat(user, "You change the circuit board setting to \"[new_name]\".")
- else
- return ..()
-
/obj/machinery/chem_master/RefreshParts()
reagents.maximum_volume = 0
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in component_parts)
@@ -360,7 +335,3 @@
name = "CondiMaster 3000"
desc = "Used to create condiments and other cooking supplies."
condi = 1
-
-/obj/item/weapon/circuitboard/machine/chem_master/condi
- name = "CondiMaster 3000 (Machine Board)"
- build_path = /obj/machinery/chem_master/condimaster
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index adf7292a56..57a7f3445d 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -52,6 +52,7 @@
M.SetUnconscious(0, 0)
M.silent = 0
M.dizziness = 0
+ M.disgust = 0
M.drowsyness = 0
M.stuttering = 0
M.slurring = 0
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index c13ff096e4..428c10e24a 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -10,7 +10,7 @@
var/required_other = 0 // an integer required for the reaction to happen
var/secondary = 0 // set to nonzero if secondary reaction
- var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob
+ var/mob_react = TRUE //Determines if a chemical reaction can occur inside a mob
var/required_temp = 0
var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp.
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 4151a2695e..01195333fb 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -51,7 +51,7 @@
name = "Solid Plasma"
id = "solidplasma"
required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/plasmasolidification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -62,7 +62,7 @@
name = "Solid Gold"
id = "solidgold"
required_reagents = list("frostoil" = 5, "gold" = 20, "iron" = 1)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/goldsolidification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -80,7 +80,7 @@
id = "soapification"
required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles
required_temp = 374
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -92,7 +92,7 @@
id = "candlefication"
required_reagents = list("liquidgibs" = 5, "oxygen" = 5) //
required_temp = 374
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -103,7 +103,7 @@
name = "Meatification"
id = "meatification"
required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -436,7 +436,7 @@
name = "Foam"
id = "foam"
required_reagents = list("fluorosurfactant" = 1, "water" = 1)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -453,7 +453,7 @@
name = "Metal Foam"
id = "metalfoam"
required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
@@ -470,7 +470,7 @@
name = "Iron Foam"
id = "ironlfoam"
required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1)
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index dcafef247b..8ca65a6588 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -140,10 +140,11 @@
name = "Meth explosion"
id = "methboom1"
results = list("methboom1" = 1)
- required_temp = 420 //high enough to not blow up in the meth syringes
+ required_temp = 380 //slightly above the meth mix time.
required_reagents = list("methamphetamine" = 1)
strengthdiv = 6
modifier = 1
+ mob_react = FALSE
/datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
@@ -154,7 +155,7 @@
/datum/chemical_reaction/reagent_explosion/methsplosion/methboom2
required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine.
- required_temp = 420
+ required_temp = 300 //room temperature, chilling it even a little will prevent the explosion
results = list("methboom1" = 4) // this is ugly. Sorry goof.
/datum/chemical_reaction/sorium
@@ -269,7 +270,7 @@
required_reagents = list("smoke_powder" = 1)
required_temp = 374
secondary = 1
- mob_react = 1
+ mob_react = FALSE
/datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 132ebdf8fd..c3e1bd2c98 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -9,6 +9,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
desc = "Manufactures circuit boards for the construction of machines."
icon_state = "circuit_imprinter"
container_type = OPENCONTAINER
+ circuit = /obj/item/weapon/circuitboard/machine/circuit_imprinter
var/datum/material_container/materials
var/efficiency_coeff
@@ -28,24 +29,13 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
)
/obj/machinery/r_n_d/circuit_imprinter/Initialize()
- . = ..()
materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE))
create_reagents(0)
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null)
- B.apply_default_parts(src)
-
-/obj/machinery/r_n_d/circuit_imprinter/Destroy()
- qdel(materials)
return ..()
-/obj/item/weapon/circuitboard/machine/circuit_imprinter
- name = "Circuit Imprinter (Machine Board)"
- build_path = /obj/machinery/r_n_d/circuit_imprinter
- origin_tech = "engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/reagent_containers/glass/beaker = 2)
+/obj/machinery/r_n_d/circuit_imprinter/Destroy()
+ QDEL_NULL(materials)
+ return ..()
/obj/machinery/r_n_d/circuit_imprinter/RefreshParts()
reagents.maximum_volume = 0
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 71b9780c58..c6f2463b74 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -11,22 +11,9 @@ Note: Must be placed within 3 tiles of the R&D Console
name = "destructive analyzer"
desc = "Learn science by destroying things!"
icon_state = "d_analyzer"
+ circuit = /obj/item/weapon/circuitboard/machine/destructive_analyzer
var/decon_mod = 0
-/obj/machinery/r_n_d/destructive_analyzer/Initialize()
- . = ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/destructive_analyzer(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/destructive_analyzer
- name = "Destructive Analyzer (Machine Board)"
- build_path = /obj/machinery/r_n_d/destructive_analyzer
- origin_tech = "magnets=2;engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/manipulator = 1,
- /obj/item/weapon/stock_parts/micro_laser = 1)
-
/obj/machinery/r_n_d/destructive_analyzer/RefreshParts()
var/T = 0
for(var/obj/item/weapon/stock_parts/S in component_parts)
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 7e7b4c2b5b..fa1c59bfd6 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -25,6 +25,7 @@
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
+ circuit = /obj/item/weapon/circuitboard/machine/experimentor
var/recentlyExperimented = 0
var/mob/trackedIan
var/mob/trackedRuntime
@@ -84,22 +85,11 @@
/obj/machinery/r_n_d/experimentor/Initialize()
. = ..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/experimentor(null)
- B.apply_default_parts(src)
trackedIan = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_list
trackedRuntime = locate(/mob/living/simple_animal/pet/cat/Runtime) in GLOB.mob_list
SetTypeReactions()
-/obj/item/weapon/circuitboard/machine/experimentor
- name = "E.X.P.E.R.I-MENTOR (Machine Board)"
- build_path = /obj/machinery/r_n_d/experimentor
- origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2"
- req_components = list(
- /obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/stock_parts/micro_laser = 2)
-
/obj/machinery/r_n_d/experimentor/RefreshParts()
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
if(resetTime > 0 && (resetTime - M.rating) >= 1)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 84432e8e44..2691286771 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -12,6 +12,7 @@ Note: Must be placed west/left of and R&D console to function.
desc = "Converts raw materials into useful objects."
icon_state = "protolathe"
container_type = OPENCONTAINER
+ circuit = /obj/item/weapon/circuitboard/machine/protolathe
var/datum/material_container/materials
var/efficiency_coeff
@@ -32,23 +33,12 @@ Note: Must be placed west/left of and R&D console to function.
/obj/machinery/r_n_d/protolathe/Initialize()
- . = ..()
create_reagents(0)
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE))
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null)
- B.apply_default_parts(src)
-
-/obj/item/weapon/circuitboard/machine/protolathe
- name = "Protolathe (Machine Board)"
- build_path = /obj/machinery/r_n_d/protolathe
- origin_tech = "engineering=2;programming=2"
- req_components = list(
- /obj/item/weapon/stock_parts/matter_bin = 2,
- /obj/item/weapon/stock_parts/manipulator = 2,
- /obj/item/weapon/reagent_containers/glass/beaker = 2)
+ return ..()
/obj/machinery/r_n_d/protolathe/Destroy()
- qdel(materials)
+ QDEL_NULL(materials)
return ..()
/obj/machinery/r_n_d/protolathe/RefreshParts()
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 5dc96be0a0..0ea18b2ff9 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -21,8 +21,7 @@
wires = new /datum/wires/r_n_d(src)
/obj/machinery/r_n_d/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/r_n_d/proc/shock(mob/user, prb)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index d161929f2c..8fa7e64ffe 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -19,14 +19,6 @@
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/rdserver(null)
B.apply_default_parts(src)
-/obj/item/weapon/circuitboard/machine/rdserver
- name = "R&D Server (Machine Board)"
- build_path = /obj/machinery/r_n_d/server
- origin_tech = "programming=3"
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/scanning_module = 1)
-
/obj/machinery/r_n_d/server/Destroy()
griefProtection()
return ..()
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 24849b7b09..4b010c85b2 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -486,7 +486,7 @@
/obj/effect/golemrune/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
- notify_ghosts("Golem rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
+ notify_ghosts("Golem rune created in [get_area(src)].", 'sound/misc/server-ready.ogg', source = src)
/obj/effect/golemrune/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -554,7 +554,7 @@
layer = FLY_LAYER
pixel_x = -64
pixel_y = -64
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/mob/living/immune = list() // the one who creates the timestop is immune
var/list/stopped_atoms = list()
var/freezerange = 2
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index ebab6568d8..8c4772d434 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -72,7 +72,7 @@
layer = EDGED_TURF_LAYER
pixel_x = -32
pixel_y = -32
- mouse_opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
opacity = TRUE
/obj/structure/opacity_blocker/singularity_pull()
diff --git a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm
index 06fb2b9c04..68a34637b8 100644
--- a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm
+++ b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm
@@ -1,10 +1,10 @@
//These landmarks can be placed in rooms/ruins to set the baseturfs of every turf in the area. Easier than having potentially unlimited subtypes of every turf or having to manually edit the turfs in the map editor
/obj/effect/baseturf_helper
- name = "lava baseturf editor"
+ name = "baseturf editor"
icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
- var/baseturf = /turf/open/lava/smooth/lava_land_surface
+ var/baseturf = null
layer = POINT_LAYER
/obj/effect/baseturf_helper/Initialize()
@@ -13,4 +13,37 @@
for(var/turf/T in get_area_turfs(thearea, z))
if(T.baseturf != T.type) //Don't break indestructible walls and the like
T.baseturf = baseturf
- qdel(src)
\ No newline at end of file
+ qdel(src)
+
+
+/obj/effect/baseturf_helper/asteroid
+ name = "asteroid baseturf editor"
+ baseturf = /turf/open/floor/plating/asteroid
+
+/obj/effect/baseturf_helper/asteroid/airless
+ name = "asteroid airless baseturf editor"
+ baseturf = /turf/open/floor/plating/asteroid/airless
+
+/obj/effect/baseturf_helper/asteroid/basalt
+ name = "asteroid basalt baseturf editor"
+ baseturf = /turf/open/floor/plating/asteroid/basalt
+
+/obj/effect/baseturf_helper/asteroid/snow
+ name = "asteroid snow baseturf editor"
+ baseturf = /turf/open/floor/plating/asteroid/snow
+
+/obj/effect/baseturf_helper/beach/sand
+ name = "beach sand baseturf editor"
+ baseturf = /turf/open/floor/plating/beach/sand
+
+/obj/effect/baseturf_helper/beach/water
+ name = "water baseturf editor"
+ baseturf = /turf/open/floor/plating/beach/water
+
+/obj/effect/baseturf_helper/lava
+ name = "lava baseturf editor"
+ baseturf = /turf/open/lava/smooth
+
+/obj/effect/baseturf_helper/lava_land/surface
+ name = "lavaland baseturf editor"
+ baseturf = /turf/open/lava/smooth/lava_land_surface
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 0567ee5d51..8563c36ea4 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -24,8 +24,8 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
/obj/machinery/keycard_auth/Destroy()
GLOB.keycard_events.clearEvent("triggerEvent", ev)
- qdel(ev)
- . = ..()
+ QDEL_NULL(ev)
+ return ..()
/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 179f1e7d0a..eba4bd74a8 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -10,9 +10,13 @@
var/admin_controlled
var/no_destination_swap = 0
-/obj/machinery/computer/shuttle/Initialize(mapload, obj/item/weapon/circuitboard/computer/shuttle/C)
- . = ..()
- if(istype(C))
+/obj/machinery/computer/shuttle/Initialize()
+ ..()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/computer/shuttle/LateInitialize()
+ if(istype(circuit, /obj/item/weapon/circuitboard/computer/shuttle))
+ var/obj/item/weapon/circuitboard/computer/shuttle/C = circuit
possible_destinations = C.possible_destinations
shuttleId = C.shuttleId
diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm
index 6fd9cb129e..6e2741a6d7 100644
--- a/code/modules/shuttle/manipulator.dm
+++ b/code/modules/shuttle/manipulator.dm
@@ -33,14 +33,10 @@
add_overlay(hologram_projection)
add_overlay(hologram_ship)
-/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", \
- datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, \
- datum/ui_state/state = GLOB.admin_state)
-
+/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, \
- master_ui, state)
+ ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, master_ui, state)
ui.open()
/proc/shuttlemode2str(mode)
@@ -62,7 +58,7 @@
if(SHUTTLE_ENDGAME)
. = "endgame"
if(!.)
- throw EXCEPTION("shuttlemode2str(): invalid mode [mode]")
+ CRASH("shuttlemode2str(): invalid mode [mode]")
/obj/machinery/shuttle_manipulator/ui_data(mob/user)
diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm
index a757a86430..06675c39a3 100644
--- a/code/modules/shuttle/ripple.dm
+++ b/code/modules/shuttle/ripple.dm
@@ -8,7 +8,7 @@
anchored = TRUE
density = FALSE
layer = RIPPLE_LAYER
- mouse_opacity = 1
+ mouse_opacity = MOUSE_OPACITY_ICON
alpha = 0
duration = 3 * SHUTTLE_RIPPLE_TIME
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 9c2c67d97c..149685532d 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -10,9 +10,9 @@
icon = 'icons/obj/machines/magic_emitter.dmi'
icon_state = "wabbajack_statue"
icon_state_on = "wabbajack_statue_on"
+ active = FALSE
var/list/active_tables = list()
var/tables_required = 2
- active = FALSE
/obj/machinery/power/emitter/energycannon/magical/Initialize()
. = ..()
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index 47eb22c397..1c1b0731be 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -25,20 +25,6 @@
board.moved = TRUE
..()
-/obj/item/weapon/circuitboard/computer/syndicate_shuttle
- name = "Syndicate Shuttle (Computer Board)"
- build_path = /obj/machinery/computer/shuttle/syndicate
- var/challenge = FALSE
- var/moved = FALSE
-
-/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Initialize()
- . = ..()
- GLOB.syndicate_shuttle_boards += src
-
-/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Destroy()
- GLOB.syndicate_shuttle_boards -= src
- return ..()
-
/obj/machinery/computer/shuttle/syndicate/drop_pod
name = "syndicate assault pod control"
icon = 'icons/obj/terminals.dmi'
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 77a30b1884..453a8e097a 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -206,35 +206,6 @@
/obj/structure/filler/ex_act()
return
-/obj/item/weapon/circuitboard/machine/bsa/back
- name = "Bluespace Artillery Generator (Machine Board)"
- build_path = /obj/machinery/bsa/back
- origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies!
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor/quadratic = 5,
- /obj/item/stack/cable_coil = 2)
-
-/obj/item/weapon/circuitboard/machine/bsa/middle
- name = "Bluespace Artillery Fusor (Machine Board)"
- build_path = /obj/machinery/bsa/middle
- origin_tech = "engineering=2;combat=2;bluespace=2"
- req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 20,
- /obj/item/stack/cable_coil = 2)
-
-/obj/item/weapon/circuitboard/machine/bsa/front
- name = "Bluespace Artillery Bore (Machine Board)"
- build_path = /obj/machinery/bsa/front
- origin_tech = "engineering=2;combat=2;bluespace=2"
- req_components = list(
- /obj/item/weapon/stock_parts/manipulator/femto = 5,
- /obj/item/stack/cable_coil = 2)
-
-/obj/item/weapon/circuitboard/computer/bsa_control
- name = "Bluespace Artillery Controls (Computer Board)"
- build_path = /obj/machinery/computer/bsa_control
- origin_tech = "engineering=2;combat=2;bluespace=2"
-
/obj/machinery/computer/bsa_control
name = "bluespace artillery control"
var/obj/machinery/bsa/full/cannon
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 1ccb608fa0..1b6d11719f 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -118,16 +118,6 @@
dna[H.dna.uni_identity] = 1
to_chat(user, "Humanoid data added to local storage.")
-
-/obj/item/weapon/circuitboard/machine/dna_vault
- name = "DNA Vault (Machine Board)"
- build_path = /obj/machinery/dna_vault
- origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies!
- req_components = list(
- /obj/item/weapon/stock_parts/capacitor/super = 5,
- /obj/item/weapon/stock_parts/manipulator/pico = 5,
- /obj/item/stack/cable_coil = 2)
-
/obj/machinery/dna_vault
name = "DNA Vault"
desc = "Break glass in case of apocalypse."
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 1543f7615a..38fd5ad853 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -36,15 +36,10 @@
coverage |= view(A.kill_range,A)
return coverage.len
-/obj/item/weapon/circuitboard/machine/computer/sat_control
- name = "Satellite Network Control (Computer Board)"
- build_path = /obj/machinery/computer/sat_control
- origin_tech = "engineering=3"
-
/obj/machinery/computer/sat_control
name = "satellite control"
desc = "Used to control the satellite network."
- circuit = /obj/item/weapon/circuitboard/machine/computer/sat_control
+ circuit = /obj/item/weapon/circuitboard/computer/sat_control
var/notice
/obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/modules/stock_market/computer.dm b/code/modules/stock_market/computer.dm
index 9cef9b3048..68b28d09be 100644
--- a/code/modules/stock_market/computer.dm
+++ b/code/modules/stock_market/computer.dm
@@ -11,8 +11,8 @@
light_color = LIGHT_COLOR_GREEN
-/obj/machinery/computer/stockexchange/New()
- ..()
+/obj/machinery/computer/stockexchange/Initialize()
+ . = ..()
logged_in = "[station_name()] Cargo Department"
/obj/machinery/computer/stockexchange/proc/balance()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 12fdadaeb1..d63eb283c5 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -74,6 +74,7 @@
icon_state = "appendix"
icon = 'icons/obj/surgery.dmi'
list_reagents = list("nutriment" = 5)
+ foodtype = RAW | MEAT | GROSS
/obj/item/organ/Destroy()
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index 74bc7821b0..36cd28ac98 100755
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -7,12 +7,53 @@
slot = "stomach"
attack_verb = list("gored", "squished", "slapped", "digested")
desc = "Onaka ga suite imasu."
+ var/disgust_metabolism = 1
/obj/item/organ/stomach/on_life()
var/mob/living/carbon/human/H = owner
if(istype(H))
H.dna.species.handle_digestion(H)
+ handle_disgust(H)
+
+/obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/H)
+ if(H.disgust)
+ var/pukeprob = 5 + 0.05 * H.disgust
+ if(H.disgust >= DISGUST_LEVEL_GROSS)
+ if(prob(10))
+ H.stuttering += 1
+ H.confused += 2
+ if(prob(10) && !H.stat)
+ to_chat(H, "You feel kind of iffy...")
+ H.jitteriness = max(H.jitteriness - 3, 0)
+ if(H.disgust >= DISGUST_LEVEL_VERYGROSS)
+ if(prob(pukeprob)) //iT hAndLeS mOrE ThaN PukInG
+ H.confused += 2.5
+ H.stuttering += 1
+ H.vomit(10, 0, 1, 0, 1, 0)
+ H.Dizzy(5)
+ if(H.disgust >= DISGUST_LEVEL_DISGUSTED)
+ if(prob(25))
+ H.blur_eyes(3) //We need to add more shit down here
+
+ H.adjust_disgust(-0.5 * disgust_metabolism)
+
+ switch(H.disgust)
+ if(0 to DISGUST_LEVEL_GROSS)
+ H.clear_alert("disgust")
+ if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS)
+ H.throw_alert("disgust", /obj/screen/alert/gross)
+ if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED)
+ H.throw_alert("disgust", /obj/screen/alert/verygross)
+ if(DISGUST_LEVEL_DISGUSTED to INFINITY)
+ H.throw_alert("disgust", /obj/screen/alert/disgusted)
+
+/obj/item/organ/stomach/Remove(mob/living/carbon/M, special = 0)
+ var/mob/living/carbon/human/H = owner
+ if(istype(H))
+ H.clear_alert("disgust")
+
+ ..()
/obj/item/organ/stomach/fly
name = "insectoid stomach"
@@ -21,5 +62,5 @@
/obj/item/organ/stomach/plasmaman
name = "digestive crystal"
- icon_state = "pstomach"
+ icon_state = "pstomach"
desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen."
diff --git a/code/world.dm b/code/world.dm
index a0c5ae43f8..955d19c6c4 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -1,3 +1,7 @@
+
+//This file is just for the necessary /world definition
+//Try looking in game/world.dm
+
/world
mob = /mob/dead/new_player
turf = /turf/open/space/basic
@@ -10,298 +14,3 @@
#ifdef GC_FAILURE_HARD_LOOKUP
loop_checks = FALSE
#endif
-
-/world/New()
- log_world("World loaded at [time_stamp()]")
-
- SetupExternalRSC()
-
- GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
-
- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
-
- config = new
-
- CheckSchemaVersion()
- SetRoundID()
-
- SetupLogs()
-
- if(!RunningService()) //tgs2 support
- GLOB.revdata.DownloadPRDetails()
-
- load_motd()
- load_admins()
- LoadVerbs(/datum/verbs/menu)
- if(config.usewhitelist)
- load_whitelist()
- LoadBans()
-
- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
-
- Master.Initialize(10, FALSE)
-
- if(config.irc_announce_new_game)
- IRCBroadcast("New round starting on [SSmapping.config.map_name]!")
-
-/world/proc/SetupExternalRSC()
-#if (PRELOAD_RSC == 0)
- external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
- var/i=1
- while(i<=external_rsc_urls.len)
- if(external_rsc_urls[i])
- i++
- else
- external_rsc_urls.Cut(i,i+1)
-#endif
-
-/world/proc/CheckSchemaVersion()
- if(config.sql_enabled)
- if(SSdbcore.Connect())
- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1")
- query_db_version.Execute()
- if(query_db_version.NextRow())
- var/db_major = text2num(query_db_version.item[1])
- var/db_minor = text2num(query_db_version.item[2])
- if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION)
- message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
- log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
- else
- message_admins("Could not get schema version from database")
- else
- log_world("Your server failed to establish a connection with the database.")
-
-/world/proc/SetRoundID()
- if(config.sql_enabled)
- if(SSdbcore.Connect())
- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')")
- query_round_start.Execute()
- var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()")
- query_round_last_id.Execute()
- if(query_round_last_id.NextRow())
- GLOB.round_id = query_round_last_id.item[1]
-
-/world/proc/SetupLogs()
- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
- if(GLOB.round_id)
- GLOB.log_directory += "[GLOB.round_id]"
- else
- GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
- GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
- GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
- GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log")
- GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html")
- GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
- GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
- GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
- if(fexists(GLOB.config_error_log))
- fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
- fdel(GLOB.config_error_log)
-
- if(GLOB.round_id)
- log_game("Round ID: [GLOB.round_id]")
-
-/world/Topic(T, addr, master, key)
- var/list/input = params2list(T)
-
- var/pinging = ("ping" in input)
- var/playing = ("players" in input)
-
- if(!pinging && !playing && config && config.log_world_topic)
- GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
-
- if(input[SERVICE_CMD_PARAM_KEY])
- return ServiceCommand(input)
- var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
-
- if(pinging)
- var/x = 1
- for (var/client/C in GLOB.clients)
- x++
- return x
-
- else if(playing)
- var/n = 0
- for(var/mob/M in GLOB.player_list)
- if(M.client)
- n++
- return n
-
- else if("ircstatus" in input) //tgs2 support
- var/static/last_irc_status = 0
- if(world.time - last_irc_status < 50)
- return
- var/list/adm = get_admin_counts()
- var/list/allmins = adm["total"]
- var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
- status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]."
- send2irc("Status", status)
- last_irc_status = world.time
-
- else if("status" in input)
- var/list/s = list()
- s["version"] = GLOB.game_version
- s["mode"] = GLOB.master_mode
- s["respawn"] = config ? GLOB.abandon_allowed : 0
- s["enter"] = GLOB.enter_allowed
- s["vote"] = config.allow_vote_mode
- s["ai"] = config.allow_ai
- s["host"] = host ? host : null
- s["active_players"] = get_active_player_count()
- s["players"] = GLOB.clients.len
- s["revision"] = GLOB.revdata.commit
- s["revision_date"] = GLOB.revdata.date
-
- var/list/adm = get_admin_counts()
- var/list/presentmins = adm["present"]
- var/list/afkmins = adm["afk"]
- s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
- s["gamestate"] = SSticker.current_state
-
- s["map_name"] = SSmapping.config.map_name
-
- if(key_valid && SSticker.HasRoundStarted())
- s["real_mode"] = SSticker.mode.name
- // Key-authed callers may know the truth behind the "secret"
-
- s["security_level"] = get_security_level()
- s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
- // Amount of world's ticks in seconds, useful for calculating round duration
-
- if(SSshuttle && SSshuttle.emergency)
- s["shuttle_mode"] = SSshuttle.emergency.mode
- // Shuttle status, see /__DEFINES/stat.dm
- s["shuttle_timer"] = SSshuttle.emergency.timeLeft()
- // Shuttle timer, in seconds
-
- return list2params(s)
-
- else if("announce" in input)
- if(!key_valid)
- return "Bad Key"
- else
- AnnouncePR(input["announce"], json_decode(input["payload"]))
-
- else if("crossmessage" in input)
- if(!key_valid)
- return
- else
- if(input["crossmessage"] == "Ahelp")
- relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]")
- if(input["crossmessage"] == "Comms_Console")
- minor_announce(input["message"], "Incoming message from [input["message_sender"]]")
- for(var/obj/machinery/computer/communications/CM in GLOB.machines)
- CM.overrideCooldown()
- if(input["crossmessage"] == "News_Report")
- minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
-
- else if("adminmsg" in input) //tgs2 support
- if(!key_valid)
- return "Bad Key"
- else
- return IrcPm(input["adminmsg"],input["msg"],input["sender"])
-
- else if("namecheck" in input) //tgs2 support
- if(!key_valid)
- return "Bad Key"
- else
- log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]")
- message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]")
- return keywords_lookup(input["namecheck"],1)
- else if("adminwho" in input) //tgs2 support
- if(!key_valid)
- return "Bad Key"
- else
- return ircadminwho()
- else if("server_hop" in input)
- show_server_hop_transfer_screen(input["server_hop"])
-
-#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
- //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
-
-/world/proc/AnnouncePR(announcement, list/payload)
- var/static/list/PRcounts = list() //PR id -> number of times announced this round
- var/id = "[payload["pull_request"]["id"]]"
- if(!PRcounts[id])
- PRcounts[id] = 1
- else
- ++PRcounts[id]
- if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
- return
-
- var/final_composed = "PR: [announcement]"
- for(var/client/C in GLOB.clients)
- C.AnnouncePR(final_composed)
-
-/world/Reboot(reason = 0, fast_track = FALSE)
- ServiceReboot() //handles alternative actions if necessary
- if (reason || fast_track) //special reboot, do none of the normal stuff
- if (usr)
- log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
- message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
- to_chat(world, "Rebooting World immediately due to host request")
- else
- to_chat(world, "Rebooting world...")
- Master.Shutdown() //run SS shutdowns
- log_world("World rebooted at [time_stamp()]")
- ..()
-
-/world/proc/load_motd()
- GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo()
-
-/world/proc/update_status()
- var/s = ""
-
- if (config && config.server_name)
- s += "[config.server_name] — "
-
- s += "[station_name()]";
- s += " ("
- s += "" //Change this to wherever you want the hub to link to.
- s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version.
- s += ""
- s += ")"
-
- var/list/features = list()
-
- if(GLOB.master_mode)
- features += GLOB.master_mode
-
- if (!GLOB.enter_allowed)
- features += "closed"
-
- features += GLOB.abandon_allowed ? "respawn" : "no respawn"
-
- if (config && config.allow_vote_mode)
- features += "vote"
-
- if (config && config.allow_ai)
- features += "AI allowed"
-
- var/n = 0
- for (var/mob/M in GLOB.player_list)
- if (M.client)
- n++
-
- if (n > 1)
- features += "~[n] players"
- else if (n > 0)
- features += "~[n] player"
-
- if (!host && config && config.hostedby)
- features += "hosted by [config.hostedby]"
-
- if (features)
- s += ": [jointext(features, ", ")]"
-
- status = s
-
-/world/proc/update_hub_visibility(new_visibility)
- if(new_visibility == GLOB.hub_visibility)
- return
- GLOB.hub_visibility = new_visibility
- if(GLOB.hub_visibility)
- hub_password = "kMZy3U5jJHSiBQjr"
- else
- hub_password = "SORRYNOPASSWORD"
diff --git a/code/world.dm.rej b/code/world.dm.rej
index cde7698a21..e82c17e503 100644
--- a/code/world.dm.rej
+++ b/code/world.dm.rej
@@ -1,10 +1,301 @@
diff a/code/world.dm b/code/world.dm (rejected hunks)
-@@ -59,7 +59,7 @@
- if(config.sql_enabled)
- if(SSdbcore.Connect())
- log_world("Database connection established.")
-- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")] ORDER BY date DESC LIMIT 1")
-+ var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1")
- query_db_version.Execute()
- if(query_db_version.NextRow())
- var/db_major = query_db_version.item[1]
+@@ -10,299 +13,3 @@
+ #ifdef GC_FAILURE_HARD_LOOKUP
+ loop_checks = FALSE
+ #endif
+-
+-/world/New()
+- log_world("World loaded at [time_stamp()]")
+-
+- SetupExternalRSC()
+-
+- GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
+-
+- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
+-
+- config = new
+-
+- CheckSchemaVersion()
+- SetRoundID()
+-
+- SetupLogs()
+-
+- if(!RunningService()) //tgs2 support
+- GLOB.revdata.DownloadPRDetails()
+-
+- load_motd()
+- load_admins()
+- LoadVerbs(/datum/verbs/menu)
+- if(config.usewhitelist)
+- load_whitelist()
+- LoadBans()
+-
+- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
+-
+- Master.Initialize(10, FALSE)
+-
+- if(config.irc_announce_new_game)
+- IRCBroadcast("New round starting on [SSmapping.config.map_name]!")
+-
+-/world/proc/SetupExternalRSC()
+-#if (PRELOAD_RSC == 0)
+- external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
+- var/i=1
+- while(i<=external_rsc_urls.len)
+- if(external_rsc_urls[i])
+- i++
+- else
+- external_rsc_urls.Cut(i,i+1)
+-#endif
+-
+-/world/proc/CheckSchemaVersion()
+- if(config.sql_enabled)
+- if(SSdbcore.Connect())
+- log_world("Database connection established.")
+- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1")
+- query_db_version.Execute()
+- if(query_db_version.NextRow())
+- var/db_major = text2num(query_db_version.item[1])
+- var/db_minor = text2num(query_db_version.item[2])
+- if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION)
+- message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
+- log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors")
+- else
+- message_admins("Could not get schema version from database")
+- else
+- log_world("Your server failed to establish a connection with the database.")
+-
+-/world/proc/SetRoundID()
+- if(config.sql_enabled)
+- if(SSdbcore.Connect())
+- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')")
+- query_round_start.Execute()
+- var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()")
+- query_round_last_id.Execute()
+- if(query_round_last_id.NextRow())
+- GLOB.round_id = query_round_last_id.item[1]
+-
+-/world/proc/SetupLogs()
+- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+- if(GLOB.round_id)
+- GLOB.log_directory += "[GLOB.round_id]"
+- else
+- GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
+- GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
+- GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
+- GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log")
+- GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html")
+- GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+- GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+- GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
+- if(fexists(GLOB.config_error_log))
+- fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
+- fdel(GLOB.config_error_log)
+-
+- if(GLOB.round_id)
+- log_game("Round ID: [GLOB.round_id]")
+-
+-/world/Topic(T, addr, master, key)
+- var/list/input = params2list(T)
+-
+- var/pinging = ("ping" in input)
+- var/playing = ("players" in input)
+-
+- if(!pinging && !playing && config && config.log_world_topic)
+- GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
+-
+- if(input[SERVICE_CMD_PARAM_KEY])
+- return ServiceCommand(input)
+- var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
+-
+- if(pinging)
+- var/x = 1
+- for (var/client/C in GLOB.clients)
+- x++
+- return x
+-
+- else if(playing)
+- var/n = 0
+- for(var/mob/M in GLOB.player_list)
+- if(M.client)
+- n++
+- return n
+-
+- else if("ircstatus" in input) //tgs2 support
+- var/static/last_irc_status = 0
+- if(world.time - last_irc_status < 50)
+- return
+- var/list/adm = get_admin_counts()
+- var/list/allmins = adm["total"]
+- var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
+- status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]."
+- send2irc("Status", status)
+- last_irc_status = world.time
+-
+- else if("status" in input)
+- var/list/s = list()
+- s["version"] = GLOB.game_version
+- s["mode"] = GLOB.master_mode
+- s["respawn"] = config ? GLOB.abandon_allowed : 0
+- s["enter"] = GLOB.enter_allowed
+- s["vote"] = config.allow_vote_mode
+- s["ai"] = config.allow_ai
+- s["host"] = host ? host : null
+- s["active_players"] = get_active_player_count()
+- s["players"] = GLOB.clients.len
+- s["revision"] = GLOB.revdata.commit
+- s["revision_date"] = GLOB.revdata.date
+-
+- var/list/adm = get_admin_counts()
+- var/list/presentmins = adm["present"]
+- var/list/afkmins = adm["afk"]
+- s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho
+- s["gamestate"] = SSticker.current_state
+-
+- s["map_name"] = SSmapping.config.map_name
+-
+- if(key_valid && SSticker.HasRoundStarted())
+- s["real_mode"] = SSticker.mode.name
+- // Key-authed callers may know the truth behind the "secret"
+-
+- s["security_level"] = get_security_level()
+- s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0
+- // Amount of world's ticks in seconds, useful for calculating round duration
+-
+- if(SSshuttle && SSshuttle.emergency)
+- s["shuttle_mode"] = SSshuttle.emergency.mode
+- // Shuttle status, see /__DEFINES/stat.dm
+- s["shuttle_timer"] = SSshuttle.emergency.timeLeft()
+- // Shuttle timer, in seconds
+-
+- return list2params(s)
+-
+- else if("announce" in input)
+- if(!key_valid)
+- return "Bad Key"
+- else
+- AnnouncePR(input["announce"], json_decode(input["payload"]))
+-
+- else if("crossmessage" in input)
+- if(!key_valid)
+- return
+- else
+- if(input["crossmessage"] == "Ahelp")
+- relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]")
+- if(input["crossmessage"] == "Comms_Console")
+- minor_announce(input["message"], "Incoming message from [input["message_sender"]]")
+- for(var/obj/machinery/computer/communications/CM in GLOB.machines)
+- CM.overrideCooldown()
+- if(input["crossmessage"] == "News_Report")
+- minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
+-
+- else if("adminmsg" in input) //tgs2 support
+- if(!key_valid)
+- return "Bad Key"
+- else
+- return IrcPm(input["adminmsg"],input["msg"],input["sender"])
+-
+- else if("namecheck" in input) //tgs2 support
+- if(!key_valid)
+- return "Bad Key"
+- else
+- log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]")
+- message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]")
+- return keywords_lookup(input["namecheck"],1)
+- else if("adminwho" in input) //tgs2 support
+- if(!key_valid)
+- return "Bad Key"
+- else
+- return ircadminwho()
+- else if("server_hop" in input)
+- show_server_hop_transfer_screen(input["server_hop"])
+-
+-#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
+- //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
+-
+-/world/proc/AnnouncePR(announcement, list/payload)
+- var/static/list/PRcounts = list() //PR id -> number of times announced this round
+- var/id = "[payload["pull_request"]["id"]]"
+- if(!PRcounts[id])
+- PRcounts[id] = 1
+- else
+- ++PRcounts[id]
+- if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
+- return
+-
+- var/final_composed = "PR: [announcement]"
+- for(var/client/C in GLOB.clients)
+- C.AnnouncePR(final_composed)
+-
+-/world/Reboot(reason = 0, fast_track = FALSE)
+- ServiceReboot() //handles alternative actions if necessary
+- if (reason || fast_track) //special reboot, do none of the normal stuff
+- if (usr)
+- log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
+- message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
+- to_chat(world, "Rebooting World immediately due to host request")
+- else
+- to_chat(world, "Rebooting world...")
+- Master.Shutdown() //run SS shutdowns
+- log_world("World rebooted at [time_stamp()]")
+- ..()
+-
+-/world/proc/load_motd()
+- GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo()
+-
+-/world/proc/update_status()
+- var/s = ""
+-
+- if (config && config.server_name)
+- s += "[config.server_name] — "
+-
+- s += "[station_name()]";
+- s += " ("
+- s += "" //Change this to wherever you want the hub to link to.
+- s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version.
+- s += ""
+- s += ")"
+-
+- var/list/features = list()
+-
+- if(GLOB.master_mode)
+- features += GLOB.master_mode
+-
+- if (!GLOB.enter_allowed)
+- features += "closed"
+-
+- features += GLOB.abandon_allowed ? "respawn" : "no respawn"
+-
+- if (config && config.allow_vote_mode)
+- features += "vote"
+-
+- if (config && config.allow_ai)
+- features += "AI allowed"
+-
+- var/n = 0
+- for (var/mob/M in GLOB.player_list)
+- if (M.client)
+- n++
+-
+- if (n > 1)
+- features += "~[n] players"
+- else if (n > 0)
+- features += "~[n] player"
+-
+- if (!host && config && config.hostedby)
+- features += "hosted by [config.hostedby]"
+-
+- if (features)
+- s += ": [jointext(features, ", ")]"
+-
+- status = s
+-
+-/world/proc/update_hub_visibility(new_visibility)
+- if(new_visibility == GLOB.hub_visibility)
+- return
+- GLOB.hub_visibility = new_visibility
+- if(GLOB.hub_visibility)
+- hub_password = "kMZy3U5jJHSiBQjr"
+- else
+- hub_password = "SORRYNOPASSWORD"
diff --git a/html/changelogs/AutoChangeLog-pr-2232.yml b/html/changelogs/AutoChangeLog-pr-2232.yml
new file mode 100644
index 0000000000..8d82c65d9f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2232.yml
@@ -0,0 +1,8 @@
+author: "Floyd (and sprites by Maya from Yogstation13)"
+delete-after: True
+changes:
+ - rscadd: "Makes rat edible. Only lizards really enjoy eating them, though."
+ - rscadd: "Adds food types to all food, which means you can no longer eat whatever the hell you want."
+ - rscadd: "Adds a disgust system, currently only used with food."
+ - rscadd: "Pukonium, makes whoever it is injected to disgusted."
+ - rscadd: "Makes pod people vegan, or well, carnivores. It depends on how you look at it, really."
diff --git a/html/changelogs/AutoChangeLog-pr-2253.yml b/html/changelogs/AutoChangeLog-pr-2253.yml
new file mode 100644
index 0000000000..142950f442
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2253.yml
@@ -0,0 +1,4 @@
+author: "Floyd"
+delete-after: True
+changes:
+ - bugfix: "No longer does everyone look like a sick, nauseated weirdo!"
diff --git a/html/changelogs/AutoChangeLog-pr-2357.yml b/html/changelogs/AutoChangeLog-pr-2357.yml
new file mode 100644
index 0000000000..f63277f66f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2357.yml
@@ -0,0 +1,8 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - rscadd: "Breasts can now be used to masturbate/milk yourselves."
+ - rscadd: "You can now expose genitals through clothing using a verb in the IC tab."
+ - tweak: "Pressing the Arousal HUD symbol will now bring up several options to use. Pull or be pulled by someone who's exposed to have them appear as an option."
+ - tweak: "Made hexacamphor/hexacrocin less verbose and trigger forced climaxes less often to avoid incredible spam."
+ - tweak: "Being forced to orgasm while pulled or pulling someone now counts them as your selected partner."
diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml
new file mode 100644
index 0000000000..5bdc603b06
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2362.yml
@@ -0,0 +1,4 @@
+author: "More Robust Than You"
+delete-after: True
+changes:
+ - bugfix: "Fixes a typo in the blobbernaut spawn text"
diff --git a/html/changelogs/AutoChangeLog-pr-2399.yml b/html/changelogs/AutoChangeLog-pr-2399.yml
new file mode 100644
index 0000000000..2d162a5edf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2399.yml
@@ -0,0 +1,4 @@
+author: "More Robust Than You"
+delete-after: True
+changes:
+ - rscadd: "Blobs can now sense when they're being cuddled!"
diff --git a/html/changelogs/AutoChangeLog-pr-2408.yml b/html/changelogs/AutoChangeLog-pr-2408.yml
new file mode 100644
index 0000000000..92f33a9292
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2408.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - soundadd: "The station's explosion now uses a new (or old) sound."
diff --git a/html/changelogs/AutoChangeLog-pr-2428.yml b/html/changelogs/AutoChangeLog-pr-2428.yml
new file mode 100644
index 0000000000..76adf39bcd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2428.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - spellcheck: "The chat message has been removed from *spin. I hope you're happy."
diff --git a/html/changelogs/AutoChangeLog-pr-2437.yml b/html/changelogs/AutoChangeLog-pr-2437.yml
new file mode 100644
index 0000000000..1a54eed45e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2437.yml
@@ -0,0 +1,5 @@
+author: "BeeSting12"
+delete-after: True
+changes:
+ - bugfix: "Deltastation's N2O console has been renamed to be an N2O console."
+ - tweak: "Deltastation's atmos now has a fire axe."
diff --git a/html/changelogs/AutoChangeLog-pr-2438.yml b/html/changelogs/AutoChangeLog-pr-2438.yml
new file mode 100644
index 0000000000..9195a11183
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2438.yml
@@ -0,0 +1,4 @@
+author: "XDTM"
+delete-after: True
+changes:
+ - bugfix: "Viruses will now be able to affect more than one person at a time."
diff --git a/html/changelogs/AutoChangeLog-pr-2439.yml b/html/changelogs/AutoChangeLog-pr-2439.yml
new file mode 100644
index 0000000000..c92b5e2235
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2439.yml
@@ -0,0 +1,4 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - tweak: "The singularity will now dig up asteroids when in proximity of them. Please watch for flying debris."
diff --git a/html/changelogs/AutoChangeLog-pr-2448.yml b/html/changelogs/AutoChangeLog-pr-2448.yml
new file mode 100644
index 0000000000..40610a2afe
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2448.yml
@@ -0,0 +1,4 @@
+author: "ktccd"
+delete-after: True
+changes:
+ - bugfix: "Taurs now rely on their taur-sprites to render legs, instead of rendering human legs on top of them. Mostly impacts driders and such uniquely legged individuals."
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 102fc01000..e6315d6f48 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/mob/mam_body_markings.dmi b/icons/mob/mam_body_markings.dmi
index 737fa15c42..fdb97490c8 100644
Binary files a/icons/mob/mam_body_markings.dmi and b/icons/mob/mam_body_markings.dmi differ
diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi
index c9f1ba70e8..7de9b40734 100644
Binary files a/icons/mob/mam_bodyparts.dmi and b/icons/mob/mam_bodyparts.dmi differ
diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi
index 7f5f05e3af..4a6988f88e 100644
Binary files a/icons/obj/machines/telecomms.dmi and b/icons/obj/machines/telecomms.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 8576be384b..7ad30fb7b5 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -161,4 +161,6 @@ h1.alert, h2.alert {color: #000000;}
.monkey {color: #975032;}
.swarmer {color: #2C75FF;}
.resonate {color: #298F85;}
+.love {color: #FF69Bf;}
+.lovebold {color: #FF69Bf; font-weight: bold;}
"}
diff --git a/sound/effects/explosion_distant.ogg b/sound/effects/explosion_distant.ogg
new file mode 100644
index 0000000000..d9976c51fe
Binary files /dev/null and b/sound/effects/explosion_distant.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 185bc4f91d..ea4c83c1f7 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -37,6 +37,7 @@
#include "code\__DEFINES\DNA.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\flags.dm"
+#include "code\__DEFINES\food.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\inventory.dm"
#include "code\__DEFINES\is_helpers.dm"
@@ -374,6 +375,7 @@
#include "code\game\shuttle_engines.dm"
#include "code\game\skincmd.dm"
#include "code\game\sound.dm"
+#include "code\game\world.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
#include "code\game\area\Space_Station_13_areas.dm"
@@ -548,6 +550,7 @@
#include "code\game\gamemodes\wizard\soulstone.dm"
#include "code\game\gamemodes\wizard\spellbook.dm"
#include "code\game\gamemodes\wizard\wizard.dm"
+#include "code\game\machinery\_machinery.dm"
#include "code\game\machinery\ai_slipper.dm"
#include "code\game\machinery\airlock_control.dm"
#include "code\game\machinery\announcement_system.dm"
@@ -574,7 +577,6 @@
#include "code\game\machinery\launch_pad.dm"
#include "code\game\machinery\lightswitch.dm"
#include "code\game\machinery\limbgrower.dm"
-#include "code\game\machinery\machinery.dm"
#include "code\game\machinery\magnet.dm"
#include "code\game\machinery\mass_driver.dm"
#include "code\game\machinery\navbeacon.dm"
@@ -605,6 +607,7 @@
#include "code\game\machinery\camera\motion.dm"
#include "code\game\machinery\camera\presets.dm"
#include "code\game\machinery\camera\tracking.dm"
+#include "code\game\machinery\computer\_computer.dm"
#include "code\game\machinery\computer\aifixer.dm"
#include "code\game\machinery\computer\apc_control.dm"
#include "code\game\machinery\computer\arcade.dm"
@@ -616,7 +619,6 @@
#include "code\game\machinery\computer\card.dm"
#include "code\game\machinery\computer\cloning.dm"
#include "code\game\machinery\computer\communications.dm"
-#include "code\game\machinery\computer\computer.dm"
#include "code\game\machinery\computer\crew.dm"
#include "code\game\machinery\computer\dna_console.dm"
#include "code\game\machinery\computer\gulag_teleporter.dm"
@@ -632,6 +634,7 @@
#include "code\game\machinery\computer\security.dm"
#include "code\game\machinery\computer\station_alert.dm"
#include "code\game\machinery\computer\telecrystalconsoles.dm"
+#include "code\game\machinery\computer\teleporter.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
#include "code\game\machinery\doors\airlock_types.dm"
@@ -862,6 +865,9 @@
#include "code\game\objects\items\weapons\twohanded.dm"
#include "code\game\objects\items\weapons\vending_items.dm"
#include "code\game\objects\items\weapons\weaponry.dm"
+#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm"
+#include "code\game\objects\items\weapons\circuitboards\computer_circuitboards.dm"
+#include "code\game\objects\items\weapons\circuitboards\machine_circuitboards.dm"
#include "code\game\objects\items\weapons\grenades\chem_grenade.dm"
#include "code\game\objects\items\weapons\grenades\clusterbuster.dm"
#include "code\game\objects\items\weapons\grenades\emgrenade.dm"
diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar
index 4cfa49f36d..3e99778951 100644
Binary files a/tools/dmitool/dmitool.jar and b/tools/dmitool/dmitool.jar differ
diff --git a/tools/dmitool/src/main/java/dmitool/IconState.java b/tools/dmitool/src/main/java/dmitool/IconState.java
index 2a2202c71c..a214f5d621 100644
--- a/tools/dmitool/src/main/java/dmitool/IconState.java
+++ b/tools/dmitool/src/main/java/dmitool/IconState.java
@@ -189,6 +189,7 @@ public class IconState {
px[i] = sl.clone();
}
+ int channelCount = in.imgInfo.alpha ? 4 : 3;
Image[] images = new Image[frames*dirs];
for(int imageY=0; imageY LINES_LIMIT-1:
break
if counter+len(note) > LINE_LENGTH_LIM-2:
- last_note_num = len(split_list)-1
- split_list[last_note_num] = split_list[last_note_num].rstrip(',')
- split_list[last_note_num] += END_OF_LINE_CHAR
+ split_list[-1] = split_list[-1].rstrip(',')
+ split_list[-1] += END_OF_LINE_CHAR
counter = 0
line_counter += 1
split_list.append(note)