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/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 4a3618e941..9a2b6473af 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -23,6 +23,7 @@
#define WACKY "Wacky"
#define MUT_MUTE "Mute"
#define SMILE "Smile"
+#define STONER "Stoner"
#define UNINTELLIGABLE "Unintelligable"
#define SWEDISH "Swedish"
#define CHAV "Chav"
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 2d36d72ee3..e5d1f4c19e 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -124,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/controllers/master.dm b/code/controllers/master.dm
index 0f4ae021ad..74847ed88c 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -177,7 +177,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
to_chat(world, "[msg]")
log_world(msg)
- SetRunLevel(1)
+ if (!current_runlevel)
+ SetRunLevel(1)
// Sort subsystems by display setting for easy access.
sortTim(subsystems, /proc/cmp_subsystem_display)
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/ticker.dm b/code/controllers/subsystem/ticker.dm
index a54c74966a..c839c7c33d 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -744,6 +744,15 @@ SUBSYSTEM_DEF(ticker)
cinematic = SSticker.cinematic
maprotatechecked = SSticker.maprotatechecked
+ switch (current_state)
+ if(GAME_STATE_SETTING_UP)
+ Master.SetRunLevel(RUNLEVEL_SETUP)
+ if(GAME_STATE_PLAYING)
+ Master.SetRunLevel(RUNLEVEL_GAME)
+ if(GAME_STATE_FINISHED)
+ Master.SetRunLevel(RUNLEVEL_POSTGAME)
+
+
modevoted = SSticker.modevoted
/datum/controller/subsystem/ticker/proc/send_news_report()
@@ -844,7 +853,7 @@ SUBSYSTEM_DEF(ticker)
if(delay_end)
to_chat(world, "An admin has delayed the round end.")
return
-
+
to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]")
var/start_wait = world.time
@@ -854,7 +863,7 @@ SUBSYSTEM_DEF(ticker)
if(delay_end)
to_chat(world, "Reboot was cancelled by an admin.")
return
-
+
SSblackbox.set_details("[feedback_c]","[feedback_r]")
log_game("Rebooting World. [reason]")
diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm
index 4dc0362d01..139ad096ec 100644
--- a/code/datums/map_config.dm
+++ b/code/datums/map_config.dm
@@ -11,8 +11,8 @@
var/minetype = "lavaland"
- var/list/transition_config = list(MAIN_STATION = CROSSLINKED,
- CENTCOMM = SELFLOOPING,
+ var/list/transition_config = list(CENTCOMM = SELFLOOPING,
+ MAIN_STATION = CROSSLINKED,
EMPTY_AREA_1 = CROSSLINKED,
EMPTY_AREA_2 = CROSSLINKED,
MINING = SELFLOOPING,
diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm
index caab422e8b..05e4f4d458 100644
--- a/code/datums/mutations.dm
+++ b/code/datums/mutations.dm
@@ -608,6 +608,23 @@ GLOBAL_LIST_EMPTY(mutations_list)
message = replacetext(message," muh valids "," getting my kicks ")
return trim(message)
+/datum/mutation/human/stoner
+ name = "Stoner"
+ quality = NEGATIVE
+ dna_block = NON_SCANNABLE
+ text_gain_indication = "You feel...totally chill, man!"
+ text_lose_indication = "You feel like you have a better sense of time."
+
+/datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner)
+ ..()
+ owner.grant_language(/datum/language/beachbum)
+ owner.remove_language(/datum/language/common)
+
+/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
+ ..()
+ owner.grant_language(/datum/language/common)
+ owner.remove_language(/datum/language/beachbum)
+
/datum/mutation/human/laser_eyes
name = "Laser Eyes"
quality = POSITIVE
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/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/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/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/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 6df194cf25..fac4f7f31b 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -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/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/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 5bca9cf535..eafd5fdba4 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -548,7 +548,7 @@
return ..()
/obj/item/borg/projectile_dampen/attack_self(mob/user)
- if(cycle_delay < world.time)
+ if(cycle_delay > world.time)
to_chat(user, "\the [src] is still recycling its projectors!")
return
cycle_delay = world.time + PKBORG_DAMPEN_CYCLE_DELAY
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/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/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/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 6100b296ed..0bda03c667 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -377,6 +377,10 @@
icon_state = "sleeper"
flavour_text = "You are a beach bum!"
+/obj/effect/mob_spawn/human/beach/equip(mob/living/carbon/human/H)
+ ..()
+ H.dna.add_mutation(STONER)
+
/////////////////Officers+Nanotrasen Security//////////////////////
/obj/effect/mob_spawn/human/bridgeofficer
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/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/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/jobs/access.dm b/code/modules/jobs/access.dm
index d3a8c089d6..527b6ff736 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -136,26 +136,27 @@ 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
+ if(!req_access)
+ req_access = list()
+ for(var/a in text2access(req_access_txt))
+ req_access += a
+ if(!req_one_access)
+ req_one_access = list()
+ 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/beachbum.dm b/code/modules/language/beachbum.dm
new file mode 100644
index 0000000000..84c75c9ca4
--- /dev/null
+++ b/code/modules/language/beachbum.dm
@@ -0,0 +1,22 @@
+/datum/language/beachbum
+ name = "Beach Bumbian"
+ desc = "For when you're too toasted to speak normally."
+ speech_verb = "mumbles"
+ ask_verb = "grills"
+ exclaim_verb = "hollers"
+ key = "u"
+ space_chance = 85
+ default_priority = 90
+ syllables = list("cowabunga", "rad", "radical", "dudes", "bogus", "weeed", "every",
+ "dee", "dah", "woah", "surf", "blazed", "high", "heinous", "day",
+ "brah", "bro", "blown", "catch", "body", "beach", "oooo", "twenty",
+ "shiz", "phiz", "wizz", "pop", "chill", "awesome", "dude", "it",
+ "wax", "stoked", "yes", "ding", "way", "no", "wicked", "aaaa",
+ "cool", "hoo", "wah", "wee", "man", "maaaaaan", "mate", "wick",
+ "oh", "ocean", "up", "out", "rip", "slide", "big", "stomp",
+ "weed", "pot", "smoke", "four-twenty", "shove", "wacky", "hah",
+ "sick", "slash", "spit", "stoked", "shallow", "gun", "party",
+ "heavy", "stellar", "excellent", "triumphant", "babe", "four",
+ "tail", "trim", "tube", "wobble", "roll", "gnarly", "epic")
+
+ icon_state = "beach"
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 4e80477e6b..f1ff497a2a 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -20,3 +20,16 @@
. = ..()
if(.)
update_hair()
+
+/mob/living/carbon/human/set_drugginess(amount)
+ ..()
+ if(!amount)
+ remove_language(/datum/language/beachbum)
+
+/mob/living/carbon/human/adjust_drugginess(amount)
+ ..()
+ if(!dna.check_mutation(STONER))
+ if(druggy)
+ grant_language(/datum/language/beachbum)
+ else
+ remove_language(/datum/language/beachbum)
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/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/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/power/cable.dm b/code/modules/power/cable.dm
index 5bf4bab33e..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, "-")
@@ -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/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 7f6bfb3026..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.", INVESTIGATE_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"].", INVESTIGATE_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/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 04761befdc..d9a0ee78a2 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -295,14 +295,16 @@
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
if(user.a_intent == INTENT_HARM) //Flogging
if(bayonet)
- bayonet.attack(M, user)
+ M.attackby(bayonet, user)
return
- return ..()
+ else
+ return ..()
+ return
/obj/item/weapon/gun/attack_obj(obj/O, mob/user)
if(user.a_intent == INTENT_HARM)
if(bayonet)
- bayonet.attack_obj(O, user)
+ O.attackby(bayonet, user)
return
return ..()
@@ -332,7 +334,7 @@
if(!bayonet)
if(!user.transferItemToLoc(I, src))
return
- to_chat(user, "You attach \the [K] to the front of ]the [src].")
+ 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))
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/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 5a3555c8f9..5f23b1ef7d 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -15,6 +15,7 @@
/datum/language/common,
/datum/language/draconic,
/datum/language/monkey,
+ /datum/language/beachbum,
/datum/language/narsie,
))
diff --git a/code/modules/surgery/organs/tongue.dm.rej b/code/modules/surgery/organs/tongue.dm.rej
new file mode 100644
index 0000000000..11c501c6f6
--- /dev/null
+++ b/code/modules/surgery/organs/tongue.dm.rej
@@ -0,0 +1,9 @@
+diff a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm (rejected hunks)
+@@ -17,6 +17,7 @@
+ /datum/language/codespeak,
+ /datum/language/monkey,
+ /datum/language/narsie,
++ /datum/language/beachbum,
+ /datum/language/ratvar
+ ))
+
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/html/changelogs/AutoChangeLog-pr-1151.yml b/html/changelogs/AutoChangeLog-pr-1151.yml
new file mode 100644
index 0000000000..1cd57ad4c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1151.yml
@@ -0,0 +1,5 @@
+author: "That Really Good Soda Flavor"
+delete-after: True
+changes:
+ - rscadd: "People who are high and beach bums can now talk in their own stoner language."
+ - tweak: "Beach bums can only communicate with other beach bums and people who are high."
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/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/misc/language.dmi b/icons/misc/language.dmi
index 081bbf1aa3..f4894c2b90 100644
Binary files a/icons/misc/language.dmi and b/icons/misc/language.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/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/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 7cb9f2a3ff..dd6146d7fb 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index f61256862c..7c1d803849 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1194,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"
@@ -1440,6 +1439,7 @@
#include "code\modules\jobs\job_types\science.dm"
#include "code\modules\jobs\job_types\security.dm"
#include "code\modules\jobs\job_types\silicon.dm"
+#include "code\modules\language\beachbum.dm"
#include "code\modules\language\common.dm"
#include "code\modules\language\draconic.dm"
#include "code\modules\language\drone.dm"
diff --git a/tgstation.dme.rej b/tgstation.dme.rej
new file mode 100644
index 0000000000..6f5a5fec15
--- /dev/null
+++ b/tgstation.dme.rej
@@ -0,0 +1,9 @@
+diff a/tgstation.dme b/tgstation.dme (rejected hunks)
+@@ -1390,6 +1390,7 @@
+ #include "code\modules\jobs\job_types\security.dm"
+ #include "code\modules\jobs\job_types\silicon.dm"
+ #include "code\modules\jobs\map_changes\map_changes.dm"
++#include "code\modules\language\beachbum.dm"
+ #include "code\modules\language\codespeak.dm"
+ #include "code\modules\language\common.dm"
+ #include "code\modules\language\draconic.dm"