diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 6724122a501..60eae92ba1d 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -25,6 +25,19 @@
* Text sanitization
*/
+//this proc strips html properly, but it's not lazy like the other procs.
+//this means that it doesn't just remove < and > and call it a day. seriously, who the fuck thought that would be useful.
+/proc/strip_html_properly(var/input)
+ var/opentag = 1 //These store the position of < and > respectively.
+ var/closetag = 1
+ while(1)
+ opentag = findtext(input, "<")
+ closetag = findtext(input, ">")
+ if(!closetag || !opentag)
+ break
+ input = copytext(input, 1, opentag) + copytext(input, (closetag + 1))
+ return input
+
//Simply removes < and > and limits the length of the message
/proc/strip_html_simple(var/t,var/limit=MAX_MESSAGE_LEN)
var/list/strip_chars = list("<",">")
@@ -363,16 +376,3 @@ var/list/binary = list("0","1")
temp = findtextEx(haystack, ascii2text(text2ascii(needles,i)), start, end) //Note: ascii2text(text2ascii) is faster than copytext()
if(temp) end = temp
return end
-
-//this proc strips html properly, but it's not lazy like the other procs.
-//this means that it doesn't just remove < and > and call it a day. seriously, who the fuck thought that would be useful.
-/proc/strip_html_properly(var/input)
- var/opentag = 1 //These store the position of < and > respectively.
- var/closetag = 1
- while(1)
- opentag = findtext(input, "<")
- closetag = findtext(input, ">")
- if(!closetag || !opentag)
- break
- input = copytext(input, 1, opentag) + copytext(input, (closetag + 1))
- return input
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index ad6a82e04df..64a72a6a6bf 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -9,7 +9,10 @@
/datum/round_event/spooky/start()
for(var/mob/living/carbon/human/H in mob_list)
if(H.dna)
- hardset_dna(H, null, null, null, null, /datum/species/skeleton)
+ if(prob(50))
+ hardset_dna(H, null, null, null, null, /datum/species/skeleton)
+ else
+ hardset_dna(H, null, null, null, null, /datum/species/zombie)
for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food&drinks/food/snacks/meat.dm
index 91b2c27b243..9397cd6b40f 100644
--- a/code/modules/food&drinks/food/snacks/meat.dm
+++ b/code/modules/food&drinks/food/snacks/meat.dm
@@ -61,6 +61,11 @@
icon_state = "skeletonmeat"
desc = "There's a point where this needs to stop and clearly we have passed it"
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie
+ name = "-meat (rotten)"
+ icon_state = "lizardmeat" //Close enough.
+ desc = "Halfway to becoming fertilizer for your garden."
+
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey
//same as plain meat
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 37831db6f0a..c173f406e2f 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -18,29 +18,3 @@
/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
src << message
-
-/*
- for (var/mob/M in hearers(null, null))
- if (!M.stat)
- if(M.job == "Chaplain")
- if (prob (49))
- M.show_message("You hear muffled speech... but nothing is there...", 2)
- if(prob(20))
- playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
- else
- M.show_message("You hear muffled speech... you can almost make out some words...", 2)
-// M.show_message("[stutter(message)]", 2)
- if(prob(30))
- playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
- else
- if (prob(50))
- return
- else if (prob (95))
- M.show_message("You hear muffled speech... but nothing is there...", 2)
- if(prob(20))
- playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
- else
- M.show_message("You hear muffled speech... you can almost make out some words...", 2)
-// M.show_message("[stutter(message)]", 2)
- playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
-*/
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index e3e42effb46..99cb7f8eece 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -214,10 +214,7 @@
return 1
/datum/species/fly/handle_speech(message)
- if(copytext(message, 1, 2) != "*")
- message = replacetext(message, "z", stutter("zz"))
-
- return message
+ return replacetext(message, "z", stutter("zz"))
/*
SKELETONS
@@ -229,3 +226,30 @@
id = "skeleton"
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton
+/*
+ ZOMBIES
+*/
+
+/datum/species/zombie
+ // 1spooky
+ name = "Brain-Munching Zombie"
+ id = "zombie"
+ say_mod = "moans"
+ sexes = 0
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie
+
+/datum/species/zombie/handle_speech(message)
+ var/list/message_list = text2list(message, " ")
+ var/maxchanges = max(round(message_list.len / 1.5), 2)
+
+ for(var/i = rand(maxchanges / 2, maxchanges), i > 0, i--)
+ var/insertpos = rand(1, message_list.len - 1)
+ var/inserttext = message_list[insertpos]
+
+ if(!(copytext(inserttext, length(inserttext) - 2) == "..."))
+ message_list[insertpos] = inserttext + "..."
+
+ if(prob(20) && message_list.len > 3)
+ message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...")
+
+ return list2text(message_list, " ")
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index 8b586b4fab9..ff3073b2ddd 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ