diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 4b50904ea2..0bc99060de 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -726,7 +726,7 @@
},
/area/ruin/powered/syndicate_lava_base)
"bM" = (
-/obj/machinery/smartfridge/chemistry/virology,
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (EAST)";
icon_state = "podhatch";
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
index 8993318f00..8f1e550e17 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
@@ -8,185 +8,81 @@
},
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"c" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"d" = (
/obj/structure/alien/resin/wall,
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"e" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
},
/obj/structure/alien/egg/burst,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"f" = (
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"g" = (
/obj/structure/alien/weeds,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"h" = (
/obj/structure/alien/weeds,
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"i" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"j" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/mob/living/simple_animal/hostile/alien,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"k" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/obj/structure/alien/egg/burst,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"l" = (
/obj/structure/alien/weeds/node,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"m" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
},
/obj/structure/bed/nest,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"n" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/obj/structure/bed/nest,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"o" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -198,43 +94,19 @@
},
/obj/item/weapon/gun/ballistic/automatic/pistol,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"p" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"q" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"r" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
@@ -242,112 +114,48 @@
/obj/structure/alien/resin/wall,
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"s" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/obj/structure/alien/egg,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"t" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/mob/living/simple_animal/hostile/alien/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"u" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
},
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"v" = (
/obj/structure/alien/weeds/node,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"w" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"x" = (
/obj/structure/alien/weeds,
/obj/structure/alien/egg/burst,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"y" = (
/obj/structure/alien/weeds/node,
/obj/structure/alien/resin/wall,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"z" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
@@ -364,28 +172,12 @@
/obj/item/weapon/melee/baton/loaded,
/obj/item/clothing/head/helmet,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"A" = (
/obj/structure/alien/weeds,
/obj/structure/alien/egg,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"B" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
@@ -393,59 +185,27 @@
/obj/structure/alien/egg/burst,
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"C" = (
/obj/structure/alien/weeds,
/obj/structure/alien/egg/burst,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"D" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"E" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"F" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/queen/large{
@@ -455,15 +215,7 @@
plants_off = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"G" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
@@ -472,28 +224,12 @@
plants_off = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"H" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"I" = (
/obj/structure/alien/weeds,
/obj/structure/bed/nest,
@@ -507,56 +243,24 @@
/obj/item/clothing/under/syndicate,
/obj/item/clothing/glasses/night,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"J" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/sentinel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"K" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"L" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"M" = (
/obj/structure/alien/weeds{
icon_state = "weeds1"
@@ -573,15 +277,7 @@
stat = 2
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"N" = (
/obj/structure/alien/weeds,
/obj/structure/alien/resin/wall,
@@ -590,15 +286,7 @@
"O" = (
/obj/structure/alien/weeds/node,
/turf/template_noop,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"P" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
@@ -615,41 +303,17 @@
plants_off = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"R" = (
/obj/structure/alien/weeds,
/turf/template_noop,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"S" = (
/obj/structure/alien/weeds{
icon_state = "weeds2"
},
/turf/template_noop,
-/area/awaycontent/a5{
- always_unpowered = 1;
- has_gravity = 1;
- name = "The Hive";
- power_environ = 0;
- power_equip = 0;
- power_light = 0;
- poweralm = 0
- })
+/area/ruin/xenonest)
"T" = (
/obj/structure/alien/weeds/node,
/obj/structure/alien/resin/wall,
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index b00c11274b..229d5755a1 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -1142,6 +1142,10 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -1338,6 +1342,13 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -1356,6 +1367,13 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -53772,6 +53790,10 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -112232,11 +112254,11 @@ btp
cbv
ccq
bns
-cjD
-cjD
-cjD
-cjD
-cnj
+aof
+aof
+aof
+aof
+amw
aaa
aaa
aaa
@@ -112489,13 +112511,13 @@ ckS
bky
ccq
cds
-cjD
+aof
ckt
cly
cmw
-cnj
-cnj
-cnj
+amw
+amw
+amw
aaa
aaa
aaf
@@ -113003,13 +113025,13 @@ cbg
bTr
cct
cdu
-cjG
+aqx
cku
clz
cmx
-cnj
-cnj
-cnj
+amw
+amw
+amw
aaa
aaa
aaf
@@ -113260,11 +113282,11 @@ bky
bky
bky
bky
-cjD
-cjD
-cjD
-cjD
-cnj
+aof
+aof
+aof
+aof
+amw
aaa
aaa
aaa
diff --git a/_maps/map_files/generic/Fastload.dmm b/_maps/map_files/generic/Fastload.dmm
deleted file mode 100644
index 96b4a26934..0000000000
--- a/_maps/map_files/generic/Fastload.dmm
+++ /dev/null
@@ -1,3 +0,0 @@
-"a" = ()
-
-(1,1,1, 1,1,1) = {""}
diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm
index 7bf4708da7..eeb1a3756b 100644
--- a/_maps/shuttles/emergency_raven.dmm
+++ b/_maps/shuttles/emergency_raven.dmm
@@ -123,6 +123,7 @@
},
/area/shuttle/escape)
"aw" = (
+/obj/machinery/light,
/turf/open/floor/plasteel/darkblue/side,
/area/shuttle/escape)
"ax" = (
@@ -168,6 +169,10 @@
"aE" = (
/obj/structure/table/reinforced,
/obj/item/weapon/defibrillator/loaded,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/turf/open/floor/plasteel/darkpurple/side{
dir = 4
},
@@ -216,6 +221,9 @@
id = "shuttleflash";
pixel_y = -23
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (NORTH)";
dir = 1
@@ -232,6 +240,9 @@
},
/area/shuttle/escape)
"aM" = (
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (NORTH)";
dir = 1
@@ -412,6 +423,9 @@
pixel_y = 9
},
/obj/structure/closet/crate/internals,
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel/darkyellow/side{
tag = "icon-darkyellow (NORTHEAST)";
icon_state = "darkyellow";
@@ -516,6 +530,9 @@
pixel_y = 8
},
/obj/structure/table/reinforced,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/darkpurple/side{
dir = 8
},
@@ -918,6 +935,9 @@
/area/shuttle/escape)
"ch" = (
/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/darkgreen/side{
dir = 9;
icon_state = "darkgreen";
@@ -926,6 +946,10 @@
/area/shuttle/escape)
"ci" = (
/obj/structure/reagent_dispensers/watertank,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/turf/open/floor/plasteel/darkgreen/side{
dir = 5
},
@@ -1040,9 +1064,9 @@
name = "Bridge Blast Shutters";
pixel_x = 0;
pixel_y = -26;
- req_access_txt = "150";
- pixel_x = 0
+ req_access_txt = "19"
},
+/obj/machinery/light,
/turf/open/floor/plasteel/darkblue/side,
/area/shuttle/escape)
"cA" = (
@@ -1482,10 +1506,146 @@
pixel_x = 24;
pixel_y = 0
},
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/turf/open/floor/plasteel/darkgreen/side{
dir = 4
},
/area/shuttle/escape)
+"eC" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/turf/open/floor/plasteel/darkpurple/side{
+ dir = 4
+ },
+/area/shuttle/escape)
+"eD" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/brig{
+ dir = 8;
+ floor_tile = /obj/item/stack/tile/plasteel;
+ icon_state = "darkred"
+ },
+/area/shuttle/escape)
+"eE" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eF" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 8
+ },
+/area/shuttle/escape)
+"eG" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eH" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eI" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eJ" = (
+/obj/machinery/button/flasher{
+ id = "cockpit_flasher";
+ pixel_x = 6;
+ pixel_y = -24
+ },
+/obj/machinery/light,
+/turf/open/floor/mineral/titanium/blue,
+/area/space)
+"eK" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eL" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eM" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eN" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 4
+ },
+/area/shuttle/escape)
+"eO" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 8
+ },
+/area/shuttle/escape)
+"eP" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eQ" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 4
+ },
+/area/shuttle/escape)
+"eR" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eS" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -1531,7 +1691,7 @@ cs
ar
aW
bc
-bc
+eD
bc
bc
bc
@@ -1545,7 +1705,7 @@ cu
bF
be
be
-be
+eO
be
be
cd
@@ -1604,19 +1764,19 @@ cu
cu
cs
ar
-br
+eG
aC
-bz
+eH
ar
bT
bo
-br
+eK
bZ
ca
aC
bZ
ca
-bz
+eR
ab
ch
ar
@@ -1636,7 +1796,7 @@ be
be
be
be
-be
+eF
be
bG
aC
@@ -1712,13 +1872,13 @@ bP
ar
bU
bo
-br
+eL
bZ
ca
aC
bZ
ca
-bz
+eS
ab
ci
ar
@@ -1742,7 +1902,7 @@ bz
cs
bH
bG
-bz
+eI
cs
cs
cs
@@ -1771,7 +1931,7 @@ bb
bf
bk
cs
-br
+eE
bz
cs
bI
@@ -1884,9 +2044,9 @@ aa
cs
cs
cs
-br
+eM
aC
-bz
+eP
cs
cs
cs
@@ -1946,7 +2106,7 @@ bB
cu
ad
ad
-ad
+eJ
ad
cu
br
@@ -2004,7 +2164,7 @@ ar
aE
aI
aO
-aV
+eC
aV
bi
bm
@@ -2020,9 +2180,9 @@ cs
bW
aZ
aZ
+eN
aZ
-aZ
-aZ
+eQ
aZ
aZ
ce
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index a5e69bdc7b..e443e57b14 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -14,6 +14,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define MASKINTERNALS 8 // mask allows internals
#define HEAR 16 // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not.
+#define CHECK_RICOCHET 32 // Projectiels will check ricochet on things impacted that have this.
#define CONDUCT 64 // conducts electricity (metal etc.)
#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
#define NODECONSTRUCT 128 // For machines and structures that should not break into parts, eg, holodeck stuff
@@ -57,6 +58,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define UNUSED_TRANSIT_TURF 2
#define CAN_BE_DIRTY 4 //If a turf can be made dirty at roundstart. This is also used in areas.
#define NO_DEATHRATTLE 16 // Do not notify deadchat about any deaths that occur on this turf.
+//#define CHECK_RICOCHET 32 //Same thing as atom flag.
/*
These defines are used specifically with the atom/pass_flags bitmask
diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm
new file mode 100644
index 0000000000..859f3e3775
--- /dev/null
+++ b/code/__DEFINES/logging.dm
@@ -0,0 +1,18 @@
+//Investigate logging defines
+#define INVESTIGATE_ATMOS "atmos"
+#define INVESTIGATE_BOTANY "botany"
+#define INVESTIGATE_CARGO "cargo"
+#define INVESTIGATE_EXPERIMENTOR "experimentor"
+#define INVESTIGATE_GRAVITY "gravity"
+#define INVESTIGATE_RECORDS "records"
+#define INVESTIGATE_SINGULO "singulo"
+#define INVESTIGATE_SUPERMATTER "supermatter"
+#define INVESTIGATE_TELESCI "telesci"
+#define INVESTIGATE_WIRES "wires"
+
+//Individual logging defines
+#define INDIVIDUAL_ATTACK_LOG "Attack log"
+#define INDIVIDUAL_SAY_LOG "Say log"
+#define INDIVIDUAL_EMOTE_LOG "Emote log"
+#define INDIVIDUAL_OOC_LOG "OOC log"
+#define INDIVIDUAL_SHOW_ALL_LOG "All logs"
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 8b02a61fba..6a7e3b3b2e 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -411,3 +411,9 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define NO_FIELD 0
#define FIELD_TURF 1
#define FIELD_EDGE 2
+
+//gibtonite state defines
+#define GIBTONITE_UNSTRUCK 0
+#define GIBTONITE_ACTIVE 1
+#define GIBTONITE_STABLE 2
+#define GIBTONITE_DETONATE 3
\ No newline at end of file
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 49e03bdbdf..e5d1f4c19e 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -114,13 +114,6 @@
#define SNPC_MARTYR 3
#define SNPC_PSYCHO 4
-//Individual logging defines
-#define INDIVIDUAL_ATTACK_LOG "Attack log"
-#define INDIVIDUAL_SAY_LOG "Say log"
-#define INDIVIDUAL_EMOTE_LOG "Emote log"
-#define INDIVIDUAL_OOC_LOG "OOC log"
-#define INDIVIDUAL_SHOW_ALL_LOG "All logs"
-
#define TK_MAXRANGE 15
#define NO_SLIP_WHEN_WALKING 1
@@ -131,3 +124,8 @@
#define MAX_CHICKENS 50
#define UNHEALING_EAR_DAMAGE 100
+
+
+#define INCORPOREAL_MOVE_BASIC 1
+#define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows
+#define INCORPOREAL_MOVE_JAUNT 3 // is blocked by holy water/salt
\ No newline at end of file
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 8c8b360497..7303f0f33a 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -39,6 +39,7 @@
// Subsystem init_order, from highest priority to lowest priority
+// Subsystems shutdown in the reverse of the order they initialize in
// The numbers just define the ordering, they are meaningless otherwise.
#define INIT_ORDER_SERVER_MAINT 16
@@ -71,4 +72,4 @@
#define RUNLEVEL_GAME 4
#define RUNLEVEL_POSTGAME 8
-#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME)
\ No newline at end of file
+#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index de46e18fde..a0de8d9840 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -167,23 +167,14 @@
underlay_appearance.icon = fixed_underlay["icon"]
underlay_appearance.icon_state = fixed_underlay["icon_state"]
else
- var/turf/T = get_step(src, turn(adjacencies, 180))
- if(T && (T.density || T.smooth))
+ var/turned_adjacency = turn(adjacencies, 180)
+ var/turf/T = get_step(src, turned_adjacency)
+ if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
T = get_step(src, turn(adjacencies, 135))
- if(T && (T.density || T.smooth))
+ if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
T = get_step(src, turn(adjacencies, 225))
-
- if(isspaceturf(T) && !istype(T, /turf/open/space/transit))
- underlay_appearance.icon = 'icons/turf/space.dmi'
- underlay_appearance.icon_state = SPACE_ICON_STATE
- underlay_appearance.plane = PLANE_SPACE
- else if(T && !T.density && !T.smooth)
- underlay_appearance.icon = T.icon
- underlay_appearance.icon_state = T.icon_state
- else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth))
- underlay_appearance.icon = initial(baseturf.icon)
- underlay_appearance.icon_state = initial(baseturf.icon_state)
- else
+ //if all else fails, ask our own turf
+ if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
underlay_appearance.icon = DEFAULT_UNDERLAY_ICON
underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE
underlays = U
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
index 7e892e8dd4..7e0fd531eb 100644
--- a/code/__HELPERS/maths.dm
+++ b/code/__HELPERS/maths.dm
@@ -130,6 +130,22 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
var/t = round((val - min) / d)
return val - (t * d)
+#define NORM_ROT(rot) ((((rot % 360) + (rot - round(rot, 1))) > 0) ? ((rot % 360) + (rot - round(rot, 1))) : (((rot % 360) + (rot - round(rot, 1))) + 360))
+
+/proc/get_angle_of_incidence(face_angle, angle_in, auto_normalize = TRUE)
+
+ var/angle_in_s = NORM_ROT(angle_in)
+ var/face_angle_s = NORM_ROT(face_angle)
+ var/incidence = face_angle_s - angle_in_s
+ var/incidence_s = incidence
+ while(incidence_s < -90)
+ incidence_s += 180
+ while(incidence_s > 90)
+ incidence_s -= 180
+ if(auto_normalize)
+ return incidence_s
+ else
+ return incidence
//A logarithm that converts an integer to a number scaled between 0 and 1 (can be tweaked to be higher).
//Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions.
@@ -141,8 +157,6 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5
//to_chat(world, "Transform multiplier of [src] is [size_factor + scaling_modifer]")
-
-
//converts a uniform distributed random number into a normal distributed one
//since this method produces two random numbers, one is saved for subsequent calls
//(making the cost negligble for every second call)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index a9f76f7f9d..5b26067725 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -92,7 +92,7 @@
if(next_move > world.time) // in the year 2000...
return
- if(A.IsObscured())
+ if(!modifiers["catcher"] && A.IsObscured())
return
if(istype(loc,/obj/mecha))
@@ -119,7 +119,7 @@
//User itself, current loc, and user inventory
if(DirectAccess(A))
if(W)
- melee_item_attack_chain(src,W,A,params)
+ W.melee_attack_chain(src, A, params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
@@ -133,7 +133,7 @@
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
- melee_item_attack_chain(src,W,A,params)
+ W.melee_attack_chain(src, A, params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
@@ -325,8 +325,6 @@
/mob/living/carbon/human/CtrlClick(mob/user)
if(ishuman(user) && Adjacent(user))
- if(world.time < user.next_move)
- return FALSE
var/mob/living/carbon/human/H = user
H.dna.species.grab(H, src, H.mind.martial_art)
H.changeNext_move(CLICK_CD_MELEE)
@@ -448,6 +446,7 @@
C.swap_hand()
else
var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr))
+ params += "&catcher=1"
if(T)
T.Click(location, control, params)
. = 1
@@ -466,4 +465,4 @@
view = -1
else
view = 1
- add_view_range(view)
+ add_view_range(view)
\ No newline at end of file
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index c52b3441db..3bb15c1947 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -71,7 +71,7 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
- melee_item_attack_chain(src, W, A, params)
+ W.melee_attack_chain(src, A, params)
return
if(!isturf(loc))
@@ -80,7 +80,7 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
- melee_item_attack_chain(src, W, A, params)
+ W.melee_attack_chain(src, A, params)
return
else
W.afterattack(A, src, 0, params)
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index dfabe23025..7e6f488a47 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -271,8 +271,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/obj/screen/alert/bloodsense/Initialize()
. = ..()
- if(!narnar)
- narnar = new('icons/mob/screen_alert.dmi', "mini_nar")
+ narnar = new('icons/mob/screen_alert.dmi', "mini_nar")
START_PROCESSING(SSprocessing, src)
/obj/screen/alert/bloodsense/Destroy()
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 24f6559dd6..72694a434c 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -1,10 +1,10 @@
-/proc/melee_item_attack_chain(mob/user, obj/item/I, atom/target, params)
- if(I.pre_attackby(target, user, params))
+/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
+ if(pre_attackby(target, user, params))
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
- var/resolved = target.attackby(I,user,params)
- if(!resolved && target && I)
- I.afterattack(target, user, 1, params) // 1: clicking something Adjacent
+ var/resolved = target.attackby(src, user, params)
+ if(!resolved && target && !QDELETED(src))
+ afterattack(target, user, 1, params) // 1: clicking something Adjacent
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index c7ad66440e..0ca0fb31a9 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -124,7 +124,8 @@
if(!isturf(target) && istype(focus,/obj/item) && target.Adjacent(focus))
apply_focus_overlay()
- melee_item_attack_chain(tk_user, focus, target, params) //isn't copying the attack chain fun. we should do it more often.
+ var/obj/item/I = focus
+ I.melee_attack_chain(tk_user, target, params) //isn't copying the attack chain fun. we should do it more often.
if(check_if_focusable(focus))
focus.do_attack_animation(target, null, focus)
else
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index ecc5f3cc17..f606a0d61a 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -1,8 +1,8 @@
SUBSYSTEM_DEF(blackbox)
name = "Blackbox"
wait = 6000
- flags = SS_NO_TICK_CHECK | SS_NO_INIT
- runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ flags = SS_NO_TICK_CHECK | SS_NO_INIT
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/msg_common = list()
var/list/msg_science = list()
@@ -86,12 +86,11 @@ SUBSYSTEM_DEF(blackbox)
if (!SSdbcore.Connect())
return
-
+
var/list/sqlrowlist = list()
for (var/datum/feedback_variable/FV in feedback)
- sqlrowlist += list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'")
-
+ sqlrowlist += list(list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'"))
if (!length(sqlrowlist))
return
diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm
index ad4691564c..cf3efc3bc3 100644
--- a/code/controllers/subsystem/dbcore.dm
+++ b/code/controllers/subsystem/dbcore.dm
@@ -23,7 +23,8 @@ SUBSYSTEM_DEF(dbcore)
var/failed_connections = 0
/datum/controller/subsystem/dbcore/PreInit()
- _db_con = _dm_db_new_con()
+ if(!_db_con)
+ _db_con = _dm_db_new_con()
/datum/controller/subsystem/dbcore/Recover()
_db_con = SSdbcore._db_con
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 2611bc53e6..234569bfdc 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -164,8 +164,8 @@ SUBSYSTEM_DEF(garbage)
if (time > highest_del_time)
highest_del_time = time
if (time > 10)
- log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)")
- message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).")
+ log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)")
+ message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).")
postpone(time/5)
/datum/controller/subsystem/garbage/proc/HardQueue(datum/A)
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 35d8a3d08f..bcb94c835b 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -15,14 +15,15 @@ SUBSYSTEM_DEF(lighting)
/datum/controller/subsystem/lighting/Initialize(timeofday)
- if (config.starlight)
- for(var/I in GLOB.sortedAreas)
- var/area/A = I
- if (A.dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT)
- A.luminosity = 0
+ if(!initialized)
+ if (config.starlight)
+ for(var/I in GLOB.sortedAreas)
+ var/area/A = I
+ if (A.dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT)
+ A.luminosity = 0
- create_all_lighting_objects()
- initialized = TRUE
+ create_all_lighting_objects()
+ initialized = TRUE
fire(FALSE, TRUE)
diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm
index b8dfa00f23..6c8b83daa4 100644
--- a/code/datums/antagonists/datum_clockcult.dm
+++ b/code/datums/antagonists/datum_clockcult.dm
@@ -55,9 +55,8 @@
else if(isbrain(current) || isclockmob(current))
to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.")
..()
- if(istype(SSticker.mode, /datum/game_mode/clockwork_cult))
- var/datum/game_mode/clockwork_cult/C = SSticker.mode
- C.present_tasks(owner) //Memorize the objectives
+ to_chat(current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]")
+ owner.memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
" //Memorize the objectives
/datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override)
. = ..()
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index b90e2ec652..2e95629d30 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -1,34 +1,37 @@
/datum/getrev
- var/parentcommit
+ var/originmastercommit
var/commit
var/list/testmerge = list()
var/has_pr_details = FALSE //example data in a testmerge entry when this is true: https://api.github.com/repositories/3234987/pulls/22586
var/date
/datum/getrev/New()
- var/head_file = file2text(".git/logs/HEAD")
if(SERVERTOOLS && fexists("..\\prtestjob.lk"))
var/list/tmp = world.file2list("..\\prtestjob.lk")
for(var/I in tmp)
if(I)
testmerge |= I
- var/testlen = max(testmerge.len - 1, 0)
- var/regex/head_log = new("(\\w{40}) .+> (\\d{10}).+(?=(\n.*(\\w{40}).*){[testlen]}\n*\\Z)")
- head_log.Find(head_file)
- parentcommit = head_log.group[1]
- date = unix2date(text2num(head_log.group[2]))
- commit = head_log.group[4]
+
log_world("Running /tg/ revision:")
- log_world("[date]")
+ var/list/logs = world.file2list(".git/logs/HEAD")
+ if(logs)
+ logs = splittext(logs[logs.len - 1], " ")
+ date = unix2date(text2num(logs[5]))
+ commit = logs[2]
+ log_world("[date]")
+ logs = world.file2list(".git/logs/refs/remotes/origin/master")
+ if(logs)
+ originmastercommit = splittext(logs[logs.len - 1], " ")[2]
+
if(testmerge.len)
log_world(commit)
for(var/line in testmerge)
if(line)
log_world("Test merge active of PR #[line]")
SSblackbox.add_details("testmerged_prs","[line]")
- log_world("Based off master commit [parentcommit]")
+ log_world("Based off origin/master commit [originmastercommit]")
else
- log_world(parentcommit)
+ log_world(originmastercommit)
/datum/getrev/proc/DownloadPRDetails()
if(!config.githubrepoid)
@@ -73,13 +76,13 @@
set name = "Show Server Revision"
set desc = "Check the current server code revision"
- if(GLOB.revdata.parentcommit)
+ if(GLOB.revdata.originmastercommit)
to_chat(src, "Server revision compiled on: [GLOB.revdata.date]")
var/prefix = ""
if(GLOB.revdata.testmerge.len)
to_chat(src, GLOB.revdata.GetTestMergeInfo())
- prefix = "Based off master commit: "
- var/pc = GLOB.revdata.parentcommit
+ prefix = "Based off origin/master commit: "
+ var/pc = GLOB.revdata.originmastercommit
to_chat(src, "[prefix][copytext(pc, 1, min(length(pc), 7))]")
else
to_chat(src, "Revision unknown")
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 8f18f8b1fe..a3157e6514 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -46,7 +46,7 @@
user.reset_perspective()
if(user.client)
for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
- user.client.images -= chunk.obscured
+ chunk.remove(eye)
user.remote_control = null
QDEL_NULL(eye)
diff --git a/code/datums/riding.dm b/code/datums/riding.dm
index c069e0cdeb..1d989cc653 100644
--- a/code/datums/riding.dm
+++ b/code/datums/riding.dm
@@ -1,6 +1,4 @@
/datum/riding
- var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver
- var/generic_pixel_y = 0 //All dirs show this pixel_y for the driver, use these vars if the pixel shift is stable across all dir, override handle_vehicle_offsets otherwise.
var/next_vehicle_move = 0 //used for move delays
var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
var/keytype = null
@@ -34,16 +32,29 @@
/datum/riding/proc/force_dismount(mob/living/M)
ridden.unbuckle_mob(M)
-//Override this to set your vehicle's various pixel offsets
-//if they differ between directions, otherwise use the
-//generic variables
/datum/riding/proc/handle_vehicle_offsets()
+ var/ridden_dir = "[ridden.dir]"
+ var/passindex = 0
if(ridden.has_buckled_mobs())
for(var/m in ridden.buckled_mobs)
+ passindex++
var/mob/living/buckled_mob = m
- buckled_mob.setDir(ridden.dir)
- buckled_mob.pixel_x = generic_pixel_x
- buckled_mob.pixel_y = generic_pixel_y
+ var/list/offsets = get_offsets(passindex)
+ dir_loop:
+ for(var/offsetdir in offsets)
+ if(offsetdir == ridden_dir)
+ var/list/diroffsets = offsets[offsetdir]
+ buckled_mob.pixel_x = diroffsets[1]
+ if(diroffsets.len == 2)
+ buckled_mob.pixel_y = diroffsets[2]
+ if(diroffsets.len == 3)
+ buckled_mob.layer = diroffsets[3]
+ break dir_loop
+
+
+//Override this to set your vehicle's various pixel offsets
+/datum/riding/proc/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 0), "[SOUTH]" = list(0, 0), "[EAST]" = list(0, 0), "[WEST]" = list(0, 0))
//KEYS
/datum/riding/proc/keycheck(mob/user)
@@ -100,10 +111,12 @@
//atv
/datum/riding/atv
keytype = /obj/item/key
- generic_pixel_x = 0
- generic_pixel_y = 4
vehicle_move_delay = 1
+/datum/riding/atv/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(0, 4), "[WEST]" = list( 0, 4))
+
+
/datum/riding/atv/handle_vehicle_layer()
if(ridden.dir == SOUTH)
ridden.layer = ABOVE_MOB_LAYER
@@ -150,24 +163,9 @@
keytype = /obj/item/key/janitor
-/datum/riding/janicart/handle_vehicle_offsets()
- ..()
- if(ridden.has_buckled_mobs())
- for(var/m in ridden.buckled_mobs)
- var/mob/living/buckled_mob = m
- switch(buckled_mob.dir)
- if(NORTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 4
- if(EAST)
- buckled_mob.pixel_x = -12
- buckled_mob.pixel_y = 7
- if(SOUTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 7
- if(WEST)
- buckled_mob.pixel_x = 12
- buckled_mob.pixel_y = 7
+/datum/riding/janicart/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(-12, 7), "[EAST]" = list(0, 7), "[WEST]" = list( 12, 7))
+
//scooter
/datum/riding/scooter/handle_vehicle_layer()
if(ridden.dir == SOUTH)
@@ -175,20 +173,14 @@
else
ridden.layer = OBJ_LAYER
+/datum/riding/scooter/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0), "[SOUTH]" = list(-2), "[EAST]" = list(0), "[WEST]" = list( 2))
+
/datum/riding/scooter/handle_vehicle_offsets()
..()
if(ridden.has_buckled_mobs())
for(var/m in ridden.buckled_mobs)
var/mob/living/buckled_mob = m
- switch(buckled_mob.dir)
- if(NORTH)
- buckled_mob.pixel_x = 0
- if(EAST)
- buckled_mob.pixel_x = -2
- if(SOUTH)
- buckled_mob.pixel_x = 0
- if(WEST)
- buckled_mob.pixel_x = 2
if(buckled_mob.get_num_legs() > 0)
buckled_mob.pixel_y = 5
else
@@ -209,16 +201,18 @@
//secway
/datum/riding/secway
keytype = /obj/item/key/security
- generic_pixel_x = 0
- generic_pixel_y = 4
+
+/datum/riding/secway/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(0, 4), "[WEST]" = list( 0, 4))
//i want to ride my
/datum/riding/bicycle
keytype = null
- generic_pixel_x = 0
- generic_pixel_y = 4
vehicle_move_delay = 0
+/datum/riding/bicycle/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(0, 4), "[WEST]" = list( 0, 4))
+
//speedbike
/datum/riding/space/speedbike
keytype = null
@@ -233,54 +227,28 @@
ridden.pixel_x = -18
ridden.pixel_y = 0
-/datum/riding/space/speedbike/handle_vehicle_offsets()
- if(ridden.has_buckled_mobs())
- for(var/m in ridden.buckled_mobs)
- var/mob/living/buckled_mob = m
- buckled_mob.setDir(ridden.dir)
- switch(ridden.dir)
- if(NORTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = -8
- if(SOUTH)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 4
- if(EAST)
- buckled_mob.pixel_x = -10
- buckled_mob.pixel_y = 5
- if(WEST)
- buckled_mob.pixel_x = 10
- buckled_mob.pixel_y = 5
+/datum/riding/space/speedbike/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, -8), "[SOUTH]" = list(0, 4), "[EAST]" = list(-10, 5), "[WEST]" = list( 10, 5))
//SPEEDUWAGON
/datum/riding/space/speedwagon
vehicle_move_delay = 0
-/datum/riding/space/speedwagon/handle_vehicle_offsets()
- if(ridden.has_buckled_mobs())
- for(var/m in ridden.buckled_mobs)
- var/mob/living/buckled_mob = m
- buckled_mob.setDir(ridden.dir)
- ridden.pixel_x = -48
- ridden.pixel_y = -48
- switch(ridden.dir)
- if(NORTH)
- buckled_mob.pixel_x = -10
- buckled_mob.pixel_y = -3
- if(SOUTH)
- buckled_mob.pixel_x = 16
- buckled_mob.pixel_y = 3
- if(EAST)
- buckled_mob.pixel_x = -4
- buckled_mob.pixel_y = 30
- if(WEST)
- buckled_mob.pixel_x = 4
- buckled_mob.pixel_y = -1
-
/datum/riding/space/speedwagon/handle_vehicle_layer()
ridden.layer = BELOW_MOB_LAYER
+/datum/riding/space/speedwagon/get_offsets(pass_index) // list(dir = x, y, layer)
+ switch(pass_index)
+ if(1)
+ return list("[NORTH]" = list(-10, -4), "[SOUTH]" = list(16, 3), "[EAST]" = list(-4, 30), "[WEST]" = list(4, -3))
+ if(2)
+ return list("[NORTH]" = list(19, -5, 4), "[SOUTH]" = list(-13, 3, 4), "[EAST]" = list(-4, -3, 4.1), "[WEST]" = list(4, 28, 3.9))
+ if(3)
+ return list("[NORTH]" = list(-10, -18, 4.2), "[SOUTH]" = list(16, 25, 3.9), "[EAST]" = list(-22, 30), "[WEST]" = list(22, -3, 4.1))
+ if(4)
+ return list("[NORTH]" = list(19, -18, 4.2), "[SOUTH]" = list(-13, 25, 3.9), "[EAST]" = list(-22, 3, 3.9), "[WEST]" = list(22, 28))
+
///////////////BOATS////////////
/datum/riding/boat
keytype = /obj/item/weapon/oar
@@ -297,17 +265,15 @@
/datum/riding/boat/dragon
keytype = null
- generic_pixel_y = 2
- generic_pixel_x = 1
vehicle_move_delay = 1
+/datum/riding/boat/dragon/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(1, 2), "[SOUTH]" = list(1, 2), "[EAST]" = list(1, 2), "[WEST]" = list( 1, 2))
///////////////ANIMALS////////////
//general animals
/datum/riding/animal
keytype = null
- generic_pixel_x = 0
- generic_pixel_y = 4
/datum/riding/animal/handle_ride(mob/user, direction)
if(user.incapacitated())
@@ -335,7 +301,7 @@
/datum/riding/human/ride_check(mob/living/M)
var/mob/living/carbon/human/H = ridden //IF this runtimes I'm blaming the admins.
if(M.incapacitated(FALSE, TRUE) || H.incapacitated(FALSE, TRUE))
- M.visible_message("[M] falls off [ridden]!")
+ M.visible_message("[M] falls off of [ridden]!")
Unbuckle(M)
return FALSE
if(M.restrained(TRUE))
@@ -345,22 +311,8 @@
if(H.pulling == M)
H.stop_pulling()
-/datum/riding/human/handle_vehicle_offsets()
- for(var/mob/living/M in ridden.buckled_mobs)
- M.setDir(ridden.dir)
- switch(ridden.dir)
- if(NORTH)
- M.pixel_x = 0
- M.pixel_y = 6
- if(SOUTH)
- M.pixel_x = 0
- M.pixel_y = 6
- if(EAST)
- M.pixel_x = -6
- M.pixel_y = 4
- if(WEST)
- M.pixel_x = 6
- M.pixel_y = 4
+/datum/riding/human/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 6), "[SOUTH]" = list(0, 6), "[EAST]" = list(-6, 4), "[WEST]" = list( 6, 4))
/datum/riding/human/handle_vehicle_layer()
if(ridden.buckled_mobs && ridden.buckled_mobs.len)
@@ -375,7 +327,7 @@
ridden.unbuckle_mob(user)
user.Weaken(3)
user.Stun(3)
- user.visible_message("[ridden] pushes [user] off of them!")
+ user.visible_message("[ridden] pushes [user] off of them!")
/datum/riding/cyborg
keytype = null
@@ -407,6 +359,9 @@
else
ridden.layer = MOB_LAYER
+/datum/riding/cyborg/get_offsets(pass_index) // list(dir = x, y, layer)
+ return list("[NORTH]" = list(0, 4), "[SOUTH]" = list(0, 4), "[EAST]" = list(-6, 3), "[WEST]" = list( 6, 3))
+
/datum/riding/cyborg/handle_vehicle_offsets()
if(ridden.has_buckled_mobs())
for(var/mob/living/M in ridden.buckled_mobs)
@@ -417,26 +372,14 @@
M.pixel_x = R.module.ride_offset_x[dir2text(ridden.dir)]
M.pixel_y = R.module.ride_offset_y[dir2text(ridden.dir)]
else
- switch(ridden.dir)
- if(NORTH)
- M.pixel_x = 0
- M.pixel_y = 4
- if(SOUTH)
- M.pixel_x = 0
- M.pixel_y = 4
- if(EAST)
- M.pixel_x = -6
- M.pixel_y = 3
- if(WEST)
- M.pixel_x = 6
- M.pixel_y = 3
+ ..()
/datum/riding/cyborg/force_dismount(mob/living/M)
ridden.unbuckle_mob(M)
var/turf/target = get_edge_target_turf(ridden, ridden.dir)
var/turf/targetm = get_step(get_turf(ridden), ridden.dir)
M.Move(targetm)
- M.visible_message("[M] is thrown clear of [ridden]!")
+ M.visible_message("[M] is thrown clear of [ridden]!")
M.throw_at(target, 14, 5, ridden)
M.Weaken(3)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index f24ad5f7c3..92ee2e6462 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -181,6 +181,7 @@
marked_underlay.pixel_x = -owner.pixel_x
marked_underlay.pixel_y = -owner.pixel_y
owner.underlays += marked_underlay
+ return TRUE
return FALSE
/datum/status_effect/crusher_mark/Destroy()
diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm
index 48271f479d..a88816f187 100644
--- a/code/game/area/areas/mining.dm
+++ b/code/game/area/areas/mining.dm
@@ -86,6 +86,7 @@
/area/lavaland
icon_state = "mining"
has_gravity = 1
+ flags = NONE
/area/lavaland/surface
name = "Lavaland"
@@ -123,4 +124,4 @@
icon_state = "danger"
/area/lavaland/surface/outdoors/explored
- name = "Lavaland Labor Camp"
\ No newline at end of file
+ name = "Lavaland Labor Camp"
diff --git a/code/game/area/areas/ruins.dm b/code/game/area/areas/ruins.dm
index 828d165dd8..4a1fd86c20 100644
--- a/code/game/area/areas/ruins.dm
+++ b/code/game/area/areas/ruins.dm
@@ -5,6 +5,7 @@
icon_state = "away"
has_gravity = 1
hidden = TRUE
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/area/ruin/unpowered
@@ -199,3 +200,15 @@
/area/ruin/abandonedzoo
name = "Abandoned Zoo"
icon_state = "green"
+
+
+//Xeno Nest
+
+/area/ruin/xenonest
+ name = "The Hive"
+ always_unpowered = 1
+ power_environ = 0
+ power_equip = 0
+ power_light = 0
+ poweralm = 0
+
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 4a0f05602b..65d4cf1449 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -104,6 +104,9 @@
return ..()
+/atom/proc/handle_ricochet(obj/item/projectile/P)
+ return
+
/atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5)
return (!density || !height)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 531cc873f0..132c834f10 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -171,14 +171,6 @@ Credit where due:
return TRUE
return FALSE
-/datum/game_mode/clockwork_cult/proc/present_tasks(mob/living/L) //Memorizes and displays the clockwork cult's objective
- if(!L || !istype(L) || !L.mind)
- return 0
- var/datum/mind/M = L.mind
- to_chat(M.current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]")
- M.memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
"
- return 1
-
/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
if(GLOB.clockwork_gateway_activated)
SSticker.news_report = CLOCK_PROSELYTIZATION //failure, technically, but we have the station
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index ed1a64eede..4be11267ef 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -375,8 +375,8 @@
desc = "Used by veteran cultists to instantly transport items to their needful bretheren."
w_class = WEIGHT_CLASS_SMALL
brightness_on = 1
- icon_state = "torch-on"
- item_state = "torch-on"
+ icon_state = "torch"
+ item_state = "torch"
color = "#ff0000"
on_damage = 15
slot_flags = null
diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm
index 0ff9ef4f2d..f5db21f0ab 100644
--- a/code/game/gamemodes/gang/gang_datum.dm
+++ b/code/game/gamemodes/gang/gang_datum.dm
@@ -53,7 +53,6 @@
/datum/gang_item/weapon/ammo/uzi_ammo,
/datum/gang_item/equipment/sharpener,
/datum/gang_item/equipment/spraycan,
- /datum/gang_item/equipment/sharpener,
/datum/gang_item/equipment/emp,
/datum/gang_item/equipment/c4,
/datum/gang_item/equipment/frag,
@@ -91,7 +90,6 @@
/datum/gang_item/weapon/ammo/uzi_ammo,
/datum/gang_item/equipment/sharpener,
/datum/gang_item/equipment/spraycan,
- /datum/gang_item/equipment/sharpener,
/datum/gang_item/equipment/emp,
/datum/gang_item/equipment/c4,
/datum/gang_item/equipment/frag,
diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm
index aec9b040cd..5a190d4a18 100644
--- a/code/game/gamemodes/gang/gang_items.dm
+++ b/code/game/gamemodes/gang/gang_items.dm
@@ -422,7 +422,7 @@
return FALSE
if(dominator_excessive_walls(user))
- to_chat(user, "span class='warning'>The dominator will not function here! The dominator requires a sizable open space within three standard units so that walls do not interfere with the signal.")
+ to_chat(user, "The dominator will not function here! The dominator requires a sizable open space within three standard units so that walls do not interfere with the signal.")
return FALSE
if(!(usrarea.type in gang.territory|gang.territory_new))
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 4bbdd0ca18..554d992987 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -70,12 +70,12 @@
origin.vest_mode_action.Remove(C)
origin.vest_disguise_action.Remove(C)
origin.set_droppoint_action.Remove(C)
- remote_eye.eye_user = null
C.reset_perspective(null)
if(C.client)
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
+ chunk.remove(remote_eye)
+ remote_eye.eye_user = null
C.remote_control = null
C.unset_machine()
Remove(C)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 293b114b36..da7cdee931 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -15,7 +15,7 @@
var/icon_stun = "revenant_stun"
var/icon_drain = "revenant_draining"
var/stasis = FALSE
- incorporeal_move = 3
+ incorporeal_move = INCORPOREAL_MOVE_JAUNT
invisibility = INVISIBILITY_REVENANT
health = INFINITY //Revenants don't use health, they use essence instead
maxHealth = INFINITY
@@ -102,7 +102,7 @@
if(unreveal_time && world.time >= unreveal_time)
unreveal_time = 0
revealed = FALSE
- incorporeal_move = 3
+ incorporeal_move = INCORPOREAL_MOVE_JAUNT
invisibility = INVISIBILITY_REVENANT
to_chat(src, "You are once more concealed.")
if(unstun_time && world.time >= unstun_time)
@@ -222,7 +222,7 @@
R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls
R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body
R.revenant = src
- invisibility = INVISIBILITY_ABSTRACT
+ invisibility = INVISIBILITY_ABSTRACT
revealed = FALSE
ghostize(0)//Don't re-enter invisible corpse
return
@@ -236,7 +236,7 @@
return
revealed = TRUE
invisibility = 0
- incorporeal_move = 0
+ incorporeal_move = FALSE
if(!unreveal_time)
to_chat(src, "You have been revealed!")
unreveal_time = world.time + time
@@ -309,12 +309,12 @@
/mob/living/simple_animal/revenant/proc/death_reset()
revealed = FALSE
- unreveal_time = 0
+ unreveal_time = 0
notransform = 0
unstun_time = 0
inhibited = FALSE
draining = FALSE
- incorporeal_move = 3
+ incorporeal_move = INCORPOREAL_MOVE_JAUNT
invisibility = INVISIBILITY_REVENANT
alpha=255
stasis = FALSE
diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm
index 2ee546c7aa..dfe198eeb9 100644
--- a/code/game/gamemodes/traitor/double_agents.dm
+++ b/code/game/gamemodes/traitor/double_agents.dm
@@ -1,6 +1,8 @@
#define PINPOINTER_MINIMUM_RANGE 15
#define PINPOINTER_EXTRA_RANDOM_RANGE 10
#define PINPOINTER_PING_TIME 40
+#define PROB_ACTUAL_TRAITOR 20
+#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent"
/datum/game_mode/traitor/internal_affairs
name = "Internal Affairs"
@@ -171,7 +173,10 @@
if(!objective.check_completion())
traitored = FALSE
return
- to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.")
+ if(owner.special_role == TRAITOR_AGENT_ROLE)
+ to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ")
+ else
+ to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.")
replace_escape_objective(owner)
@@ -194,7 +199,10 @@
if(objective.stolen)
var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! "
if(traitored)
- fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated."
+ if(owner.special_role == TRAITOR_AGENT_ROLE)
+ fail_msg += " You no longer have permission to die. "
+ else
+ fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated."
reinstate_escape_objective(owner)
traitored = FALSE
to_chat(owner.current, fail_msg)
@@ -238,6 +246,10 @@
state.add_steal_targets_timer()
if(!issilicon(traitor.current))
give_pinpointer(traitor)
+ //Optional traitor objective
+ if(prob(PROB_ACTUAL_TRAITOR))
+ traitor.special_role = TRAITOR_AGENT_ROLE
+ forge_single_objective(traitor)
else
..() // Give them standard objectives.
@@ -289,11 +301,18 @@
/datum/game_mode/traitor/internal_affairs/greet_traitor(datum/mind/traitor)
var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
- to_chat(traitor.current, "You are the [traitor_name].")
- to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.")
- to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.")
- to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.")
- to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
+ if(traitor.special_role == TRAITOR_AGENT_ROLE)
+ to_chat(traitor.current, "You are the [TRAITOR_AGENT_ROLE].")
+ to_chat(traitor.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.")
+ to_chat(traitor.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.")
+ to_chat(traitor.current, " You have been provided with a standard uplink to accomplish your task. ")
+ to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
+ else
+ to_chat(traitor.current, "You are the [traitor_name].")
+ to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.")
+ to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.")
+ to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.")
+ to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
traitor.announce_objectives()
@@ -301,6 +320,8 @@
/datum/game_mode/traitor/internal_affairs/give_codewords(mob/living/traitor_mob)
return
+#undef PROB_ACTUAL_TRAITOR
#undef PINPOINTER_EXTRA_RANDOM_RANGE
#undef PINPOINTER_MINIMUM_RANGE
#undef PINPOINTER_PING_TIME
+
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 4673b572a8..6ad37815ca 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -85,40 +85,65 @@
character.make_Traitor()
+/datum/game_mode/proc/forge_single_objective(datum/mind/traitor) //Returns how many objectives are added
+ .=1
+ if(issilicon(traitor.current))
+ var/special_pick = rand(1,4)
+ switch(special_pick)
+ if(1)
+ var/datum/objective/block/block_objective = new
+ block_objective.owner = traitor
+ traitor.objectives += block_objective
+ if(2)
+ var/datum/objective/purge/purge_objective = new
+ purge_objective.owner = traitor
+ traitor.objectives += purge_objective
+ if(3)
+ var/datum/objective/robot_army/robot_objective = new
+ robot_objective.owner = traitor
+ traitor.objectives += robot_objective
+ if(4) //Protect and strand a target
+ var/datum/objective/protect/yandere_one = new
+ yandere_one.owner = traitor
+ traitor.objectives += yandere_one
+ yandere_one.find_target()
+ var/datum/objective/maroon/yandere_two = new
+ yandere_two.owner = traitor
+ yandere_two.target = yandere_one.target
+ yandere_two.update_explanation_text() // normally called in find_target()
+ traitor.objectives += yandere_two
+ .=2
+ else
+ if(prob(50))
+ var/list/active_ais = active_ais()
+ if(active_ais.len && prob(100/GLOB.joined_player_list.len))
+ var/datum/objective/destroy/destroy_objective = new
+ destroy_objective.owner = traitor
+ destroy_objective.find_target()
+ traitor.objectives += destroy_objective
+ else if(prob(30))
+ var/datum/objective/maroon/maroon_objective = new
+ maroon_objective.owner = traitor
+ maroon_objective.find_target()
+ traitor.objectives += maroon_objective
+ else
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = traitor
+ kill_objective.find_target()
+ traitor.objectives += kill_objective
+ else
+ var/datum/objective/steal/steal_objective = new
+ steal_objective.owner = traitor
+ steal_objective.find_target()
+ traitor.objectives += steal_objective
+
+
/datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor)
if(issilicon(traitor.current))
var/objective_count = 0
if(prob(30))
- var/special_pick = rand(1,4)
- switch(special_pick)
- if(1)
- var/datum/objective/block/block_objective = new
- block_objective.owner = traitor
- traitor.objectives += block_objective
- objective_count++
- if(2)
- var/datum/objective/purge/purge_objective = new
- purge_objective.owner = traitor
- traitor.objectives += purge_objective
- objective_count++
- if(3)
- var/datum/objective/robot_army/robot_objective = new
- robot_objective.owner = traitor
- traitor.objectives += robot_objective
- objective_count++
- if(4) //Protect and strand a target
- var/datum/objective/protect/yandere_one = new
- yandere_one.owner = traitor
- traitor.objectives += yandere_one
- yandere_one.find_target()
- objective_count++
- var/datum/objective/maroon/yandere_two = new
- yandere_two.owner = traitor
- yandere_two.target = yandere_one.target
- yandere_two.update_explanation_text() // normally called in find_target()
- traitor.objectives += yandere_two
- objective_count++
+ objective_count+=forge_single_objective(traitor)
for(var/i = objective_count, i < config.traitor_objectives_amount, i++)
var/datum/objective/assassinate/kill_objective = new
@@ -142,29 +167,8 @@
assign_exchange_role(exchange_red)
assign_exchange_role(exchange_blue)
objective_count += 1 //Exchange counts towards number of objectives
- var/list/active_ais = active_ais()
for(var/i = objective_count, i < config.traitor_objectives_amount, i++)
- if(prob(50))
- if(active_ais.len && prob(100/GLOB.joined_player_list.len))
- var/datum/objective/destroy/destroy_objective = new
- destroy_objective.owner = traitor
- destroy_objective.find_target()
- traitor.objectives += destroy_objective
- else if(prob(30))
- var/datum/objective/maroon/maroon_objective = new
- maroon_objective.owner = traitor
- maroon_objective.find_target()
- traitor.objectives += maroon_objective
- else
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = traitor
- kill_objective.find_target()
- traitor.objectives += kill_objective
- else
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = traitor
- steal_objective.find_target()
- traitor.objectives += steal_objective
+ forge_single_objective(traitor)
if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount
if (!(locate(/datum/objective/hijack) in traitor.objectives))
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index c72152668d..4c25d221ff 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -3,6 +3,7 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "soulstone"
item_state = "electronic"
+ layer = HIGH_OBJ_LAYER
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power."
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
@@ -213,12 +214,12 @@
var/obj/screen/alert/bloodsense/BS
if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode)
SSticker.mode.add_cultist(newstruct.mind, 0)
- BS = newstruct.alerts.Find("bloodsense")
if(iscultist(stoner) || cultoverride)
to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow their orders and help them complete their goals at all costs.")
else if(stoner)
to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs.")
- BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
+ newstruct.clear_alert("bloodsense")
+ BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
if(BS)
BS.Cviewer = newstruct
newstruct.cancel_camera()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index ec87cf6ba9..fac4f7f31b 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -44,8 +44,8 @@
"corazone", // prevents cardiac arrest damage
"mimesbane") // stops them gasping from lack of air.
-/obj/machinery/clonepod/New()
- ..()
+/obj/machinery/clonepod/Initialize()
+ . = ..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null)
B.apply_default_parts(src)
@@ -358,8 +358,12 @@
/obj/machinery/clonepod/proc/go_out()
countdown.stop()
var/mob/living/mob_occupant = occupant
+ var/turf/T = get_turf(src)
if(mess) //Clean that mess and dump those gibs!
+ for(var/obj/fl in unattached_flesh)
+ fl.forceMove(T)
+ unattached_flesh.Cut()
mess = FALSE
new /obj/effect/gibspawner/generic(loc)
audible_message("You hear a splat.")
@@ -375,10 +379,12 @@
to_chat(occupant, "There is a bright flash!
You feel like a new being.")
mob_occupant.flash_act()
- var/turf/T = get_turf(src)
occupant.forceMove(T)
icon_state = "pod_0"
mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
+ for(var/fl in unattached_flesh)
+ qdel(fl)
+ unattached_flesh.Cut()
occupant = null
@@ -389,8 +395,7 @@
SPEAK("Critical error! Please contact a Thinktronic Systems \
technician, as your warranty may be affected.")
mess = TRUE
- for(var/obj/item/O in unattached_flesh)
- qdel(O)
+ maim_clone(mob_occupant) //Remove every bit that's grown back so far to drop later, also destroys bits that haven't grown yet
icon_state = "pod_g"
if(mob_occupant.mind != clonemind)
clonemind.transfer_to(mob_occupant)
@@ -450,9 +455,10 @@
var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg")
for(var/zone in zones)
var/obj/item/bodypart/BP = H.get_bodypart(zone)
- BP.drop_limb()
- BP.forceMove(src)
- unattached_flesh += BP
+ if(BP)
+ BP.drop_limb()
+ BP.forceMove(src)
+ unattached_flesh += BP
for(var/o in H.internal_organs)
var/obj/item/organ/organ = o
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 600ededadd..f9014d5b8f 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -178,7 +178,7 @@
/obj/item/weapon/circuitboard/computer/xenobiology
name = "circuit board (Xenobiology Console)"
build_path = /obj/machinery/computer/camera_advanced/xenobio
- origin_tech = "programming=3;bio=3"
+ 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
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 39cdb1478c..1719695cf5 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -151,13 +151,13 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
remote_eye.origin.current_user = null
remote_eye.origin.jump_action.Remove(C)
- remote_eye.eye_user = null
if(C.client)
C.reset_perspective(null)
if(remote_eye.visible_icon)
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
+ chunk.remove(remote_eye)
+ remote_eye.eye_user = null
C.remote_control = null
C.unset_machine()
Remove(C)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index c9a448fc7b..605cd60ce6 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -54,7 +54,7 @@
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return
- if (src.z > ZLEVEL_CENTCOM) //Can only use on centcom and SS13
+ if (z != ZLEVEL_STATION && z != ZLEVEL_CENTCOM) //Can only use on centcom and SS13
to_chat(usr, "Unable to establish a connection: \black You're too far away from the station!")
return
usr.set_machine(src)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index dee63b902c..2bb9d61068 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -292,7 +292,7 @@
src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src)
else if(href_list["del_all2"])
- investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", "records")
+ investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", INVESTIGATE_RECORDS)
GLOB.data_core.medical.Cut()
src.temp = "All records deleted."
@@ -458,7 +458,7 @@
src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src)
else if(href_list["del_r2"])
- investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", "records")
+ investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
if(active2)
qdel(active2)
active2 = null
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index b8d777e42d..5baa169e99 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -452,7 +452,7 @@ What a mess.*/
temp += "No"
if("Purge All Records")
- investigate_log("[usr.name] ([usr.key]) has purged all the security records.", "records")
+ investigate_log("[usr.name] ([usr.key]) has purged all the security records.", INVESTIGATE_RECORDS)
for(var/datum/data/record/R in GLOB.data_core.security)
qdel(R)
GLOB.data_core.security.Cut()
@@ -696,18 +696,18 @@ What a mess.*/
active2.fields["criminal"] = "Parolled"
if("released")
active2.fields["criminal"] = "Discharged"
- investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [usr.name] ([usr.key]).", "records")
+ investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [usr.name] ([usr.key]).", INVESTIGATE_RECORDS)
for(var/mob/living/carbon/human/H in GLOB.mob_list) //thanks for forcing me to do this, whoever wrote this shitty records system
H.sec_hud_set_security_status()
if("Delete Record (Security) Execute")
- investigate_log("[usr.name] ([usr.key]) has deleted the security records for [active1.fields["name"]].", "records")
+ investigate_log("[usr.name] ([usr.key]) has deleted the security records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
if(active2)
qdel(active2)
active2 = null
if("Delete Record (ALL) Execute")
if(active1)
- investigate_log("[usr.name] ([usr.key]) has deleted all records for [active1.fields["name"]].", "records")
+ investigate_log("[usr.name] ([usr.key]) has deleted all records for [active1.fields["name"]].", INVESTIGATE_RECORDS)
for(var/datum/data/record/R in GLOB.data_core.medical)
if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
qdel(R)
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 8632243b67..214feeb63a 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -317,7 +317,7 @@
/obj/machinery/disco/proc/dance(var/mob/living/M) //Show your moves
-
+ set waitfor = FALSE
switch(rand(0,9))
if(0 to 1)
dance2(M)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 1750aa7aa8..2175be22fe 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -97,7 +97,14 @@
var/static/list/airlock_overlays = list()
/obj/machinery/door/airlock/Initialize()
- ..()
+ . = ..()
+
+ if (cyclelinkeddir)
+ cyclelinkairlock()
+ if(frequency)
+ set_frequency(frequency)
+ update_icon()
+
wires = new /datum/wires/airlock(src)
if(src.closeOtherId != null)
spawn (5)
@@ -120,14 +127,6 @@
diag_hud.add_to_hud(src)
diag_hud_set_electrified()
-/obj/machinery/door/airlock/Initialize()
- ..()
- if (cyclelinkeddir)
- cyclelinkairlock()
- if(frequency)
- set_frequency(frequency)
- update_icon()
-
/obj/machinery/door/airlock/proc/cyclelinkairlock()
if (cyclelinkedairlock)
cyclelinkedairlock.cyclelinkedairlock = null
@@ -199,14 +198,11 @@
qdel(src)
/obj/machinery/door/airlock/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
if(charge)
qdel(charge)
charge = null
- if(electronics)
- qdel(electronics)
- electronics = null
+ QDEL_NULL(electronics)
if (cyclelinkedairlock)
if (cyclelinkedairlock.cyclelinkedairlock == src)
cyclelinkedairlock.cyclelinkedairlock = null
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 82e9d9a176..6c3d25d223 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -143,7 +143,7 @@
else
log_msg += "nothing"
log_msg += " [sending ? "to" : "from"] [target_x], [target_y], [z] ([A ? A.name : "null area"])"
- investigate_log(log_msg.Join(), "telesci")
+ investigate_log(log_msg.Join(), INVESTIGATE_TELESCI)
updateDialog()
//Starts in the briefcase. Don't spawn this directly, or it will runtime when closing.
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index ae9d485447..6fa58e5ba2 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -227,7 +227,6 @@
update_icon()
-
/obj/machinery/porta_turret/attackby(obj/item/I, mob/user, params)
if(stat & BROKEN)
if(istype(I, /obj/item/weapon/crowbar))
@@ -553,6 +552,7 @@
use_power = 0
has_cover = 0
scan_range = 9
+ req_access = list(GLOB.access_syndicate)
stun_projectile = /obj/item/projectile/bullet
lethal_projectile = /obj/item/projectile/bullet
lethal_projectile_sound = 'sound/weapons/Gunshot.ogg'
@@ -569,6 +569,8 @@
return 10 //Syndicate turrets shoot everything not in their faction
/obj/machinery/porta_turret/syndicate/pod
+ max_integrity = 40
+ integrity_failure = 20
obj_integrity = 40
stun_projectile = /obj/item/projectile/bullet/weakbullet3
lethal_projectile = /obj/item/projectile/bullet/weakbullet3
@@ -944,6 +946,7 @@
var/atom/target
var/turf/target_turf
var/warned = FALSE
+ var/mouseparams
//BUCKLE HOOKS
@@ -987,8 +990,8 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
- flags = ABSTRACT | NODROP
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON
+ flags = ABSTRACT | NODROP | NOBLUDGEON
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/obj/machinery/manned_turret/turret
/obj/item/gun_control/New(obj/machinery/manned_turret/MT)
@@ -1000,11 +1003,22 @@
/obj/item/gun_control/CanItemAutoclick()
return 1
-/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user)
+/obj/item/gun_control/attack_obj(obj/O, mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ O.attacked_by(src, user)
+
+/obj/item/gun_control/attack(mob/living/M, mob/living/user)
+ user.lastattacked = M
+ M.lastattacker = user
+ M.attacked_by(src, user)
+ add_fingerprint(user)
+
+/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params)
..()
var/obj/machinery/manned_turret/E = user.buckled
E.setDir(get_dir(E,targeted_atom))
user.setDir(E.dir)
+ E.mouseparams = params
switch(E.dir)
if(NORTH)
E.layer = BELOW_MOB_LAYER
@@ -1052,15 +1066,15 @@
else
cooldown = world.time + cooldown_duration
warned = FALSE
- INVOKE_ASYNC(src, /obj/machinery/manned_turret/.proc/volley)
+ volley(user)
-/obj/machinery/manned_turret/proc/volley()
+/obj/machinery/manned_turret/proc/volley(mob/user)
target_turf = get_turf(target)
for(var/i in 1 to number_of_shots)
- addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper), i*rate_of_fire)
+ addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire)
-/obj/machinery/manned_turret/proc/fire_helper()
+/obj/machinery/manned_turret/proc/fire_helper(mob/user)
if(!src)
return
var/turf/targets_from = get_turf(src)
@@ -1069,11 +1083,10 @@
var/obj/item/projectile/P = new projectile_type(targets_from)
P.current = targets_from
P.starting = targets_from
- P.firer = src
+ P.firer = user
P.original = target
playsound(src, 'sound/weapons/Gunshot_smg.ogg', 75, 1)
- P.yo = target.y - targets_from.y + rand(-1,1)
- P.xo = target.x - targets_from.x + rand(-1,1)
+ P.preparePixelProjectile(target, target_turf, user, mouseparams, rand(-9, 9))
P.fire()
/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics
diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm
index 045673b019..7ade1b707f 100644
--- a/code/game/objects/effects/forcefields.dm
+++ b/code/game/objects/effects/forcefields.dm
@@ -10,6 +10,7 @@
/obj/effect/forcefield/cult
desc = "An unholy shield that blocks all attacks."
name = "glowing wall"
+ icon = 'icons/effects/cult_effects.dmi'
icon_state = "cultshield"
///////////Mimewalls///////////
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 4a64cf5c0d..f3c32d3d68 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -632,7 +632,14 @@ GLOBAL_LIST_EMPTY(PDAs)
L = get(src, /mob/living/silicon)
if(L && L.stat != UNCONSCIOUS)
- to_chat(L, "\icon[src] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)")
+
+ var/hrefstart
+ var/hrefend
+ if (isAI(L))
+ hrefstart = ""
+ hrefend = ""
+
+ to_chat(L, "\icon[src.icon] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply)")
update_icon()
add_overlay(icon_alert)
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 97a343311d..eafd5fdba4 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -504,6 +504,8 @@
S.change_head_color(color2)
dropped = TRUE
+#define PKBORG_DAMPEN_CYCLE_DELAY 20
+
//Peacekeeper Cyborg Projectile Dampenening Field
/obj/item/borg/projectile_dampen
name = "Hyperkinetic Dampening projector"
@@ -526,6 +528,7 @@
var/image/projectile_effect
var/field_radius = 3
var/active = FALSE
+ var/cycle_delay = 0
/obj/item/borg/projectile_dampen/debug
maxenergy = 50000
@@ -545,29 +548,31 @@
return ..()
/obj/item/borg/projectile_dampen/attack_self(mob/user)
- if(!istype(dampening_field))
- activate_field()
- active = TRUE
+ if(cycle_delay > world.time)
+ to_chat(user, "\the [src] is still recycling its projectors!")
+ return
+ cycle_delay = world.time + PKBORG_DAMPEN_CYCLE_DELAY
+ active = !active
+ if(active)
+ activate_field(user)
else
deactivate_field()
- active = FALSE
+ update_icon()
to_chat(user, "You [active? "activate":"deactivate"] the [src].")
/obj/item/borg/projectile_dampen/update_icon()
- . = ..()
icon_state = "[initial(icon_state)][active]"
/obj/item/borg/projectile_dampen/proc/activate_field()
- if(!istype(dampening_field))
- dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src))
- update_icon()
+ if(istype(dampening_field))
+ QDEL_NULL(dampening_field)
+ dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src))
/obj/item/borg/projectile_dampen/proc/deactivate_field()
QDEL_NULL(dampening_field)
- visible_message("The [src] shuts off!")
- for(var/obj/item/projectile/P in tracked)
+ visible_message("\The [src] shuts off!")
+ for(var/P in tracked)
restore_projectile(P)
- update_icon()
/obj/item/borg/projectile_dampen/dropped()
. = ..()
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 14e4f5a01c..9c14a4376a 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -196,13 +196,6 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.")
if(do_after(user,50, target = src))
to_chat(user, "You cut the hair from this [src.singular_name].")
- //Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/hairlesshide/HS in user.loc)
- if(HS.amount < 50)
- HS.amount++
- use(1)
- break
- //If it gets to here it means it did not find a suitable stack on the tile.
var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc)
HS.amount = 1
use(1)
@@ -230,3 +223,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
HS.amount = 1
wetness = initial(wetness)
src.use(1)
+
+/obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW)
+ ..()
+ var/obj/item/stack/sheet/leather/L = new(loc)
+ L.amount = amount
+ qdel(src)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 222fbe4174..021966570a 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -83,6 +83,14 @@
var/list/access = list()
var/registered_name = null // The name registered_name on the card
var/assignment = null
+ var/access_txt // mapping aid
+
+
+
+/obj/item/weapon/card/id/Initialize(mapload)
+ . = ..()
+ if(mapload && access_txt)
+ access = text2access(access_txt)
/obj/item/weapon/card/id/attack_self(mob/user)
user.visible_message("[user] shows you: \icon[src] [src.name].", \
diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm
index e32d365298..86664404d1 100644
--- a/code/game/objects/items/weapons/chrono_eraser.dm
+++ b/code/game/objects/items/weapons/chrono_eraser.dm
@@ -54,10 +54,10 @@
var/obj/effect/chrono_field/field = null
var/turf/startpos = null
-/obj/item/weapon/gun/energy/chrono_gun/New(var/obj/item/weapon/chrono_eraser/T)
+/obj/item/weapon/gun/energy/chrono_gun/Initialize()
. = ..()
- if(istype(T))
- TED = T
+ if(istype(loc, /obj/item/weapon/chrono_eraser))
+ TED = loc
else //admin must have spawned it
TED = new(src.loc)
qdel(src)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 82229bb7cf..61ac601e71 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -622,6 +622,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon = 'icons/obj/clothing/masks.dmi'
icon_state = null
item_state = null
+ w_class = WEIGHT_CLASS_TINY
var/chem_volume = 100
var/vapetime = 0 //this so it won't puff out clouds every tick
var/screw = 0 // kinky
@@ -633,8 +634,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return (TOXLOSS|OXYLOSS)
-/obj/item/clothing/mask/vape/New(loc, var/param_color = null)
- ..()
+/obj/item/clothing/mask/vape/Initialize(mapload, param_color)
+ . = ..()
create_reagents(chem_volume)
reagents.set_reacting(FALSE) // so it doesn't react until you light it
reagents.add_reagent("nicotine", 50)
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index f251cbabab..4bdf6ddf3c 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -23,14 +23,14 @@
var/combat = 0 //can we revive through space suits?
var/grab_ghost = FALSE // Do we pull the ghost back into their body?
-/obj/item/weapon/defibrillator/New() //starts without a cell for rnd
- ..()
+/obj/item/weapon/defibrillator/Initialize() //starts without a cell for rnd
+ . = ..()
paddles = make_paddles()
update_icon()
return
-/obj/item/weapon/defibrillator/loaded/New() //starts with hicap
- ..()
+/obj/item/weapon/defibrillator/loaded/Initialize() //starts with hicap
+ . = ..()
paddles = make_paddles()
bcell = new(src)
update_icon()
@@ -237,8 +237,8 @@
if(slot == user.getBeltSlot())
return 1
-/obj/item/weapon/defibrillator/compact/loaded/New()
- ..()
+/obj/item/weapon/defibrillator/compact/loaded/Initialize()
+ . = ..()
paddles = make_paddles()
bcell = new(src)
update_icon()
@@ -249,8 +249,8 @@
combat = 1
safety = 0
-/obj/item/weapon/defibrillator/compact/combat/loaded/New()
- ..()
+/obj/item/weapon/defibrillator/compact/combat/loaded/Initialize()
+ . = ..()
paddles = make_paddles()
bcell = new /obj/item/weapon/stock_parts/cell/infinite(src)
update_icon()
diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm
index 21a71f371d..a528a832c0 100644
--- a/code/game/objects/items/weapons/grenades/plastic.dm
+++ b/code/game/objects/items/weapons/grenades/plastic.dm
@@ -235,7 +235,7 @@
to_chat(user, "You start planting the bomb...")
- if(do_after(user, 50, target = AM))
+ if(do_after(user, 30, target = AM))
if(!user.temporarilyRemoveItemFromInventory(src))
return
src.target = AM
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 54a41b2214..e11e36bbb6 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -65,6 +65,7 @@
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP_ACCURATE
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
+ var/bayonet = FALSE //Can this be attached to a gun?
/obj/item/weapon/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user)
if(user.zone_selected == "eyes")
@@ -107,7 +108,7 @@
throwforce = 20
origin_tech = "materials=3;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
-
+ bayonet = TRUE
/obj/item/weapon/kitchen/knife/combat/survival
name = "survival knife"
@@ -115,6 +116,7 @@
desc = "A hunting grade survival knife."
force = 15
throwforce = 15
+ bayonet = TRUE
/obj/item/weapon/kitchen/knife/combat/bone
name = "bone dagger"
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 64fb4c7ecc..91b605543b 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -270,4 +270,4 @@
/obj/item/weapon/pneumatic_cannon/pie/selfcharge/process()
if(++charge_tick >= charge_ticks)
- fill_with_type(/obj/item/weapon/reagent_containers/food/snacks/pie, charge_amount)
+ fill_with_type(/obj/item/weapon/reagent_containers/food/snacks/pie/cream, charge_amount)
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 662f451e81..0fd70e7ac3 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -69,7 +69,7 @@
var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [name]?", "Proceed", "Abort")
if(safety == "Abort" || !in_range(src, user) || !src || !W || user.incapacitated())
return
- investigate_log("has become a singularity. Caused by [user.key]","singulo")
+ investigate_log("has become a singularity. Caused by [user.key]", INVESTIGATE_SINGULO)
to_chat(user, "The Bluespace interfaces of the two devices catastrophically malfunction!")
qdel(W)
var/obj/singularity/singulo = new /obj/singularity (get_turf(src))
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 5393f40ec6..c1b932d1bc 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -21,10 +21,9 @@
user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!")
return (FIRELOSS)
-/obj/item/weapon/melee/baton/New()
- ..()
+/obj/item/weapon/melee/baton/Initialize()
+ . = ..()
update_icon()
- return
/obj/item/weapon/melee/baton/throw_impact(atom/hit_atom)
..()
@@ -32,10 +31,9 @@
if(status && prob(throw_hit_chance) && iscarbon(hit_atom))
baton_stun(hit_atom)
-/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
- ..()
+/obj/item/weapon/melee/baton/loaded/Initialize() //this one starts with a cell pre-installed.
bcell = new(src)
- update_icon()
+ . = ..()
/obj/item/weapon/melee/baton/proc/deductcharge(chrgdeductamt)
if(bcell)
@@ -188,8 +186,8 @@
slot_flags = SLOT_BACK
var/obj/item/device/assembly/igniter/sparkler = 0
-/obj/item/weapon/melee/baton/cattleprod/New()
- ..()
+/obj/item/weapon/melee/baton/cattleprod/Initialize()
+ . = ..()
sparkler = new (src)
/obj/item/weapon/melee/baton/cattleprod/baton_stun()
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 702e72842f..44281fb26f 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -48,6 +48,8 @@
take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM))
/obj/ex_act(severity, target)
+ if(resistance_flags & INDESTRUCTIBLE)
+ return
..() //contents explosion
if(target == src)
qdel(src)
@@ -256,4 +258,4 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
if(can_break && integrity_failure && current_integrity <= integrity_failure)
obj_break(damage_type)
return TRUE
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 23bbc40ed8..989bb6755b 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -5,7 +5,7 @@
/obj/structure/easel
name = "easel"
- desc = "only for the finest of art!"
+ desc = "Only for the finest of art!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "easel"
density = 1
@@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(globalBlankCanvases, new(AMT_OF_CANVASES))
/obj/item/weapon/canvas
name = "canvas"
- desc = "draw out your soul on this canvas!"
+ desc = "Draw out your soul on this canvas!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "11x11"
resistance_flags = FLAMMABLE
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 757a0bbb8d..744740c6f9 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -161,7 +161,16 @@
anchored = 0
buildstacktype = /obj/item/stack/sheet/mineral/wood
buildstackamount = 10
+ var/mob/living/owner = null
+/obj/structure/bed/dogbed/proc/update_owner(mob/living/M)
+ owner = M
+ name = "[M]'s bed"
+ desc = "[M]'s bed! Looks comfy."
+
+/obj/structure/bed/dogbed/buckle_mob(mob/living/M, force, check_loc)
+ . = ..()
+ update_owner(M)
/obj/structure/bed/alien
name = "resting contraption"
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 11d20a2dc1..8ffebdc0ab 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -146,49 +146,49 @@
/obj/structure/sign/biohazard
name = "\improper BIOHAZARD"
- desc = "A warning sign which reads 'BIOHAZARD'"
+ desc = "A warning sign which reads 'BIOHAZARD'."
icon_state = "bio"
/obj/structure/sign/electricshock
name = "\improper HIGH VOLTAGE"
- desc = "A warning sign which reads 'HIGH VOLTAGE'"
+ desc = "A warning sign which reads 'HIGH VOLTAGE'."
icon_state = "shock"
/obj/structure/sign/examroom
name = "\improper EXAM ROOM"
- desc = "A guidance sign which reads 'EXAM ROOM'"
+ desc = "A guidance sign which reads 'EXAM ROOM'."
icon_state = "examroom"
/obj/structure/sign/vacuum
name = "\improper HARD VACUUM AHEAD"
- desc = "A warning sign which reads 'HARD VACUUM AHEAD'"
+ desc = "A warning sign which reads 'HARD VACUUM AHEAD'."
icon_state = "space"
/obj/structure/sign/deathsposal
name = "\improper DISPOSAL: LEADS TO SPACE"
- desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'"
+ desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'."
icon_state = "deathsposal"
/obj/structure/sign/pods
name = "\improper ESCAPE PODS"
- desc = "A warning sign which reads 'ESCAPE PODS'"
+ desc = "A warning sign which reads 'ESCAPE PODS'."
icon_state = "pods"
/obj/structure/sign/fire
name = "\improper DANGER: FIRE"
- desc = "A warning sign which reads 'DANGER: FIRE'"
+ desc = "A warning sign which reads 'DANGER: FIRE'."
icon_state = "fire"
/obj/structure/sign/nosmoking_1
name = "\improper NO SMOKING"
- desc = "A warning sign which reads 'NO SMOKING'"
+ desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking"
/obj/structure/sign/nosmoking_2
name = "\improper NO SMOKING"
- desc = "A warning sign which reads 'NO SMOKING'"
+ desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking2"
/obj/structure/sign/radiation
@@ -223,7 +223,7 @@
/obj/structure/sign/nanotrasen
name = "\improper NanoTrasen Logo "
- desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!"
+ desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!"
icon_state = "nanotrasen"
/obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map
@@ -246,6 +246,12 @@
desc = "A sign labelling an area as a place where xenobiological entities are researched."
icon_state = "xenobio"
+/obj/structure/sign/xeno_warning_mining
+ name = "DANGEROUS ALIEN LIFE"
+ desc = "A sign that warns would-be travellers of hostile alien life in the vicinity."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "xeno_warning"
+
/obj/structure/sign/enginesafety
name = "\improper ENGINEERING SAFETY"
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index 741d4f2958..a459ac5903 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -5,6 +5,9 @@
density = 1
blocks_air = 1
+/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ return FALSE
+
/turf/closed/indestructible
name = "wall"
icon = 'icons/turf/walls.dmi'
@@ -24,9 +27,6 @@
/turf/closed/indestructible/oldshuttle/corner
icon_state = "corner"
-
-
-
/turf/closed/indestructible/splashscreen
name = "Space Station 13"
icon = 'config/title_screens/images/blank.png'
@@ -111,6 +111,11 @@
explosion_block = 50
baseturf = /turf/closed/indestructible/necropolis
+/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "necro1"
+ return TRUE
+
/turf/closed/indestructible/riveted/hierophant
name = "wall"
desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index ff278b415a..718451bcb0 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -45,6 +45,9 @@
/turf/open/indestructible/hierophant/two
+/turf/open/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ return FALSE
+
/turf/open/indestructible/paper
name = "notebook floor"
desc = "A floor made of invulnerable notebook paper."
diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm
index 4f22487537..8f0de9675d 100644
--- a/code/game/turfs/simulated/chasm.dm
+++ b/code/game/turfs/simulated/chasm.dm
@@ -22,6 +22,10 @@
if(!drop_stuff())
STOP_PROCESSING(SSobj, src)
+/turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "basalt"
+ return TRUE
/turf/open/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction)
..()
@@ -171,6 +175,11 @@
planetary_atmos = TRUE
initial_gas_mix = "o2=14;n2=23;TEMP=300"
+/turf/open/chasm/jungle/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "dirt"
+ return TRUE
+
/turf/open/chasm/straight_down/jungle
icon = 'icons/turf/floors/junglechasm.dmi'
planetary_atmos = TRUE
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 4f6da47bde..91ed7a7cd6 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -140,7 +140,7 @@
floor_tile = /obj/item/stack/tile/carpet
broken_states = list("damaged")
smooth = SMOOTH_TRUE
- canSmoothWith = list(/turf/open/floor/carpet, /turf/open/chasm)
+ canSmoothWith = list(/turf/open/floor/carpet)
flags = NONE
/turf/open/floor/carpet/Initialize()
@@ -175,15 +175,22 @@
burnt = 1
update_icon()
+/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ return FALSE
-turf/open/floor/fakepit
+/turf/open/floor/fakepit
desc = "A clever illusion designed to look like a bottomless pit."
smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE
- canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm)
+ canSmoothWith = list(/turf/open/floor/fakepit)
icon = 'icons/turf/floors/Chasms.dmi'
icon_state = "smooth"
+/turf/open/floor/fakepit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "basalt"
+ return TRUE
+
/turf/open/floor/fakespace
icon = 'icons/turf/space.dmi'
icon_state = "0"
@@ -193,4 +200,10 @@ turf/open/floor/fakepit
/turf/open/floor/fakespace/Initialize()
..()
- icon_state = "[rand(0,25)]"
+ icon_state = SPACE_ICON_STATE
+
+/turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/space.dmi'
+ underlay_appearance.icon_state = SPACE_ICON_STATE
+ underlay_appearance.plane = PLANE_SPACE
+ return TRUE
diff --git a/code/game/turfs/simulated/floor/plating/lava.dm b/code/game/turfs/simulated/floor/plating/lava.dm
index 9321b4f082..ead1e97d22 100644
--- a/code/game/turfs/simulated/floor/plating/lava.dm
+++ b/code/game/turfs/simulated/floor/plating/lava.dm
@@ -38,6 +38,11 @@
/turf/open/floor/plating/lava/make_plating()
return
+/turf/open/floor/plating/lava/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "basalt"
+ return TRUE
+
/turf/open/floor/plating/lava/GetHeatCapacity()
. = 700000
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 708427a11a..9c3d8ed0c7 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -26,7 +26,7 @@
/turf/closed/mineral/Initialize()
if (!canSmoothWith)
- canSmoothWith = list(/turf/closed)
+ canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible)
pixel_y = -4
pixel_x = -4
icon = smooth_icon
@@ -42,6 +42,13 @@
setDir(angle2dir(rotation+dir2angle(dir)))
queue_smooth(src)
+/turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ if(turf_type)
+ underlay_appearance.icon = initial(turf_type.icon)
+ underlay_appearance.icon_state = initial(turf_type.icon_state)
+ return TRUE
+ return ..()
+
/turf/closed/mineral/attackby(obj/item/weapon/pickaxe/P, mob/user, params)
if (!user.IsAdvancedToolUser())
@@ -379,7 +386,7 @@
spread = 0
scan_state = "rock_Gibtonite"
var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it
- var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction
+ var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are
var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes
var/activated_name = null
var/mutable_appearance/activated_overlay
@@ -395,12 +402,12 @@
..()
/turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0)
- if(stage == 0)
+ if(stage == GIBTONITE_UNSTRUCK)
activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER)
add_overlay(activated_overlay)
name = "gibtonite deposit"
desc = "An active gibtonite reserve. Run!"
- stage = 1
+ stage = GIBTONITE_ACTIVE
visible_message("There was gibtonite inside! It's going to explode!")
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -422,38 +429,38 @@
/turf/closed/mineral/gibtonite/proc/countdown(notify_admins = 0)
set waitfor = 0
- while(istype(src, /turf/closed/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1)
+ while(istype(src, /turf/closed/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1)
det_time--
sleep(5)
if(istype(src, /turf/closed/mineral/gibtonite))
- if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
+ if(stage == GIBTONITE_ACTIVE && det_time <= 0 && mineralAmt >= 1)
var/turf/bombturf = get_turf(src)
mineralAmt = 0
- stage = 3
+ stage = GIBTONITE_DETONATE
explosion(bombturf,1,3,5, adminlog = notify_admins)
/turf/closed/mineral/gibtonite/proc/defuse()
- if(stage == 1)
+ if(stage == GIBTONITE_ACTIVE)
cut_overlay(activated_overlay)
activated_overlay.icon_state = "rock_Gibtonite_inactive"
add_overlay(activated_overlay)
desc = "An inactive gibtonite reserve. The ore can be extracted."
- stage = 2
+ stage = GIBTONITE_STABLE
if(det_time < 0)
det_time = 0
visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!")
/turf/closed/mineral/gibtonite/gets_drilled(mob/user, triggered_by_explosion = 0)
- if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated
+ if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
explosive_reaction(user, triggered_by_explosion)
return
- if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom
+ if(stage == GIBTONITE_ACTIVE && mineralAmt >= 1) //Gibtonite deposit goes kaboom
var/turf/bombturf = get_turf(src)
mineralAmt = 0
- stage = 3
+ stage = GIBTONITE_DETONATE
explosion(bombturf,1,2,5, adminlog = 0)
- if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
+ if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/weapon/twohanded/required/gibtonite/G = new /obj/item/weapon/twohanded/required/gibtonite/(src)
if(det_time <= 0)
G.quality = 3
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index b78099c6bb..2cfb32f6dc 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -175,6 +175,7 @@
desc = "A light-weight titanium wall used in shuttles."
icon = 'icons/turf/walls/shuttle_wall.dmi'
icon_state = "map-shuttle"
+ flags = CAN_BE_DIRTY | CHECK_RICOCHET
sheet_type = /obj/item/stack/sheet/mineral/titanium
smooth = SMOOTH_MORE|SMOOTH_DIAGONAL
canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock/, /turf/closed/wall/shuttle, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 068dd0f218..44dc1afee7 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -28,6 +28,20 @@
/turf/closed/wall/attack_tk()
return
+/turf/closed/wall/handle_ricochet(obj/item/projectile/P) //A huge pile of shitcode!
+ var/turf/p_turf = get_turf(P)
+ var/face_direction = get_dir(src, p_turf)
+ var/face_angle = dir2angle(face_direction)
+ var/incidence_s = get_angle_of_incidence(face_angle, P.Angle)
+ var/new_angle = face_angle + incidence_s
+ var/new_angle_s = new_angle
+ while(new_angle_s > 180) // Translate to regular projectile degrees
+ new_angle_s -= 360
+ while(new_angle_s < -180)
+ new_angle_s += 360
+ P.Angle = new_angle_s
+ return TRUE
+
/turf/closed/wall/proc/dismantle_wall(devastated=0, explode=0)
if(devastated)
devastate_wall()
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 1876d6f782..bac25e68c0 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -160,6 +160,12 @@
/turf/open/space/acid_act(acidpwr, acid_volume)
return 0
+/turf/open/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/space.dmi'
+ underlay_appearance.icon_state = SPACE_ICON_STATE
+ underlay_appearance.plane = PLANE_SPACE
+ return TRUE
+
/turf/open/space/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
if(!CanBuildHere())
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 68c00c54ec..c447b83a1f 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -4,6 +4,11 @@
baseturf = /turf/open/space/transit
flags = NOJAUNT //This line goes out to every wizard that ever managed to escape the den. I'm sorry.
+/turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ . = ..()
+ underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]"
+ underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf))
+
/turf/open/space/transit/south
dir = SOUTH
@@ -69,25 +74,32 @@
throw_atom(AM)
/turf/open/space/transit/proc/update_icon()
- var/p = 9
- var/angle = 0
- var/state = 1
- switch(dir)
- if(NORTH)
- angle = 180
- state = ((-p*x+y) % 15) + 1
- if(state < 1)
- state += 15
- if(EAST)
- angle = 90
- state = ((x+p*y) % 15) + 1
- if(WEST)
- angle = -90
- state = ((x-p*y) % 15) + 1
- if(state < 1)
- state += 15
- else
- state = ((p*x+y) % 15) + 1
+ icon_state = "speedspace_ns_[get_transit_state(src)]"
+ transform = turn(matrix(), get_transit_angle(src))
- icon_state = "speedspace_ns_[state]"
- transform = turn(matrix(), angle)
\ No newline at end of file
+/proc/get_transit_state(turf/T)
+ var/p = 9
+ . = 1
+ switch(T.dir)
+ if(NORTH)
+ . = ((-p*T.x+T.y) % 15) + 1
+ if(. < 1)
+ . += 15
+ if(EAST)
+ . = ((T.x+p*T.y) % 15) + 1
+ if(WEST)
+ . = ((T.x-p*T.y) % 15) + 1
+ if(. < 1)
+ . += 15
+ else
+ . = ((p*T.x+T.y) % 15) + 1
+
+/proc/get_transit_angle(turf/T)
+ . = 0
+ switch(T.dir)
+ if(NORTH)
+ . = 180
+ if(EAST)
+ . = 90
+ if(WEST)
+ . = -90
\ No newline at end of file
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index c4d35d7bd1..9d556e896f 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -394,6 +394,12 @@
if(ismob(A) || .)
A.ratvar_act()
+/turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = icon
+ underlay_appearance.icon_state = icon_state
+ underlay_appearance.dir = adjacency_dir
+ return TRUE
+
/turf/proc/add_blueprints(atom/movable/AM)
var/image/I = new
I.appearance = AM.appearance
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index f8329b1f69..fdc18652d0 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -37,7 +37,7 @@
body += " \[Heal\] "
if(M.client)
- body += "
\[Player Age: [M.client.player_age]\]\[Byond Age: [M.client.account_age]\]"
+ body += "
\[First Seen: [M.client.player_join_date]\]\[Byond account registered on: [M.client.account_join_date]\]"
body += "
Show related accounts by: "
body += "\[ CID | "
body += "IP \]"
@@ -48,7 +48,7 @@
body += "PM - "
body += "SM - "
body += "FLW - "
- body += "LOGS\]
"
+ body += "LOGS\]
"
body += "Mob type = [M.type]
"
@@ -239,21 +239,21 @@
if(6)
dat+="ERROR: Could not submit Feed story to Network.
"
if(src.admincaster_feed_channel.channel_name=="")
- dat+="•Invalid receiving channel name.
"
+ dat+="Invalid receiving channel name.
"
if(src.admincaster_feed_message.returnBody(-1) == "" || src.admincaster_feed_message.returnBody(-1) == "\[REDACTED\]")
- dat+="•Invalid message body.
"
+ dat+="Invalid message body.
"
dat+="
Return
"
if(7)
dat+="ERROR: Could not submit Feed Channel to Network.
"
if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]")
- dat+="•Invalid channel name.
"
+ dat+="Invalid channel name.
"
var/check = 0
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
check = 1
break
if(check)
- dat+="•Channel name already in use.
"
+ dat+="Channel name already in use.
"
dat+="
Return
"
if(9)
dat+="[admincaster_feed_channel.channel_name]: \[created by: [admincaster_feed_channel.returnAuthor(-1)]\]
"
@@ -354,9 +354,9 @@
if(16)
dat+="ERROR: Wanted Issue rejected by Network.
"
if(src.admincaster_wanted_message.criminal =="" || src.admincaster_wanted_message.criminal == "\[REDACTED\]")
- dat+="•Invalid name for person wanted.
"
+ dat+="Invalid name for person wanted.
"
if(src.admincaster_wanted_message.body == "" || src.admincaster_wanted_message.body == "\[REDACTED\]")
- dat+="•Invalid description.
"
+ dat+="Invalid description.
"
dat+="
Return
"
if(17)
dat+="Wanted Issue successfully deleted from Circulation
"
@@ -419,18 +419,18 @@
set desc="Restarts the world immediately"
if (!usr.client.holder)
return
-
- var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
- var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
- if(result)
+
+ var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
+ var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
+ if(result)
SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- switch(result)
- if("Regular Restart")
- SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
- if("Hard Restart (No Delay, No Feeback Reason)")
- world.Reboot()
- if("Hardest Restart (No actions, just reboot)")
- world.Reboot(fast_track = TRUE)
+ switch(result)
+ if("Regular Restart")
+ SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
+ if("Hard Restart (No Delay, No Feeback Reason)")
+ world.Reboot()
+ if("Hardest Restart (No actions, just reboot)")
+ world.Reboot(fast_track = TRUE)
/datum/admins/proc/end_round()
set category = "Server"
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index cdd05a3aad..0e46f20c4c 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -5,7 +5,7 @@
F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
"
-/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
+/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY) )
set name = "Investigate"
set category = "Admin"
if(!holder)
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index eabc7d3fd0..e569eacd2b 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -174,7 +174,7 @@
if("list_bombers")
if(!check_rights(R_ADMIN))
return
- var/dat = "Bombing List
"
+ var/dat = "Bombing List
"
for(var/l in GLOB.bombers)
dat += text("[l]
")
usr << browse(dat, "window=bombers")
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index cfe3719423..2a039cd5bf 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -152,7 +152,7 @@ Pipelines + Other Objects -> Pipe network
"[user] unfastens \the [src].", \
"You unfasten \the [src].", \
"You hear ratchet.")
- investigate_log("was REMOVED by [key_name(usr)]", "atmos")
+ investigate_log("was REMOVED by [key_name(usr)]", INVESTIGATE_ATMOS)
//You unwrenched a pipe full of pressure? Let's splat you into the wall, silly.
if(unsafe_wrenching)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index e67db7fcd7..8ea2b34251 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -112,7 +112,7 @@ Passive gate is similar to the regular pump except:
switch(action)
if("power")
on = !on
- investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("pressure")
var/pressure = params["pressure"]
@@ -128,7 +128,7 @@ Passive gate is similar to the regular pump except:
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
update_icon()
/obj/machinery/atmospherics/components/binary/passive_gate/atmosinit()
@@ -152,7 +152,7 @@ Passive gate is similar to the regular pump except:
target_pressure = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50)
if(on != old_on)
- investigate_log("was turned [on ? "on" : "off"] by a remote signal", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS)
if("status" in signal.data)
broadcast_status()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index 26c3d25e85..babb18dd98 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -121,7 +121,7 @@ Thus, the two variables affect pump operation are set in New():
switch(action)
if("power")
on = !on
- investigate_log("Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [A]", "atmos")
+ investigate_log("Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]")
log_admin("[key_name(usr)] manipulated a pump at [x], [y], [z]")
. = TRUE
@@ -139,7 +139,7 @@ Thus, the two variables affect pump operation are set in New():
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
- investigate_log("Pump, [src.name], was set to [target_pressure] kPa by [key_name(usr)] at [x], [y], [z], [A]", "atmos")
+ investigate_log("Pump, [src.name], was set to [target_pressure] kPa by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Pump, [src.name], was set to [target_pressure] kPa by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]")
log_admin("[key_name(usr)] manipulated a pump at [x], [y], [z]")
update_icon()
@@ -165,7 +165,7 @@ Thus, the two variables affect pump operation are set in New():
target_pressure = Clamp(text2num(signal.data["set_output_pressure"]),0,ONE_ATMOSPHERE*50)
if(on != old_on)
- investigate_log("was turned [on ? "on" : "off"] by a remote signal", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS)
if("status" in signal.data)
broadcast_status()
@@ -186,7 +186,7 @@ Thus, the two variables affect pump operation are set in New():
if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench [src], turn it off first!")
else
- investigate_log("Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", "atmos")
+ investigate_log("Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)]")
log_admin("[key_name(usr)] unwrenched a pump at [x], [y], [z]")
return 1
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
index 34fea329ac..df19b7f3e3 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
@@ -30,12 +30,12 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
update_parents()
var/datum/pipeline/parent1 = PARENT1
parent1.reconcile_air()
- investigate_log("was opened by [usr ? key_name(usr) : "a remote signal"]", "atmos")
+ investigate_log("was opened by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS)
/obj/machinery/atmospherics/components/binary/valve/proc/close()
open = 0
update_icon_nopipes()
- investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", "atmos")
+ investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS)
/obj/machinery/atmospherics/components/binary/valve/proc/normalize_dir()
if(dir==SOUTH)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index d6bc3bbdb7..aea169130b 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -121,7 +121,7 @@ Thus, the two variables affect pump operation are set in New():
switch(action)
if("power")
on = !on
- investigate_log("Volume Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [loc.loc]", "atmos")
+ investigate_log("Volume Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [loc.loc]", INVESTIGATE_ATMOS)
message_admins("Volume Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]")
log_admin("[key_name(usr)] manipulated a volume pump at [x], [y], [z]")
@@ -140,7 +140,7 @@ Thus, the two variables affect pump operation are set in New():
. = TRUE
if(.)
transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE)
- investigate_log("Volume Pump, [src.name], was set to [transfer_rate] L/s by [key_name(usr)] at [x], [y], [z], [loc.loc]", "atmos")
+ investigate_log("Volume Pump, [src.name], was set to [transfer_rate] L/s by [key_name(usr)] at [x], [y], [z], [loc.loc]", INVESTIGATE_ATMOS)
message_admins("Volume Pump, [src.name], was set to [transfer_rate] L/s by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]")
log_admin("[key_name(usr)] manipulated a volume pump at [x], [y], [z]")
update_icon()
@@ -162,7 +162,7 @@ Thus, the two variables affect pump operation are set in New():
transfer_rate = Clamp(text2num(signal.data["set_transfer_rate"]),0,air1.volume)
if(on != old_on)
- investigate_log("was turned [on ? "on" : "off"] by a remote signal", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by a remote signal", INVESTIGATE_ATMOS)
if("status" in signal.data)
broadcast_status()
@@ -183,7 +183,7 @@ Thus, the two variables affect pump operation are set in New():
if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench [src], turn it off first!")
else
- investigate_log("Volume Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [loc.loc]", "atmos")
+ investigate_log("Volume Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [loc.loc]", INVESTIGATE_ATMOS)
message_admins("Volume Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)]")
log_admin("[key_name(usr)] unwrenched a volume pump at [x], [y], [z]")
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 4b9c2c710f..3c6c7b2342 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -83,20 +83,20 @@
if(!removed)
return
-
+
var/filtering = filter_type ? TRUE : FALSE
-
+
if(filtering && !istext(filter_type))
WARNING("Wrong gas ID in [src]'s filter_type var. filter_type == [filter_type]")
filtering = FALSE
-
+
if(filtering && removed.gases[filter_type])
var/datum/gas_mixture/filtered_out = new
-
+
filtered_out.temperature = removed.temperature
filtered_out.assert_gas(filter_type)
filtered_out.gases[filter_type][MOLES] = removed.gases[filter_type][MOLES]
-
+
removed.gases[filter_type][MOLES] = 0
removed.garbage_collect()
@@ -133,7 +133,7 @@
switch(action)
if("power")
on = !on
- investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("pressure")
var/pressure = params["pressure"]
@@ -149,7 +149,7 @@
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
if("filter")
filter_type = ""
var/filter_name = "nothing"
@@ -157,6 +157,6 @@
if(gas in GLOB.meta_gas_info)
filter_type = gas
filter_name = GLOB.meta_gas_info[gas][META_GAS_NAME]
- investigate_log("was set to filter [filter_name] by [key_name(usr)]", "atmos")
+ investigate_log("was set to filter [filter_name] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
update_icon()
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index ed168c7153..958782d5a1 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -138,7 +138,7 @@
switch(action)
if("power")
on = !on
- investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("pressure")
var/pressure = params["pressure"]
@@ -154,17 +154,17 @@
. = TRUE
if(.)
target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
if("node1")
var/value = text2num(params["concentration"])
node1_concentration = max(0, min(1, node1_concentration + value))
node2_concentration = max(0, min(1, node2_concentration - value))
- investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", "atmos")
+ investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("node2")
var/value = text2num(params["concentration"])
node2_concentration = max(0, min(1, node2_concentration + value))
node1_concentration = max(0, min(1, node1_concentration - value))
- investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", "atmos")
+ investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
update_icon()
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 73e0c2042f..51e97eb5a4 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -27,10 +27,10 @@
var/radio_key = /obj/item/device/encryptionkey/headset_med
var/radio_channel = "Medical"
-/obj/machinery/atmospherics/components/unary/cryo_cell/New()
- ..()
+/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
+ . = ..()
initialize_directions = dir
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/cryo_tube(null)
+ var/obj/item/weapon/circuitboard/machine/cryo_tube/B = new
B.apply_default_parts(src)
radio = new(src)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index ca90604ee7..a03a6952c4 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -167,7 +167,7 @@
switch(action)
if("power")
on = !on
- investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("rate")
var/rate = params["rate"]
@@ -183,7 +183,7 @@
. = TRUE
if(.)
volume_rate = Clamp(rate, 0, MAX_TRANSFER_RATE)
- investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", "atmos")
+ investigate_log("was set to [volume_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS)
update_icon()
broadcast_status()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 8761211f72..26f02a43ef 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -173,7 +173,7 @@
if("power")
on = !on
use_power = 1 + on
- investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("target")
var/target = params["target"]
@@ -190,7 +190,7 @@
. = TRUE
if(.)
target_temperature = Clamp(target, min_temperature, max_temperature)
- investigate_log("was set to [target_temperature] K by [key_name(usr)]", "atmos")
+ investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
update_icon()
/obj/machinery/atmospherics/components/unary/thermomachine/freezer
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 09c7a44c66..0324effcc7 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -286,7 +286,7 @@
density = 0
playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
update_icon()
- investigate_log("was destroyed.", "atmos")
+ investigate_log("was destroyed.", INVESTIGATE_ATMOS)
if(holding)
holding.forceMove(T)
@@ -388,7 +388,7 @@
. = TRUE
if(.)
release_pressure = Clamp(round(pressure), can_min_release_pressure, can_max_release_pressure)
- investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", "atmos")
+ investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS)
if("valve")
var/logmsg
valve_open = !valve_open
@@ -439,7 +439,7 @@
if("eject")
if(holding)
if(valve_open)
- investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the air
", "atmos")
+ investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the air
", INVESTIGATE_ATMOS)
holding.forceMove(get_turf(src))
holding = null
. = TRUE
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index d8bd51aa5f..3a2894653c 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -120,6 +120,6 @@
if(I.force < 10 && !(stat & BROKEN))
take_damage(0)
else
- investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos")
+ investigate_log("was smacked with \a [I] by [key_name(user)].", INVESTIGATE_ATMOS)
add_fingerprint(user)
..()
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 16c786c044..d3fbc38208 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -133,7 +133,7 @@
. = TRUE
if(.)
pump.target_pressure = Clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE)
- investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", "atmos")
+ investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS)
if("eject")
if(holding)
holding.loc = get_turf(src)
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index fb1d375854..441d40db8f 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -46,8 +46,8 @@
//Syndicate sub-machine guns.
/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r
-/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r/New()
- ..()
+/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r/Initialize()
+ . = ..()
for(var/ammo in magazine.stored_ammo)
if(prob(95)) //95% chance
magazine.stored_ammo -= ammo
@@ -55,8 +55,8 @@
//Barman's shotgun
/obj/item/weapon/gun/ballistic/shotgun/sc_pump
-/obj/item/weapon/gun/ballistic/shotgun/sc_pump/New()
- ..()
+/obj/item/weapon/gun/ballistic/shotgun/sc_pump/Initialize()
+ . = ..()
for(var/ammo in magazine.stored_ammo)
if(prob(95)) //95% chance
magazine.stored_ammo -= ammo
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 8e21b3d2d4..6fe923a519 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -8,7 +8,7 @@
var/safety_warning = "For safety reasons the automated supply shuttle \
cannot transport live organisms, classified nuclear weaponry or \
homing beacons."
-
+
light_color = "#E2853D"//orange
/obj/machinery/computer/cargo/request
@@ -106,9 +106,9 @@
SSshuttle.supply.contraband = contraband
SSshuttle.moveShuttle("supply", "supply_away", TRUE)
say("The supply shuttle has departed.")
- investigate_log("[key_name(usr)] sent the supply shuttle away.", "cargo")
+ investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO)
else
- investigate_log("[key_name(usr)] called the supply shuttle.", "cargo")
+ investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO)
say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.")
SSshuttle.moveShuttle("supply", "supply_home", TRUE)
. = TRUE
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index b88cfc0315..421b8a057e 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1582,7 +1582,7 @@
name = "Contraband Crate"
contraband = TRUE
cost = 3000
- num_contained = 6
+ num_contained = 5
contains = list(/obj/item/weapon/poster/random_contraband,
/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims,
/obj/item/weapon/storage/fancy/cigarettes/cigpack_midori,
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 0de56aa86a..3a91c3207e 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -420,8 +420,8 @@
var/badmin_mode = FALSE
var/static/list/blacklisted_vars = list("locs", "loc", "contents", "x", "y", "z")
-/obj/item/weapon/gun/energy/laser/chameleon/New()
- ..()
+/obj/item/weapon/gun/energy/laser/chameleon/Initialize()
+ . = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/weapon/gun
chameleon_action.chameleon_name = "Gun"
diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 2f70c3bfdf..61cca9b24a 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -7,18 +7,18 @@
actions_types = list(/datum/action/item_action/toggle_mode)
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
- mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode
+ mesons_on = TRUE //if set to FALSE, these goggles work as t-ray scanners.
var/range = 1
/obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary)
var/turf/T = get_turf(src)
- if(T && T.z == ZLEVEL_MINING && mode)
+ if(T && T.z == ZLEVEL_MINING && !mesons_on)
if(picked_excuse)
to_chat(user, "Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.")
return
- mode = !mode
+ mesons_on = !mesons_on
- if(mode)
+ if(!mesons_on)
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
@@ -50,7 +50,7 @@
toggle_mode(user, TRUE)
/obj/item/clothing/glasses/meson/engine/process()
- if(!mode)
+ if(mesons_on)
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING)
toggle_mode(loc)
@@ -83,15 +83,8 @@
if(M.client)
flick_overlay(I, list(M.client), 8)
-/obj/item/clothing/glasses/meson/engine/proc/t_ray_on()
- if(!ishuman(loc))
- return 0
-
- var/mob/living/carbon/human/user = loc
- return mode & (user.glasses == src)
-
/obj/item/clothing/glasses/meson/engine/update_icon()
- icon_state = mode ? "trayson-tray" : "trayson-meson"
+ icon_state = mesons_on ? "trayson-meson" : "trayson-tray"
if(istype(loc,/mob/living/carbon/human/))
var/mob/living/carbon/human/user = loc
if(user.glasses == src)
@@ -103,7 +96,7 @@
icon_state = "trayson-tray_off"
origin_tech = "materials=3;magnets=2;engineering=2"
- mode = TRUE
+ mesons_on = FALSE
var/on = FALSE
vision_flags = 0
darkness_view = 2
@@ -135,6 +128,3 @@
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
-
-/obj/item/clothing/glasses/meson/engine/tray/t_ray_on()
- return on && ..()
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 1cc0cc6163..063f3894c9 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -42,7 +42,7 @@
var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \
"gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat")
var/picked_excuse
- var/mode = FALSE //if FALSE, is in normal meson mode.
+ var/mesons_on = TRUE
/obj/item/clothing/glasses/meson/Initialize()
. = ..()
@@ -56,34 +56,28 @@
/obj/item/clothing/glasses/meson/examine(mob/user)
..()
var/turf/T = get_turf(src)
- if(T && T.z == ZLEVEL_MINING && mode && picked_excuse)
+ if(T && T.z == ZLEVEL_MINING && !mesons_on && picked_excuse)
to_chat(user, "Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.")
/obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user)
- if(vision_flags & SEE_TURFS)
- mode = TRUE
- vision_flags &= ~SEE_TURFS
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(picked_excuse)
- to_chat(H, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.")
- if(H.glasses == src)
- H.update_sight()
- else if(!(vision_flags & SEE_TURFS))
- mode = FALSE
- vision_flags |= SEE_TURFS
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- to_chat(H, "Your Meson Scanners have reactivated.")
- if(H.glasses == src)
- H.update_sight()
+ vision_flags ^= SEE_TURFS
+ mesons_on = (vision_flags & SEE_TURFS)? TRUE : FALSE
+
+ if(iscarbon(user)) //only carbons can wear glasses
+ var/mob/living/carbon/C = user
+ if(!mesons_on)
+ to_chat(C, "Your Meson Scanners have reactivated.")
+ else if(picked_excuse)
+ to_chat(C, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.")
+ if(C.glasses == src)
+ C.update_sight()
/obj/item/clothing/glasses/meson/process()
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING)
- if(!mode)
+ if(mesons_on) //if we're on mining, turn mesons OFF
toggle_mode(loc)
- else if(mode)
+ else if(!mesons_on) //otherwise, if we're not on mining, turn mesons back ON
toggle_mode(loc)
/obj/item/clothing/glasses/meson/night
diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm
deleted file mode 100644
index d562802db1..0000000000
--- a/code/modules/clothing/head/cit_hats.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/obj/item/clothing/head/hunter
- name = "hunter hat"
- desc = "It's a flimsy looking hat."
- icon_state = "hunter"
- icon = 'icons/obj/clothing/cit_hats.dmi'
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 3bf866cc2c..c2979b1bcf 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -280,3 +280,9 @@
name = "magnificent crown"
desc = "A crown worn by only the highest emperors of the land."
icon_state = "fancycrown"
+
+/obj/item/clothing/head/hunter
+ name = "hunter hat"
+ desc = "It's a flimsy looking hat."
+ item_state = "hunter_hat"
+ icon_state = "hunter_hat"
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index b3f74b038f..fccfe21589 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -65,9 +65,8 @@
backpack_contents = list(/obj/item/weapon/storage/box/engineer=1,\
/obj/item/weapon/storage/box/handcuffs=1,\
/obj/item/clothing/mask/gas/sechailer=1,\
- /obj/item/weapon/gun/energy/e_gun=1,\
- /obj/item/weapon/melee/baton/loaded=1,\
- /obj/item/weapon/gun/energy/e_gun/advtaser=1)
+ /obj/item/weapon/gun/energy/e_gun/stun=1,\
+ /obj/item/weapon/melee/baton/loaded=1)
/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index a8ed4d2100..1cadd5cc0d 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -14,14 +14,14 @@
/obj/item/clothing/suit/armor/vest
name = "armor vest"
- desc = "A slim armored vest that protects against most types of damage."
+ desc = "A slim Type I armored vest that provides decent protection against most types of damage."
icon_state = "armoralt"
item_state = "armoralt"
blood_overlay_type = "armor"
dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/alt
- desc = "An armored vest that protects against most types of damage."
+ desc = "A Type I armored vest that provides decent protection against most types of damage."
icon_state = "armor"
item_state = "armor"
@@ -31,7 +31,7 @@
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
- desc = "A greatcoat enchanced with a special alloy for some protection and style for those with a commanding presence."
+ desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence."
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
@@ -77,7 +77,7 @@
/obj/item/clothing/suit/armor/vest/capcarapace
name = "captain's carapace"
- desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
+ desc = "An fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
@@ -93,7 +93,7 @@
/obj/item/clothing/suit/armor/riot
name = "riot suit"
- desc = "A suit of armor with heavy padding to protect against melee attacks."
+ desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks."
icon_state = "riot"
item_state = "swat_suit"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -115,7 +115,7 @@
/obj/item/clothing/suit/armor/bulletproof
name = "bulletproof armor"
- desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
+ desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 1a8c96e802..e90c750d12 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -50,12 +50,28 @@
name = "captain's cloak"
desc = "Worn by the commander of Space Station 13."
icon_state = "capcloak"
-
+
/obj/item/clothing/neck/cloak/hop
name = "head of personnel's cloak"
desc = "Worn by the Head of Personnel. It smells faintly of bureaucracy."
icon_state = "hopcloak"
+/obj/item/clothing/suit/hooded/cloak/goliath
+ name = "goliath cloak"
+ icon_state = "goliath_cloak"
+ desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear, /obj/item/weapon/twohanded/bonespear, /obj/item/organ/hivelord_core/legion, /obj/item/weapon/kitchen/knife/combat/bone, /obj/item/weapon/kitchen/knife/combat/survival)
+ armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
+ hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
+ body_parts_covered = CHEST|GROIN|ARMS
+
+/obj/item/clothing/head/hooded/cloakhood/goliath
+ name = "goliath cloak hood"
+ icon_state = "golhood"
+ desc = "A protective & concealing hood."
+ armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60)
+ flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
+
/obj/item/clothing/suit/hooded/cloak/drake
name = "drake armour"
icon_state = "dragon"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index bc1f25cfa7..02040b4469 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -541,5 +541,5 @@
name = "spooky ghost"
desc = "this is obviously just a bedsheet, but maybe try it on?"
icon_state = "bedsheet"
- user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = 1, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
+ user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 72088961de..a489d0fb6a 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -337,9 +337,9 @@
/obj/item/weapon/restraints/handcuffs/cable = 1
)
category = CAT_MISC
-
+
/datum/crafting_recipe/toysword
- name = "Toy Sword"
+ name = "Toy Sword"
reqs = list(/obj/item/weapon/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
result = /obj/item/toy/sword
category = CAT_MISC
@@ -398,6 +398,15 @@
reqs = list(/obj/item/stack/sheet/bone = 4)
category = CAT_PRIMAL
+/datum/crafting_recipe/goliathcloak
+ name = "Goliath Cloak"
+ result = /obj/item/clothing/suit/hooded/cloak/goliath
+ time = 50
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
+ category = CAT_PRIMAL
+
/datum/crafting_recipe/drakecloak
name = "Ash Drake Armour"
result = /obj/item/clothing/suit/hooded/cloak/drake
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index 60ff69a323..45269743a5 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -37,7 +37,7 @@
return FALSE
to_chat(user, "You plant [src].")
message_admins("Kudzu planted by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(user)]",0,1)
- investigate_log("was planted by [key_name(user)] at [COORD(user)]","botany")
+ investigate_log("was planted by [key_name(user)] at [COORD(user)]", INVESTIGATE_BOTANY)
new /datum/spacevine_controller(get_turf(user), mutations, potency, production)
qdel(src)
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index d12f9c52cf..fc34fbad83 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -306,6 +306,5 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom/attack_self(mob/user)
. = ..()
if(.)
- message_admins("Shadowshroom planted by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(user)]",0,1)
- investigate_log("was planted by [key_name(user)] at [COORD(user)]", "botany")
+ investigate_log("was planted by [key_name(user)] at [COORD(user)]", INVESTIGATE_BOTANY)
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index d3a8c089d6..bf554f85a9 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -136,26 +136,23 @@ GLOBAL_VAR_CONST(access_away_generic4, 208)
/obj/item/proc/GetID()
return null
+/obj/proc/text2access(access_text)
+ . = list()
+ if(!access_text)
+ return
+ var/list/split = splittext(access_text,";")
+ for(var/x in split)
+ var/n = text2num(x)
+ if(n)
+ . += n
+
//Call this before using req_access or req_one_access directly
/obj/proc/gen_access()
//These generations have been moved out of /obj/New() because they were slowing down the creation of objects that never even used the access system.
- if(!src.req_access)
- src.req_access = list()
- if(src.req_access_txt)
- var/list/req_access_str = splittext(req_access_txt,";")
- for(var/x in req_access_str)
- var/n = text2num(x)
- if(n)
- req_access += n
-
- if(!src.req_one_access)
- src.req_one_access = list()
- if(src.req_one_access_txt)
- var/list/req_one_access_str = splittext(req_one_access_txt,";")
- for(var/x in req_one_access_str)
- var/n = text2num(x)
- if(n)
- req_one_access += n
+ for(var/a in text2access(req_access_txt))
+ req_access += a
+ for(var/b in text2access(req_one_access_txt))
+ req_one_access += b
/obj/proc/check_access(obj/item/I)
gen_access()
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 918f179591..a649041e01 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -107,7 +107,6 @@
/datum/language_holder/construct
languages = list(/datum/language/common, /datum/language/narsie)
- only_speaks_language = /datum/language/narsie
/datum/language_holder/drone
languages = list(/datum/language/common, /datum/language/drone, /datum/language/machine)
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index dc443cf265..68665e2d81 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -270,7 +270,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
if(5)
dat += "Upload a New Title
"
if(!scanner)
- findscanner(9)
+ scanner = findscanner(9)
if(!scanner)
dat += "No scanner found within wireless network range.
"
else if(!scanner.cache)
@@ -314,7 +314,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
popup.open()
/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange)
- for(var/obj/machinery/libraryscanner/S in range(viewrange))
+ for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src)))
return S
return null
diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm
deleted file mode 100644
index a9315b7bea..0000000000
--- a/code/modules/mining/equipment.dm
+++ /dev/null
@@ -1,557 +0,0 @@
-/****************Explorer's Suit**************************/
-
-/obj/item/clothing/suit/hooded/explorer
- name = "explorer suit"
- desc = "An armoured suit for exploring harsh environments."
- icon_state = "explorer"
- item_state = "explorer"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- cold_protection = CHEST|GROIN|LEGS|ARMS
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- heat_protection = CHEST|GROIN|LEGS|ARMS
- hoodtype = /obj/item/clothing/head/hooded/explorer
- armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/head/hooded/explorer
- name = "explorer hood"
- desc = "An armoured hood for exploring harsh environments."
- icon_state = "explorer"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
- min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/mask/gas/explorer
- name = "explorer gas mask"
- desc = "A military-grade gas mask that can be connected to an air supply."
- icon_state = "gas_mining"
- visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
- visor_flags_inv = HIDEFACIALHAIR
- visor_flags_cover = MASKCOVERSMOUTH
- actions_types = list(/datum/action/item_action/adjust)
- armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 0, bio = 50, rad = 0, fire = 20, acid = 40)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
- adjustmask(user)
-
-/obj/item/clothing/mask/gas/explorer/adjustmask(user)
- ..()
- w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL
-
-/obj/item/clothing/mask/gas/explorer/folded/New()
- ..()
- adjustmask()
-
-
-/**********************Mining Equipment Vendor Items**************************/
-
-/**********************Jaunter**********************/
-
-/obj/item/device/wormhole_jaunter
- name = "wormhole jaunter"
- desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
- icon = 'icons/obj/mining.dmi'
- icon_state = "Jaunter"
- item_state = "electronic"
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 5
- origin_tech = "bluespace=2"
- slot_flags = SLOT_BELT
-
-/obj/item/device/wormhole_jaunter/attack_self(mob/user)
- user.visible_message("[user.name] activates the [src.name]!")
- SSblackbox.add_details("jaunter", "User") // user activated
- activate(user)
-
-/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
- var/turf/device_turf = get_turf(user)
- if(!device_turf||device_turf.z==2||device_turf.z>=7)
- to_chat(user, "You're having difficulties getting the [src.name] to work.")
- return FALSE
- return TRUE
-
-/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
- var/list/destinations = list()
-
- if(isgolem(user))
- for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
- var/turf/T = get_turf(B)
- if(istype(T.loc, /area/ruin/powered/golem_ship))
- destinations += B
-
- // In the event golem beacon is destroyed, send to station instead
- if(destinations.len)
- return destinations
-
- for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
- var/turf/T = get_turf(B)
- if(T.z == ZLEVEL_STATION)
- destinations += B
-
- return destinations
-
-/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
- if(!turf_check(user))
- return
-
- var/list/L = get_destinations(user)
- if(!L.len)
- to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
- return
- var/chosen_beacon = pick(L)
- var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
- J.target = chosen_beacon
- try_move_adjacent(J)
- playsound(src,'sound/effects/sparks4.ogg',50,1)
- qdel(src)
-
-/obj/item/device/wormhole_jaunter/emp_act(power)
- var/triggered = FALSE
-
- if(usr.get_item_by_slot(slot_belt) == src)
- if(power == 1)
- triggered = TRUE
- else if(power == 2 && prob(50))
- triggered = TRUE
-
- if(triggered)
- usr.visible_message("The [src] overloads and activates!")
- SSblackbox.add_details("jaunter","EMP") // EMP accidental activation
- activate(usr)
-
-/obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user)
- if(user.get_item_by_slot(slot_belt) == src)
- to_chat(user, "Your [src] activates, saving you from the chasm!")
- SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation
- activate(user)
- else
- to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
-
-
-/obj/effect/portal/wormhole/jaunt_tunnel
- name = "jaunt tunnel"
- icon = 'icons/effects/effects.dmi'
- icon_state = "bhole3"
- desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
- mech_sized = TRUE //save your ripley
-
-/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
- if(istype(M, /obj/effect))
- return
-
- if(M.anchored)
- if(!(istype(M, /obj/mecha) && mech_sized))
- return
-
- if(istype(M, /atom/movable))
- if(do_teleport(M, target, 6))
- // KERPLUNK
- playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
- if(iscarbon(M))
- var/mob/living/carbon/L = M
- L.Weaken(3)
- if(ishuman(L))
- shake_camera(L, 20, 1)
- addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
-
-/**********************Resonator**********************/
-
-/obj/item/weapon/resonator
- name = "resonator"
- icon = 'icons/obj/mining.dmi'
- icon_state = "resonator"
- item_state = "resonator"
- desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum."
- w_class = WEIGHT_CLASS_NORMAL
- force = 15
- throwforce = 10
- var/burst_time = 30
- var/fieldlimit = 4
- var/list/fields = list()
- var/quick_burst_mod = 0.8
- origin_tech = "magnets=3;engineering=3"
-
-/obj/item/weapon/resonator/upgraded
- name = "upgraded resonator"
- desc = "An upgraded version of the resonator that can produce more fields at once, as well as having no damage penalty for bursting a resonance field early."
- icon_state = "resonator_u"
- item_state = "resonator_u"
- origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
- fieldlimit = 6
- quick_burst_mod = 1
-
-/obj/item/weapon/resonator/attack_self(mob/user)
- if(burst_time == 50)
- burst_time = 30
- to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
- else
- burst_time = 50
- to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
-
-/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user)
- var/turf/T = get_turf(target)
- var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
- if(R)
- R.damage_multiplier = quick_burst_mod
- R.burst()
- return
- if(LAZYLEN(fields) < fieldlimit)
- new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
- user.changeNext_move(CLICK_CD_MELEE)
-
-/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params)
- if(check_allowed_items(target, 1))
- CreateResonance(target, user)
- return TRUE
-
-/obj/effect/temp_visual/resonance
- name = "resonance field"
- desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
- icon_state = "shield1"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 50
- var/resonance_damage = 20
- var/damage_multiplier = 1
- var/creator
- var/obj/item/weapon/resonator/res
-
-/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration)
- duration = set_duration
- . = ..()
- creator = set_creator
- res = set_resonator
- if(res)
- res.fields += src
- playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
- transform = matrix()*0.75
- animate(src, transform = matrix()*1.5, time = duration)
- deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
-
-/obj/effect/temp_visual/resonance/Destroy()
- if(res)
- res.fields -= src
- res = null
- creator = null
- . = ..()
-
-/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
- if(!proj_turf)
- proj_turf = get_turf(src)
- if(!istype(proj_turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- resonance_damage = initial(resonance_damage)
- if(pressure < 50)
- name = "strong [initial(name)]"
- resonance_damage *= 3
- else
- name = initial(name)
- resonance_damage *= damage_multiplier
-
-/obj/effect/temp_visual/resonance/proc/burst()
- var/turf/T = get_turf(src)
- new /obj/effect/temp_visual/resonance_crush(T)
- if(ismineralturf(T))
- var/turf/closed/mineral/M = T
- M.gets_drilled(creator)
- check_pressure(T)
- playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
- for(var/mob/living/L in T)
- if(creator)
- add_logs(creator, L, "used a resonator field on", "resonator")
- to_chat(L, "[src] ruptured with you in it!")
- L.apply_damage(resonance_damage, BRUTE)
- qdel(src)
-
-/obj/effect/temp_visual/resonance_crush
- icon_state = "shield1"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 4
-
-/obj/effect/temp_visual/resonance_crush/Initialize()
- . = ..()
- transform = matrix()*1.5
- animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
-
-/**********************Facehugger toy**********************/
-
-/obj/item/clothing/mask/facehugger/toy
- item_state = "facehugger_inactive"
- desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
- throwforce = 0
- real = 0
- sterile = 1
- tint = 3 //Makes it feel more authentic when it latches on
-
-/obj/item/clothing/mask/facehugger/toy/Die()
- return
-
-/**********************Lazarus Injector**********************/
-
-/obj/item/weapon/lazarus_injector
- name = "lazarus injector"
- desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
- icon = 'icons/obj/syringe.dmi'
- icon_state = "lazarus_hypo"
- item_state = "hypo"
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 5
- var/loaded = 1
- var/malfunctioning = 0
- var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
- origin_tech = "biotech=4;magnets=6"
-
-/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
- if(!loaded)
- return
- if(isliving(target) && proximity_flag)
- if(istype(target, /mob/living/simple_animal))
- var/mob/living/simple_animal/M = target
- if(M.sentience_type != revive_type)
- to_chat(user, "[src] does not work on this sort of creature.")
- return
- if(M.stat == DEAD)
- M.faction = list("neutral")
- M.revive(full_heal = 1, admin_revive = 1)
- if(ishostile(target))
- var/mob/living/simple_animal/hostile/H = M
- if(malfunctioning)
- H.faction |= list("lazarus", "\ref[user]")
- H.robust_searching = 1
- H.friends += user
- H.attack_same = 1
- log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
- else
- H.attack_same = 0
- loaded = 0
- user.visible_message("[user] injects [M] with [src], reviving it.")
- SSblackbox.add_details("lazarus_injector", "[M.type]")
- playsound(src,'sound/effects/refill.ogg',50,1)
- icon_state = "lazarus_empty"
- return
- else
- to_chat(user, "[src] is only effective on the dead.")
- return
- else
- to_chat(user, "[src] is only effective on lesser beings.")
- return
-
-/obj/item/weapon/lazarus_injector/emp_act()
- if(!malfunctioning)
- malfunctioning = 1
-
-/obj/item/weapon/lazarus_injector/examine(mob/user)
- ..()
- if(!loaded)
- to_chat(user, "[src] is empty.")
- if(malfunctioning)
- to_chat(user, "The display on [src] seems to be flickering.")
-
-/**********************Mining Scanners**********************/
-
-/obj/item/device/mining_scanner
- desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
- name = "manual mining scanner"
- icon_state = "mining1"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT
- slot_flags = SLOT_BELT
- var/cooldown = 35
- var/current_cooldown = 0
- origin_tech = "engineering=1;magnets=1"
-
-/obj/item/device/mining_scanner/attack_self(mob/user)
- if(!user.client)
- return
- if(current_cooldown <= world.time)
- current_cooldown = world.time + cooldown
- mineral_scan_pulse(get_turf(user))
-
-
-//Debug item to identify all ore spread quickly
-/obj/item/device/mining_scanner/admin
-
-/obj/item/device/mining_scanner/admin/attack_self(mob/user)
- for(var/turf/closed/mineral/M in world)
- if(M.scan_state)
- M.icon_state = M.scan_state
- qdel(src)
-
-/obj/item/device/t_scanner/adv_mining_scanner
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
- name = "advanced automatic mining scanner"
- icon_state = "mining0"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT
- slot_flags = SLOT_BELT
- var/cooldown = 35
- var/current_cooldown = 0
- var/range = 7
- origin_tech = "engineering=3;magnets=3"
-
-/obj/item/device/t_scanner/adv_mining_scanner/lesser
- name = "automatic mining scanner"
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
- range = 4
- cooldown = 50
-
-/obj/item/device/t_scanner/adv_mining_scanner/scan()
- if(current_cooldown <= world.time)
- current_cooldown = world.time + cooldown
- var/turf/t = get_turf(src)
- mineral_scan_pulse(t, range)
-
-/proc/mineral_scan_pulse(turf/T, range = world.view)
- var/list/minerals = list()
- for(var/turf/closed/mineral/M in range(range, T))
- if(M.scan_state)
- minerals += M
- if(LAZYLEN(minerals))
- for(var/turf/closed/mineral/M in minerals)
- var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
- if(oldC)
- qdel(oldC)
- var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
- C.icon_state = M.scan_state
-
-/obj/effect/temp_visual/mining_overlay
- plane = FULLSCREEN_PLANE
- layer = FLASH_LAYER
- icon = 'icons/effects/ore_visuals.dmi'
- appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
- duration = 35
- pixel_x = -224
- pixel_y = -224
-
-/obj/effect/temp_visual/mining_overlay/Initialize()
- . = ..()
- animate(src, alpha = 0, time = duration, easing = EASE_IN)
-
-
-/**********************Xeno Warning Sign**********************/
-/obj/structure/sign/xeno_warning_mining
- name = "DANGEROUS ALIEN LIFE"
- desc = "A sign that warns would be travellers of hostile alien life in the vicinity."
- icon = 'icons/obj/mining.dmi'
- icon_state = "xeno_warning"
-
-/*********************Hivelord stabilizer****************/
-
-/obj/item/weapon/hivelordstabilizer
- name = "stabilizing serum"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
- desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
- w_class = WEIGHT_CLASS_TINY
- origin_tech = "biotech=3"
-
-/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
- var/obj/item/organ/hivelord_core/C = M
- if(!istype(C, /obj/item/organ/hivelord_core))
- to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.")
- return ..()
-
- C.preserved()
- to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.")
- qdel(src)
-
-/*********************Mining Hammer****************/
-/obj/item/weapon/twohanded/required/mining_hammer
- icon = 'icons/obj/mining.dmi'
- icon_state = "mining_hammer1"
- item_state = "mining_hammer1"
- name = "proto-kinetic crusher"
- desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
- While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna.\
- \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
- This weapon is only particularly effective against large creatures."
- force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
- force_unwielded = 20 //It's never not wielded so these are the same
- force_wielded = 20
- throwforce = 5
- throw_speed = 4
- luminosity = 4
- armour_penetration = 10
- materials = list(MAT_METAL=1150, MAT_GLASS=2075)
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
- sharpness = IS_SHARP
- var/charged = TRUE
- var/charge_time = 14
-
-/obj/item/projectile/destabilizer
- name = "destabilizing force"
- icon_state = "pulse1"
- nodamage = TRUE
- damage = 0 //We're just here to mark people. This is still a melee weapon.
- damage_type = BRUTE
- flag = "bomb"
- range = 6
- log_override = TRUE
- var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
-
-/obj/item/projectile/destabilizer/Destroy()
- hammer_synced = null
- return ..()
-
-/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
- if(isliving(target))
- var/mob/living/L = target
- var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
- CM.hammer_synced = hammer_synced
- var/target_turf = get_turf(target)
- if(ismineralturf(target_turf))
- var/turf/closed/mineral/M = target_turf
- new /obj/effect/temp_visual/kinetic_blast(M)
- M.gets_drilled(firer)
- ..()
-
-/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
- if(!proximity_flag && charged)//Mark a target, or mine a tile.
- var/turf/proj_turf = user.loc
- if(!isturf(proj_turf))
- return
- var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
- D.preparePixelProjectile(target, get_turf(target), user)
- D.hammer_synced = src
- playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
- D.fire()
- charged = FALSE
- icon_state = "mining_hammer1_uncharged"
- addtimer(CALLBACK(src, .proc/Recharge), charge_time)
- return
- if(proximity_flag && isliving(target))
- var/mob/living/L = target
- var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
- if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
- return
- new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
- var/backstab_dir = get_dir(user, L)
- var/def_check = L.getarmor(type = "bomb")
- if((user.dir & backstab_dir) && (L.dir & backstab_dir))
- L.apply_damage(80, BRUTE, blocked = def_check)
- playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
- else
- L.apply_damage(50, BRUTE, blocked = def_check)
-
-/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
- if(!charged)
- charged = TRUE
- icon_state = "mining_hammer1"
- playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
new file mode 100644
index 0000000000..e4acea1cf0
--- /dev/null
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -0,0 +1,48 @@
+/****************Explorer's Suit and Mask****************/
+/obj/item/clothing/suit/hooded/explorer
+ name = "explorer suit"
+ desc = "An armoured suit for exploring harsh environments."
+ icon_state = "explorer"
+ item_state = "explorer"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ cold_protection = CHEST|GROIN|LEGS|ARMS
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ heat_protection = CHEST|GROIN|LEGS|ARMS
+ hoodtype = /obj/item/clothing/head/hooded/explorer
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/head/hooded/explorer
+ name = "explorer hood"
+ desc = "An armoured hood for exploring harsh environments."
+ icon_state = "explorer"
+ body_parts_covered = HEAD
+ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+ max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/mask/gas/explorer
+ name = "explorer gas mask"
+ desc = "A military-grade gas mask that can be connected to an air supply."
+ icon_state = "gas_mining"
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ visor_flags_inv = HIDEFACIALHAIR
+ visor_flags_cover = MASKCOVERSMOUTH
+ actions_types = list(/datum/action/item_action/adjust)
+ armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 0, bio = 50, rad = 0, fire = 20, acid = 40)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
+ adjustmask(user)
+
+/obj/item/clothing/mask/gas/explorer/adjustmask(user)
+ ..()
+ w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL
+
+/obj/item/clothing/mask/gas/explorer/folded/New()
+ ..()
+ adjustmask()
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
new file mode 100644
index 0000000000..15d6c6afc5
--- /dev/null
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -0,0 +1,86 @@
+/*********************Mining Hammer****************/
+/obj/item/weapon/twohanded/required/mining_hammer
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "mining_hammer1"
+ item_state = "mining_hammer1"
+ name = "proto-kinetic crusher"
+ desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
+ While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna.\
+ \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
+ This weapon is only particularly effective against large creatures."
+ force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = SLOT_BACK
+ force_unwielded = 20 //It's never not wielded so these are the same
+ force_wielded = 20
+ throwforce = 5
+ throw_speed = 4
+ luminosity = 4
+ armour_penetration = 10
+ materials = list(MAT_METAL=1150, MAT_GLASS=2075)
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
+ sharpness = IS_SHARP
+ var/charged = TRUE
+ var/charge_time = 14
+
+/obj/item/projectile/destabilizer
+ name = "destabilizing force"
+ icon_state = "pulse1"
+ nodamage = TRUE
+ damage = 0 //We're just here to mark people. This is still a melee weapon.
+ damage_type = BRUTE
+ flag = "bomb"
+ range = 6
+ log_override = TRUE
+ var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
+
+/obj/item/projectile/destabilizer/Destroy()
+ hammer_synced = null
+ return ..()
+
+/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ CM.hammer_synced = hammer_synced
+ var/target_turf = get_turf(target)
+ if(ismineralturf(target_turf))
+ var/turf/closed/mineral/M = target_turf
+ new /obj/effect/temp_visual/kinetic_blast(M)
+ M.gets_drilled(firer)
+ ..()
+
+/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
+ if(!proximity_flag && charged)//Mark a target, or mine a tile.
+ var/turf/proj_turf = user.loc
+ if(!isturf(proj_turf))
+ return
+ var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
+ D.preparePixelProjectile(target, get_turf(target), user)
+ D.hammer_synced = src
+ playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
+ D.fire()
+ charged = FALSE
+ icon_state = "mining_hammer1_uncharged"
+ addtimer(CALLBACK(src, .proc/Recharge), charge_time)
+ return
+ if(proximity_flag && isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
+ return
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
+ var/backstab_dir = get_dir(user, L)
+ var/def_check = L.getarmor(type = "bomb")
+ if((user.dir & backstab_dir) && (L.dir & backstab_dir))
+ L.apply_damage(80, BRUTE, blocked = def_check)
+ playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
+ else
+ L.apply_damage(50, BRUTE, blocked = def_check)
+
+/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
+ if(!charged)
+ charged = TRUE
+ icon_state = "mining_hammer1"
+ playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm
new file mode 100644
index 0000000000..7199e29bf4
--- /dev/null
+++ b/code/modules/mining/equipment/lazarus_injector.dm
@@ -0,0 +1,61 @@
+/**********************Lazarus Injector**********************/
+/obj/item/weapon/lazarus_injector
+ name = "lazarus injector"
+ desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
+ icon = 'icons/obj/syringe.dmi'
+ icon_state = "lazarus_hypo"
+ item_state = "hypo"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ var/loaded = 1
+ var/malfunctioning = 0
+ var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
+ origin_tech = "biotech=4;magnets=6"
+
+/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
+ if(!loaded)
+ return
+ if(isliving(target) && proximity_flag)
+ if(istype(target, /mob/living/simple_animal))
+ var/mob/living/simple_animal/M = target
+ if(M.sentience_type != revive_type)
+ to_chat(user, "[src] does not work on this sort of creature.")
+ return
+ if(M.stat == DEAD)
+ M.faction = list("neutral")
+ M.revive(full_heal = 1, admin_revive = 1)
+ if(ishostile(target))
+ var/mob/living/simple_animal/hostile/H = M
+ if(malfunctioning)
+ H.faction |= list("lazarus", "\ref[user]")
+ H.robust_searching = 1
+ H.friends += user
+ H.attack_same = 1
+ log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
+ else
+ H.attack_same = 0
+ loaded = 0
+ user.visible_message("[user] injects [M] with [src], reviving it.")
+ SSblackbox.add_details("lazarus_injector", "[M.type]")
+ playsound(src,'sound/effects/refill.ogg',50,1)
+ icon_state = "lazarus_empty"
+ return
+ else
+ to_chat(user, "[src] is only effective on the dead.")
+ return
+ else
+ to_chat(user, "[src] is only effective on lesser beings.")
+ return
+
+/obj/item/weapon/lazarus_injector/emp_act()
+ if(!malfunctioning)
+ malfunctioning = 1
+
+/obj/item/weapon/lazarus_injector/examine(mob/user)
+ ..()
+ if(!loaded)
+ to_chat(user, "[src] is empty.")
+ if(malfunctioning)
+ to_chat(user, "The display on [src] seems to be flickering.")
diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm
new file mode 100644
index 0000000000..4f76c98a28
--- /dev/null
+++ b/code/modules/mining/equipment/mineral_scanner.dm
@@ -0,0 +1,79 @@
+/**********************Mining Scanners**********************/
+/obj/item/device/mining_scanner
+ desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
+ name = "manual mining scanner"
+ icon_state = "mining1"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_SMALL
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ var/cooldown = 35
+ var/current_cooldown = 0
+ origin_tech = "engineering=1;magnets=1"
+
+/obj/item/device/mining_scanner/attack_self(mob/user)
+ if(!user.client)
+ return
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
+ mineral_scan_pulse(get_turf(user))
+
+//Debug item to identify all ore spread quickly
+/obj/item/device/mining_scanner/admin
+
+/obj/item/device/mining_scanner/admin/attack_self(mob/user)
+ for(var/turf/closed/mineral/M in world)
+ if(M.scan_state)
+ M.icon_state = M.scan_state
+ qdel(src)
+
+/obj/item/device/t_scanner/adv_mining_scanner
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
+ name = "advanced automatic mining scanner"
+ icon_state = "mining0"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_SMALL
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ var/cooldown = 35
+ var/current_cooldown = 0
+ var/range = 7
+ origin_tech = "engineering=3;magnets=3"
+
+/obj/item/device/t_scanner/adv_mining_scanner/lesser
+ name = "automatic mining scanner"
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
+ range = 4
+ cooldown = 50
+
+/obj/item/device/t_scanner/adv_mining_scanner/scan()
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
+ var/turf/t = get_turf(src)
+ mineral_scan_pulse(t, range)
+
+/proc/mineral_scan_pulse(turf/T, range = world.view)
+ var/list/minerals = list()
+ for(var/turf/closed/mineral/M in range(range, T))
+ if(M.scan_state)
+ minerals += M
+ if(LAZYLEN(minerals))
+ for(var/turf/closed/mineral/M in minerals)
+ var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
+ if(oldC)
+ qdel(oldC)
+ var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
+ C.icon_state = M.scan_state
+
+/obj/effect/temp_visual/mining_overlay
+ plane = FULLSCREEN_PLANE
+ layer = FLASH_LAYER
+ icon = 'icons/effects/ore_visuals.dmi'
+ appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
+ duration = 35
+ pixel_x = -224
+ pixel_y = -224
+
+/obj/effect/temp_visual/mining_overlay/Initialize()
+ . = ..()
+ animate(src, alpha = 0, time = duration, easing = EASE_IN)
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
new file mode 100644
index 0000000000..c54def1b2b
--- /dev/null
+++ b/code/modules/mining/equipment/resonator.dm
@@ -0,0 +1,120 @@
+/**********************Resonator**********************/
+/obj/item/weapon/resonator
+ name = "resonator"
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "resonator"
+ item_state = "resonator"
+ desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum."
+ w_class = WEIGHT_CLASS_NORMAL
+ force = 15
+ throwforce = 10
+ var/burst_time = 30
+ var/fieldlimit = 4
+ var/list/fields = list()
+ var/quick_burst_mod = 0.8
+ origin_tech = "magnets=3;engineering=3"
+
+/obj/item/weapon/resonator/upgraded
+ name = "upgraded resonator"
+ desc = "An upgraded version of the resonator that can produce more fields at once, as well as having no damage penalty for bursting a resonance field early."
+ icon_state = "resonator_u"
+ item_state = "resonator_u"
+ origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
+ fieldlimit = 6
+ quick_burst_mod = 1
+
+/obj/item/weapon/resonator/attack_self(mob/user)
+ if(burst_time == 50)
+ burst_time = 30
+ to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
+ else
+ burst_time = 50
+ to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
+
+/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user)
+ var/turf/T = get_turf(target)
+ var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
+ if(R)
+ R.damage_multiplier = quick_burst_mod
+ R.burst()
+ return
+ if(LAZYLEN(fields) < fieldlimit)
+ new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
+ user.changeNext_move(CLICK_CD_MELEE)
+
+/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params)
+ if(check_allowed_items(target, 1))
+ CreateResonance(target, user)
+ return TRUE
+
+//resonance field, crushes rock, damages mobs
+/obj/effect/temp_visual/resonance
+ name = "resonance field"
+ desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 50
+ var/resonance_damage = 20
+ var/damage_multiplier = 1
+ var/creator
+ var/obj/item/weapon/resonator/res
+
+/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration)
+ duration = set_duration
+ . = ..()
+ creator = set_creator
+ res = set_resonator
+ if(res)
+ res.fields += src
+ playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
+ transform = matrix()*0.75
+ animate(src, transform = matrix()*1.5, time = duration)
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
+
+/obj/effect/temp_visual/resonance/Destroy()
+ if(res)
+ res.fields -= src
+ res = null
+ creator = null
+ . = ..()
+
+/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
+ if(!proj_turf)
+ proj_turf = get_turf(src)
+ if(!istype(proj_turf))
+ return
+ var/datum/gas_mixture/environment = proj_turf.return_air()
+ var/pressure = environment.return_pressure()
+ resonance_damage = initial(resonance_damage)
+ if(pressure < 50)
+ name = "strong [initial(name)]"
+ resonance_damage *= 3
+ else
+ name = initial(name)
+ resonance_damage *= damage_multiplier
+
+/obj/effect/temp_visual/resonance/proc/burst()
+ var/turf/T = get_turf(src)
+ new /obj/effect/temp_visual/resonance_crush(T)
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled(creator)
+ check_pressure(T)
+ playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
+ for(var/mob/living/L in T)
+ if(creator)
+ add_logs(creator, L, "used a resonator field on", "resonator")
+ to_chat(L, "[src] ruptured with you in it!")
+ L.apply_damage(resonance_damage, BRUTE)
+ qdel(src)
+
+/obj/effect/temp_visual/resonance_crush
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/resonance_crush/Initialize()
+ . = ..()
+ transform = matrix()*1.5
+ animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
diff --git a/code/modules/mining/equipment/vendor_items.dm b/code/modules/mining/equipment/vendor_items.dm
new file mode 100644
index 0000000000..4ff83ea21f
--- /dev/null
+++ b/code/modules/mining/equipment/vendor_items.dm
@@ -0,0 +1,33 @@
+/**********************Mining Equipment Vendor Items**************************/
+//misc stuff you can buy from the vendor that has special code but doesn't really need its own file
+
+/**********************Facehugger toy**********************/
+/obj/item/clothing/mask/facehugger/toy
+ item_state = "facehugger_inactive"
+ desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
+ throwforce = 0
+ real = 0
+ sterile = 1
+ tint = 3 //Makes it feel more authentic when it latches on
+
+/obj/item/clothing/mask/facehugger/toy/Die()
+ return
+
+/*********************Hivelord stabilizer****************/
+/obj/item/weapon/hivelordstabilizer
+ name = "stabilizing serum"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+ desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "biotech=3"
+
+/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
+ var/obj/item/organ/hivelord_core/C = M
+ if(!istype(C, /obj/item/organ/hivelord_core))
+ to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.")
+ return ..()
+
+ C.preserved()
+ to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.")
+ qdel(src)
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
new file mode 100644
index 0000000000..135f4482fc
--- /dev/null
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -0,0 +1,109 @@
+/**********************Jaunter**********************/
+/obj/item/device/wormhole_jaunter
+ name = "wormhole jaunter"
+ desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "Jaunter"
+ item_state = "electronic"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ origin_tech = "bluespace=2"
+ slot_flags = SLOT_BELT
+
+/obj/item/device/wormhole_jaunter/attack_self(mob/user)
+ user.visible_message("[user.name] activates the [src.name]!")
+ SSblackbox.add_details("jaunter", "User") // user activated
+ activate(user)
+
+/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
+ var/turf/device_turf = get_turf(user)
+ if(!device_turf||device_turf.z==2||device_turf.z>=7)
+ to_chat(user, "You're having difficulties getting the [src.name] to work.")
+ return FALSE
+ return TRUE
+
+/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
+ var/list/destinations = list()
+
+ if(isgolem(user))
+ for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
+ var/turf/T = get_turf(B)
+ if(istype(T.loc, /area/ruin/powered/golem_ship))
+ destinations += B
+
+ // In the event golem beacon is destroyed, send to station instead
+ if(destinations.len)
+ return destinations
+
+ for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
+ var/turf/T = get_turf(B)
+ if(T.z == ZLEVEL_STATION)
+ destinations += B
+
+ return destinations
+
+/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
+ if(!turf_check(user))
+ return
+
+ var/list/L = get_destinations(user)
+ if(!L.len)
+ to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
+ return
+ var/chosen_beacon = pick(L)
+ var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
+ J.target = chosen_beacon
+ try_move_adjacent(J)
+ playsound(src,'sound/effects/sparks4.ogg',50,1)
+ qdel(src)
+
+/obj/item/device/wormhole_jaunter/emp_act(power)
+ var/triggered = FALSE
+
+ if(usr.get_item_by_slot(slot_belt) == src)
+ if(power == 1)
+ triggered = TRUE
+ else if(power == 2 && prob(50))
+ triggered = TRUE
+
+ if(triggered)
+ usr.visible_message("The [src] overloads and activates!")
+ SSblackbox.add_details("jaunter","EMP") // EMP accidental activation
+ activate(usr)
+
+/obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user)
+ if(user.get_item_by_slot(slot_belt) == src)
+ to_chat(user, "Your [src] activates, saving you from the chasm!")
+ SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation
+ activate(user)
+ else
+ to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
+
+//jaunter tunnel
+/obj/effect/portal/wormhole/jaunt_tunnel
+ name = "jaunt tunnel"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "bhole3"
+ desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
+ mech_sized = TRUE //save your ripley
+
+/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
+ if(istype(M, /obj/effect))
+ return
+
+ if(M.anchored)
+ if(!(istype(M, /obj/mecha) && mech_sized))
+ return
+
+ if(istype(M, /atom/movable))
+ if(do_teleport(M, target, 6))
+ // KERPLUNK
+ playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
+ if(iscarbon(M))
+ var/mob/living/carbon/L = M
+ L.Weaken(3)
+ if(ishuman(L))
+ shake_camera(L, 20, 1)
+ addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 3df4d521ff..10b7bc1eac 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -217,6 +217,7 @@
/area/survivalpod
name = "\improper Emergency Shelter"
icon_state = "away"
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = 0
has_gravity = 1
@@ -394,7 +395,9 @@
icon = 'icons/obj/lavaland/donkvendor.dmi'
icon_on = "donkvendor"
icon_off = "donkvendor"
- luminosity = 8
+ light_range = 5
+ light_power = 1.2
+ light_color = "#DDFFD3"
max_n_of_items = 10
pixel_y = -4
flags = NODECONSTRUCT
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index f137299581..aa9e133165 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -72,6 +72,9 @@
if(!brainmob.stored_dna)
brainmob.stored_dna = new /datum/dna/stored(brainmob)
C.dna.copy_dna(brainmob.stored_dna)
+ var/obj/item/organ/zombie_infection/ZI = L.getorganslot("zombie_infection")
+ if(ZI)
+ brainmob.set_species(ZI.old_species) //For if the brain is cloned
if(L.mind && L.mind.current)
L.mind.transfer_to(brainmob)
to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a brain.")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8f597f5531..edd10ea9e2 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -413,7 +413,7 @@
if(R)
if(H.canUseHUD())
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
- investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records")
+ investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", INVESTIGATE_RECORDS)
R.fields["criminal"] = setcriminal
sec_hud_set_security_status()
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 46f5bc3d4f..18fa2e8c60 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -622,7 +622,7 @@
gain = 100
if(mind.assigned_role == "Clown")
gain = rand(-300, 300)
- investigate_log("([key_name(src)]) has been consumed by the singularity.","singulo") //Oh that's where the clown ended up!
+ investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up!
gib()
return(gain)
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index a05614fe09..f6f7665ae8 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -31,10 +31,8 @@
create_internal_organs()
- ..()
+ . = ..()
-/mob/living/carbon/monkey/Initialize()
- ..()
create_dna(src)
dna.initialize_dna(random_blood_type())
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 9ed7796f1a..839535f6c7 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -291,7 +291,7 @@
/mob/living/singularity_act()
var/gain = 20
- investigate_log("([key_name(src)]) has been consumed by the singularity.","singulo") //Oh that's where the clown ended up!
+ investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up!
gib()
return(gain)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index fbf9c35303..83cc990a52 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -24,7 +24,8 @@
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
- var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
+ var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas
+ //and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index d3fe5eb6d2..f4cfb363fd 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -833,8 +833,20 @@
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
- var/name_used = speaker.GetVoice()
- var/rendered = "Relayed Speech: [name_used] [raw_message]"
+ var/start = "Relayed Speech: "
+ var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]"
+ var/hrefpart = ""
+ var/jobpart
+
+ if (iscarbon(speaker))
+ var/mob/living/carbon/S = speaker
+ if(S.job)
+ jobpart = "[S.job]"
+ else
+ jobpart = "Unknown"
+
+ var/rendered = "[start][hrefpart][namepart] ([jobpart]) [raw_message]"
+
show_message(rendered, 2)
/mob/living/silicon/ai/fully_replace_character_name(oldname,newname)
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 25be049546..b3b4725914 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -273,7 +273,7 @@
//Medbot Assembly
/obj/item/weapon/firstaid_arm_assembly
- name = "incomplete medibot assembly."
+ name = "incomplete medibot assembly"
desc = "A first aid kit with a robot arm permanently grafted to it."
icon = 'icons/mob/aibots.dmi'
icon_state = "firstaid_arm"
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 6fe1c5db53..afcf1d4c33 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -386,7 +386,6 @@
background_icon_state = "bg_demon"
buttontooltipstyle = "cult"
button_icon_state = "cult_mark"
- var/tracking = FALSE
var/mob/living/simple_animal/hostile/construct/harvester/the_construct
/datum/action/innate/seek_prey/Grant(var/mob/living/C)
@@ -396,12 +395,10 @@
/datum/action/innate/seek_prey/Activate()
if(GLOB.cult_narsie == null)
return
- if(tracking)
+ if(the_construct.seeking)
desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!"
button_icon_state = "cult_mark"
- tracking = FALSE
the_construct.seeking = FALSE
- the_construct.master = GLOB.cult_narsie
to_chat(the_construct, "You are now tracking Nar'Sie, return to reap the harvest!")
return
else
@@ -413,7 +410,6 @@
return
desc = "Activate to track Nar'Sie!"
button_icon_state = "sintouch"
- tracking = TRUE
the_construct.seeking = TRUE
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index a2ae3b4b2d..e691ff2dfd 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -44,6 +44,13 @@
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug = 3)
gold_core_spawnable = 2
+/mob/living/simple_animal/pet/dog/Initialize()
+ var/dog_area = get_area(src)
+ for(var/obj/structure/bed/dogbed/D in dog_area)
+ if(!D.owner)
+ D.update_owner(src)
+ break
+
/mob/living/simple_animal/pet/dog/corgi/Initialize()
..()
regenerate_icons()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index 37777a5ead..e3792d40ba 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -37,7 +37,7 @@
environment_smash = initial(environment_smash)
alpha = 255
range = initial(range)
- incorporeal_move = 0
+ incorporeal_move = FALSE
to_chat(src, "You switch to combat mode.")
toggle = FALSE
else
@@ -48,7 +48,7 @@
environment_smash = ENVIRONMENT_SMASH_NONE
alpha = 45
range = 255
- incorporeal_move = 1
+ incorporeal_move = INCORPOREAL_MOVE_BASIC
to_chat(src, "You switch to scout mode.")
toggle = TRUE
else
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 1c1fc8fb9e..5df35b2d93 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -193,6 +193,7 @@ Difficulty: Medium
return
animate(src, transform = matrix()*0.7, time = 7)
swooping |= SWOOP_INVULNERABLE
+ mouse_opacity = 0
sleep(7)
var/list/flame_hit = list()
while(swoop_duration > 0)
@@ -233,6 +234,7 @@ Difficulty: Medium
animate(src, transform = oldtransform, time = 5)
sleep(5)
swooping &= ~SWOOP_INVULNERABLE
+ mouse_opacity = initial(mouse_opacity)
icon_state = "dragon"
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
for(var/mob/living/L in orange(1, src))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index e3e4e37396..c2bd44d8ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -255,10 +255,8 @@
addtimer(CALLBACK(src, .proc/inert_check), 2400)
/obj/item/organ/hivelord_core/proc/inert_check()
- if(!owner && !preserved)
+ if(!preserved)
go_inert()
- else
- preserved(implanted = 1)
/obj/item/organ/hivelord_core/proc/preserved(implanted = 0)
inert = FALSE
@@ -278,7 +276,10 @@
update_icon()
/obj/item/organ/hivelord_core/ui_action_click()
- owner.revive(full_heal = 1)
+ if(inert)
+ to_chat(owner, "[src] breaks down as it tries to activate.")
+ else
+ owner.revive(full_heal = 1)
qdel(src)
/obj/item/organ/hivelord_core/on_life()
@@ -306,6 +307,18 @@
qdel(src)
..()
+/obj/item/organ/hivelord_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
+ . = ..()
+ if(!preserved && !inert)
+ preserved(TRUE)
+ owner.visible_message("[src] stabilizes as it's inserted.")
+
+/obj/item/organ/hivelord_core/Remove(mob/living/carbon/M, special = 0)
+ if(!inert && !special)
+ owner.visible_message("[src] goes inert as it's removed.")
+ go_inert()
+ return ..()
+
/obj/item/organ/hivelord_core/prepare_eat()
return null
@@ -827,6 +840,9 @@
health = 120
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
icon_state = "dwarf_legion"
+ icon_living = "dwarf_legion"
+ icon_aggro = "dwarf_legion"
+ icon_dead = "dwarf_legion"
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
stat_attack = 2
@@ -846,6 +862,7 @@
max_mobs = 3
spawn_time = 200
spawn_text = "peels itself off from"
+ mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
melee_damage_lower = 20
melee_damage_upper = 20
anchored = FALSE
@@ -1024,6 +1041,11 @@
regenerate_icons()
//Nests
+/obj/effect/light_emitter/tendril
+ set_luminosity = 4
+ set_cap = 2.5
+ light_color = LIGHT_COLOR_LAVA
+
/mob/living/simple_animal/hostile/spawner/lavaland
name = "necropolis tendril"
desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it."
@@ -1033,7 +1055,6 @@
icon_dead = "tendril"
faction = list("mining")
weather_immunities = list("lava","ash")
- luminosity = 1
health = 250
maxHealth = 250
max_mobs = 3
@@ -1046,9 +1067,17 @@
loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril)
del_on_death = 1
var/gps = null
+ var/obj/effect/light_emitter/tendril/emitted_light
+
+/mob/living/simple_animal/hostile/spawner/lavaland/goliath
+ mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
+
+/mob/living/simple_animal/hostile/spawner/lavaland/legion
+ mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
/mob/living/simple_animal/hostile/spawner/lavaland/Initialize()
- ..()
+ . = ..()
+ emitted_light = new(loc)
for(var/F in RANGE_TURFS(1, src))
if(ismineralturf(F))
var/turf/closed/mineral/M = F
@@ -1056,7 +1085,8 @@
gps = new /obj/item/device/gps/internal(src)
/mob/living/simple_animal/hostile/spawner/lavaland/Destroy()
- qdel(gps)
+ QDEL_NULL(emitted_light)
+ QDEL_NULL(gps)
. = ..()
#define MEDAL_PREFIX "Tendril"
@@ -1083,29 +1113,31 @@
/obj/effect/collapse
name = "collapsing necropolis tendril"
desc = "Get clear!"
- luminosity = 1
- layer = ABOVE_OPEN_TURF_LAYER
+ layer = BELOW_OBJ_LAYER
icon = 'icons/mob/nest.dmi'
icon_state = "tendril"
anchored = TRUE
+ density = TRUE
+ var/obj/effect/light_emitter/tendril/emitted_light
-/obj/effect/collapse/New()
- ..()
+/obj/effect/collapse/Initialize()
+ . = ..()
+ emitted_light = new(loc)
visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!")
visible_message("Something falls free of the tendril!")
- playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1)
- spawn(50)
- for(var/mob/M in range(7,src))
- shake_camera(M, 15, 1)
- playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1)
- visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!")
- for(var/turf/T in range(2,src))
- if(!T.density)
- T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface)
- qdel(src)
+ playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1)
+ addtimer(CALLBACK(src, .proc/collapse), 50)
-/mob/living/simple_animal/hostile/spawner/lavaland/goliath
- mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
+/obj/effect/collapse/Destroy()
+ QDEL_NULL(emitted_light)
+ return ..()
-/mob/living/simple_animal/hostile/spawner/lavaland/legion
- mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
+/obj/effect/collapse/proc/collapse()
+ for(var/mob/M in range(7,src))
+ shake_camera(M, 15, 1)
+ playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1)
+ visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!")
+ for(var/turf/T in range(2,src))
+ if(!T.density)
+ T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface)
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index e5dc99ea27..a0c1fe9fbe 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -948,7 +948,7 @@
color = "#FFFFFF77"
speak_chance = 20
status_flags = GODMODE
- incorporeal_move = 1
+ incorporeal_move = INCORPOREAL_MOVE_BASIC
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
/mob/living/simple_animal/parrot/Poly/ghost/Initialize()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index e85dca9cad..43d8a924a1 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -209,10 +209,10 @@
return
var/mob/living/L = mob
switch(L.incorporeal_move)
- if(1)
+ if(INCORPOREAL_MOVE_BASIC)
L.loc = get_step(L, direct)
L.setDir(direct)
- if(2)
+ if(INCORPOREAL_MOVE_SHADOW)
if(prob(50))
var/locx
var/locy
@@ -250,7 +250,7 @@
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.loc = get_step(L, direct)
L.setDir(direct)
- if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
+ if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
var/turf/open/floor/stepTurf = get_step(L, direct)
for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
to_chat(L, "[S] bars your passage!")
diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm
index b2f0c5fb07..18a43defb6 100644
--- a/code/modules/modular_computers/computers/machinery/console_presets.dm
+++ b/code/modules/modular_computers/computers/machinery/console_presets.dm
@@ -5,7 +5,7 @@
var/_has_battery = 0
var/_has_ai = 0
-/obj/machinery/modular_computer/console/preset/New()
+/obj/machinery/modular_computer/console/preset/Initialize()
. = ..()
if(!cpu)
return
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index b7b258d1ef..c8c303e453 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -27,15 +27,13 @@
var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
-/obj/machinery/modular_computer/New()
- ..()
+/obj/machinery/modular_computer/Initialize()
+ . = ..()
cpu = new(src)
cpu.physical = src
/obj/machinery/modular_computer/Destroy()
- if(cpu)
- qdel(cpu)
- cpu = null
+ QDEL_NULL(cpu)
return ..()
/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm
index 60315198ca..3f53ba715f 100644
--- a/code/modules/modular_computers/computers/machinery/modular_console.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_console.dm
@@ -20,8 +20,8 @@
max_integrity = 300
integrity_failure = 150
-/obj/machinery/modular_computer/console/buildable/New()
- ..()
+/obj/machinery/modular_computer/console/buildable/Initialize()
+ . = ..()
// User-built consoles start as empty frames.
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/weapon/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET]
@@ -30,8 +30,8 @@
qdel(network_card)
qdel(hard_drive)
-/obj/machinery/modular_computer/console/New()
- ..()
+/obj/machinery/modular_computer/console/Initialize()
+ . = ..()
var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
if(battery_module)
qdel(battery_module)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 73f4c73cfa..b6f8ee8f74 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -154,7 +154,7 @@
/obj/item/weapon/pen/sleepy/New()
create_reagents(45)
- reagents.add_reagent("morphine", 20)
+ reagents.add_reagent("chloralhydrate2", 20)
reagents.add_reagent("mutetoxin", 15)
reagents.add_reagent("tirizene", 10)
..()
@@ -205,4 +205,4 @@
/obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user)
P.contact_poison = "delayed_toxin"
P.contact_poison_volume = 10
- add_logs(user,P,"used poison pen on")
\ No newline at end of file
+ add_logs(user,P,"used poison pen on")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 48fc254a8e..c0ad4fd2b7 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -66,9 +66,8 @@ By design, d1 is the smallest direction and d2 is the highest
icon = 'icons/obj/power_cond/power_cond_white.dmi'
// the power cable object
-/obj/structure/cable/New()
- ..()
-
+/obj/structure/cable/Initialize()
+ . = ..()
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
var/dash = findtext(icon_state, "-")
@@ -131,7 +130,7 @@ By design, d1 is the smallest direction and d2 is the highest
return
user.visible_message("[user] cuts the cable.", "You cut the cable.")
stored.add_fingerprint(user)
- investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires")
+ investigate_log("was cut by [key_name(usr, usr.client)] in [get_area(T)]", INVESTIGATE_WIRES)
deconstruct()
return
@@ -529,7 +528,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
return(OXYLOSS)
/obj/item/stack/cable_coil/New(loc, new_amount = null, var/param_color = null)
- ..()
+ . = ..()
if(new_amount) // MAXCOIL by default
amount = new_amount
if(param_color)
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index a1d544c2e4..8f37974b2d 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -131,7 +131,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
var/broken_state = 0
/obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts.
- investigate_log("was destroyed!", "gravity")
+ investigate_log("was destroyed!", INVESTIGATE_GRAVITY)
on = 0
update_list()
for(var/obj/machinery/gravity_generator/part/O in parts)
@@ -173,7 +173,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
breaker = 0
set_power()
set_state(0)
- investigate_log("has broken down.", "gravity")
+ investigate_log("has broken down.", INVESTIGATE_GRAVITY)
/obj/machinery/gravity_generator/main/set_fix()
..()
@@ -263,7 +263,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
if(href_list["gentoggle"])
breaker = !breaker
- investigate_log("was toggled [breaker ? "ON" : "OFF"] by [usr.key].", "gravity")
+ investigate_log("was toggled [breaker ? "ON" : "OFF"] by [usr.key].", INVESTIGATE_GRAVITY)
set_power()
src.updateUsrDialog()
@@ -271,7 +271,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/main/power_change()
..()
- investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", "gravity")
+ investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", INVESTIGATE_GRAVITY)
set_power()
/obj/machinery/gravity_generator/main/get_status()
@@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
new_state = 1
charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation.
- investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", "gravity")
+ investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY)
update_icon()
// Set the state of the gravity.
@@ -308,12 +308,12 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
if(on) // If we turned on and the game is live.
if(gravity_in_level() == 0)
alert = 1
- investigate_log("was brought online and is now producing gravity for this level.", "gravity")
+ investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY)
message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
else
if(gravity_in_level() == 1)
alert = 1
- investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
+ investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY)
message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
update_icon()
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index b75cf57acf..ac4873a09b 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/process()
if(loaded_tank)
if(!loaded_tank.air_contents.gases["plasma"])
- investigate_log("out of fuel.","singulo")
+ investigate_log("out of fuel.", INVESTIGATE_SINGULO)
eject()
else
loaded_tank.air_contents.gases["plasma"][MOLES] -= 0.001*drainratio
@@ -46,9 +46,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"You turn the [src.name] [active? "on":"off"].")
- var/fuel = loaded_tank.air_contents.gases["plasma"]
+ var/fuel
+ if(loaded_tank)
+ fuel = loaded_tank.air_contents.gases["plasma"]
fuel = fuel ? fuel[MOLES] : 0
- investigate_log("turned [active?"on":"off"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].","singulo")
+ investigate_log("turned [active?"on":"off"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO)
return
else
to_chat(user, "The controls are locked!")
@@ -73,28 +75,34 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/device/multitool))
to_chat(user, "The [W.name] detects that [last_power]W were recently produced.")
- return 1
+ return TRUE
else if(istype(W, /obj/item/device/analyzer) && loaded_tank)
atmosanalyzer_scan(loaded_tank.air_contents, user)
else if(istype(W, /obj/item/weapon/tank/internals/plasma))
if(!anchored)
to_chat(user, "The [src] needs to be secured to the floor first!")
- return 1
+ return TRUE
if(loaded_tank)
to_chat(user, "There's already a plasma tank loaded!")
- return 1
+ return TRUE
if(!user.drop_item())
- return 1
+ return TRUE
loaded_tank = W
W.forceMove(src)
update_icons()
else if(istype(W, /obj/item/weapon/crowbar))
- if(loaded_tank && !locked)
+ if(loaded_tank)
+ if(locked)
+ to_chat(user, "The controls are locked!")
+ return TRUE
eject()
- return 1
+ return TRUE
+ else
+ to_chat(user, "There isn't a tank loaded!")
+ return TRUE
else if(istype(W, /obj/item/weapon/wrench))
default_unfasten_wrench(user, W, 0)
- return 1
+ return TRUE
else if(W.GetID())
if(allowed(user))
if(active)
@@ -104,7 +112,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
to_chat(user, "The controls can only be locked when \the [src] is active!")
else
to_chat(user, "Access denied.")
- return 1
+ return TRUE
else
return ..()
@@ -141,11 +149,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/proc/update_icons()
cut_overlays()
if(loaded_tank)
- add_overlay("ptank")
+ add_overlay("ptank")
if(stat & (NOPOWER|BROKEN))
return
if(active)
- add_overlay("on")
+ add_overlay("on")
/obj/machinery/power/rad_collector/proc/toggle_power()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 9d37173c9f..f5d62ba611 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -100,7 +100,7 @@
if(SSticker && SSticker.IsRoundInProgress())
message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1)
log_game("Emitter deleted at ([x],[y],[z])")
- investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo")
+ investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]", INVESTIGATE_SINGULO)
QDEL_NULL(sparks)
return ..()
@@ -123,13 +123,13 @@
to_chat(user, "You turn off \the [src].")
message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
- investigate_log("turned off by [key_name(user)] at [get_area(src)]","singulo")
+ investigate_log("turned off by [key_name(user)] at [get_area(src)]", INVESTIGATE_SINGULO)
else
src.active = 1
to_chat(user, "You turn on \the [src].")
src.shot_number = 0
src.fire_delay = maximum_fire_delay
- investigate_log("turned on by [key_name(user)] at [get_area(src)]","singulo")
+ investigate_log("turned on by [key_name(user)] at [get_area(src)]", INVESTIGATE_SINGULO)
update_icon()
else
to_chat(user, "The controls are locked!")
@@ -170,12 +170,12 @@
if(!powered)
powered = 1
update_icon()
- investigate_log("regained power and turned on at [get_area(src)]","singulo")
+ investigate_log("regained power and turned on at [get_area(src)]", INVESTIGATE_SINGULO)
else
if(powered)
powered = 0
update_icon()
- investigate_log("lost power and turned off at [get_area(src)]","singulo")
+ investigate_log("lost power and turned off at [get_area(src)]", INVESTIGATE_SINGULO)
log_game("Emitter lost power in ([x],[y],[z])")
return
if(charge <=80)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 838cc19df5..06c2544daf 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -71,7 +71,7 @@ field_generator power level display
"You turn on the [name].", \
"You hear heavy droning.")
turn_on()
- investigate_log("activated by [user.key].","singulo")
+ investigate_log("activated by [user.key].", INVESTIGATE_SINGULO)
add_fingerprint(user)
else
@@ -197,7 +197,7 @@ field_generator power level display
else
visible_message("The [name] shuts down!", "You hear something shutting down.")
turn_off()
- investigate_log("ran out of power and deactivated","singulo")
+ investigate_log("ran out of power and deactivated", INVESTIGATE_SINGULO)
power = 0
check_power_level()
return 0
@@ -324,7 +324,7 @@ field_generator power level display
if((world.time - O.last_warning) > 50) //to stop message-spam
temp = 0
message_admins("A singulo exists and a containment field has failed.",1)
- investigate_log("has failed whilst a singulo exists.","singulo")
+ investigate_log("has failed whilst a singulo exists.", INVESTIGATE_SINGULO)
O.last_warning = world.time
/obj/machinery/field/generator/shock(mob/living/user)
diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm
index c5e119876b..aa77954afe 100644
--- a/code/modules/power/singularity/investigate.dm
+++ b/code/modules/power/singularity/investigate.dm
@@ -1,4 +1,4 @@
/area/engine/engineering/poweralert(state, source)
if (state != poweralm)
- investigate_log("has a power alarm!","singulo")
+ investigate_log("has a power alarm!", INVESTIGATE_SINGULO)
..()
\ No newline at end of file
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 1aab0dd407..890136d763 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -156,7 +156,7 @@
..()
if(master && master.active)
master.toggle_power()
- investigate_log("was moved whilst active; it powered down.","singulo")
+ investigate_log("was moved whilst active; it powered down.", INVESTIGATE_SINGULO)
/obj/structure/particle_accelerator/update_icon()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 136f9162cf..fd3052cde4 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -119,7 +119,7 @@
message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]")
- investigate_log("increased to [strength] by [key_name(usr)]","singulo")
+ investigate_log("increased to [strength] by [key_name(usr)]", INVESTIGATE_SINGULO)
/obj/machinery/particle_accelerator/control_box/proc/remove_strength(s)
@@ -129,7 +129,7 @@
message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]")
- investigate_log("decreased to [strength] by [key_name(usr)]","singulo")
+ investigate_log("decreased to [strength] by [key_name(usr)]", INVESTIGATE_SINGULO)
/obj/machinery/particle_accelerator/control_box/power_change()
@@ -144,7 +144,7 @@
if(active)
//a part is missing!
if(connected_parts.len < 6)
- investigate_log("lost a connected part; It powered down.","singulo")
+ investigate_log("lost a connected part; It powered down.", INVESTIGATE_SINGULO)
toggle_power()
update_icon()
return
@@ -204,7 +204,7 @@
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
active = !active
- investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"]","singulo")
+ investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"]", INVESTIGATE_SINGULO)
message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in ([x],[y],[z])")
if(active)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 1a308ed471..56fc6c4985 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -86,7 +86,7 @@
switch(severity)
if(1)
if(current_size <= STAGE_TWO)
- investigate_log("has been destroyed by a heavy explosion.","singulo")
+ investigate_log("has been destroyed by a heavy explosion.", INVESTIGATE_SINGULO)
qdel(src)
return
else
@@ -134,7 +134,7 @@
var/count = locate(/obj/machinery/field/containment) in urange(30, src, 1)
if(!count)
message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1)
- investigate_log("was created. [count?"":"No containment fields were active"]","singulo")
+ investigate_log("was created. [count?"":"No containment fields were active"]", INVESTIGATE_SINGULO)
/obj/singularity/proc/dissipate()
if(!dissipate)
@@ -219,7 +219,7 @@
consume_range = 5
dissipate = 0
if(current_size == allowed_size)
- investigate_log("grew to size [current_size]","singulo")
+ investigate_log("grew to size [current_size]", INVESTIGATE_SINGULO)
return 1
else if(current_size < (--temp_allowed_size))
expand(temp_allowed_size)
@@ -229,7 +229,7 @@
/obj/singularity/proc/check_energy()
if(energy <= 0)
- investigate_log("collapsed.","singulo")
+ investigate_log("collapsed.", INVESTIGATE_SINGULO)
qdel(src)
return 0
switch(energy)//Some of these numbers might need to be changed up later -Mport
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index ea95b08269..ba025b7529 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -172,7 +172,7 @@
if(default_deconstruction_crowbar(I))
message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
log_game("[src] has been deconstructed by [key_name(user)]")
- investigate_log("SMES deconstructed by [key_name(user)]","singulo")
+ investigate_log("SMES deconstructed by [key_name(user)]", INVESTIGATE_SINGULO)
return
else if(panel_open && istype(I, /obj/item/weapon/crowbar))
return
@@ -195,7 +195,7 @@
var/area/area = get_area(src)
message_admins("SMES deleted at ([area.name])")
log_game("SMES deleted at ([area.name])")
- investigate_log("deleted at ([area.name])","singulo")
+ investigate_log("deleted at ([area.name])", INVESTIGATE_SINGULO)
if(terminal)
disconnect_terminal()
return ..()
@@ -284,7 +284,7 @@
if(output_used < 0.0001) // either from no charge or set to 0
outputting = 0
- investigate_log("lost power and turned off","singulo")
+ investigate_log("lost power and turned off", INVESTIGATE_SINGULO)
else if(output_attempt && charge > output_level && output_level > 0)
outputting = 1
else
@@ -419,7 +419,7 @@
log_smes(usr.ckey)
/obj/machinery/power/smes/proc/log_smes(user = "")
- investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user]", "singulo")
+ investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user]", INVESTIGATE_SINGULO)
/obj/machinery/power/smes/emp_act(severity)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 866041d883..dea263231a 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -137,11 +137,11 @@
radio.keyslot = new radio_key
radio.listening = 0
radio.recalculateChannels()
- investigate_log("has been created.", "supermatter")
+ investigate_log("has been created.", INVESTIGATE_SUPERMATTER)
/obj/machinery/power/supermatter_shard/Destroy()
- investigate_log("has been destroyed.", "supermatter")
+ investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER)
SSair.atmos_machinery -= src
QDEL_NULL(radio)
GLOB.poi_list -= src
@@ -171,16 +171,16 @@
M << 'sound/magic/Charge.ogg'
to_chat(M, "You feel reality distort for a moment...")
if(combined_gas > MOLE_PENALTY_THRESHOLD)
- investigate_log("has collapsed into a singularity.", "supermatter")
+ investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER)
if(T)
var/obj/singularity/S = new(T)
S.energy = 800
S.consume(src)
else
- investigate_log("has exploded.", "supermatter")
+ investigate_log("has exploded.", INVESTIGATE_SUPERMATTER)
explosion(get_turf(T), explosion_power * max(gasmix_power_ratio, 0.205) * 0.5 , explosion_power * max(gasmix_power_ratio, 0.205) + 2, explosion_power * max(gasmix_power_ratio, 0.205) + 4 , explosion_power * max(gasmix_power_ratio, 0.205) + 6, 1, 1)
if(power > POWER_PENALTY_THRESHOLD)
- investigate_log("has spawned additional energy balls.", "supermatter")
+ investigate_log("has spawned additional energy balls.", INVESTIGATE_SUPERMATTER)
var/obj/singularity/energy_ball/E = new(T)
E.energy = power
qdel(src)
@@ -345,7 +345,7 @@
radio.talk_into(src, "[emergency_alert] Instability: [stability]%", common_channel, get_spans(), get_default_language())
lastwarning = REALTIMEOFDAY
if(!has_reached_emergency)
- investigate_log("has reached the emergency point for the first time.", "supermatter")
+ investigate_log("has reached the emergency point for the first time.", INVESTIGATE_SUPERMATTER)
message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].")
has_reached_emergency = 1
else if(damage >= damage_archived) // The damage is still going up
@@ -388,11 +388,11 @@
return FALSE // This stops people from being able to really power up the supermatter
// Then bring it inside to explode instantly upon landing on a valid turf.
if(!istype(Proj.firer, /obj/machinery/power/emitter))
- investigate_log("has been hit by [Proj] fired by [Proj.firer]", "supermatter")
+ investigate_log("has been hit by [Proj] fired by [Proj.firer]", INVESTIGATE_SUPERMATTER)
if(Proj.flag != "bullet")
power += Proj.damage * config_bullet_energy
if(!has_been_powered)
- investigate_log("has been powered for the first time.", "supermatter")
+ investigate_log("has been powered for the first time.", INVESTIGATE_SUPERMATTER)
message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
has_been_powered = TRUE
else if(takes_damage)
@@ -401,7 +401,7 @@
/obj/machinery/power/supermatter_shard/singularity_act()
var/gain = 100
- investigate_log("Supermatter shard consumed by singularity.","singulo")
+ investigate_log("Supermatter shard consumed by singularity.", INVESTIGATE_SINGULO)
message_admins("Singularity has consumed a supermatter shard and can now become stage six.")
visible_message("[src] is consumed by the singularity!")
for(var/mob/M in GLOB.mob_list)
@@ -450,7 +450,7 @@
user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [user.p_their()] body starts to glow and bursts into flames before flashing into ash.",\
"You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\
"You hear an unearthly noise as a wave of heat washes over you.")
- investigate_log("has been attacked (hand) by [user]", "supermatter")
+ investigate_log("has been attacked (hand) by [user]", INVESTIGATE_SUPERMATTER)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
Consume(user)
@@ -467,7 +467,7 @@
user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\
"You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\
"Everything suddenly goes silent.")
- investigate_log("has been attacked ([W]) by [user]", "supermatter")
+ investigate_log("has been attacked ([W]) by [user]", INVESTIGATE_SUPERMATTER)
Consume(W)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
@@ -493,13 +493,13 @@
if(isliving(AM))
var/mob/living/user = AM
message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].")
- investigate_log("has consumed [key_name(user)].", "supermatter")
+ investigate_log("has consumed [key_name(user)].", INVESTIGATE_SUPERMATTER)
user.dust()
matter_power += 200
else if(istype(AM, /obj/singularity))
return
else if(isobj(AM) && !istype(AM, /obj/effect))
- investigate_log("has consumed [AM].", "supermatter")
+ investigate_log("has consumed [AM].", INVESTIGATE_SUPERMATTER)
qdel(AM)
matter_power += 200
@@ -507,7 +507,7 @@
//Some poor sod got eaten, go ahead and irradiate people nearby.
radiation_pulse(get_turf(src), 4, 10, 500, 1)
for(var/mob/living/L in range(10))
- investigate_log("has irradiated [L] after consuming [AM].", "supermatter")
+ investigate_log("has irradiated [L] after consuming [AM].", INVESTIGATE_SUPERMATTER)
if(L in view())
L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\
"The unearthly ringing subsides and you notice you have new radiation burns.", 2)
diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm
index 0ad35adddb..3a78d8385e 100644
--- a/code/modules/procedural_mapping/mapGeneratorModule.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModule.dm
@@ -9,14 +9,14 @@
var/allowAtomsOnSpace = FALSE
-//Syncs the module up with it's mother
+//Syncs the module up with its mother
/datum/mapGeneratorModule/proc/sync(datum/mapGenerator/mum)
mother = null
if(mum)
mother = mum
-//Generates it's spawnable atoms and turfs
+//Generates its spawnable atoms and turfs
/datum/mapGeneratorModule/proc/generate()
if(!mother)
return
@@ -143,4 +143,4 @@
/datum/mapGeneratorModule/denseLayer
clusterCheckFlags = CLUSTER_CHECK_NONE
spawnableAtoms = list(/atom = 75)
- spawnableTurfs = list(/turf = 75)
\ No newline at end of file
+ spawnableTurfs = list(/turf = 75)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 7da945a5b8..51703e0a5a 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -78,6 +78,9 @@
fire_sound = 'sound/weapons/taser.ogg'
e_cost = 200
+/obj/item/ammo_casing/energy/electrode/spec
+ e_cost = 100
+
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
e_cost = 100
diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/box_magazine.dm
index 982bbdf587..028aebe66a 100644
--- a/code/modules/projectiles/box_magazine.dm
+++ b/code/modules/projectiles/box_magazine.dm
@@ -86,6 +86,7 @@
if(num_loaded)
if(!silent)
to_chat(user, "You load [num_loaded] shell\s into \the [src]!")
+ playsound(user, 'sound/weapons/bulletinsert.ogg', 60, 1)
A.update_icon()
update_icon()
@@ -96,6 +97,7 @@
if(A)
user.put_in_hands(A)
to_chat(user, "You remove a round from \the [src]!")
+ playsound(user, 'sound/weapons/bulletremove.ogg', 60, 1)
update_icon()
/obj/item/ammo_box/update_icon()
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
index 8733cd2e1e..c2a7129b4e 100644
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/external_mag.dm
@@ -30,16 +30,19 @@
/obj/item/ammo_box/magazine/m10mm/fire
name = "pistol magazine (10mm incendiary)"
+ icon_state = "9x19pI"
desc = "A gun magazine. Loaded with rounds which ignite the target."
ammo_type = /obj/item/ammo_casing/c10mm/fire
/obj/item/ammo_box/magazine/m10mm/hp
name = "pistol magazine (10mm HP)"
+ icon_state = "9x19pH"
desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
ammo_type = /obj/item/ammo_casing/c10mm/hp
/obj/item/ammo_box/magazine/m10mm/ap
name = "pistol magazine (10mm AP)"
+ icon_state = "9x19pA"
desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets"
ammo_type = /obj/item/ammo_casing/c10mm/ap
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 2dffe0a567..89baa173c1 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -43,8 +43,11 @@
var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin //standard firing pin for most guns
- var/obj/item/device/flashlight/gun_light = null
+ var/obj/item/device/flashlight/gun_light
var/can_flashlight = 0
+ var/obj/item/weapon/kitchen/knife/bayonet
+ var/can_bayonet = FALSE
+ var/datum/action/item_action/toggle_gunlight/alight
var/list/upgrades = list()
@@ -52,6 +55,8 @@
var/ammo_y_offset = 0
var/flight_x_offset = 0
var/flight_y_offset = 0
+ var/knife_x_offset = 0
+ var/knife_y_offset = 0
//Zooming
var/zoomable = FALSE //whether the gun generates a Zoom action on creation
@@ -60,13 +65,12 @@
var/datum/action/toggle_scope_zoom/azoom
-/obj/item/weapon/gun/New()
- ..()
+/obj/item/weapon/gun/Initialize()
+ . = ..()
if(pin)
pin = new pin(src)
if(gun_light)
- verbs += /obj/item/weapon/gun/proc/toggle_gunlight
- new /datum/action/item_action/toggle_gunlight(src)
+ alight = new /datum/action/item_action/toggle_gunlight(src)
build_zooming()
@@ -268,52 +272,88 @@
SSblackbox.add_details("gun_fired","[src.type]")
return 1
+/obj/item/weapon/gun/update_icon()
+ ..()
+ cut_overlays()
+ if(gun_light && can_flashlight)
+ var/state = "flight[gun_light.on? "_on":""]" //Generic state.
+ if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state?
+ state = gun_light.icon_state
+ var/mutable_appearance/flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state)
+ flashlight_overlay.pixel_x = flight_x_offset
+ flashlight_overlay.pixel_y = flight_y_offset
+ add_overlay(flashlight_overlay)
+ if(bayonet && can_bayonet)
+ var/state = "bayonet" //Generic state.
+ if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
+ state = bayonet.icon_state
+ var/mutable_appearance/knife_overlay = mutable_appearance('icons/obj/guns/bayonets.dmi', state)
+ knife_overlay.pixel_x = knife_x_offset
+ knife_overlay.pixel_y = knife_y_offset
+ add_overlay(knife_overlay)
+
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
if(user.a_intent == INTENT_HARM) //Flogging
- ..()
- else
- return
+ if(bayonet)
+ M.attackby(bayonet, user)
+ return
+ return ..()
+
+/obj/item/weapon/gun/attack_obj(obj/O, mob/user)
+ if(user.a_intent == INTENT_HARM)
+ if(bayonet)
+ O.attackby(bayonet, user)
+ return
+ return ..()
/obj/item/weapon/gun/attackby(obj/item/I, mob/user, params)
- if(can_flashlight)
- if(istype(I, /obj/item/device/flashlight/seclite))
- var/obj/item/device/flashlight/seclite/S = I
- if(!gun_light)
- if(!user.transferItemToLoc(I, src))
- return
- to_chat(user, "You click [S] into place on [src].")
- if(S.on)
- set_light(0)
- gun_light = S
- update_icon()
- update_gunlight(user)
- verbs += /obj/item/weapon/gun/proc/toggle_gunlight
- var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src)
- if(loc == user)
- A.Grant(user)
-
- if(istype(I, /obj/item/weapon/screwdriver))
- if(gun_light)
- for(var/obj/item/device/flashlight/seclite/S in src)
- to_chat(user, "You unscrew the seclite from [src].")
- gun_light = null
- S.forceMove(get_turf(user))
- update_gunlight(user)
- S.update_brightness(user)
- update_icon()
- verbs -= /obj/item/weapon/gun/proc/toggle_gunlight
- for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
- qdel(TGL)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+ else if(istype(I, /obj/item/device/flashlight/seclite))
+ if(!can_flashlight)
+ return ..()
+ var/obj/item/device/flashlight/seclite/S = I
+ if(!gun_light)
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You click \the [S] into place on \the [src].")
+ if(S.on)
+ set_light(0)
+ gun_light = S
+ update_icon()
+ update_gunlight(user)
+ alight = new /datum/action/item_action/toggle_gunlight(src)
+ if(loc == user)
+ alight.Grant(user)
+ else if(istype(I, /obj/item/weapon/kitchen/knife))
+ if(!can_bayonet)
+ return ..()
+ var/obj/item/weapon/kitchen/knife/K = I
+ if(!bayonet)
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You attach \the [K] to the front of \the [src].")
+ bayonet = K
+ update_icon()
+ else if(istype(I, /obj/item/weapon/screwdriver))
+ if(gun_light)
+ var/obj/item/device/flashlight/seclite/S = gun_light
+ to_chat(user, "You unscrew the seclite from \the [src].")
+ gun_light = null
+ S.forceMove(get_turf(user))
+ update_gunlight(user)
+ S.update_brightness(user)
+ update_icon()
+ QDEL_NULL(alight)
+ if(bayonet)
+ var/obj/item/weapon/kitchen/knife/K = bayonet
+ K.forceMove(get_turf(user))
+ bayonet = null
+ update_icon()
else
- ..()
-
-
+ return ..()
/obj/item/weapon/gun/proc/toggle_gunlight()
- set name = "Toggle Gunlight"
- set category = "Object"
- set desc = "Click to toggle your weapon's attached flashlight."
-
if(!gun_light)
return
@@ -343,12 +383,16 @@
..()
if(azoom)
azoom.Grant(user)
+ if(alight)
+ alight.Grant(user)
/obj/item/weapon/gun/dropped(mob/user)
..()
zoom(user,FALSE)
if(azoom)
azoom.Remove(user)
+ if(alight)
+ alight.Remove(user)
/obj/item/weapon/gun/AltClick(mob/user)
@@ -370,9 +414,6 @@
to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.")
update_icon()
-
-
-
/obj/item/weapon/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params)
if(!ishuman(user) || !ishuman(target))
return
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index a7a8b75da2..80be30a06a 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -9,8 +9,8 @@
var/obj/item/ammo_box/magazine/magazine
var/casing_ejector = 1 //whether the gun ejects the chambered casing
-/obj/item/weapon/gun/ballistic/New()
- ..()
+/obj/item/weapon/gun/ballistic/Initialize()
+ . = ..()
if(!spawnwithmagazine)
update_icon()
return
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 0235bbe84d..70d399b107 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -44,6 +44,8 @@
oldmag.update_icon()
else
to_chat(user, "You insert the magazine into \the [src].")
+
+ playsound(user, 'sound/weapons/autoguninsert.ogg', 60, 1)
chamber_round()
A.update_icon()
update_icon()
@@ -97,10 +99,9 @@
/obj/item/weapon/gun/ballistic/automatic/c20r/unrestricted
pin = /obj/item/device/firing_pin
-/obj/item/weapon/gun/ballistic/automatic/c20r/New()
- ..()
+/obj/item/weapon/gun/ballistic/automatic/c20r/Initialize()
+ . = ..()
update_icon()
- return
/obj/item/weapon/gun/ballistic/automatic/c20r/afterattack()
..()
@@ -148,20 +149,18 @@
fire_delay = 2
pin = /obj/item/device/firing_pin/implant/pindicate
-/obj/item/weapon/gun/ballistic/automatic/m90/New()
- ..()
+/obj/item/weapon/gun/ballistic/automatic/m90/Initialize()
+ . = ..()
underbarrel = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher(src)
update_icon()
- return
/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted
pin = /obj/item/device/firing_pin
-/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted/New()
- ..()
+/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted/Initialize()
+ . = ..()
underbarrel = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher/unrestricted(src)
update_icon()
- return
/obj/item/weapon/gun/ballistic/automatic/m90/afterattack(atom/target, mob/living/user, flag, params)
if(select == 2)
@@ -257,8 +256,8 @@
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/unrestricted
pin = /obj/item/device/firing_pin
-/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/New()
- ..()
+/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/Initialize()
+ . = ..()
update_icon()
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/update_icon()
@@ -300,6 +299,10 @@
/obj/item/weapon/gun/ballistic/automatic/l6_saw/attack_self(mob/user)
cover_open = !cover_open
to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.")
+ if(cover_open)
+ playsound(user, 'sound/weapons/sawopen.ogg', 60, 1)
+ else
+ playsound(user, 'sound/weapons/sawclose.ogg', 60, 1)
update_icon()
@@ -330,6 +333,7 @@
magazine = null
update_icon()
to_chat(user, "You remove the magazine from [src].")
+ playsound(user, 'sound/weapons/magout.ogg', 60, 1)
/obj/item/weapon/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
index bc0668cd66..a246871e61 100644
--- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm
+++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
@@ -9,16 +9,16 @@
item_state = "backpack"
slot_flags = SLOT_BACK
w_class = WEIGHT_CLASS_HUGE
- var/obj/item/weapon/gun/ballistic/minigun/gun = null
+ var/obj/item/weapon/gun/ballistic/minigun/gun
var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded.
var/overheat = 0
var/overheat_max = 40
var/heat_diffusion = 1
-/obj/item/weapon/minigunpack/New()
+/obj/item/weapon/minigunpack/Initialize()
+ . = ..()
gun = new(src)
START_PROCESSING(SSobj, src)
- ..()
/obj/item/weapon/minigunpack/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -110,15 +110,15 @@
casing_ejector = 0
var/obj/item/weapon/minigunpack/ammo_pack
-/obj/item/weapon/gun/ballistic/minigun/New()
+/obj/item/weapon/gun/ballistic/minigun/Initialize()
SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND)
- if(!ammo_pack)
- if(istype(loc,/obj/item/weapon/minigunpack)) //We should spawn inside a ammo pack so let's use that one.
- ammo_pack = loc
- ..()
- else
- qdel(src)//No pack, no gun
+ if(istype(loc, /obj/item/weapon/minigunpack)) //We should spawn inside a ammo pack so let's use that one.
+ ammo_pack = loc
+ else
+ return INITIALIZE_HINT_QDEL //No pack, no gun
+
+ return ..()
/obj/item/weapon/gun/ballistic/minigun/attack_self(mob/living/user)
return
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index ac3c56b88a..2ce432bf31 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -6,8 +6,8 @@
origin_tech = "combat=3;materials=2"
casing_ejector = 0
-/obj/item/weapon/gun/ballistic/revolver/New()
- ..()
+/obj/item/weapon/gun/ballistic/revolver/Initialize()
+ . = ..()
if(!istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder))
verbs -= /obj/item/weapon/gun/ballistic/revolver/verb/spin
@@ -28,6 +28,7 @@
var/num_loaded = magazine.attackby(A, user, params, 1)
if(num_loaded)
to_chat(user, "You load [num_loaded] shell\s into \the [src].")
+ playsound(user, 'sound/weapons/bulletinsert.ogg', 60, 1)
A.update_icon()
update_icon()
chamber_round(0)
@@ -45,6 +46,7 @@
num_unloaded++
if (num_unloaded)
to_chat(user, "You unload [num_unloaded] shell\s from [src].")
+ playsound(user, 'sound/weapons/bulletremove.ogg', 60, 1)
else
to_chat(user, "[src] is empty!")
@@ -93,8 +95,8 @@
unique_rename = 1
unique_reskin = 1
-/obj/item/weapon/gun/ballistic/revolver/detective/New()
- ..()
+/obj/item/weapon/gun/ballistic/revolver/detective/Initialize()
+ . = ..()
options["Default"] = "detective"
options["Leopard Spots"] = "detective_leopard"
options["Black Panther"] = "detective_panther"
@@ -175,8 +177,8 @@
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357
var/spun = FALSE
-/obj/item/weapon/gun/ballistic/revolver/russian/New()
- ..()
+/obj/item/weapon/gun/ballistic/revolver/russian/Initialize()
+ . = ..()
do_spin()
spun = TRUE
update_icon()
@@ -269,8 +271,8 @@
unique_rename = 1
unique_reskin = 1
-/obj/item/weapon/gun/ballistic/revolver/doublebarrel/New()
- ..()
+/obj/item/weapon/gun/ballistic/revolver/doublebarrel/Initialize()
+ . = ..()
options["Default"] = "dshotgun"
options["Dark Red Finish"] = "dshotgun-d"
options["Ash"] = "dshotgun-f"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 5f376370d4..6fc3fd3687 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -20,6 +20,7 @@
var/num_loaded = magazine.attackby(A, user, params, 1)
if(num_loaded)
to_chat(user, "You load [num_loaded] shell\s into \the [src]!")
+ playsound(user, 'sound/weapons/shotguninsert.ogg', 60, 1)
A.update_icon()
update_icon()
@@ -146,8 +147,8 @@
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
-/obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/New()
- ..()
+/obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/Initialize()
+ . = ..()
bolt_open = 1
pump()
gun_type = type
@@ -212,8 +213,8 @@
var/toggled = 0
var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
-/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube/New()
- ..()
+/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube/Initialize()
+ . = ..()
if (!alternate_magazine)
alternate_magazine = new mag_type(src)
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 89f6655d8e..9b8044dac8 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -35,9 +35,9 @@
/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot
mag_type = /obj/item/ammo_box/magazine/toy/pistol/riot
-/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot/New()
+/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot/Initialize()
magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
- ..()
+ return ..()
/obj/item/weapon/gun/ballistic/automatic/toy/pistol/unrestricted
pin = /obj/item/device/firing_pin
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 9e642b0cef..f8d0911011 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -10,6 +10,7 @@
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
var/can_charge = 1 //Can it be charged in a recharger?
+ var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()?
var/charge_sections = 4
ammo_x_offset = 2
var/shaded_charge = 0 //if this gun uses a stateful charge bar for more detail
@@ -25,8 +26,8 @@
update_icon()
-/obj/item/weapon/gun/energy/New()
- ..()
+/obj/item/weapon/gun/energy/Initialize()
+ . = ..()
if(cell_type)
power_supply = new cell_type(src)
else
@@ -116,7 +117,9 @@
return
/obj/item/weapon/gun/energy/update_icon()
- cut_overlays()
+ ..()
+ if(!automatic_charge_overlays)
+ return
var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
var/iconState = "[icon_state]_charge"
@@ -138,14 +141,6 @@
add_overlay(charge_overlay)
else
add_overlay("[icon_state]_charge[ratio]")
- if(gun_light && can_flashlight)
- var/iconF = "flight"
- if(gun_light.on)
- iconF = "flight_on"
- var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF)
- flashlight_overlay.pixel_x = flight_x_offset
- flashlight_overlay.pixel_y = flight_y_offset
- add_overlay(flashlight_overlay)
if(itemState)
itemState += "[ratio]"
item_state = itemState
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index cc1166814b..a8edc727b3 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -22,15 +22,23 @@
charge_sections = 3
can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
-/obj/item/weapon/gun/energy/e_gun/mini/New()
+/obj/item/weapon/gun/energy/e_gun/mini/Initialize()
gun_light = new /obj/item/device/flashlight/seclite(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/e_gun/mini/update_icon()
..()
if(gun_light && gun_light.on)
add_overlay("mini-light")
+/obj/item/weapon/gun/energy/e_gun/stun
+ name = "tactical energy gun"
+ desc = "Military issue energy gun, is able to fire stun rounds."
+ icon_state = "energytac"
+ ammo_x_offset = 2
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode/spec, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
+
+
/obj/item/weapon/gun/energy/e_gun/mini/practice_phaser
name = "practice phaser"
desc = "A modified version of the basic phaser gun, this one fires less concentrated energy bolts designed for target practice."
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 0f108fcc76..1799a33cbb 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -16,6 +16,9 @@
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
var/overheat = FALSE
+ can_bayonet = TRUE
+ knife_x_offset = 15
+ knife_y_offset = 13
var/max_mod_capacity = 100
var/list/modkits = list()
@@ -68,7 +71,7 @@
unique_frequency = TRUE
max_mod_capacity = 80
-/obj/item/weapon/gun/energy/kinetic_accelerator/New()
+/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize()
. = ..()
if(!holds_charge)
empty()
@@ -129,19 +132,11 @@
overheat = FALSE
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
- cut_overlays()
+ ..()
+
if(empty_state && !can_shoot())
add_overlay(empty_state)
- if(gun_light && can_flashlight)
- var/iconF = "flight"
- if(gun_light.on)
- iconF = "flight_on"
- var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF)
- flashlight_overlay.pixel_x = flight_x_offset
- flashlight_overlay.pixel_y = flight_y_offset
- add_overlay(flashlight_overlay)
-
//Casing
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index b3e55f2423..43431a65c3 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -17,9 +17,9 @@
/obj/item/weapon/gun/energy/pulse/prize
pin = /obj/item/device/firing_pin
-/obj/item/weapon/gun/energy/pulse/prize/New()
+/obj/item/weapon/gun/energy/pulse/prize/Initialize()
. = ..()
- GLOB.poi_list |= src
+ GLOB.poi_list += src
var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]"
message_admins(msg)
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 58a756a28d..9c30eefd2f 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -44,8 +44,8 @@
charges--//... drain a charge
recharge_newshot()
-/obj/item/weapon/gun/magic/New()
- ..()
+/obj/item/weapon/gun/magic/Initialize()
+ . = ..()
charges = max_charges
chambered = new ammo_type(src)
if(can_charge)
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index fe93a58838..247273e3f4 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -9,13 +9,13 @@
max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths)
var/variable_charges = 1
-/obj/item/weapon/gun/magic/wand/New()
+/obj/item/weapon/gun/magic/wand/Initialize()
if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges
if(prob(33))
max_charges = Ceiling(max_charges / 3)
else
max_charges = Ceiling(max_charges / 2)
- ..()
+ return ..()
/obj/item/weapon/gun/magic/wand/examine(mob/user)
..()
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index 37d576a8ff..46758f8889 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -16,8 +16,8 @@
weapon_weight = WEAPON_MEDIUM
-/obj/item/weapon/gun/medbeam/New()
- ..()
+/obj/item/weapon/gun/medbeam/Initialize()
+ . = ..()
START_PROCESSING(SSobj, src)
/obj/item/weapon/gun/medbeam/Destroy(mob/user)
@@ -128,6 +128,6 @@
/obj/item/weapon/gun/medbeam/mech
mounted = 1
-/obj/item/weapon/gun/medbeam/mech/New()
- ..()
+/obj/item/weapon/gun/medbeam/mech/Initialize()
+ . = ..()
STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 09547b0d98..2e8a29cded 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -14,8 +14,8 @@
var/list/syringes = list()
var/max_syringes = 1
-/obj/item/weapon/gun/syringe/New()
- ..()
+/obj/item/weapon/gun/syringe/Initialize()
+ . = ..()
chambered = new /obj/item/ammo_casing/syringegun(src)
/obj/item/weapon/gun/syringe/recharge_newshot()
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3dbadc85c5..8c810155db 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -28,6 +28,9 @@
var/spread = 0 //amount (in degrees) of projectile spread
var/legacy = 0 //legacy projectile system
animate_movement = 0 //Use SLIDE_STEPS in conjunction with legacy
+ var/ricochets = 0
+ var/ricochets_max = 2
+ var/ricochet_chance = 30
var/damage = 10
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
@@ -132,7 +135,11 @@
/obj/item/projectile/Bump(atom/A, yes)
if(!yes) //prevents double bumps.
return
- if(firer)
+ if(check_ricochet() && check_ricochet_flag(A) && ricochets < ricochets_max)
+ ricochets++
+ if(A.handle_ricochet(src))
+ return FALSE
+ if(firer && !ricochets)
if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech
loc = A.loc
return 0
@@ -166,6 +173,16 @@
picked_mob.bullet_act(src, def_zone)
qdel(src)
+/obj/item/projectile/proc/check_ricochet()
+ if(prob(ricochet_chance))
+ return TRUE
+ return FALSE
+
+/obj/item/projectile/proc/check_ricochet_flag(atom/A)
+ if(A.flags & CHECK_RICOCHET)
+ return TRUE
+ return FALSE
+
/obj/item/projectile/Process_Spacemove(var/movement_dir = 0)
return 1 //Bullets don't drift in space
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 766d8b5e39..427f590ba5 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -11,7 +11,9 @@
eyeblur = 2
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
-
+ ricochets_max = 50 //Honk!
+ ricochet_chance = 80
+
/obj/item/projectile/beam/laser
/obj/item/projectile/beam/laser/heavylaser
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 73355cd326..0594c17469 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -28,8 +28,8 @@
damage = 10
/obj/item/projectile/bullet/armourpiercing
- damage = 17
- armour_penetration = 10
+ damage = 15
+ armour_penetration = 40
/obj/item/projectile/bullet/pellet
name = "pellet"
@@ -244,7 +244,7 @@
name = "\improper DNA injector"
icon_state = "syringeproj"
var/obj/item/weapon/dnainjector/injector
-
+
/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
if(iscarbon(target))
var/mob/living/carbon/M = target
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 5cd94748e4..05bdd7da3f 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -351,21 +351,9 @@
/obj/item/projectile/magic/aoe/Range()
if(proxdet)
- var/turf/T1 = get_step(src,turn(dir, -45))
- var/turf/T2 = get_step(src,turn(dir, 45))
- var/turf/T3 = get_step(src,dir)
- var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it.
- if(L && L.stat != DEAD)
- Bump(L,1) //Magic Bullet #teachthecontroversy
- return
- L = locate(/mob/living) in T2
- if(L && L.stat != DEAD)
- Bump(L,1)
- return
- L = locate(/mob/living) in T3
- if(L && L.stat != DEAD)
- Bump(L,1)
- return
+ for(var/mob/living/L in range(1, get_turf(src)))
+ if(L.stat != DEAD && L != firer)
+ return Bump(L, TRUE)
..()
/obj/item/projectile/magic/aoe/lightning
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 57b339178f..867d1b8c8f 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -242,6 +242,7 @@
//Between normal and advanced for damage, made a beam so not the turret does not destroy glass
name = "plasma beam"
damage = 6
+ range = 7
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index b30207eaf3..f3cc8b8620 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -160,6 +160,12 @@
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
+ else if(istype(O, /obj/item/stack/sheet/hairlesshide))
+ var/obj/item/stack/sheet/hairlesshide/HH = O
+ var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH))
+ WL.amount = HH.amount
+ qdel(HH)
+
/*
* Water reaction to a mob
*/
@@ -367,11 +373,15 @@
if(ishuman(M))
var/mob/living/carbon/human/N = M
- if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair
+ N.hair_style = "Spiky"
+ N.facial_hair_style = "Shaved"
+ N.facial_hair_color = "000"
+ N.hair_color = "000"
+ if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem!
+ N.dna.species.species_traits += HAIR
+ if(N.dna.species.use_skintones)
N.skin_tone = "orange"
- N.hair_style = "Spiky"
- N.hair_color = "000"
- if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
+ else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
N.dna.features["mcolor"] = "f80"
N.regenerate_icons()
if(prob(7))
@@ -380,7 +390,7 @@
else
M.visible_message("[M] flexes [M.p_their()] arms.")
if(prob(10))
- M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you."))
+ M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."))
..()
return
@@ -1126,7 +1136,7 @@
/datum/reagent/nitrous_oxide/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == VAPOR)
M.drowsyness += max(round(reac_volume, 1), 2)
-
+
/datum/reagent/nitrous_oxide/on_mob_life(mob/living/M)
M.drowsyness += 2
if(ishuman(M))
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index fba7f241d2..8db05a0c4f 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -238,7 +238,7 @@
visible_message("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!")
for(var/mob/living/m in oview(1, src))
m.apply_damage(15, BRUTE, pick("head","chest","groin"))
- investigate_log("Experimentor dealt minor brute to [m].", "experimentor")
+ investigate_log("Experimentor dealt minor brute to [m].", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions!")
@@ -248,7 +248,7 @@
var/mob/living/target = locate(/mob/living) in oview(7,src)
if(target)
var/obj/item/throwing = loaded_item
- investigate_log("Experimentor has thrown [loaded_item] at [target]", "experimentor")
+ investigate_log("Experimentor has thrown [loaded_item] at [target]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
if(throwing)
throwing.throw_at(target, 10, 1)
@@ -259,7 +259,7 @@
visible_message("[exp_on] has activated an unknown subroutine!")
cloneMode = TRUE
cloneCount = badThingCoeff
- investigate_log("Experimentor has made a clone of [exp_on]", "experimentor")
+ investigate_log("Experimentor has made a clone of [exp_on]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and leaking radiation!")
@@ -278,7 +278,7 @@
var/newPath = pickWeighted(valid_items)
loaded_item = new newPath(src)
visible_message("[src] malfunctions, transforming [savedName] into [loaded_item]!")
- investigate_log("Experimentor has transformed [savedName] into [loaded_item]", "experimentor")
+ investigate_log("Experimentor has transformed [savedName] into [loaded_item]", INVESTIGATE_EXPERIMENTOR)
if(istype(loaded_item,/obj/item/weapon/grenade/chem_grenade))
var/obj/item/weapon/grenade/chem_grenade/CG = loaded_item
CG.prime()
@@ -295,7 +295,7 @@
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent(chosenchem , 50)
- investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor")
+ investigate_log("Experimentor has released [chosenchem] smoke.", INVESTIGATE_EXPERIMENTOR)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 0, src, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
@@ -315,14 +315,14 @@
qdel(R)
ejectItem(TRUE)
warn_admins(usr, "[chosenchem] smoke")
- investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor")
+ investigate_log("Experimentor has released [chosenchem] smoke!", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, spewing harmless gas.")
throwSmoke(src.loc)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] melts [exp_on], ionizing the air around it!")
empulse(src.loc, 4, 6)
- investigate_log("Experimentor has generated an Electromagnetic Pulse.", "experimentor")
+ investigate_log("Experimentor has generated an Electromagnetic Pulse.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_HEAT)
@@ -336,14 +336,14 @@
C.reagents.add_reagent(chosenchem , 50)
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
- investigate_log("Experimentor has made a cup of [chosenchem] coffee.", "experimentor")
+ investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
var/turf/start = get_turf(src)
var/mob/M = locate(/mob/living) in view(src, 3)
var/turf/MT = get_turf(M)
if(MT)
visible_message("[src] dangerously overheats, launching a flaming fuel orb!")
- investigate_log("Experimentor has launched a fireball at [M]!", "experimentor")
+ investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR)
var/obj/item/projectile/magic/aoe/fireball/FB = new /obj/item/projectile/magic/aoe/fireball(start)
FB.original = MT
FB.current = start
@@ -353,7 +353,7 @@
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!")
explosion(src.loc, -1, 0, 0, 0, 0, flame_range = 2)
- investigate_log("Experimentor started a fire.", "experimentor")
+ investigate_log("Experimentor started a fire.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and leaking hot air!")
@@ -367,14 +367,14 @@
removed.temperature = min((removed.temperature*heat_capacity + 100000)/heat_capacity, 1000)
env.merge(removed)
air_update_turf()
- investigate_log("Experimentor has released hot air.", "experimentor")
+ investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, activating its emergency coolant systems!")
throwSmoke(src.loc)
for(var/mob/living/m in oview(1, src))
m.apply_damage(5, BURN, pick("head","chest","groin"))
- investigate_log("Experimentor has dealt minor burn damage to [m]", "experimentor")
+ investigate_log("Experimentor has dealt minor burn damage to [m]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_COLD)
@@ -388,13 +388,13 @@
C.reagents.add_reagent(chosenchem , 50)
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
- investigate_log("Experimentor has made a cup of [chosenchem] coffee.", "experimentor")
+ investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent("frostoil" , 50)
- investigate_log("Experimentor has released frostoil gas.", "experimentor")
+ investigate_log("Experimentor has released frostoil gas.", INVESTIGATE_EXPERIMENTOR)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 0, src, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
@@ -413,7 +413,7 @@
removed.temperature = (removed.temperature*heat_capacity - 75000)/heat_capacity
env.merge(removed)
air_update_turf()
- investigate_log("Experimentor has released cold air.", "experimentor")
+ investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!")
@@ -433,14 +433,14 @@
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src]'s crusher goes way too many levels too high, crushing right through space-time!")
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3)
- investigate_log("Experimentor has triggered the 'throw things' reaction.", "experimentor")
+ investigate_log("Experimentor has triggered the 'throw things' reaction.", INVESTIGATE_EXPERIMENTOR)
for(var/atom/movable/AM in oview(7,src))
if(!AM.anchored)
AM.throw_at(src,10,1)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src]'s crusher goes one level too high, crushing right into space-time!")
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3)
- investigate_log("Experimentor has triggered the 'minor throw things' reaction.", "experimentor")
+ investigate_log("Experimentor has triggered the 'minor throw things' reaction.", INVESTIGATE_EXPERIMENTOR)
var/list/throwAt = list()
for(var/atom/movable/AM in oview(7,src))
if(!AM.anchored)
@@ -460,7 +460,7 @@
playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 3, -1)
var/obj/item/weapon/relic/R = loaded_item
R.reveal()
- investigate_log("Experimentor has revealed a relic with [R.realProc] effect.", "experimentor")
+ investigate_log("Experimentor has revealed a relic with [R.realProc] effect.", INVESTIGATE_EXPERIMENTOR)
ejectItem()
//Global reactions
@@ -476,32 +476,32 @@
if(trackedIan)
throwSmoke(trackedIan.loc)
trackedIan.loc = src.loc
- investigate_log("Experimentor has stolen Ian!", "experimentor") //...if anyone ever fixes it...
+ investigate_log("Experimentor has stolen Ian!", INVESTIGATE_EXPERIMENTOR) //...if anyone ever fixes it...
else
new /mob/living/simple_animal/pet/dog/corgi(src.loc)
- investigate_log("Experimentor has spawned a new corgi.", "experimentor")
+ investigate_log("Experimentor has spawned a new corgi.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 50)
visible_message("Experimentor draws the life essence of those nearby!")
for(var/mob/living/m in view(4,src))
to_chat(m, "You feel your flesh being torn from you, mists of blood drifting to [src]!")
m.apply_damage(50, BRUTE, "chest")
- investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor")
+ investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", INVESTIGATE_EXPERIMENTOR)
if(globalMalf > 51 && globalMalf < 75)
visible_message("[src] encounters a run-time error!")
throwSmoke(src.loc)
if(trackedRuntime)
throwSmoke(trackedRuntime.loc)
trackedRuntime.loc = src.loc
- investigate_log("Experimentor has stolen Runtime!", "experimentor")
+ investigate_log("Experimentor has stolen Runtime!", INVESTIGATE_EXPERIMENTOR)
else
new /mob/living/simple_animal/pet/cat(src.loc)
- investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", "experimentor")
+ investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
if(globalMalf > 76)
visible_message("[src] begins to smoke and hiss, shaking violently!")
use_power(500000)
- investigate_log("Experimentor has drained power from its APC", "experimentor")
+ investigate_log("Experimentor has drained power from its APC", INVESTIGATE_EXPERIMENTOR)
spawn(resetTime)
icon_state = "h_lathe"
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 31fa13f094..fb4a4b9af3 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -447,7 +447,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
for(var/i = 0, i dockTime)
@@ -140,15 +146,22 @@
var/docked = S1 == assigned_transit
sound_played = FALSE
if(docked) //about to launch
- if(!force_depart && PersonCheck())
- mode = SHUTTLE_IDLE
- if(console)
- console.say("Launch cancelled, lifeform dectected on board.")
- return
+ if(!force_depart)
+ var/cancel_reason
+ if(PersonCheck())
+ cancel_reason = "lifeform dectected on board"
+ else if(NukeDiskCheck())
+ cancel_reason = "critical station device detected on board"
+ if(cancel_reason)
+ mode = SHUTTLE_IDLE
+ if(console)
+ console.say("Launch cancelled, [cancel_reason].")
+ return
force_depart = FALSE
. = ..()
if(!. && !docked && !damaged)
- console.say("Welcome to your new life, employees!")
+ if(console)
+ console.say("Welcome to your new life, employees!")
for(var/L in queued_announces)
var/datum/callback/C = L
C.Invoke()
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 82d5db8b20..60b37236c1 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -92,12 +92,12 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
SO.generate(pick_n_take(empty_turfs))
SSblackbox.add_details("cargo_imports",
"[SO.pack.type]|[SO.pack.name]|[SO.pack.cost]")
- investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]) has shipped.", "cargo")
+ investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]) has shipped.", INVESTIGATE_CARGO)
if(SO.pack.dangerous)
message_admins("\A [SO.pack.name] ordered by [key_name_admin(SO.orderer_ckey)] has shipped.")
purchases++
- investigate_log("[purchases] orders in this shipment, worth [value] credits. [SSshuttle.points] credits left.", "cargo")
+ investigate_log("[purchases] orders in this shipment, worth [value] credits. [SSshuttle.points] credits left.", INVESTIGATE_CARGO)
/obj/docking_port/mobile/supply/proc/sell()
var/presale_points = SSshuttle.points
@@ -127,4 +127,4 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
E.export_end()
SSshuttle.centcom_message = msg
- investigate_log("Shuttle contents sold for [SSshuttle.points - presale_points] credits. Contents: [sold_atoms || "none."] Message: [SSshuttle.centcom_message || "none."]", "cargo")
+ investigate_log("Shuttle contents sold for [SSshuttle.points - presale_points] credits. Contents: [sold_atoms || "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO)
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index d47a5b268c..f022e0338f 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -203,7 +203,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
charge_counter-- //returns the charge if the targets selecting fails
if("holdervar")
adjust_var(user, holder_var_type, holder_var_amount)
-
+ if(action)
+ action.UpdateButtonIcon()
return 1
/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount
@@ -249,16 +250,13 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
return TRUE
/obj/effect/proc_holder/spell/proc/start_recharge()
- if(action)
- action.UpdateButtonIcon()
recharging = TRUE
- if(action)
- action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/process()
if(recharging && charge_type == "recharge" && (charge_counter < charge_max))
charge_counter += 2 //processes 5 times per second instead of 10.
if(charge_counter >= charge_max)
+ action.UpdateButtonIcon()
charge_counter = charge_max
recharging = FALSE
@@ -276,6 +274,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
else
cast(targets,user=user)
after_cast(targets)
+ if(action)
+ action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/before_cast(list/targets)
if(overlay)
@@ -332,6 +332,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
charge_counter++
if("holdervar")
adjust_var(user, holder_var_type, -holder_var_amount)
+ if(action)
+ action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types
if (!istype(target))
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 585f452de4..089d8be105 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -294,10 +294,11 @@
/obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special)
//Transfer some head appearance vars over
if(brain)
- brainmob.container = null //Reset brainmob head var.
- brainmob.loc = brain //Throw mob into brain.
- brain.brainmob = brainmob //Set the brain to use the brainmob
- brainmob = null //Set head brainmob var to null
+ if(brainmob)
+ brainmob.container = null //Reset brainmob head var.
+ brainmob.loc = brain //Throw mob into brain.
+ brain.brainmob = brainmob //Set the brain to use the brainmob
+ brainmob = null //Set head brainmob var to null
brain.Insert(C) //Now insert the brain proper
brain = null //No more brain in the head
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 667742afc4..f603612bbf 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -725,16 +725,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
item = /obj/item/weapon/grenade/clusterbuster/soap
cost = 6
-/datum/uplink_item/stealthy_weapons/door_charge
- name = "Explosive Airlock Charge"
- desc = "A small, easily concealable device. It can be applied to an open airlock panel, booby-trapping it. \
- The next person to use that airlock will trigger an explosion, knocking them down and destroying \
- the airlock maintenance panel."
- item = /obj/item/device/doorCharge
- cost = 2
- surplus = 10
- exclude_modes = list(/datum/game_mode/nuclear)
-
// Stealth Items
/datum/uplink_item/stealthy_tools
category = "Stealth and Camouflage Items"
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index 7cd2839b4b..d67e769ea3 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -35,6 +35,7 @@
icon_state = "speedwagon"
layer = LYING_MOB_LAYER
overlay_state = "speedwagon_cover"
+ max_buckled_mobs = 4
var/crash_all = FALSE //CHAOS
pixel_y = -48 //to fix the offset when Initialized()
pixel_x = -48
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index 3515da0dc6..c93699a2ac 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -70,8 +70,10 @@
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
+ if(!owner.revive(full_heal = TRUE))
+ return
+
owner.grab_ghost()
- owner.revive(full_heal = TRUE)
owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!")
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
owner.do_jitter_animation(living_transformation_time * 10)
diff --git a/code/world.dm b/code/world.dm
index 566c9e213c..df083571c4 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -18,7 +18,7 @@
SetupExternalRSC()
- GLOB.config_error_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
+ 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)
diff --git a/html/changelogs/AutoChangeLog-pr-1104.yml b/html/changelogs/AutoChangeLog-pr-1104.yml
new file mode 100644
index 0000000000..caffe5a257
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1104.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - spellcheck: "Fixed very minor inconsistencies on items & punctuation on items."
diff --git a/html/changelogs/AutoChangeLog-pr-1110.yml b/html/changelogs/AutoChangeLog-pr-1110.yml
new file mode 100644
index 0000000000..ba60502d77
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1110.yml
@@ -0,0 +1,8 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - rscadd: "Added a sexy new icon for the harvester's AOE conversion spell"
+ - bugfix: "Fixed construct's forcewall being invisible"
+ - bugfix: "Fixed cult constructs \"Locate Master\" and \"Locate Prey\" not functioning"
+ - bugfix: "Fixed spell action buttons not showing their actual availability status"
+ - tweak: "Changed the duration of a few frames for the new Cult ending"
diff --git a/html/changelogs/AutoChangeLog-pr-1141.yml b/html/changelogs/AutoChangeLog-pr-1141.yml
new file mode 100644
index 0000000000..2b8841490d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1141.yml
@@ -0,0 +1,4 @@
+author: "Tacolizard"
+delete-after: True
+changes:
+ - tweak: "Station based armour is slightly more descriptive of what it does."
diff --git a/html/changelogs/AutoChangeLog-pr-1142.yml b/html/changelogs/AutoChangeLog-pr-1142.yml
new file mode 100644
index 0000000000..99b15ea5b2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1142.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "ERT Sec Tactical Energy Guns now have a unique sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-1143.yml b/html/changelogs/AutoChangeLog-pr-1143.yml
new file mode 100644
index 0000000000..7eda0316fd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1143.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Sketchin alternative magazines (Armour Piercing, Hollow Point, Incendiary) now have unique sprites to better identify them."
diff --git a/html/changelogs/AutoChangeLog-pr-1144.yml b/html/changelogs/AutoChangeLog-pr-1144.yml
new file mode 100644
index 0000000000..8dc8d42475
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1144.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "Inserted legion cores no longer work if they went inert before implanting"
diff --git a/html/changelogs/AutoChangeLog-pr-1146.yml b/html/changelogs/AutoChangeLog-pr-1146.yml
new file mode 100644
index 0000000000..c7b4db56f6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1146.yml
@@ -0,0 +1,4 @@
+author: "That Really Good Soda Flavor"
+delete-after: True
+changes:
+ - tweak: "Changed spray tan overdoses to be more realistic."
diff --git a/html/changelogs/AutoChangeLog-pr-1147.yml b/html/changelogs/AutoChangeLog-pr-1147.yml
new file mode 100644
index 0000000000..6c524da4aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1147.yml
@@ -0,0 +1,5 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - rscadd: "Hairless hides now become wet when exposed to water"
+ - rscadd: "You can microwave wet leather to dry it"
diff --git a/html/changelogs/AutoChangeLog-pr-1149.yml b/html/changelogs/AutoChangeLog-pr-1149.yml
new file mode 100644
index 0000000000..4a5c010dd4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1149.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Boxstation armoury weapon racks now have glass panes to help prevent the weapons easily flying out of a breached hull."
diff --git a/html/changelogs/AutoChangeLog-pr-1150.yml b/html/changelogs/AutoChangeLog-pr-1150.yml
new file mode 100644
index 0000000000..7bc3eb78a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1150.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Many Ballistic weapons now have new sounds related to reloading or placing bullets into magazines."
diff --git a/html/changelogs/AutoChangeLog-pr-1152.yml b/html/changelogs/AutoChangeLog-pr-1152.yml
new file mode 100644
index 0000000000..813a4a931a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1152.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - tweak: "Changes to production of Nanotrasen Auto Rifle armour piercing bullets have now made AP bullets better able to penetrate armour, but at the cost of the amount of possible damage the bullet can do to soft targets."
diff --git a/html/changelogs/AutoChangeLog-pr-1156.yml b/html/changelogs/AutoChangeLog-pr-1156.yml
new file mode 100644
index 0000000000..eda11511f8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1156.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - bugfix: "Fixed Battleship Raven's bridge blast doors not working."
diff --git a/html/changelogs/AutoChangeLog-pr-1158.yml b/html/changelogs/AutoChangeLog-pr-1158.yml
new file mode 100644
index 0000000000..0cb4ddd10d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1158.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "ERT, non-red alert, Security Response Officers spawn with a Tactical Energy Gun. This is a military variant of the Egun that, in addition to laser and disable rounds, has access to stun rounds."
diff --git a/html/changelogs/AutoChangeLog-pr-1171.yml b/html/changelogs/AutoChangeLog-pr-1171.yml
new file mode 100644
index 0000000000..e0c0601fd6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1171.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "crushers now apply marks properly"
diff --git a/html/changelogs/AutoChangeLog-pr-1178.yml b/html/changelogs/AutoChangeLog-pr-1178.yml
new file mode 100644
index 0000000000..2fdc37039e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1178.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Indestructible objects can no longer be destroyed by bombs"
diff --git a/html/changelogs/AutoChangeLog-pr-1182.yml b/html/changelogs/AutoChangeLog-pr-1182.yml
new file mode 100644
index 0000000000..a2c7d10876
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1182.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - spellcheck: "typo fix for origin tech"
diff --git a/html/changelogs/AutoChangeLog-pr-1183.yml b/html/changelogs/AutoChangeLog-pr-1183.yml
new file mode 100644
index 0000000000..4a627f949b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1183.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "20% of internal affairs agents are actually traitors"
diff --git a/html/changelogs/AutoChangeLog-pr-1186.yml b/html/changelogs/AutoChangeLog-pr-1186.yml
new file mode 100644
index 0000000000..205bc61c7a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1186.yml
@@ -0,0 +1,4 @@
+author: "4dplanner, robustin"
+delete-after: True
+changes:
+ - bugfix: "c4 has always taken 3 seconds to plant, and you are not allow to believe otherwise"
diff --git a/html/changelogs/AutoChangeLog-pr-1191.yml b/html/changelogs/AutoChangeLog-pr-1191.yml
new file mode 100644
index 0000000000..9e1d3c3eaa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1191.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "You can now add bayonets to kinetic accelerators. However, only combat knives and survival knives can be added. Harm intent attacking things will cause you to attack that thing with the bayonet instead!"
diff --git a/html/changelogs/AutoChangeLog-pr-1195.yml b/html/changelogs/AutoChangeLog-pr-1195.yml
new file mode 100644
index 0000000000..0a5716bcb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1195.yml
@@ -0,0 +1,6 @@
+author: "Moonlighting Mac says"
+delete-after: True
+changes:
+ - rscadd: "You can now craft a strong cloak with a hood made out of goliath and monster materials from within the primitive crafting screen."
+ - rscadd: "The cloak has a suit slot for all kind of primitive supplies, however it cannot carry most electronic miner equipment.
+balance: Due to the recipe requiring leather, it is not normally accessible to all ghost roles without a source of water & electricity."
diff --git a/html/changelogs/AutoChangeLog-pr-1210.yml b/html/changelogs/AutoChangeLog-pr-1210.yml
new file mode 100644
index 0000000000..4dd2b1de7d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1210.yml
@@ -0,0 +1,4 @@
+author: "Kor"
+delete-after: True
+changes:
+ - bugfix: "The chaplains possessed blade, shades, and constructs, can once again speak galactic common."
diff --git a/html/changelogs/AutoChangeLog-pr-1220.yml b/html/changelogs/AutoChangeLog-pr-1220.yml
new file mode 100644
index 0000000000..a9590654e2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1220.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Nanotrasen's new titanium wall blueprints are smooth enough that it can reflect projectiles!"
diff --git a/html/changelogs/AutoChangeLog-pr-1228.yml b/html/changelogs/AutoChangeLog-pr-1228.yml
new file mode 100644
index 0000000000..1b9058a75c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1228.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - bugfix: "Necropolis tendrils will once again emit light."
diff --git a/html/changelogs/AutoChangeLog-pr-1231.yml b/html/changelogs/AutoChangeLog-pr-1231.yml
new file mode 100644
index 0000000000..7fad1ab274
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1231.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "E-Cigarettes can now fit in your pocket."
diff --git a/html/changelogs/AutoChangeLog-pr-1232.yml b/html/changelogs/AutoChangeLog-pr-1232.yml
new file mode 100644
index 0000000000..97344d4418
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1232.yml
@@ -0,0 +1,4 @@
+author: "Iamgoofball"
+delete-after: True
+changes:
+ - bugfix: "After the Syndicate realized their top chemist was both mixing a stamina destroying drug with a stimulant to avoid slowdowns entirely in their sleepypens, they fired him and replaced him with a new chemist."
diff --git a/html/changelogs/AutoChangeLog-pr-1238.yml b/html/changelogs/AutoChangeLog-pr-1238.yml
new file mode 100644
index 0000000000..f2e48eb64f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1238.yml
@@ -0,0 +1,5 @@
+author: "cacogen"
+delete-after: True
+changes:
+ - rscadd: "You can now rename dog beds by buckling a new owner to them"
+ - rscadd: "Dogs that spawn in an area with a vacant bed will take possession of and rename the bed"
diff --git a/html/changelogs/AutoChangeLog-pr-1242.yml b/html/changelogs/AutoChangeLog-pr-1242.yml
new file mode 100644
index 0000000000..a50edc4efb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1242.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "Bayonets can now be used for butchery"
diff --git a/html/changelogs/AutoChangeLog-pr-1255.yml b/html/changelogs/AutoChangeLog-pr-1255.yml
new file mode 100644
index 0000000000..fdd7e8ac0f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1255.yml
@@ -0,0 +1,5 @@
+author: "cacogen"
+delete-after: True
+changes:
+ - rscadd: "Adds AI follow links to holopad speech and PDA messages. Note that PDA messages point to the owner of the PDA and not the PDA's actual location."
+ - bugfix: "Fixes PDA icon not showing up beside received messages for AIs"
diff --git a/html/changelogs/AutoChangeLog-pr-1264.yml b/html/changelogs/AutoChangeLog-pr-1264.yml
new file mode 100644
index 0000000000..774cea31f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1264.yml
@@ -0,0 +1,5 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - tweak: "Cloning pods which are interrupted by a emagging will now produce a slightly lumpier smoothie"
+ - bugfix: "Cloning pods that have stopped cloning early can no longer be broken open to extract leftover parts"
diff --git a/html/changelogs/AutoChangeLog-pr-1268.yml b/html/changelogs/AutoChangeLog-pr-1268.yml
new file mode 100644
index 0000000000..1ed2a4fcb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1268.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "Crew monitoring consoles once again have minimaps while you're on the station level"
diff --git a/html/changelogs/AutoChangeLog-pr-1273.yml b/html/changelogs/AutoChangeLog-pr-1273.yml
new file mode 100644
index 0000000000..27ad107949
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1273.yml
@@ -0,0 +1,4 @@
+author: "Swindly"
+delete-after: True
+changes:
+ - bugfix: "fixed not being able to attach heads without brainmobs in them"
diff --git a/icons/effects/station_explosion.dmi b/icons/effects/station_explosion.dmi
index bddc66e137..385818b011 100644
Binary files a/icons/effects/station_explosion.dmi and b/icons/effects/station_explosion.dmi differ
diff --git a/icons/minimaps/Box Station_1.png b/icons/minimaps/Box Station_2.png
similarity index 100%
rename from icons/minimaps/Box Station_1.png
rename to icons/minimaps/Box Station_2.png
diff --git a/icons/minimaps/CereStation_1.png b/icons/minimaps/CereStation_2.png
similarity index 100%
rename from icons/minimaps/CereStation_1.png
rename to icons/minimaps/CereStation_2.png
diff --git a/icons/minimaps/Delta Station_1.png b/icons/minimaps/Delta Station_2.png
similarity index 100%
rename from icons/minimaps/Delta Station_1.png
rename to icons/minimaps/Delta Station_2.png
diff --git a/icons/minimaps/MetaStation_1.png b/icons/minimaps/MetaStation_2.png
similarity index 100%
rename from icons/minimaps/MetaStation_1.png
rename to icons/minimaps/MetaStation_2.png
diff --git a/icons/minimaps/OmegaStation_1.png b/icons/minimaps/OmegaStation_2.png
similarity index 100%
rename from icons/minimaps/OmegaStation_1.png
rename to icons/minimaps/OmegaStation_2.png
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 7f6f85b004..c8fc98d4f5 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 9d63c276bc..86e720a421 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 417e97f770..4661fdc260 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index b65da989b3..b2e489b37d 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 33149a3e2e..24323f5cf3 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/cit_hats.dmi b/icons/obj/clothing/cit_hats.dmi
index 25a03dc97e..2f2b877eff 100644
Binary files a/icons/obj/clothing/cit_hats.dmi and b/icons/obj/clothing/cit_hats.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 6b0dd135f6..520ed276b8 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 27e02e2e7c..3a59c48c2e 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi
new file mode 100644
index 0000000000..176005b7d7
Binary files /dev/null and b/icons/obj/guns/bayonets.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 71b1474a66..d8c4010aef 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/flashlights.dmi b/icons/obj/guns/flashlights.dmi
new file mode 100644
index 0000000000..a651cea313
Binary files /dev/null and b/icons/obj/guns/flashlights.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 611a27e6a7..dd6146d7fb 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/sound/weapons/autoguninsert.ogg b/sound/weapons/autoguninsert.ogg
new file mode 100644
index 0000000000..f68139968e
Binary files /dev/null and b/sound/weapons/autoguninsert.ogg differ
diff --git a/sound/weapons/bulletinsert.ogg b/sound/weapons/bulletinsert.ogg
new file mode 100644
index 0000000000..789ee15b08
Binary files /dev/null and b/sound/weapons/bulletinsert.ogg differ
diff --git a/sound/weapons/bulletremove.ogg b/sound/weapons/bulletremove.ogg
new file mode 100644
index 0000000000..4d1ec70973
Binary files /dev/null and b/sound/weapons/bulletremove.ogg differ
diff --git a/sound/weapons/magin.ogg b/sound/weapons/magin.ogg
new file mode 100644
index 0000000000..8908bb2f4f
Binary files /dev/null and b/sound/weapons/magin.ogg differ
diff --git a/sound/weapons/magout.ogg b/sound/weapons/magout.ogg
new file mode 100644
index 0000000000..ca91915bd4
Binary files /dev/null and b/sound/weapons/magout.ogg differ
diff --git a/sound/weapons/sawclose.ogg b/sound/weapons/sawclose.ogg
new file mode 100644
index 0000000000..f33a06059f
Binary files /dev/null and b/sound/weapons/sawclose.ogg differ
diff --git a/sound/weapons/sawopen.ogg b/sound/weapons/sawopen.ogg
new file mode 100644
index 0000000000..c6da68e323
Binary files /dev/null and b/sound/weapons/sawopen.ogg differ
diff --git a/sound/weapons/shotguninsert.ogg b/sound/weapons/shotguninsert.ogg
new file mode 100644
index 0000000000..189324493c
Binary files /dev/null and b/sound/weapons/shotguninsert.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 2d2e35f59e..53723583d2 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -43,6 +43,7 @@
#include "code\__DEFINES\language.dm"
#include "code\__DEFINES\layers.dm"
#include "code\__DEFINES\lighting.dm"
+#include "code\__DEFINES\logging.dm"
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\maps.dm"
#include "code\__DEFINES\math.dm"
@@ -1193,7 +1194,6 @@
#include "code\modules\clothing\gloves\miscellaneous.dm"
#include "code\modules\clothing\gloves\vg_gloves.dm"
#include "code\modules\clothing\head\beanie.dm"
-#include "code\modules\clothing\head\cit_hats.dm"
#include "code\modules\clothing\head\collectable.dm"
#include "code\modules\clothing\head\hardhat.dm"
#include "code\modules\clothing\head\helmet.dm"
@@ -1472,7 +1472,6 @@
#include "code\modules\mining\abandoned_crates.dm"
#include "code\modules\mining\aux_base.dm"
#include "code\modules\mining\aux_base_camera.dm"
-#include "code\modules\mining\equipment.dm"
#include "code\modules\mining\fulton.dm"
#include "code\modules\mining\machine_input_output_plates.dm"
#include "code\modules\mining\machine_processing.dm"
@@ -1487,6 +1486,13 @@
#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
+#include "code\modules\mining\equipment\explorer_gear.dm"
+#include "code\modules\mining\equipment\kinetic_crusher.dm"
+#include "code\modules\mining\equipment\lazarus_injector.dm"
+#include "code\modules\mining\equipment\mineral_scanner.dm"
+#include "code\modules\mining\equipment\resonator.dm"
+#include "code\modules\mining\equipment\vendor_items.dm"
+#include "code\modules\mining\equipment\wormhole_jaunter.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"
diff --git a/tools/mapmerge/map_helpers.py b/tools/mapmerge/map_helpers.py
index 2e96e7e7e2..ea06641f50 100644
--- a/tools/mapmerge/map_helpers.py
+++ b/tools/mapmerge/map_helpers.py
@@ -125,7 +125,7 @@ def merge_map(newfile, backupfile, tgm):
#######################
#write to file helpers#
def write_dictionary_tgm(filename, dictionary, header = None): #write dictionary in tgm format
- with open(filename, "w") as output:
+ with open(filename, "w", newline='\n') as output:
output.write("{}\n".format(tgm_header))
if header:
output.write("{}\n".format(header))
@@ -172,7 +172,7 @@ def write_dictionary_tgm(filename, dictionary, header = None): #write dictionary
def write_grid_coord_small(filename, grid, maxx, maxy): #thanks to YotaXP for finding out about this one
- with open(filename, "a") as output:
+ with open(filename, "a", newline='\n') as output:
output.write("\n")
for x in range(1, maxx+1):
@@ -183,7 +183,7 @@ def write_grid_coord_small(filename, grid, maxx, maxy): #thanks to YotaXP for fi
def write_dictionary(filename, dictionary, header = None): #writes a tile dictionary the same way Dreammaker does
- with open(filename, "w") as output:
+ with open(filename, "w", newline='\n') as output:
for key, value in dictionary.items():
if header:
output.write("{}\n".format(header))
@@ -191,7 +191,7 @@ def write_dictionary(filename, dictionary, header = None): #writes a tile dictio
def write_grid(filename, grid, maxx, maxy): #writes a map grid the same way Dreammaker does
- with open(filename, "a") as output:
+ with open(filename, "a", newline='\n') as output:
output.write("\n")
output.write("(1,1,1) = {\"\n")
diff --git a/tools/mapmerge/old_java_mapmerge/MapMerge.jar b/tools/mapmerge/old_java_mapmerge/MapMerge.jar
deleted file mode 100644
index d0f0ce0802..0000000000
Binary files a/tools/mapmerge/old_java_mapmerge/MapMerge.jar and /dev/null differ
diff --git a/tools/mapmerge/old_java_mapmerge/Run Map Merge.bat b/tools/mapmerge/old_java_mapmerge/Run Map Merge.bat
deleted file mode 100644
index 5bb8f1736b..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Run Map Merge.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-@echo off
-call java -jar MapMerge.jar "../../_maps/" /wait
-
-pause
\ No newline at end of file
diff --git a/tools/mapmerge/old_java_mapmerge/Source/.classpath b/tools/mapmerge/old_java_mapmerge/Source/.classpath
deleted file mode 100644
index 8a11d5b17e..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/tools/mapmerge/old_java_mapmerge/Source/.project b/tools/mapmerge/old_java_mapmerge/Source/.project
deleted file mode 100644
index df472fbdf1..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- MapMerger
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
-
-
diff --git a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs b/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3a21537071..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,11 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs b/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index ea0a123b8b..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,60 +0,0 @@
-cleanup.add_default_serial_version_id=false
-cleanup.add_generated_serial_version_id=true
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_missing_override_annotations_interface_methods=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=true
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_functional_interfaces=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=true
-cleanup.format_source_code=true
-cleanup.format_source_code_changes_only=false
-cleanup.insert_inferred_type_arguments=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_type_abstract_if_missing_method=false
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=false
-cleanup.organize_imports=true
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=true
-cleanup.remove_private_constructors=true
-cleanup.remove_redundant_type_arguments=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=true
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=true
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_anonymous_class_creation=false
-cleanup.use_blocks=true
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_lambda=true
-cleanup.use_parentheses_in_expressions=true
-cleanup.use_this_for_non_static_field_access=true
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=true
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup.use_type_arguments=false
-cleanup_profile=_Default
-cleanup_settings_version=2
-eclipse.preferences.version=1
diff --git a/tools/mapmerge/old_java_mapmerge/Source/bin/FileFinder.class b/tools/mapmerge/old_java_mapmerge/Source/bin/FileFinder.class
deleted file mode 100644
index ab01a656c4..0000000000
Binary files a/tools/mapmerge/old_java_mapmerge/Source/bin/FileFinder.class and /dev/null differ
diff --git a/tools/mapmerge/old_java_mapmerge/Source/bin/MapMerge.class b/tools/mapmerge/old_java_mapmerge/Source/bin/MapMerge.class
deleted file mode 100644
index dff913a6b9..0000000000
Binary files a/tools/mapmerge/old_java_mapmerge/Source/bin/MapMerge.class and /dev/null differ
diff --git a/tools/mapmerge/old_java_mapmerge/Source/bin/MapPatcher.jar b/tools/mapmerge/old_java_mapmerge/Source/bin/MapPatcher.jar
deleted file mode 100644
index 5cbaad488c..0000000000
Binary files a/tools/mapmerge/old_java_mapmerge/Source/bin/MapPatcher.jar and /dev/null differ
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/FileFinder.java b/tools/mapmerge/old_java_mapmerge/Source/src/FileFinder.java
deleted file mode 100644
index 0677b77784..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/src/FileFinder.java
+++ /dev/null
@@ -1,25 +0,0 @@
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-
-public class FileFinder extends SimpleFileVisitor {
- private PathMatcher matcher;
- public ArrayList foundPaths = new ArrayList<>();
- public FileFinder(String pattern) {
- matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
- }
-
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
- Path name = file.getFileName();
- if (matcher.matches(name)) {
- foundPaths.add(file);
- }
- return FileVisitResult.CONTINUE;
- }
-}
\ No newline at end of file
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java
deleted file mode 100644
index 552a406b13..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java
+++ /dev/null
@@ -1,108 +0,0 @@
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Scanner;
-
-public class MapMerge {
-
- private static Scanner input = new Scanner(System.in);
- private static Path pathToMaps;
-
- public static void main(String[] mapPath) throws IOException {
- pathToMaps = Paths.get(mapPath[0]);
- FileFinder dmmFinder = new FileFinder("*.dmm");
- Files.walkFileTree(pathToMaps, dmmFinder);
- ArrayList foundFiles = dmmFinder.foundPaths;
- if (foundFiles.size() > 0) {
- try {
- MapMerge.merge(foundFiles);
- } catch (Exception e) {
- System.out.println("Something went wrong.");
- e.printStackTrace();
- }
- } else {
- System.out.println("No files were found in provided directory!");
- System.out.print("Path to maps folder: ");
- pathToMaps = Paths.get(input.nextLine());
- dmmFinder = new FileFinder("*.dmm");
- Files.walkFileTree(pathToMaps, dmmFinder);
- foundFiles = dmmFinder.foundPaths;
- try {
- MapMerge.merge(foundFiles);
- } catch (Exception e) {
- System.out.println("Something went wrong.");
- e.printStackTrace();
- }
- }
- }
-
- public static void merge(ArrayList foundFiles) throws IOException {
-
- System.out.println("How many files do you want to merge?");
- int selection1;
- inputCheck: while (true) {
- while (!input.hasNextInt()) {
- String temp = input.next();
- System.out.println(temp + " is not a valid int.");
- }
- selection1 = input.nextInt();
- if (selection1 < 0) {
- System.out.println("Use a number greater than 0!");
- continue inputCheck;
- } else {
- break inputCheck;
- }
- }
-
- for (int numOfFiles = selection1; numOfFiles != 0; numOfFiles--) {
-
- for (int num = 0; num < foundFiles.size(); num++) {
- System.out.println(num + ": " + foundFiles.get(num));
- }
-
- System.out.print("File to use: ");
- int selection2;
- inputCheck: while (true) {
- while (!input.hasNextInt()) {
- String temp = input.next();
- System.out.println(temp + " is not a valid int.");
- }
- selection2 = input.nextInt();
- if ((selection2 < 0) || (selection2 >= foundFiles.size())) {
- if (selection2 < 0) {
- System.out.println("Use a number greater than 0!");
- } else {
- System.out.println("Use a number less than " + foundFiles.size() + "!");
- }
- continue inputCheck;
- } else {
- break inputCheck;
- }
- }
-
- String selected_map = foundFiles.get(selection2) + "";
- String backup_map = selected_map + ".backup";
- String edited_map = selected_map;
- String to_save = selected_map;
- String[] passInto = { "-clean", backup_map, edited_map, to_save };
- MapPatcher.main(passInto);
-
- // Will try to fix when I have time ~CorruptComputer
- /*try{
- Process process = new ProcessBuilder("dmm2tgm\\dmm2tgm.exe", selected_map).start();
- }catch(Exception e1){
- System.out.println("You are not on a windows machine, trying the .py");
- try{
- Process process = new ProcessBuilder("dmm2tgm\\Source\\dmm2tgm.py", selected_map).start();
- }catch(Exception e2){
- System.out.println("You do not have python 2.7.x installed.");
- System.out.println("Downloads can be found here: https://www.python.org/downloads/");
- }
- }
- */
-
- }
- }
-}
\ No newline at end of file
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java
deleted file mode 100644
index 2a901d54b2..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java
+++ /dev/null
@@ -1,42 +0,0 @@
-class Location
-{
- int x;
- int y;
- int z;
-
- public Location()
- {
- }
-
- public Location(int paramInt1, int paramInt2, int paramInt3)
- {
- this.x = paramInt1;
- this.y = paramInt2;
- this.z = paramInt3;
- }
-
- public void set(int paramInt1, int paramInt2, int paramInt3)
- {
- this.x = paramInt1;
- this.y = paramInt2;
- this.z = paramInt3;
- }
-
- public boolean equals(Object paramObject)
- {
- if (!(paramObject instanceof Location)) return false;
- Location localLocation = (Location)paramObject;
- if ((this.x != localLocation.x) || (this.y != localLocation.y) || (this.z != localLocation.z)) return false;
- return true;
- }
-
- public int hashCode()
- {
- return (this.z * 256 + this.y) * 256 + this.x;
- }
-
- public String toString()
- {
- return "(" + this.x + "," + this.y + "," + this.z + ")";
- }
-}
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java
deleted file mode 100644
index 949db7e6ca..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java
+++ /dev/null
@@ -1,314 +0,0 @@
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.Vector;
-
-public class Map
-{
- boolean sizeunknown;
- int minx;
- int miny;
- int minz;
- int maxx;
- int maxy;
- int maxz;
- HashMap tile_types;
- HashMap codes_by_value;
- HashMap tiles;
-
- public Map()
- {
- this.sizeunknown = true;
- this.tile_types = new HashMap();
- this.codes_by_value = new HashMap();
- this.tiles = new HashMap();
- }
-
- public Map(File paramFile)
- {
- this(paramFile, false);
- }
-
- public Map(File paramFile, boolean paramBoolean)
- {
- this.sizeunknown = true;
- try {
- BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramFile)));
-
- this.tile_types = new HashMap();
- this.codes_by_value = new HashMap();
- this.tiles = new HashMap();
-
- MapPatcher.Systemoutprintln(new StringBuilder().append("Loading map ").append(paramFile.getName()).toString());
- MapPatcher.Systemoutprint("Loading tiles");
- String str1 = "";
- int i = 0;
- while ((str1 = localBufferedReader.readLine()) != null)
- {
- if (str1.equals("")) break;
- if (str1.startsWith("\""))
- {
- if (i < 1)
- {
- int j = str1.indexOf("\"", 1);
- i = j - 1;
- }
- String str2 = str1.substring(1, 1 + i);
- String str3 = str1.substring(str1.indexOf("("));
- this.tile_types.put(str2, str3);
- this.codes_by_value.put(str3, str2);
- }
- }
-
- MapPatcher.Systemoutprintln(new StringBuilder().append(" ").append(this.tile_types.size()).toString());
- if (!paramBoolean)
- {
- MapPatcher.Systemoutprintln("Loading levels");
- while (true)
- {
- if ((str1 = localBufferedReader.readLine()) != null) { if (str1.startsWith("(")) break label270; } else {
- label270: if (str1 == null)
- {
- break;
- }
- int k = str1.indexOf(",", 1);
- int m = Integer.parseInt(str1.substring(1, k));
- str1 = str1.substring(k);
- k = str1.indexOf(",", 1);
- int n = Integer.parseInt(str1.substring(1, k));
- str1 = str1.substring(k);
- k = str1.indexOf(")", 1);
- int i1 = Integer.parseInt(str1.substring(1, k));
-
- MapPatcher.Systemoutprintln(new StringBuilder().append("New map part from (").append(m).append(",").append(n).append(",").append(i1).append(")").toString());
-
- int i3 = n;
- if (this.sizeunknown)
- {
- this.minx = m; this.maxx = this.minx;
- this.miny = n; this.maxy = this.miny;
- this.minz = i1; this.maxz = this.minz;
- this.sizeunknown = false;
- }
- if (this.minz > i1) this.minz = i1;
- if (this.maxz < i1) this.maxz = i1;
- while (!(str1 = localBufferedReader.readLine()).startsWith("\"}"))
- {
- int i2 = m;
- if (this.miny > i3) this.miny = i3;
- if (this.maxy < i3) this.maxy = i3;
- while (str1.length() > 0)
- {
- String str4 = str1.substring(0, i);
- Location localLocation = new Location(i2, i3, i1);
- if (this.minx > i2) this.minx = i2;
- if (this.maxx < i2) this.maxx = i2;
- this.tiles.put(localLocation, this.tile_types.get(str4));
- str1 = str1.substring(i);
- i2++;
- }
- i3++;
- }
- }
- }
- }
- localBufferedReader.close();
- }
- catch (Exception localException)
- {
- localException.printStackTrace();
- }
- }
-
- public void mirrorY()
- {
- for (int i = this.minz; i <= this.maxz; i++)
- for (int j = this.minx; j <= this.maxx; j++)
- for (int k = this.miny; k < (this.miny + this.maxy) / 2; k++)
- {
- int m = this.maxy - (k - this.miny);
- String str = contentAt2(j, k, i);
- setAt(j, k, i, contentAt2(j, m, i));
- setAt(j, m, i, str);
- }
- }
-
- public String contentAt(int paramInt1, int paramInt2, int paramInt3)
- {
- Location localLocation = new Location(paramInt1, paramInt2, paramInt3);
- String str = (String)this.tiles.get(localLocation);
- if (str == null) System.err.println(new StringBuilder().append("Null at ").append(paramInt1).append(",").append(paramInt2).append(",").append(paramInt3).append(" Possible loading error").toString());
- return str == null ? "null" : str;
- }
-
- public String contentAt2(int paramInt1, int paramInt2, int paramInt3)
- {
- Location localLocation = new Location(paramInt1, paramInt2, paramInt3);
- return (String)this.tiles.get(localLocation);
- }
-
- public void setAt(int paramInt1, int paramInt2, int paramInt3, String paramString)
- {
- if (this.sizeunknown)
- {
- this.minx = (this.maxx = paramInt1);
- this.miny = (this.maxy = paramInt2);
- this.minz = (this.maxz = paramInt3);
- this.sizeunknown = false;
- }
- else
- {
- this.minx = Math.min(this.minx, paramInt1);
- this.miny = Math.min(this.miny, paramInt2);
- this.minz = Math.min(this.minz, paramInt3);
- this.maxx = Math.max(this.maxx, paramInt1);
- this.maxy = Math.max(this.maxy, paramInt2);
- this.maxz = Math.max(this.maxz, paramInt3);
- }
- Location localLocation = new Location(paramInt1, paramInt2, paramInt3);
- localLocation.set(paramInt1, paramInt2, paramInt3);
- this.tiles.put(localLocation, paramString);
- }
-
- public void save(File paramFile) throws Exception
- {
- saveReferencing(paramFile, null);
- }
-
- public void saveReferencing(File paramFile, Map paramMap) throws Exception
- {
- FileWriter localFileWriter = new FileWriter(paramFile);
-
- this.tile_types.clear();
- this.codes_by_value.clear();
- Vector localVector1 = new Vector();
- for (Object localObject1 = this.tiles.keySet().iterator(); ((Iterator)localObject1).hasNext(); ) { Location localLocation = (Location)((Iterator)localObject1).next();
-
- String str1 = (String)this.tiles.get(localLocation);
- if (!localVector1.contains(str1))
- localVector1.add(str1);
- }
- MapPatcher.Systemoutprintln(new StringBuilder().append("We have ").append(localVector1.size()).append(" different tiles").toString());
- localObject1 = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
-
- int i = 1;
- int j = localObject1.length;
- while (j < localVector1.size())
- {
- j *= localObject1.length;
- i++;
- }
- Vector localVector2;
- if (paramMap == null) {
- localVector2 = localVector1;
- }
- else {
- localVector2 = new Vector();
- for (Iterator localIterator = localVector1.iterator(); localIterator.hasNext(); ) { localObject2 = (String)localIterator.next();
-
- if (paramMap.codes_by_value.containsKey(localObject2))
- {
- localObject3 = paramMap.getIdFor((String)localObject2);
- this.tile_types.put(localObject3, localObject2);
- this.codes_by_value.put(localObject2, localObject3);
- }
- else {
- localVector2.add(localObject2);
- } }
- localVector1.clear();
- }
-
- int k = 0;
- for (Object localObject2 = localVector2.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject3 = (String)((Iterator)localObject2).next();
- do
- {
- str2 = int2code((String[])localObject1, k, i);
- k++;
- }while (this.tile_types.containsKey(str2));
- this.tile_types.put(str2, localObject3);
- this.codes_by_value.put(localObject3, str2);
- }
- String str2;
- localVector2.clear();
-
- k = 0;
- for (int m = 0; m < this.tile_types.size(); m++)
- {
- do
- {
- localObject3 = int2code((String[])localObject1, k, i);
- k++;
- }while (!this.tile_types.containsKey(localObject3));
- str2 = (String)this.tile_types.get(localObject3);
- localFileWriter.write(new StringBuilder().append("\"").append((String)localObject3).append("\" = ").append(str2).append("\r\n").toString());
- }
- localVector2.clear();
-
- localFileWriter.write("\n");
-
- m = 1 + this.maxz - this.minz;
- Object localObject3 = new SavingThread[m];
- int n = (this.maxy - this.miny) * ((this.maxx - this.minx) * i + 2) + 32;
-
- for (k = 0; k < m; k++)
- {
- localObject3[k] = new SavingThread(this.minz + k, this, n);
- localObject3[k].start();
- }
-
- int i1 = 0;
- String str3 = "";
- while (i1 == 0) {
- try {
- Thread.sleep(100L); } catch (Exception localException) {
- }
- i1 = 1;
-
- str3 = "";
- for (k = 0; k < m; k++)
- {
- if (!localObject3[k].done)
- i1 = 0;
- if (str3.length() != 0) str3 = new StringBuilder().append(str3).append(" ").toString();
- str3 = new StringBuilder().append(str3).append(localObject3[k].done ? "Done" : new StringBuilder().append(localObject3[k].progress).append("%").toString()).toString();
- }
- MapPatcher.Systemoutprint(new StringBuilder().append(str3).append("\r").toString());
- }
-
- for (k = 0; k < m; k++) {
- localFileWriter.write(localObject3[k].result.toString());
- }
- localFileWriter.flush();
- localFileWriter.close();
- }
-
- public String getIdFor(String paramString)
- {
- if (this.codes_by_value.containsKey(paramString))
- {
- return (String)this.codes_by_value.get(paramString);
- }
- return "???";
- }
-
- public String int2code(String[] paramArrayOfString, int paramInt1, int paramInt2)
- {
- String str = "";
- while (paramInt1 >= paramArrayOfString.length)
- {
- int i = paramInt1 % paramArrayOfString.length;
- str = new StringBuilder().append(paramArrayOfString[i]).append(str).toString();
- paramInt1 -= i;
- paramInt1 /= paramArrayOfString.length;
- }
- str = new StringBuilder().append(paramArrayOfString[paramInt1]).append(str).toString();
- while (str.length() < paramInt2) str = new StringBuilder().append(paramArrayOfString[0]).append(str).toString();
- return str;
- }
-}
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java
deleted file mode 100644
index c8d50b9b2f..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java
+++ /dev/null
@@ -1,304 +0,0 @@
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.util.Arrays;
-
-public class MapPatcher
-{
- static boolean silent = false;
-
- public static void main(String[] paramArrayOfString)
- {
- String str1 = "usage: [me] -diff [old_map] [new_map] [diff_file]";
- String str2 = "usage: [me] -patch [old_map] [diff_file] [new_map]";
- String str3 = "usage: [me] -pack [unpacked] [packed.dmm]";
- String str4 = "usage: [me] -unpack [packed.dmm] [unpacked]";
- String str5 = "usage: [me] -clean [oldmap.dmm] [newmap.dmm] [cleaned.dmm]";
- String str6 = "usage: [me] -merge [original] [local] [remote] [output]";
-
- for (int i = 0; i < paramArrayOfString.length; i++)
- if (paramArrayOfString[i].equalsIgnoreCase("-silent"))
- {
- silent = true;
- for (; i < paramArrayOfString.length - 1; i++)
- paramArrayOfString[i] = paramArrayOfString[(i + 1)];
- paramArrayOfString = (String[])Arrays.copyOf(paramArrayOfString, paramArrayOfString.length - 1);
- break;
- }
- Object localObject;
- int i2;
- int i3;
- int i5;
- if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-merge")))
- {
- if (paramArrayOfString.length < 5)
- {
- System.out.println(str6);
- try { System.in.read(); } catch (Exception localException1) {
- }return;
- }
-
- Map localMap1 = new Map(new File(paramArrayOfString[1]));
- localObject = new Map(new File(paramArrayOfString[2]));
- Map localMap8 = new Map(new File(paramArrayOfString[3]));
- Map localMap9 = new Map();
-
- if ((localMap1.minx != ((Map)localObject).minx) || (localMap1.minx != localMap8.minx) || (localMap1.maxx != ((Map)localObject).maxx) || (localMap1.maxx != localMap8.maxx) || (localMap1.miny != ((Map)localObject).miny) || (localMap1.miny != localMap8.miny) || (localMap1.maxy != ((Map)localObject).maxy) || (localMap1.maxy != localMap8.maxy) || (localMap1.minz != ((Map)localObject).minz) || (localMap1.minz != localMap8.minz) || (localMap1.maxz != ((Map)localObject).maxz) || (localMap1.maxz != localMap8.maxz))
- {
- Systemoutprintln("Map sizes differ");
- System.exit(1);
- }
- try
- {
- for (int n = localMap1.minz; n <= localMap1.maxz; n++)
- for (i2 = localMap1.miny; i2 <= localMap1.maxy; i2++)
- for (i3 = localMap1.minx; i3 <= localMap1.maxx; i3++)
- {
- boolean bool1 = localMap1.contentAt(i3, i2, n).equals(((Map)localObject).contentAt(i3, i2, n));
- boolean bool2 = localMap1.contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n));
- i5 = ((Map)localObject).contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n));
- if ((!bool1) && (!bool2))
- {
- if (i5 == 0)
- {
- Systemoutprintln(i3 + "," + i2 + "," + n + " local and remote don't match original and differ");
- System.exit(1);
- }
- else {
- localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n));
- }
- } else if (!bool1)
- localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n));
- else if (!bool2)
- localMap9.setAt(i3, i2, n, localMap8.contentAt(i3, i2, n));
- else
- localMap9.setAt(i3, i2, n, localMap1.contentAt(i3, i2, n));
- }
- Systemoutprintln("Saving");
- localMap9.saveReferencing(new File(paramArrayOfString[4]), localMap1);
- Systemoutprintln("Done");
- }
- catch (Exception localException12)
- {
- localException12.printStackTrace();
- }
- }
- else
- {
- int m;
- int i1;
- if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-diff")))
- {
- if (paramArrayOfString.length < 4)
- {
- System.out.println(str1);
- try { System.in.read(); } catch (Exception localException2) {
- }return;
- }
-
- Map localMap2 = new Map(new File(paramArrayOfString[1]));
- localObject = new Map(new File(paramArrayOfString[2]));
-
- int j = Math.max(localMap2.minx, ((Map)localObject).minx);
- m = Math.min(localMap2.maxx, ((Map)localObject).maxx);
- i1 = Math.max(localMap2.miny, ((Map)localObject).miny);
- i2 = Math.min(localMap2.maxy, ((Map)localObject).maxy);
- i3 = Math.max(localMap2.minz, ((Map)localObject).minz);
- int i4 = Math.min(localMap2.maxz, ((Map)localObject).maxz);
- Systemoutprintln("Comparing: x(" + j + "-" + m + ") y(" + i1 + "-" + i2 + ") z(" + i3 + "-" + i4 + ")");
- try
- {
- FileWriter localFileWriter2 = new FileWriter(paramArrayOfString[3]);
- i5 = 0;
- for (int i6 = i3; i6 <= i4; i6++)
- {
- Systemoutprintln("Z-level " + i6);
- for (int i7 = i1; i7 <= i2; i7++)
- for (int i8 = j; i8 <= m; i8++)
- if (!localMap2.contentAt(i8, i7, i6).equals(((Map)localObject).contentAt(i8, i7, i6)))
- {
- localFileWriter2.write("(" + i8 + "," + (1 + ((Map)localObject).maxy - i7) + "," + i6 + ")=" + ((Map)localObject).contentAt(i8, i7, i6) + "\n");
- i5++;
- }
- }
- localFileWriter2.flush();
- localFileWriter2.close();
- if (i5 == 0)
- Systemoutprintln("Files do match");
- else
- Systemoutprintln("Writed out " + i5 + " differences");
- }
- catch (Exception localException13)
- {
- localException13.printStackTrace();
- }
-
- Systemoutprintln("Done");
- }
- else
- {
- String str7;
- String str8;
- if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-patch")))
- {
- if (paramArrayOfString.length < 4)
- {
- System.out.println(str2);
- try { System.in.read(); } catch (Exception localException3) {
- }return;
- }
-
- Map localMap3 = new Map(new File(paramArrayOfString[1]));
- try
- {
- localObject = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[2])));
-
- while ((str7 = ((BufferedReader)localObject).readLine()) != null)
- {
- str7 = str7.trim();
- if (str7.length() != 0)
- {
- m = str7.indexOf(",", 1);
- i1 = Integer.parseInt(str7.substring(1, m));
- str7 = str7.substring(m);
- m = str7.indexOf(",", 1);
- i2 = Integer.parseInt(str7.substring(1, m));
- str7 = str7.substring(m);
- m = str7.indexOf(")", 1);
- i3 = Integer.parseInt(str7.substring(1, m));
- str8 = str7.substring(str7.indexOf("=") + 1);
- localMap3.setAt(i1, 1 + localMap3.maxy - i2, i3, str8);
- }
- }
- localMap3.save(new File(paramArrayOfString[3]));
- }
- catch (Exception localException8)
- {
- localException8.printStackTrace();
- }
-
- Systemoutprintln("Done");
- }
- else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-pack")))
- {
- if (paramArrayOfString.length < 3)
- {
- System.out.println(str3);
- try { System.in.read(); } catch (Exception localException4) {
- }return;
- }
-
- Map localMap4 = new Map();
- try {
- BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[1])));
- Systemoutprintln("Loading");
-
- while ((str7 = localBufferedReader.readLine()) != null)
- {
- str7 = str7.trim();
- if (str7.length() != 0)
- {
- m = str7.indexOf(",", 1);
- i1 = Integer.parseInt(str7.substring(1, m));
- str7 = str7.substring(m);
- m = str7.indexOf(",", 1);
- i2 = Integer.parseInt(str7.substring(1, m));
- str7 = str7.substring(m);
- m = str7.indexOf(")", 1);
- i3 = Integer.parseInt(str7.substring(1, m));
- str8 = str7.substring(str7.indexOf("=") + 1);
- localMap4.setAt(i1, i2, i3, str8);
- }
- }
- Systemoutprintln("Flipping");
- localMap4.mirrorY();
- Systemoutprintln("Saving, bounds: x{" + localMap4.minx + " - " + localMap4.maxx + "}, y{" + localMap4.miny + " - " + localMap4.maxy + "}, z{" + localMap4.minz + " - " + localMap4.maxz + "}");
- localMap4.save(new File(paramArrayOfString[2]));
- Systemoutprintln("Done");
- }
- catch (Exception localException9)
- {
- localException9.printStackTrace();
- }
- }
- else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-unpack")))
- {
- if (paramArrayOfString.length < 3)
- {
- System.out.println(str4);
- try { System.in.read(); } catch (Exception localException5) {
- }return;
- }
-
- Systemoutprintln("Loading");
- Map localMap5 = new Map(new File(paramArrayOfString[1]));
- try {
- FileWriter localFileWriter1 = new FileWriter(paramArrayOfString[2]);
- Systemoutprintln("Saving");
- for (int k = localMap5.minz; k <= localMap5.maxz; k++)
- {
- Systemoutprintln("Z-level " + k);
- for (m = localMap5.miny; m <= localMap5.maxy; m++)
- for (i1 = localMap5.minx; i1 <= localMap5.maxx; i1++)
- localFileWriter1.write("(" + i1 + "," + (1 + localMap5.maxy - m) + "," + k + ")=" + localMap5.contentAt(i1, m, k) + "\n");
- localFileWriter1.write("\n");
- }
- localFileWriter1.flush();
- localFileWriter1.close();
-
- Systemoutprintln("Done");
- }
- catch (Exception localException10)
- {
- localException10.printStackTrace();
- }
- }
- else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-clean")))
- {
- if (paramArrayOfString.length < 4)
- {
- System.out.println(str5);
- try { System.in.read(); } catch (Exception localException6) {
- }return;
- }
-
- Map localMap6 = new Map(new File(paramArrayOfString[1]), true);
- Map localMap7 = new Map(new File(paramArrayOfString[2]));
- try
- {
- localMap7.saveReferencing(new File(paramArrayOfString[3]), localMap6);
- Systemoutprintln("Done");
- }
- catch (Exception localException11)
- {
- localException11.printStackTrace();
- }
- }
- else
- {
- System.out.println(str1);
- System.out.println(str2);
- System.out.println(str3);
- System.out.println(str4);
- System.out.println(str5);
- System.out.println(str6);
- try {
- System.in.read(); } catch (Exception localException7) { }
- }
- }
- }
- }
-
- public static void Systemoutprintln(String paramString) { if (!silent)
- System.out.println(paramString); }
-
- public static void Systemoutprint(String paramString)
- {
- if (!silent)
- System.out.print(paramString);
- }
-}
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java
deleted file mode 100644
index 24a3d7b04d..0000000000
--- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java
+++ /dev/null
@@ -1,37 +0,0 @@
-class SavingThread extends Thread
-{
- int z;
- Map mymap;
- boolean done;
- int progress;
- StringBuilder result;
-
- public SavingThread(int paramInt1, Map paramMap, int paramInt2)
- {
- this.z = paramInt1;
- this.mymap = paramMap;
- this.progress = 0;
- this.done = false;
- this.result = new StringBuilder(paramInt2);
- }
-
- public void run()
- {
- this.result.append("(" + this.mymap.minx + "," + this.mymap.miny + "," + this.z + ") = {\"\r\n");
-
- int i = (this.mymap.maxx - this.mymap.minx) * (this.mymap.maxy - this.mymap.miny) / 100;
- int j = 0;
- for (int k = this.mymap.miny; k <= this.mymap.maxy; k++)
- {
- for (int m = this.mymap.minx; m <= this.mymap.maxx; m++)
- {
- this.result.append(this.mymap.getIdFor(this.mymap.contentAt(m, k, this.z)));
- j++; if (j >= i) { j = 0; this.progress += 1; }
- }
- this.result.append("\r\n");
- }
- this.result.append("\"}\r\n");
- this.result.append("\r\n");
- this.done = true;
- }
-}
diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher.jar b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher.jar
deleted file mode 100644
index 5cbaad488c..0000000000
Binary files a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher.jar and /dev/null differ
diff --git a/tools/readme.txt b/tools/readme.txt
index a1c1a17c3b..fbd99e3760 100644
--- a/tools/readme.txt
+++ b/tools/readme.txt
@@ -1,6 +1,4 @@
the compiled exe file for the Unstandardness text for DM program is in:
UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe
-of
-UnstandardnessTestForDM\bin\Release\UnstandardnessTestForDM.exe
-You have to move it to the root folder (where the dme file is) and run it from there for it to work.
\ No newline at end of file
+You have to move it to the root folder (where the dme file is) and run it from there for it to work.