diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 7f25b86cb5b..8982f59174e 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -1,4 +1,3 @@
-
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
client
@@ -402,56 +401,14 @@ client
//This should all be moved over to datum/admins/Topic() or something ~Carn
if( (usr.client != src) || !src.holder )
return
- if(!check_rights(R_VAREDIT))
- return
if(href_list["Vars"])
debug_variables(locate(href_list["Vars"]))
- //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
- else if(href_list["rename"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["rename"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
+ if(href_list["datumrefresh"])
+ var/datum/DAT = locate(href_list["datumrefresh"])
+ if(!istype(DAT, /datum))
return
-
- var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
- if( !new_name || !M ) return
-
- message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
- M.fully_replace_character_name(M.real_name,new_name)
- href_list["datumrefresh"] = href_list["rename"]
-
- else if(href_list["varnameedit"] && href_list["datumedit"])
- if(!check_rights(0)) return
-
- var/D = locate(href_list["datumedit"])
- if(!istype(D,/datum) && !istype(D,/client))
- usr << "This can only be used on instances of types /client or /datum"
- return
-
- modify_variables(D, href_list["varnameedit"], 1)
-
- else if(href_list["varnamechange"] && href_list["datumchange"])
- if(!check_rights(0)) return
-
- var/D = locate(href_list["datumchange"])
- if(!istype(D,/datum) && !istype(D,/client))
- usr << "This can only be used on instances of types /client or /datum"
- return
-
- modify_variables(D, href_list["varnamechange"], 0)
-
- else if(href_list["varnamemass"] && href_list["datummass"])
- if(!check_rights(0)) return
-
- var/atom/A = locate(href_list["datummass"])
- if(!istype(A))
- usr << "This can only be used on instances of type /atom"
- return
-
- cmd_mass_modify_object_variables(A, href_list["varnamemass"])
+ src.debug_variables(DAT)
else if(href_list["mob_player_panel"])
if(!check_rights(0)) return
@@ -464,39 +421,6 @@ client
src.holder.show_player_panel(M)
href_list["datumrefresh"] = href_list["mob_player_panel"]
- else if(href_list["give_spell"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["give_spell"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- src.give_spell(M)
- href_list["datumrefresh"] = href_list["give_spell"]
-
- else if(href_list["give_disease"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["give_disease"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- src.give_disease(M)
- href_list["datumrefresh"] = href_list["give_spell"]
-
- else if(href_list["ninja"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["ninja"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- src.cmd_admin_ninjafy(M)
- href_list["datumrefresh"] = href_list["ninja"]
-
else if(href_list["godmode"])
if(!check_rights(R_REJUVINATE)) return
@@ -508,125 +432,6 @@ client
src.cmd_admin_godmode(M)
href_list["datumrefresh"] = href_list["godmode"]
- else if(href_list["gib"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["gib"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- src.cmd_admin_gib(M)
-
- else if(href_list["build_mode"])
- if(!check_rights(R_BUILDMODE)) return
-
- var/mob/M = locate(href_list["build_mode"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- togglebuildmode(M)
- href_list["datumrefresh"] = href_list["build_mode"]
-
- else if(href_list["drop_everything"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["drop_everything"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- if(usr.client)
- usr.client.cmd_admin_drop_everything(M)
-
- else if(href_list["direct_control"])
- if(!check_rights(0)) return
-
- var/mob/M = locate(href_list["direct_control"])
- if(!istype(M))
- usr << "This can only be used on instances of type /mob"
- return
-
- if(usr.client)
- usr.client.cmd_assume_direct_control(M)
-
- else if(href_list["make_skeleton"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
- if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
- return
-
- H.makeSkeleton()
- href_list["datumrefresh"] = href_list["make_skeleton"]
-
- else if(href_list["delall"])
- if(!check_rights(R_DEBUG|R_SERVER)) return
-
- var/obj/O = locate(href_list["delall"])
- if(!isobj(O))
- usr << "This can only be used on instances of type /obj"
- return
-
- var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
- if(action_type == "Cancel" || !action_type)
- return
-
- if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
- return
-
- if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
- return
-
- var/O_type = O.type
- switch(action_type)
- if("Strict type")
- var/i = 0
- for(var/obj/Obj in world)
- if(Obj.type == O_type)
- i++
- del(Obj)
- if(!i)
- usr << "No objects of this type exist"
- return
- log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
- message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
- if("Type and subtypes")
- var/i = 0
- for(var/obj/Obj in world)
- if(istype(Obj,O_type))
- i++
- del(Obj)
- if(!i)
- usr << "No objects of this type exist"
- return
- log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
- message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
-
- else if(href_list["explode"])
- if(!check_rights(0)) return
-
- var/atom/A = locate(href_list["explode"])
- if(!isobj(A) && !ismob(A) && !isturf(A))
- usr << "This can only be done to instances of type /obj, /mob and /turf"
- return
-
- src.cmd_admin_explosion(A)
- href_list["datumrefresh"] = href_list["explode"]
-
- else if(href_list["emp"])
- if(!check_rights(0)) return
-
- var/atom/A = locate(href_list["emp"])
- if(!isobj(A) && !ismob(A) && !isturf(A))
- usr << "This can only be done to instances of type /obj, /mob and /turf"
- return
-
- src.cmd_admin_emp(A)
- href_list["datumrefresh"] = href_list["emp"]
-
else if(href_list["mark_object"])
if(!check_rights(0)) return
@@ -638,123 +443,6 @@ client
src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
- else if(href_list["rotatedatum"])
- if(!check_rights(0)) return
-
- var/atom/A = locate(href_list["rotatedatum"])
- if(!istype(A))
- usr << "This can only be done to instances of type /atom"
- return
-
- switch(href_list["rotatedir"])
- if("right") A.dir = turn(A.dir, -45)
- if("left") A.dir = turn(A.dir, 45)
- href_list["datumrefresh"] = href_list["rotatedatum"]
-
- else if(href_list["makehuman"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
- if(!istype(Mo))
- usr << "This can only be done to instances of type /mob/living/carbon/monkey"
- return
-
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!Mo)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("humanone"=href_list["makehuman"]))
-
- else if(href_list["makemonkey"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
-
- else if(href_list["makerobot"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["makerobot"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("makerobot"=href_list["makerobot"]))
-
- else if(href_list["makealien"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["makealien"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("makealien"=href_list["makealien"]))
-
- else if(href_list["makeslime"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["makeslime"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("makeslime"=href_list["makeslime"]))
-
- else if(href_list["makeai"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["makeai"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- holder.Topic(href, list("makeai"=href_list["makeai"]))
-
- else if(href_list["setmutantrace"])
- if(!check_rights(0)) return
-
- var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
- if(!istype(H))
- usr << "This can only be done to instances of type /mob/living/carbon/human"
- return
-
- var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
- switch(new_mutantrace)
- if(null) return
- if("NONE") new_mutantrace = ""
- if(!H)
- usr << "Mob doesn't exist anymore"
- return
- if(H.dna)
- H.dna.mutantrace = new_mutantrace
- H.update_body()
- H.update_hair()
-
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
@@ -764,41 +452,357 @@ client
return
M.regenerate_icons()
- else if(href_list["adjustDamage"] && href_list["mobToDamage"])
- if(!check_rights(0)) return
+//Needs +VAREDIT past this point
- var/mob/living/L = locate(href_list["mobToDamage"])
- if(!istype(L)) return
+ else if(check_rights(R_VAREDIT))
- var/Text = href_list["adjustDamage"]
- var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
+ //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
- if(!L)
- usr << "Mob doesn't exist anymore"
- return
+ if(href_list["rename"])
+ if(!check_rights(0)) return
- switch(Text)
- if("brute") L.adjustBruteLoss(amount)
- if("fire") L.adjustFireLoss(amount)
- if("toxin") L.adjustToxLoss(amount)
- if("oxygen")L.adjustOxyLoss(amount)
- if("brain") L.adjustBrainLoss(amount)
- if("clone") L.adjustCloneLoss(amount)
- else
- usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
+ var/mob/M = locate(href_list["rename"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
return
- if(amount != 0)
- log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
- message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
- href_list["datumrefresh"] = href_list["mobToDamage"]
+ var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
+ if( !new_name || !M ) return
+
+ message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
+ M.fully_replace_character_name(M.real_name,new_name)
+ href_list["datumrefresh"] = href_list["rename"]
+
+ else if(href_list["varnameedit"] && href_list["datumedit"])
+ if(!check_rights(0)) return
+
+ var/D = locate(href_list["datumedit"])
+ if(!istype(D,/datum) && !istype(D,/client))
+ usr << "This can only be used on instances of types /client or /datum"
+ return
+
+ modify_variables(D, href_list["varnameedit"], 1)
+
+ else if(href_list["varnamechange"] && href_list["datumchange"])
+ if(!check_rights(0)) return
+
+ var/D = locate(href_list["datumchange"])
+ if(!istype(D,/datum) && !istype(D,/client))
+ usr << "This can only be used on instances of types /client or /datum"
+ return
+
+ modify_variables(D, href_list["varnamechange"], 0)
+
+ else if(href_list["varnamemass"] && href_list["datummass"])
+ if(!check_rights(0)) return
+
+ var/atom/A = locate(href_list["datummass"])
+ if(!istype(A))
+ usr << "This can only be used on instances of type /atom"
+ return
+
+ cmd_mass_modify_object_variables(A, href_list["varnamemass"])
+
+ else if(href_list["give_spell"])
+ if(!check_rights(0)) return
+
+ var/mob/M = locate(href_list["give_spell"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ src.give_spell(M)
+ href_list["datumrefresh"] = href_list["give_spell"]
+
+ else if(href_list["give_disease"])
+ if(!check_rights(0)) return
+
+ var/mob/M = locate(href_list["give_disease"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ src.give_disease(M)
+ href_list["datumrefresh"] = href_list["give_spell"]
+
+ else if(href_list["ninja"])
+ if(!check_rights(R_FUN)) return
+
+ var/mob/M = locate(href_list["ninja"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ src.cmd_admin_ninjafy(M)
+ href_list["datumrefresh"] = href_list["ninja"]
+
+ else if(href_list["gib"])
+ if(!check_rights(R_FUN)) return
+
+ var/mob/M = locate(href_list["gib"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ src.cmd_admin_gib(M)
+
+ else if(href_list["build_mode"])
+ if(!check_rights(R_BUILDMODE)) return
+
+ var/mob/M = locate(href_list["build_mode"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ togglebuildmode(M)
+ href_list["datumrefresh"] = href_list["build_mode"]
+
+ else if(href_list["drop_everything"])
+ if(!check_rights(0)) return
+
+ var/mob/M = locate(href_list["drop_everything"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ if(usr.client)
+ usr.client.cmd_admin_drop_everything(M)
+
+ else if(href_list["direct_control"])
+ if(!check_rights(0)) return
+
+ var/mob/M = locate(href_list["direct_control"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ if(usr.client)
+ usr.client.cmd_assume_direct_control(M)
+
+ else if(href_list["make_skeleton"])
+ if(!check_rights(R_FUN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
+ if(!istype(H))
+ usr << "This can only be used on instances of type /mob/living/carbon/human"
+ return
+
+ H.makeSkeleton()
+ href_list["datumrefresh"] = href_list["make_skeleton"]
+
+ else if(href_list["delall"])
+ if(!check_rights(R_DEBUG|R_SERVER)) return
+
+ var/obj/O = locate(href_list["delall"])
+ if(!isobj(O))
+ usr << "This can only be used on instances of type /obj"
+ return
+
+ var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
+ if(action_type == "Cancel" || !action_type)
+ return
+
+ if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
+ return
+
+ if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
+ return
+
+ var/O_type = O.type
+ switch(action_type)
+ if("Strict type")
+ var/i = 0
+ for(var/obj/Obj in world)
+ if(Obj.type == O_type)
+ i++
+ del(Obj)
+ if(!i)
+ usr << "No objects of this type exist"
+ return
+ log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
+ message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
+ if("Type and subtypes")
+ var/i = 0
+ for(var/obj/Obj in world)
+ if(istype(Obj,O_type))
+ i++
+ del(Obj)
+ if(!i)
+ usr << "No objects of this type exist"
+ return
+ log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
+ message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
+
+ else if(href_list["explode"])
+ if(!check_rights(R_FUN)) return
+
+ var/atom/A = locate(href_list["explode"])
+ if(!isobj(A) && !ismob(A) && !isturf(A))
+ usr << "This can only be done to instances of type /obj, /mob and /turf"
+ return
+
+ src.cmd_admin_explosion(A)
+ href_list["datumrefresh"] = href_list["explode"]
+
+ else if(href_list["emp"])
+ if(!check_rights(R_FUN)) return
+
+ var/atom/A = locate(href_list["emp"])
+ if(!isobj(A) && !ismob(A) && !isturf(A))
+ usr << "This can only be done to instances of type /obj, /mob and /turf"
+ return
+
+ src.cmd_admin_emp(A)
+ href_list["datumrefresh"] = href_list["emp"]
+
+ else if(href_list["rotatedatum"])
+ if(!check_rights(0)) return
+
+ var/atom/A = locate(href_list["rotatedatum"])
+ if(!istype(A))
+ usr << "This can only be done to instances of type /atom"
+ return
+
+ switch(href_list["rotatedir"])
+ if("right") A.dir = turn(A.dir, -45)
+ if("left") A.dir = turn(A.dir, 45)
+ href_list["datumrefresh"] = href_list["rotatedatum"]
+
+ else if(href_list["makehuman"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
+ if(!istype(Mo))
+ usr << "This can only be done to instances of type /mob/living/carbon/monkey"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!Mo)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("humanone"=href_list["makehuman"]))
+
+ else if(href_list["makemonkey"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob/living/carbon/human"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
+
+ else if(href_list["makerobot"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["makerobot"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob/living/carbon/human"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("makerobot"=href_list["makerobot"]))
+
+ else if(href_list["makealien"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["makealien"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob/living/carbon/human"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("makealien"=href_list["makealien"]))
+
+ else if(href_list["makeslime"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["makeslime"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob/living/carbon/human"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("makeslime"=href_list["makeslime"]))
+
+ else if(href_list["makeai"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["makeai"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob/living/carbon/human"
+ return
+
+ if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+ holder.Topic(href, list("makeai"=href_list["makeai"]))
+
+ else if(href_list["setmutantrace"])
+ if(!check_rights(R_SPAWN)) return
+
+ var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
+ if(!istype(H))
+ usr << "This can only be done to instances of type /mob/living/carbon/human"
+ return
+
+ var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
+ switch(new_mutantrace)
+ if(null) return
+ if("NONE") new_mutantrace = ""
+ if(!H)
+ usr << "Mob doesn't exist anymore"
+ return
+ if(H.dna)
+ H.dna.mutantrace = new_mutantrace
+ H.update_body()
+ H.update_hair()
+
+ else if(href_list["adjustDamage"] && href_list["mobToDamage"])
+ if(!check_rights(0)) return
+
+ var/mob/living/L = locate(href_list["mobToDamage"])
+ if(!istype(L)) return
+
+ var/Text = href_list["adjustDamage"]
+
+ var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
+
+ if(!L)
+ usr << "Mob doesn't exist anymore"
+ return
+
+ switch(Text)
+ if("brute") L.adjustBruteLoss(amount)
+ if("fire") L.adjustFireLoss(amount)
+ if("toxin") L.adjustToxLoss(amount)
+ if("oxygen")L.adjustOxyLoss(amount)
+ if("brain") L.adjustBrainLoss(amount)
+ if("clone") L.adjustCloneLoss(amount)
+ else
+ usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
+ return
+
+ if(amount != 0)
+ log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
+ message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
+ href_list["datumrefresh"] = href_list["mobToDamage"]
- if(href_list["datumrefresh"])
- var/datum/DAT = locate(href_list["datumrefresh"])
- if(!istype(DAT, /datum))
- return
- src.debug_variables(DAT)
return
diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm
index 74f5de75e09..ed3248d776a 100644
--- a/code/datums/spells/construct_spells.dm
+++ b/code/datums/spells/construct_spells.dm
@@ -83,10 +83,21 @@
invocation_type = "none"
range = -1
include_user = 1
- phaseshift = 1
jaunt_duration = 50 //in deciseconds
centcom_cancast = 0 //Stop people from getting to centcom
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
+ animation.icon_state = "phase_shift"
+ animation.dir = target.dir
+ flick("phase_shift",animation)
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
+ animation.icon_state = "phase_shift2"
+ animation.dir = target.dir
+ flick("phase_shift2",animation)
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc)
+ return
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
name = "Lesser Magic Missile"
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index 347361cc8ea..20de7205d71 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -11,8 +11,6 @@
cooldown_min = 100 //50 deciseconds reduction per rank
include_user = 1
centcom_cancast = 0 //Prevent people from getting to centcom
-
- var phaseshift = 0
var/jaunt_duration = 50 //in deciseconds
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
@@ -26,63 +24,46 @@
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
- animation.icon_state = "liquify"
animation.layer = 5
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
target.buckled.unbuckle()
- if(phaseshift == 1)
- animation.dir = target.dir
- flick("phase_shift",animation)
- target.loc = holder
- sleep(jaunt_duration)
- mobloc = get_turf(target.loc)
- animation.loc = mobloc
- target.canmove = 0
- holder.reappearing = 1
- sleep(20)
- animation.dir = target.dir
- flick("phase_shift2",animation)
- sleep(5)
- if(!target.Move(mobloc))
- for(var/direction in list(1,2,4,8,5,6,9,10))
- var/turf/T = get_step(mobloc, direction)
- if(T)
- if(target.Move(T))
- break
- target.canmove = 1
- target.notransform = 0
- target.client.eye = target
- del(animation)
- del(holder)
- else
- flick("liquify",animation)
- target.loc = holder
- var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
- steam.set_up(10, 0, mobloc)
- steam.start()
- sleep(jaunt_duration)
- mobloc = get_turf(target.loc)
- animation.loc = mobloc
- steam.location = mobloc
- steam.start()
- target.canmove = 0
- holder.reappearing = 1
- sleep(20)
- flick("reappear",animation)
- sleep(5)
- if(!target.Move(mobloc))
- for(var/direction in list(1,2,4,8,5,6,9,10))
- var/turf/T = get_step(mobloc, direction)
- if(T)
- if(target.Move(T))
- break
- target.canmove = 1
- target.notransform = 0
- target.client.eye = target
- del(animation)
- del(holder)
+ jaunt_disappear(animation, target)
+ target.loc = holder
+ target.notransform=0 //mob is safely inside holder now, no need for protection.
+ jaunt_steam(mobloc)
+ sleep(jaunt_duration)
+ mobloc = get_turf(target.loc)
+ animation.loc = mobloc
+ jaunt_steam(mobloc)
+ target.canmove = 0
+ holder.reappearing = 1
+ sleep(20)
+ jaunt_reappear(animation, target)
+ sleep(5)
+ if(!target.Move(mobloc))
+ for(var/direction in list(1,2,4,8,5,6,9,10))
+ var/turf/T = get_step(mobloc, direction)
+ if(T)
+ if(target.Move(T))
+ break
+ target.canmove = 1
+ target.client.eye = target
+ del(animation)
+ del(holder)
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
+ animation.icon_state = "liquify"
+ flick("liquify",animation)
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
+ flick("reappear",animation)
+
+/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(var/mobloc)
+ var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
+ steam.set_up(10, 0, mobloc)
+ steam.start()
/obj/effect/dummy/spell_jaunt
name = "water"
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index d17300571b8..cf0707a6022 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -70,89 +70,47 @@
src.throwing = 1
- if(usr)
- if(HULK in usr.mutations)
- src.throwing = 2 // really strong throw!
+ if(usr && HULK in usr.mutations)
+ src.throwing = 2 // really strong throw!
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
-
- var/dx
- if (target.x > src.x)
- dx = EAST
- else
- dx = WEST
-
- var/dy
- if (target.y > src.y)
- dy = NORTH
- else
- dy = SOUTH
+ var/dx = (target.x > src.x) ? EAST : WEST
+ var/dy = (target.y > src.y) ? NORTH : SOUTH
var/dist_travelled = 0
var/dist_since_sleep = 0
var/area/a = get_area(src.loc)
- if(dist_x > dist_y)
- var/error = dist_x/2 - dist_y
+ var/tdist_x = dist_x;
+ var/tdist_y = dist_y;
+ var/tdx = dx;
+ var/tdy = dy;
+ if(dist_x <= dist_y)
+ tdist_x = dist_y;
+ tdist_y = dist_x;
+ tdx = dy;
+ tdy = dx;
- while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
- // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
- if(error < 0)
- var/atom/step = get_step(src, dy)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check()
- error += dist_x
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- else
- var/atom/step = get_step(src, dx)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check()
- error -= dist_y
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- a = get_area(src.loc)
- else
- var/error = dist_y/2 - dist_x
- while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
- // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
- if(error < 0)
- var/atom/step = get_step(src, dx)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check()
- error += dist_y
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- else
- var/atom/step = get_step(src, dy)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check()
- error -= dist_x
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
+ var/error = tdist_x/2 - tdist_y
+ while(target && (((((dist_x > dist_y) && ((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST))) || ((dist_x <= dist_y) && ((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH))) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)))
+ // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
+ if(!src.throwing) break
+ if(!istype(src.loc, /turf)) break
- a = get_area(src.loc)
+ var/atom/step = get_step(src, (error < 0) ? tdy : tdx)
+ if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
+ break
+ src.Move(step)
+ hit_check()
+ error += (error < 0) ? tdist_x : -tdist_y;
+ dist_travelled++
+ dist_since_sleep++
+ if(dist_since_sleep >= speed)
+ dist_since_sleep = 0
+ sleep(1)
+
+ a = get_area(src.loc)
//done throwing, either because it hit something or it finished moving
src.throwing = 0
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index a38040c2901..879134be58a 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -252,7 +252,7 @@
max_uses--
temp = "You have cast summon guns."
if("summonmagic")
- feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
+ feedback_add_details("wizard_spell_learned","SU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.rightandwrong(1)
max_uses--
temp = "You have cast summon magic."
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 5a4854349b6..fb922c6fb9a 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -70,7 +70,7 @@
desc = "Does not support Pinball."
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
- circuit = /obj/item/weapon/circuitboard/arcade
+ circuit = /obj/item/weapon/circuitboard/arcade/battle
var/enemy_name = "Space Villian"
var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc
var/player_hp = 30 //Player health/attack points
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 35385ec64ff..b04ecad5106 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -409,10 +409,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="Wanted issue for [src.channel_name] successfully edited.
"
dat+="
Return
"
if(20)
- dat+="Printing successfull. Please receive your newspaper from the bottom of the machine.
"
+ dat+="Printing successful. Please receive your newspaper from the bottom of the machine.
"
dat+="Return"
if(21)
- dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage.
"
+ dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.
"
dat+="Return"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index c143ddd39e6..4369c3b99b6 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -64,10 +64,10 @@
affecting = H.get_organ("head")
- if (affecting.heal_damage(src.heal_brute, src.heal_burn, 0))
- H.update_damage_overlays(0)
+ if (affecting.heal_damage(src.heal_brute, src.heal_burn, 0))
+ H.update_damage_overlays(0)
- M.updatehealth()
+ M.updatehealth()
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index c09bbb8f538..1dad4811ea5 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -1,5 +1,5 @@
/obj/structure/closet/secure_closet/personal
- desc = "It's a secure locker for personell. The first card swiped gains control."
+ desc = "It's a secure locker for personnel. The first card swiped gains control."
name = "personal closet"
req_access = list(access_all_personal_lockers)
var/registered_name = null
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 361e913d7a8..8430fadbb02 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -72,6 +72,11 @@ BLIND // can't see anything
body_parts_covered = HEAD
slot_flags = SLOT_MASK
+
+//Override this to modify speech like luchador masks.
+/obj/item/clothing/mask/proc/speechModification(message)
+ return message
+
//Shoes
/obj/item/clothing/shoes
name = "shoes"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 478990d5078..70cc4b22744 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -4,6 +4,7 @@
name = "\improper Centcom hat"
icon_state = "centcom"
desc = "It's good to be emperor."
+ flags = FPRINT|TABLEPASS
item_state = "that"
/obj/item/clothing/head/powdered_wig
@@ -17,47 +18,52 @@
desc = "It's an amish looking hat."
icon_state = "tophat"
item_state = "that"
+ flags = FPRINT|TABLEPASS
/obj/item/clothing/head/redcoat
name = "redcoat's hat"
icon_state = "redcoat"
desc = "'I guess it's a redhead.'"
+ flags = FPRINT | TABLEPASS
/obj/item/clothing/head/mailman
name = "mailman's hat"
icon_state = "mailman"
desc = "'Right-on-time' mail service head wear."
+ flags = FPRINT | TABLEPASS
/obj/item/clothing/head/plaguedoctorhat
name = "plague doctor's hat"
desc = "These were once used by Plague doctors. They're pretty much useless."
icon_state = "plaguedoctor"
+ flags = FPRINT | TABLEPASS
permeability_coefficient = 0.01
/obj/item/clothing/head/hasturhood
name = "hastur's hood"
desc = "It's unspeakably stylish"
icon_state = "hasturhood"
- flags = HEADCOVERSEYES|BLOCKHAIR
+ flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR
/obj/item/clothing/head/nursehat
name = "nurse's hat"
desc = "It allows quick identification of trained medical personnel."
icon_state = "nursehat"
+ flags = FPRINT|TABLEPASS
/obj/item/clothing/head/syndicatefake
name = "red space-helmet replica"
icon_state = "syndicate"
item_state = "syndicate"
desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
- flags = BLOCKHAIR
+ flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/cueball
name = "cueball helmet"
desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?"
icon_state = "cueball"
- flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+ flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
item_state="cueball"
flags_inv = 0
@@ -66,6 +72,7 @@
desc = "It's an amish looking armored top hat."
icon_state = "tophat"
item_state = "that"
+ flags = FPRINT|TABLEPASS
flags_inv = 0
/obj/item/clothing/head/greenbandana
@@ -73,6 +80,7 @@
desc = "It's a green bandana with some fine nanotech lining."
icon_state = "greenbandana"
item_state = "greenbandana"
+ flags = FPRINT|TABLEPASS
flags_inv = 0
/obj/item/clothing/head/cardborg
@@ -80,7 +88,7 @@
desc = "A helmet made out of a box."
icon_state = "cardborg_h"
item_state = "cardborg_h"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH
+ flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/justice
@@ -88,7 +96,7 @@
desc = "fight for what's righteous!"
icon_state = "justicered"
item_state = "justicered"
- flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+ flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
/obj/item/clothing/head/justice/blue
icon_state = "justiceblue"
@@ -110,6 +118,7 @@
name = "rabbit ears"
desc = "Wearing these makes you looks useless, and only good for your sex appeal."
icon_state = "bunny"
+ flags = FPRINT | TABLEPASS
/obj/item/clothing/head/flatcap
name = "flat cap"
@@ -140,32 +149,34 @@
desc = "Gentleman, elite aboard!"
icon_state = "bowler"
item_state = "bowler"
+ flags = FPRINT | TABLEPASS
/obj/item/clothing/head/witchwig
name = "witch costume wig"
desc = "Eeeee~heheheheheheh!"
icon_state = "witch"
item_state = "witch"
- flags = BLOCKHAIR
+ flags = FPRINT | TABLEPASS | BLOCKHAIR
/obj/item/clothing/head/chicken
name = "chicken suit head"
desc = "Bkaw!"
icon_state = "chickenhead"
item_state = "chickensuit"
- flags = BLOCKHAIR
+ flags = FPRINT | TABLEPASS | BLOCKHAIR
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
desc = "Fuzzy."
icon_state = "bearpelt"
item_state = "bearpelt"
- flags = BLOCKHAIR
+ flags = FPRINT | TABLEPASS | BLOCKHAIR
/obj/item/clothing/head/xenos
name = "xenos helmet"
icon_state = "xenos"
item_state = "xenos_helm"
desc = "A helmet made out of chitinous alien hide."
- flags = BLOCKHAIR
+ flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index 13e81e07a56..13980d915db 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -16,6 +16,29 @@
flags_inv = HIDEFACE
w_class = 2
+/obj/item/clothing/mask/luchador/speechModification(message)
+ if(copytext(message, 1, 2) != "*")
+ message = replacetext(message, "captain", "CAPITÁN")
+ message = replacetext(message, "station", "ESTACIÓN")
+ message = replacetext(message, "sir", "SEÑOR")
+ message = replacetext(message, "the ", "el ")
+ message = replacetext(message, "my ", "mi ")
+ message = replacetext(message, "is ", "es ")
+ message = replacetext(message, "it's", "es")
+ message = replacetext(message, "friend", "amigo")
+ message = replacetext(message, "buddy", "amigo")
+ message = replacetext(message, "hello", "hola")
+ message = replacetext(message, " hot", " caliente")
+ message = replacetext(message, " very ", " muy ")
+ message = replacetext(message, "sword", "espada")
+ message = replacetext(message, "library", "biblioteca")
+ message = replacetext(message, "traitor", "traidor")
+ message = replacetext(message, "wizard", "mago")
+ message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image.
+ if(prob(25))
+ message += " OLE!"
+ return message
+
/obj/item/clothing/mask/luchador/tecnicos
name = "Tecnicos Mask"
desc = "Worn by robust fighters who uphold justice and fight honorably."
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index ff9b79f2005..91e10749606 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -199,6 +199,28 @@
item_state = "s-ninja_mask"
vchange = 1
+/obj/item/clothing/mask/gas/voice/space_ninja/speechModification(message)
+ if(voice == "Unknown")
+ if(copytext(message, 1, 2) != "*")
+ var/list/temp_message = text2list(message, " ")
+ var/list/pick_list = list()
+ for(var/i = 1, i <= temp_message.len, i++)
+ pick_list += i
+ for(var/i=1, i <= abs(temp_message.len/3), i++)
+ var/H = pick(pick_list)
+ if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
+ temp_message[H] = ninjaspeak(temp_message[H])
+ pick_list -= H
+ message = dd_list2text(temp_message, " ")
+ message = replacetext(message, "o", "¤")
+ message = replacetext(message, "p", "þ")
+ message = replacetext(message, "l", "£")
+ message = replacetext(message, "s", "§")
+ message = replacetext(message, "u", "µ")
+ message = replacetext(message, "b", "ß")
+ return message
+
+
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 003c57dd6aa..17aec60cfeb 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -55,4 +55,10 @@
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
- var/voicechange = 0
\ No newline at end of file
+ var/voicechange = 0
+
+/obj/item/clothing/mask/horsehead/speechModification(message)
+ if(voicechange)
+ if(!(copytext(message, 1, 2) == "*" || (usr.mind && usr.mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":ï"))))
+ message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
+ return message
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 3eb9e044d4f..41ddbb312f6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -458,13 +458,12 @@
target_zone = user.zone_sel.selecting
// If targeting the head, see if the head item is thin enough.
// If targeting anything else, see if the wear suit is thin enough.
- switch(target_zone)
- if("head")
- if(head && head.flags & THICKMATERIAL)
- . = 0
- else
- if(wear_suit && wear_suit.flags & THICKMATERIAL)
- . = 0
+ if(above_neck(target_zone))
+ if(head && head.flags & THICKMATERIAL)
+ . = 0
+ else
+ if(wear_suit && wear_suit.flags & THICKMATERIAL)
+ . = 0
if(!. && error_msg && user)
// Might need re-wording.
- user << "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"]."
+ user << "There is no exposed flesh or thin material [above_neck(target_zone) ? "on their head" : "on their body"]."
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d5bdc8cbd69..ffef68d2f61 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -996,15 +996,15 @@
if(hurtdamage)
var/image/I
switch(hurtdamage)
- if(10 to 25)
+ if(35 to 45)
I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay1")
- if(25 to 40)
+ if(45 to 55)
I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay2")
- if(40 to 55)
+ if(55 to 65)
I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay3")
- if(55 to 70)
+ if(65 to 75)
I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay4")
- if(70 to 85)
+ if(75 to 85)
I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay5")
if(85 to INFINITY)
I = image("icon" = 'icons/mob/screen_full.dmi', "icon_state" = "brutedamageoverlay6")
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index aa9ea615239..73a7961d649 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -55,52 +55,7 @@
message = dd_list2text(temp_message, " ")
if(wear_mask)
- if(istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja) && wear_mask:voice == "Unknown")
- if(copytext(message, 1, 2) != "*")
- var/list/temp_message = text2list(message, " ")
- var/list/pick_list = list()
- for(var/i = 1, i <= temp_message.len, i++)
- pick_list += i
- for(var/i=1, i <= abs(temp_message.len/3), i++)
- var/H = pick(pick_list)
- if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
- temp_message[H] = ninjaspeak(temp_message[H])
- pick_list -= H
- message = dd_list2text(temp_message, " ")
- message = replacetext(message, "o", "¤")
- message = replacetext(message, "p", "þ")
- message = replacetext(message, "l", "£")
- message = replacetext(message, "s", "§")
- message = replacetext(message, "u", "µ")
- message = replacetext(message, "b", "ß")
-
- else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
- if(copytext(message, 1, 2) != "*")
- message = replacetext(message, "captain", "CAPITÁN")
- message = replacetext(message, "station", "ESTACIÓN")
- message = replacetext(message, "sir", "SEÑOR")
- message = replacetext(message, "the ", "el ")
- message = replacetext(message, "my ", "mi ")
- message = replacetext(message, "is ", "es ")
- message = replacetext(message, "it's", "es")
- message = replacetext(message, "friend", "amigo")
- message = replacetext(message, "buddy", "amigo")
- message = replacetext(message, "hello", "hola")
- message = replacetext(message, " hot", " caliente")
- message = replacetext(message, " very ", " muy ")
- message = replacetext(message, "sword", "espada")
- message = replacetext(message, "library", "biblioteca")
- message = replacetext(message, "traitor", "traidor")
- message = replacetext(message, "wizard", "mago")
- message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image.
- if(prob(25))
- message += " OLE!"
-
- else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
- var/obj/item/clothing/mask/horsehead/hoers = wear_mask
- if(hoers.voicechange)
- if(!(copytext(message, 1, 2) == "*" || (mind && mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":ï"))))
- message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
+ message = wear_mask.speechModification(message)
if ((HULK in mutations) && health >= 25 && length(message))
if(copytext(message, 1, 2) != "*")
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 43b05920d33..d5ec65900b0 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -44,24 +44,8 @@
var/italics = 1
var/message_range = 1
- if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)&&src.wear_mask:voice=="Unknown")
- if(copytext(message, 1, 2) != "*")
- var/list/temp_message = text2list(message, " ")
- var/list/pick_list = list()
- for(var/i = 1, i <= temp_message.len, i++)
- pick_list += i
- for(var/i=1, i <= abs(temp_message.len/3), i++)
- var/H = pick(pick_list)
- if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
- temp_message[H] = ninjaspeak(temp_message[H])
- pick_list -= H
- message = dd_list2text(temp_message, " ")
- message = replacetext(message, "o", "¤")
- message = replacetext(message, "p", "þ")
- message = replacetext(message, "l", "£")
- message = replacetext(message, "s", "§")
- message = replacetext(message, "u", "µ")
- message = replacetext(message, "b", "ß")
+ if(src.wear_mask)
+ message = wear_mask.speechModification(message)
if (src.stuttering)
message = stutter(message)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 5539a1b74a3..27aaae5e1a0 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -142,20 +142,7 @@ var/list/department_radio_keys = list(
// :downs:
if (getBrainLoss() >= 60)
- message = replacetext(message, " am ", " ")
- message = replacetext(message, " is ", " ")
- message = replacetext(message, " are ", " ")
- message = replacetext(message, "you", "u")
- message = replacetext(message, "help", "halp")
- message = replacetext(message, "grief", "grife")
- message = replacetext(message, "space", "spess")
- message = replacetext(message, "carp", "crap")
- message = replacetext(message, "reason", "raisin")
- if(prob(50))
- message = uppertext(message)
- message += "[stutter(pick("!", "!!", "!!!"))]"
- if(!stuttering && prob(15))
- message = stutter(message)
+ message = derpspeech(message, stuttering)
if (stuttering)
message = stutter(message)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 1d109b80f5b..ecbb91f74b6 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -169,6 +169,12 @@ proc/isorgan(A)
return zone
+/proc/above_neck(zone)
+ var/list/zones = list("head", "mouth", "eyes")
+ if(zones.Find(zone))
+ return 1
+ else
+ return 0
/proc/stars(n, pr)
if (pr == null)
@@ -215,6 +221,23 @@ proc/isorgan(A)
p++//for each letter p is increased to find where the next letter will be.
return copytext(sanitize(t),1,MAX_MESSAGE_LEN)
+/proc/derpspeech(message, stuttering)
+ message = replacetext(message, " am ", " ")
+ message = replacetext(message, " is ", " ")
+ message = replacetext(message, " are ", " ")
+ message = replacetext(message, "you", "u")
+ message = replacetext(message, "help", "halp")
+ message = replacetext(message, "grief", "grife")
+ message = replacetext(message, "space", "spess")
+ message = replacetext(message, "carp", "crap")
+ message = replacetext(message, "reason", "raisin")
+ if(prob(50))
+ message = uppertext(message)
+ message += "[stutter(pick("!", "!!", "!!!"))]"
+ if(!stuttering && prob(15))
+ message = stutter(message)
+ return message
+
proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added
/* Turn text into complete gibberish! */
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index b319ea8ab8d..d2e0a4063f3 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -80,7 +80,7 @@
on_hit(var/atom/target, var/blocked = 0, var/hit_zone)
if(istype(target, /mob/living/carbon))
var/mob/living/carbon/M = target
- if(M.can_inject(target_zone = hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
reagents.trans_to(M, reagents.total_volume)
return 1
else
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 2e790b36383..b7d19dea00d 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -193,6 +193,9 @@ proc/wabbajack(mob/living/M)
for (var/obj/effect/proc_holder/spell/S in M.spell_list)
new_mob.spell_list += new S.type
+ new_mob.attack_log = M.attack_log
+ M.attack_log += text("\[[time_stamp()]\] [M.real_name] ([M.ckey]) became [new_mob.real_name].")
+
new_mob.a_intent = "harm"
if(M.mind)
M.mind.transfer_to(new_mob)
diff --git a/html/changelog.html b/html/changelog.html
index b9f40f238ac..4d1fade3f8a 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -52,7 +52,25 @@ should be listed in the changelog upon commit tho. Thanks. -->
-
+
+
+