Merge branch 'master' into master
This commit is contained in:
@@ -57,7 +57,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/proc/blob_chat(msg)
|
||||
var/spanned_message = say_quote(msg, get_spans())
|
||||
var/spanned_message = say_quote(msg)
|
||||
var/rendered = "<font color=\"#EE4000\"><b>\[Blob Telepathy\] [real_name]</b> [spanned_message]</font>"
|
||||
for(var/M in GLOB.mob_list)
|
||||
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
|
||||
|
||||
@@ -210,7 +210,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
|
||||
src.log_talk(message, LOG_SAY)
|
||||
|
||||
var/message_a = say_quote(message, get_spans())
|
||||
var/message_a = say_quote(message)
|
||||
var/rendered = "<span class='big'><font color=\"#EE4000\"><b>\[Blob Telepathy\] [name](<font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>)</b> [message_a]</font></span>"
|
||||
|
||||
for(var/mob/M in GLOB.mob_list)
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
heat_protection = CHEST|GROIN|LEGS
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel)
|
||||
allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/holyoil)
|
||||
|
||||
/obj/item/clothing/suit/armor/clockwork/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
bubble_icon = "clock"
|
||||
light_color = "#E42742"
|
||||
death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg'
|
||||
speech_span = SPAN_ROBOT
|
||||
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
|
||||
var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates
|
||||
|
||||
@@ -26,9 +27,6 @@
|
||||
. = ..()
|
||||
update_values()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/Login()
|
||||
..()
|
||||
add_servant_of_ratvar(src, TRUE)
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
deathmessage = "explodes with a sharp pop!"
|
||||
light_color = LIGHT_COLOR_CYAN
|
||||
hud_type = /datum/hud/swarmer
|
||||
speech_span = SPAN_ROBOT
|
||||
var/resources = 0 //Resource points, generated by consuming metal/glass
|
||||
var/max_resources = 100
|
||||
|
||||
@@ -126,9 +127,6 @@
|
||||
if(statpanel("Status"))
|
||||
stat("Resources:",resources)
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/emp_act()
|
||||
. = ..()
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
@@ -666,7 +664,7 @@
|
||||
set_light(0)
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg)
|
||||
var/rendered = "<B>Swarm communication - [src]</b> [say_quote(msg, get_spans())]"
|
||||
var/rendered = "<B>Swarm communication - [src]</b> [say_quote(msg)]"
|
||||
for(var/i in GLOB.mob_list)
|
||||
var/mob/M = i
|
||||
if(isswarmer(M))
|
||||
|
||||
@@ -167,10 +167,11 @@
|
||||
on = FALSE
|
||||
update_icon()
|
||||
playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
|
||||
radio.talk_into(src, "Patient fully restored", radio_channel, get_spans(), get_default_language())
|
||||
var/msg = "Patient fully restored."
|
||||
if(autoeject) // Eject if configured.
|
||||
radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language())
|
||||
msg += " Auto ejecting patient now."
|
||||
open_machine()
|
||||
radio.talk_into(src, msg, radio_channel)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air1 = airs[1]
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
. = ..()
|
||||
siemens_coefficient = pick(0,0,0,0.5,0.5,0.5,0.75)
|
||||
|
||||
/obj/item/clothing/gloves/cut
|
||||
/obj/item/clothing/gloves/cut
|
||||
desc = "These gloves would protect the wearer from electric shock.. if the fingers were covered."
|
||||
name = "fingerless insulated gloves"
|
||||
icon_state = "yellowcut"
|
||||
@@ -218,32 +218,3 @@
|
||||
|
||||
/obj/item/clothing/gloves/color/white/redcoat
|
||||
item_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
|
||||
|
||||
/obj/item/clothing/gloves/color/random
|
||||
name = "random gloves"
|
||||
desc = "These gloves are supposed to be a random color..."
|
||||
icon_state = "random_gloves"
|
||||
item_state = "wgloves"
|
||||
item_color = "mime"
|
||||
|
||||
/obj/item/clothing/gloves/color/random/Initialize()
|
||||
..()
|
||||
var/list/gloves = list(
|
||||
/obj/item/clothing/gloves/color/orange = 1,
|
||||
/obj/item/clothing/gloves/color/red = 1,
|
||||
/obj/item/clothing/gloves/color/blue = 1,
|
||||
/obj/item/clothing/gloves/color/purple = 1,
|
||||
/obj/item/clothing/gloves/color/green = 1,
|
||||
/obj/item/clothing/gloves/color/grey = 1,
|
||||
/obj/item/clothing/gloves/color/light_brown = 1,
|
||||
/obj/item/clothing/gloves/color/brown = 1,
|
||||
/obj/item/clothing/gloves/color/white = 1,
|
||||
/obj/item/clothing/gloves/color/rainbow = 1)
|
||||
|
||||
var/obj/item/clothing/gloves/color/selected = pick(gloves)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.equip_to_slot_or_del(new selected(H), SLOT_GLOVES)
|
||||
else
|
||||
new selected(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -186,33 +186,41 @@
|
||||
mode = DRILL_CANADIAN
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/warden/drill/speechModification(M)
|
||||
if(copytext(M, 1, 2) != "*")
|
||||
if(mode == DRILL_DEFAULT)
|
||||
M = " [M]"
|
||||
return trim(M)
|
||||
if(mode == DRILL_SHOUTING)
|
||||
M = " [M]!"
|
||||
return trim(M)
|
||||
if(mode == DRILL_YELLING)
|
||||
M = " [M]!!"
|
||||
return trim(M)
|
||||
if(mode == DRILL_CANADIAN)
|
||||
M = " [M]"
|
||||
var/list/canadian_words = strings("canadian_replacement.json", "canadian")
|
||||
/obj/item/clothing/head/warden/drill/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
if (slot == SLOT_HEAD)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
for(var/key in canadian_words)
|
||||
var/value = canadian_words[key]
|
||||
if(islist(value))
|
||||
value = pick(value)
|
||||
/obj/item/clothing/head/warden/drill/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]")
|
||||
M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]")
|
||||
M = replacetextEx(M, " [key]", " [value]")
|
||||
/obj/item/clothing/head/warden/drill/proc/handle_speech(datum/source, mob/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
switch (mode)
|
||||
if(DRILL_SHOUTING)
|
||||
message += "!"
|
||||
if(DRILL_YELLING)
|
||||
message += "!!"
|
||||
if(DRILL_CANADIAN)
|
||||
message = " [message]"
|
||||
var/list/canadian_words = strings("canadian_replacement.json", "canadian")
|
||||
|
||||
if(prob(30))
|
||||
M += pick(", eh?", ", EH?")
|
||||
return trim(M)
|
||||
for(var/key in canadian_words)
|
||||
var/value = canadian_words[key]
|
||||
if(islist(value))
|
||||
value = pick(value)
|
||||
|
||||
message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]")
|
||||
message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]")
|
||||
message = replacetextEx(message, " [key]", " [value]")
|
||||
|
||||
if(prob(30))
|
||||
message += pick(", eh?", ", EH?")
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
/obj/item/clothing/head/beret/sec
|
||||
name = "security beret"
|
||||
|
||||
@@ -330,9 +330,21 @@
|
||||
icon_state = "beretblack"
|
||||
dynamic_hair_suffix = ""
|
||||
|
||||
/obj/item/clothing/head/frenchberet/speechModification(M)
|
||||
if(copytext(M, 1, 2) != "*")
|
||||
M = " [M]"
|
||||
/obj/item/clothing/head/frenchberet/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
if (slot == SLOT_HEAD)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/clothing/head/frenchberet/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/clothing/head/frenchberet/proc/handle_speech(datum/source, mob/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
message = " [message]"
|
||||
var/list/french_words = strings("french_replacement.json", "french")
|
||||
|
||||
for(var/key in french_words)
|
||||
@@ -340,10 +352,10 @@
|
||||
if(islist(value))
|
||||
value = pick(value)
|
||||
|
||||
M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]")
|
||||
M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]")
|
||||
M = replacetextEx(M, " [key]", " [value]")
|
||||
message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]")
|
||||
message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]")
|
||||
message = replacetextEx(message, " [key]", " [value]")
|
||||
|
||||
if(prob(3))
|
||||
M += pick(" Honh honh honh!"," Honh!"," Zut Alors!")
|
||||
return trim(M)
|
||||
message += pick(" Honh honh honh!"," Honh!"," Zut Alors!")
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
@@ -5,12 +5,54 @@
|
||||
slot_flags = ITEM_SLOT_MASK
|
||||
strip_delay = 40
|
||||
equip_delay_other = 40
|
||||
var/modifies_speech = FALSE
|
||||
var/mask_adjusted = 0
|
||||
var/adjusted_flags = null
|
||||
var/muzzle_var = NORMAL_STYLE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //most masks have overrides, but not all probably.
|
||||
|
||||
|
||||
/obj/item/clothing/mask/attack_self(mob/user)
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
TOGGLE_BITFIELD(clothing_flags, VOICEBOX_DISABLED)
|
||||
var/status = !CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)
|
||||
to_chat(user, "<span class='notice'>You turn the voice box in [src] [status ? "on" : "off"].</span>")
|
||||
|
||||
/obj/item/clothing/mask/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
if (slot == SLOT_WEAR_MASK && modifies_speech)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
if(!ishuman(M))
|
||||
return
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
if(mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
H.update_inv_wear_mask()
|
||||
|
||||
/obj/item/clothing/mask/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/clothing/mask/proc/handle_speech()
|
||||
|
||||
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
@@ -20,31 +62,6 @@
|
||||
IF_HAS_BLOOD_DNA(src)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
|
||||
|
||||
/obj/item/clothing/mask/equipped(mob/user, slot)
|
||||
..()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
if(mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
H.update_inv_wear_mask()
|
||||
|
||||
|
||||
/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
|
||||
..()
|
||||
if(ismob(loc))
|
||||
|
||||
@@ -20,9 +20,11 @@
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/luchador/speechModification(message)
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
/obj/item/clothing/mask/luchador/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
message = replacetext(message, "captain", "CAPITÁN")
|
||||
message = replacetext(message, "station", "ESTACIÓN")
|
||||
message = replacetext(message, "sir", "SEÑOR")
|
||||
@@ -42,7 +44,7 @@
|
||||
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
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
/obj/item/clothing/mask/luchador/tecnicos
|
||||
name = "Tecnicos Mask"
|
||||
|
||||
@@ -46,10 +46,12 @@
|
||||
/obj/item/clothing/mask/fakemoustache/italian
|
||||
name = "italian moustache"
|
||||
desc = "Made from authentic Italian moustache hairs. Gives the wearer an irresistable urge to gesticulate wildly."
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/italian/speechModification(M)
|
||||
if(copytext(M, 1, 2) != "*")
|
||||
M = " [M]"
|
||||
/obj/item/clothing/mask/fakemoustache/italian/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
message = " [message]"
|
||||
var/list/italian_words = strings("italian_replacement.json", "italian")
|
||||
|
||||
for(var/key in italian_words)
|
||||
@@ -57,13 +59,13 @@
|
||||
if(islist(value))
|
||||
value = pick(value)
|
||||
|
||||
M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]")
|
||||
M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]")
|
||||
M = replacetextEx(M, " [key]", " [value]")
|
||||
message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]")
|
||||
message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]")
|
||||
message = replacetextEx(message, " [key]", " [value]")
|
||||
|
||||
if(prob(3))
|
||||
M += pick(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!")
|
||||
return trim(M)
|
||||
message += pick(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!")
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
/obj/item/clothing/mask/joy
|
||||
name = "joy mask"
|
||||
@@ -77,32 +79,20 @@
|
||||
icon_state = "pig"
|
||||
item_state = "pig"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
clothing_flags = VOICEBOX_TOGGLABLE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/toggle_voice_box)
|
||||
var/voicechange = 0
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/pig/attack_self(mob/user)
|
||||
voicechange = !voicechange
|
||||
to_chat(user, "<span class='notice'>You turn the voice box [voicechange ? "on" : "off"]!</span>")
|
||||
/obj/item/clothing/mask/pig/handle_speech(datum/source, list/speech_args)
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("Oink!","Squeeeeeeee!","Oink Oink!")
|
||||
|
||||
/obj/item/clothing/mask/pig/speechModification(message)
|
||||
if(voicechange)
|
||||
message = pick("Oink!","Squeeeeeeee!","Oink Oink!")
|
||||
return message
|
||||
|
||||
/obj/item/clothing/mask/spig //needs to be different otherwise you could turn the speedmodification off and on
|
||||
/obj/item/clothing/mask/pig/cursed //needs to be different otherwise you could turn the speedmodification off and on
|
||||
name = "Pig face"
|
||||
desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!" //It's only ever going to be attached to your face.
|
||||
icon_state = "pig"
|
||||
item_state = "pig"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/voicechange = 1
|
||||
|
||||
/obj/item/clothing/mask/spig/speechModification(message)
|
||||
if(voicechange)
|
||||
message = pick("Oink!","Squeeeeeeee!","Oink Oink!")
|
||||
return message
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
clothing_flags = NONE
|
||||
item_flags = NODROP
|
||||
|
||||
///frog mask - reeee!!
|
||||
/obj/item/clothing/mask/frog
|
||||
@@ -112,47 +102,47 @@
|
||||
item_state = "frog"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/voicechange = TRUE
|
||||
clothing_flags = VOICEBOX_TOGGLABLE
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/frog/attack_self(mob/user)
|
||||
voicechange = !voicechange
|
||||
to_chat(user, "<span class='notice'>You turn the voice box [voicechange ? "on" : "off"]!</span>")
|
||||
|
||||
/obj/item/clothing/mask/frog/speechModification(message) //whenever you speak
|
||||
if(voicechange)
|
||||
/obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
if(prob(5)) //sometimes, the angry spirit finds others words to speak.
|
||||
message = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!")
|
||||
speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!")
|
||||
else
|
||||
message = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish,
|
||||
return message
|
||||
speech_args[SPEECH_MESSAGE] = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish,
|
||||
|
||||
/obj/item/clothing/mask/frog/cursed
|
||||
clothing_flags = NONE
|
||||
item_flags = NODROP //reee!!
|
||||
|
||||
/obj/item/clothing/mask/frog/cursed/attack_self(mob/user)
|
||||
return //no voicebox to alter.
|
||||
|
||||
/obj/item/clothing/mask/frog/cursed/equipped(mob/user, slot)
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.wear_mask == src)
|
||||
to_chat(user, "<span class='warning'><B>[src] was cursed! Ree!!</B></span>")
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/clothing/mask/cowmask
|
||||
name = "Cowface"
|
||||
desc = "It looks like a mask, but closer inspection reveals it's melded onto this persons face!"
|
||||
name = "Cow mask"
|
||||
desc = "A rubber cow mask,"
|
||||
icon = 'icons/mob/mask.dmi'
|
||||
icon_state = "cowmask"
|
||||
item_state = "cowmask"
|
||||
clothing_flags = VOICEBOX_TOGGLABLE
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/voicechange = 1
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/cowmask/speechModification(message)
|
||||
if(voicechange)
|
||||
message = pick("Moooooooo!","Moo!","Moooo!")
|
||||
return message
|
||||
/obj/item/clothing/mask/cowmask/handle_speech(datum/source, list/speech_args)
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!")
|
||||
|
||||
/obj/item/clothing/mask/cowmask/cursed
|
||||
name = "cow face"
|
||||
desc = "It looks like a cow mask, but closer inspection reveals it's melded onto this persons face!"
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
clothing_flags = NONE
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/horsehead
|
||||
name = "horse head mask"
|
||||
@@ -161,12 +151,18 @@
|
||||
item_state = "horsehead"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEYES|HIDEEARS
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/voicechange = 1
|
||||
clothing_flags = VOICEBOX_TOGGLABLE
|
||||
|
||||
/obj/item/clothing/mask/horsehead/speechModification(message)
|
||||
if(voicechange)
|
||||
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
return message
|
||||
/obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args)
|
||||
if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED))
|
||||
speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
|
||||
/obj/item/clothing/mask/horsehead/cursed
|
||||
name = "horse face"
|
||||
desc = "It initially looks like a mask, but it's melded into the poor person's face."
|
||||
clothing_flags = NONE
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/rat
|
||||
name = "rat mask"
|
||||
@@ -285,16 +281,18 @@
|
||||
item_state = "gondola"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/gondola/speechModification(M)
|
||||
if(copytext(M, 1, 2) != "*")
|
||||
M = " [M]"
|
||||
/obj/item/clothing/mask/gondola/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
message = " [message]"
|
||||
var/list/spurdo_words = strings("spurdo_replacement.json", "spurdo")
|
||||
for(var/key in spurdo_words)
|
||||
var/value = spurdo_words[key]
|
||||
if(islist(value))
|
||||
value = pick(value)
|
||||
M = replacetextEx(M,regex(uppertext(key),"g"), "[uppertext(value)]")
|
||||
M = replacetextEx(M,regex(capitalize(key),"g"), "[capitalize(value)]")
|
||||
M = replacetextEx(M,regex(key,"g"), "[value]")
|
||||
return trim(M)
|
||||
message = replacetextEx(message,regex(uppertext(key),"g"), "[uppertext(value)]")
|
||||
message = replacetextEx(message,regex(capitalize(key),"g"), "[capitalize(value)]")
|
||||
message = replacetextEx(message,regex(key,"g"), "[value]")
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses
|
||||
name = "combat boots"
|
||||
desc = "High speed, low drag combat boots."
|
||||
icon_state = "jackboots"
|
||||
icon_state = "combat"
|
||||
item_state = "jackboots"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
|
||||
@@ -689,7 +689,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
|
||||
chosen = capitalize(pick(speak_messages))
|
||||
chosen = replacetext(chosen, "%TARGETNAME%", target_name)
|
||||
var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER)
|
||||
var/message = target.compose_message(person,understood_language,chosen,null,person.get_spans(),face_name = TRUE)
|
||||
var/message = target.compose_message(person,understood_language,chosen,null,list(person.speech_span),face_name = TRUE)
|
||||
feedback_details += "Type: Talk, Source: [person.real_name], Message: [message]"
|
||||
to_chat(target, message)
|
||||
if(target.client)
|
||||
@@ -705,7 +705,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
humans += H
|
||||
person = pick(humans)
|
||||
var/message = target.compose_message(person,understood_language,chosen,"[FREQ_COMMON]",person.get_spans(),face_name = TRUE)
|
||||
var/message = target.compose_message(person,understood_language,chosen,"[FREQ_COMMON]",list(person.speech_span),face_name = TRUE)
|
||||
feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]"
|
||||
to_chat(target, message)
|
||||
qdel(src)
|
||||
|
||||
@@ -202,6 +202,19 @@
|
||||
desc = "A flask of holy water...it's been sitting in the Necropolis a while though."
|
||||
list_reagents = list("hell_water" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/holyoil
|
||||
name = "flask of zelus oil"
|
||||
desc = "A brass flask of Zelus oil, a viscous fluid with a scenting of brass - this flask may be sipped or thrown."
|
||||
icon_state = "zelusflask"
|
||||
list_reagents = list("holyoil" = 30) //Powerfull
|
||||
volume = 30
|
||||
foodtype = NONE
|
||||
force = 12 //Same as a toolbox
|
||||
throwforce = 18
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/holyoil/null
|
||||
list_reagents = list("holyoil" = 0)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/vermouth
|
||||
name = "Goldeneye vermouth"
|
||||
desc = "Sweet, sweet dryness~"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
H.adjust_blurriness(1)
|
||||
H.visible_message("<span class='warning'>[H] is creamed by [src]!</span>", "<span class='userdanger'>You've been creamed by [src]!</span>")
|
||||
playsound(H, "desceration", 50, TRUE)
|
||||
reagents.trans_to(H,15) //Transfers the cream pies total volume of reagents to target on it
|
||||
reagents.trans_to(H,15) //Cream pie combat
|
||||
if(!H.creamed) // one layer at a time
|
||||
H.add_overlay(creamoverlay)
|
||||
H.creamed = TRUE
|
||||
@@ -61,6 +61,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pie/cream/nostun
|
||||
list_reagents = list("laughter" = 15)
|
||||
stunning = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pie/cream/body
|
||||
|
||||
@@ -112,7 +112,7 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
else
|
||||
if(!(obj_flags & EMAGGED))
|
||||
Radio.set_frequency(FREQ_SECURITY)
|
||||
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY, get_spans(), get_default_language())
|
||||
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY)
|
||||
to_chat(usr, "<span class='notice'>Shuttle received message and will be sent shortly.</span>")
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/proc/check_auth()
|
||||
@@ -149,7 +149,7 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
var/obj/item/stack/sheet/inp = I
|
||||
points += inp.point_value * inp.amount
|
||||
return ..()
|
||||
|
||||
|
||||
/**********************Point Lookup Console**************************/
|
||||
/obj/machinery/mineral/labor_points_checker
|
||||
name = "points checking console"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
var/datum/dna/stored/stored_dna // dna var for brain. Used to store dna, brain dna is not considered like actual dna, brain.has_dna() returns FALSE.
|
||||
stat = DEAD //we start dead by default
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
speech_span = SPAN_ROBOT
|
||||
|
||||
/mob/living/brain/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -10,14 +10,11 @@
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/brain/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
/mob/living/brain/radio(message, message_mode, list/spans, language)
|
||||
if(message_mode == MODE_HEADSET && istype(container, /obj/item/mmi))
|
||||
var/obj/item/mmi/R = container
|
||||
if(R.radio)
|
||||
R.radio.talk_into(src, message, , get_spans(), language)
|
||||
R.radio.talk_into(src, message, language = language)
|
||||
return ITALICS | REDUCE_RANGE
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
if(!message)
|
||||
return
|
||||
|
||||
var/message_a = say_quote(message, get_spans())
|
||||
var/message_a = say_quote(message)
|
||||
var/rendered = "<i><span class='alien'>Hivemind, <span class='name'>[shown_name]</span> <span class='message'>[message_a]</span></span></i>"
|
||||
for(var/mob/S in GLOB.player_list)
|
||||
if(!S.stat && S.hivecheck())
|
||||
|
||||
@@ -10,29 +10,6 @@
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/treat_message(message)
|
||||
message = dna.species.handle_speech(message,src)
|
||||
if(diseases.len)
|
||||
for(var/datum/disease/pierrot_throat/D in diseases)
|
||||
var/list/temp_message = splittext(message, " ") //List each word in the message
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line
|
||||
pick_list += i
|
||||
for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++) //Loop for each stage of the disease or until we run out of words
|
||||
if(prob(3 * D.stage)) //Stage 1: 3% Stage 2: 6% Stage 3: 9% Stage 4: 12%
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":"))
|
||||
continue
|
||||
temp_message[H] = "HONK"
|
||||
pick_list -= H //Make sure that you dont HONK the same word twice
|
||||
message = jointext(temp_message, " ")
|
||||
message = ..(message)
|
||||
message = dna.mutations_say_mods(message)
|
||||
return message
|
||||
|
||||
/mob/living/carbon/human/get_spans()
|
||||
return ..() | dna.mutations_get_spans() | dna.species_get_spans()
|
||||
|
||||
/mob/living/carbon/human/GetVoice()
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/chameleon))
|
||||
var/obj/item/clothing/mask/chameleon/V = wear_mask
|
||||
|
||||
@@ -1158,13 +1158,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
return 1
|
||||
return FALSE
|
||||
|
||||
/datum/species/proc/handle_speech(message, mob/living/carbon/human/H)
|
||||
return message
|
||||
|
||||
//return a list of spans or an empty list
|
||||
/datum/species/proc/get_spans()
|
||||
return list()
|
||||
|
||||
/datum/species/proc/check_weakness(obj/item, mob/living/attacker)
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -68,17 +68,17 @@
|
||||
|
||||
/obj/item/organ/tongue/dullahan
|
||||
zone = "abstract"
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/organ/tongue/dullahan/TongueSpeech(var/message)
|
||||
/obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args)
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(H.dna.species.id == "dullahan")
|
||||
var/datum/species/dullahan/D = H.dna.species
|
||||
if(isobj(D.myhead.loc))
|
||||
var/obj/O = D.myhead.loc
|
||||
O.say(message)
|
||||
message = ""
|
||||
return message
|
||||
O.say(speech_args[SPEECH_MESSAGE])
|
||||
speech_args[SPEECH_MESSAGE] = ""
|
||||
|
||||
/obj/item/organ/ears/dullahan
|
||||
zone = "abstract"
|
||||
|
||||
@@ -519,6 +519,11 @@
|
||||
..()
|
||||
last_banana = world.time
|
||||
last_honk = world.time
|
||||
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/species/golem/bananium/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
UnregisterSignal(C, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/species/golem/bananium/random_name(gender,unique,lastname)
|
||||
var/clown_name = pick(GLOB.clown_names)
|
||||
@@ -567,9 +572,8 @@
|
||||
/datum/species/golem/bananium/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
playsound(get_turf(H), 'sound/misc/sadtrombone.ogg', 70, 0)
|
||||
|
||||
/datum/species/golem/bananium/get_spans()
|
||||
return list(SPAN_CLOWN)
|
||||
|
||||
/datum/species/golem/bananium/proc/handle_speech(datum/source, list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_CLOWN
|
||||
|
||||
/datum/species/golem/runic
|
||||
name = "Runic Golem"
|
||||
@@ -646,14 +650,16 @@
|
||||
/datum/species/golem/clockwork/on_species_gain(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
H.faction |= "ratvar"
|
||||
RegisterSignal(H, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/species/golem/clockwork/on_species_loss(mob/living/carbon/human/H)
|
||||
if(!is_servant_of_ratvar(H))
|
||||
H.faction -= "ratvar"
|
||||
UnregisterSignal(H, COMSIG_MOB_SAY)
|
||||
. = ..()
|
||||
|
||||
/datum/species/golem/clockwork/get_spans()
|
||||
return SPAN_ROBOT //beep
|
||||
/datum/species/golem/clockwork/proc/handle_speech(datum/source, list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT //beep
|
||||
|
||||
/datum/species/golem/clockwork/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
gibbed = !has_corpse ? FALSE : gibbed
|
||||
@@ -951,7 +957,7 @@
|
||||
sexes = FALSE
|
||||
fixed_mut_color = "ffffff"
|
||||
attack_verb = "rattl"
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER)
|
||||
info_text = "As a <span class='danger'>Bone Golem</span>, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
|
||||
var/datum/action/innate/bonechill/bonechill
|
||||
|
||||
@@ -28,6 +28,11 @@
|
||||
/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
|
||||
..()
|
||||
assume_disguise(old_species, H)
|
||||
RegisterSignal(H, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/datum/species/synth/on_species_loss(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
UnregisterSignal(H, COMSIG_MOB_SAY)
|
||||
|
||||
/datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
|
||||
if(chem.id == "synthflesh")
|
||||
@@ -110,18 +115,12 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/species/synth/get_spans()
|
||||
if(fake_species)
|
||||
return fake_species.get_spans()
|
||||
return list()
|
||||
|
||||
|
||||
/datum/species/synth/handle_speech(message, mob/living/carbon/human/H)
|
||||
if(H.health > disguise_fail_health)
|
||||
if(fake_species)
|
||||
return fake_species.handle_speech(message,H)
|
||||
else
|
||||
return ..()
|
||||
else
|
||||
return ..()
|
||||
/datum/species/synth/proc/handle_speech(datum/source, list/speech_args)
|
||||
if (isliving(source)) // yeah it's gonna be living but just to be clean
|
||||
var/mob/living/L = source
|
||||
if(fake_species && L.health > disguise_fail_health)
|
||||
switch (fake_species.type)
|
||||
if (/datum/species/golem/bananium)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_CLOWN
|
||||
if (/datum/species/golem/clockwork)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
|
||||
@@ -1,38 +1,17 @@
|
||||
/mob/living/carbon/treat_message(message)
|
||||
for(var/datum/brain_trauma/trauma in get_traumas())
|
||||
message = trauma.on_say(message)
|
||||
message = ..(message)
|
||||
|
||||
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
|
||||
if(!T) //hoooooouaah!
|
||||
var/regex/tongueless_lower = new("\[gdntke]+", "g")
|
||||
var/regex/tongueless_upper = new("\[GDNTKE]+", "g")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = tongueless_lower.Replace(message, pick("aa","oo","'"))
|
||||
message = tongueless_upper.Replace(message, pick("AA","OO","'"))
|
||||
else
|
||||
message = T.TongueSpeech(message)
|
||||
if(wear_mask)
|
||||
message = wear_mask.speechModification(message)
|
||||
if(head)
|
||||
message = head.speechModification(message)
|
||||
return message
|
||||
/mob/living/carbon/proc/handle_tongueless_speech(mob/living/carbon/speaker, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
var/static/regex/tongueless_lower = new("\[gdntke]+", "g")
|
||||
var/static/regex/tongueless_upper = new("\[GDNTKE]+", "g")
|
||||
if(message[1] != "*")
|
||||
message = tongueless_lower.Replace(message, pick("aa","oo","'"))
|
||||
message = tongueless_upper.Replace(message, pick("AA","OO","'"))
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
/mob/living/carbon/can_speak_vocal(message)
|
||||
if(silent)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/get_spans()
|
||||
. = ..()
|
||||
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
|
||||
if(T)
|
||||
. |= T.get_spans()
|
||||
|
||||
var/obj/item/I = get_active_held_item()
|
||||
if(I)
|
||||
. |= I.get_held_item_speechspans(src)
|
||||
|
||||
/mob/living/carbon/could_speak_in_language(datum/language/dt)
|
||||
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
|
||||
if(T)
|
||||
|
||||
@@ -175,13 +175,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
else
|
||||
src.log_talk(message, LOG_SAY, forced_by=forced)
|
||||
|
||||
message = treat_message(message)
|
||||
message = treat_message(message) // unfortunately we still need this
|
||||
var/sigreturn = SEND_SIGNAL(src, COMSIG_MOB_SAY, args)
|
||||
if (sigreturn & COMPONENT_UPPERCASE_SPEECH)
|
||||
message = uppertext(message)
|
||||
if(!message)
|
||||
return
|
||||
|
||||
last_words = message
|
||||
|
||||
spans |= get_spans()
|
||||
spans |= speech_span
|
||||
|
||||
if(language)
|
||||
var/datum/language/L = GLOB.language_datum_instances[language]
|
||||
@@ -333,6 +336,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return null
|
||||
|
||||
/mob/living/proc/treat_message(message)
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_UNINTELLIGIBLE_SPEECH))
|
||||
message = unintelligize(message)
|
||||
|
||||
if(derpspeech)
|
||||
message = derpspeech(message, stuttering)
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
else
|
||||
padloc = "(UNKNOWN)"
|
||||
src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]")
|
||||
send_speech(message, 7, T, "robot", get_spans(), language)
|
||||
send_speech(message, 7, T, "robot", language = language)
|
||||
to_chat(src, "<i><span class='game say'>Holopad transmitted, <span class='name'>[real_name]</span> <span class='message robot'>\"[message]\"</span></span></i>")
|
||||
else
|
||||
to_chat(src, "No holopad connected.")
|
||||
|
||||
@@ -29,6 +29,13 @@
|
||||
if(!L.temporarilyRemoveItemFromInventory(card))
|
||||
to_chat(src, "<span class='warning'>Error: Unable to expand to mobile form. Chassis is restrained by some device or person.</span>")
|
||||
return FALSE
|
||||
if(istype(card.loc, /obj/item/integrated_circuit/input/pAI_connector))
|
||||
var/obj/item/integrated_circuit/input/pAI_connector/C = card.loc
|
||||
C.RemovepAI()
|
||||
C.visible_message("<span class='notice'>[src] ejects itself from [C]!</span>")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
C.installed_pai = null
|
||||
C.push_data()
|
||||
forceMove(get_turf(card))
|
||||
card.forceMove(src)
|
||||
if(client)
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
|
||||
/mob/living/silicon/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
/mob/living/proc/robot_talk(message)
|
||||
log_talk(message, LOG_SAY)
|
||||
var/desig = "Default Cyborg" //ezmode for taters
|
||||
if(issilicon(src))
|
||||
var/mob/living/silicon/S = src
|
||||
desig = trim_left(S.designation + " " + S.job)
|
||||
var/message_a = say_quote(message, get_spans())
|
||||
var/message_a = say_quote(message)
|
||||
var/rendered = "Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span>"
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.binarycheck())
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
possible_a_intents = list(INTENT_HELP, INTENT_HARM)
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
speech_span = SPAN_ROBOT
|
||||
|
||||
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
|
||||
var/last_lawchange_announce = 0
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
verb_yell = "alarms"
|
||||
initial_language_holder = /datum/language_holder/synthetic
|
||||
bubble_icon = "machine"
|
||||
speech_span = SPAN_ROBOT
|
||||
|
||||
faction = list("neutral", "silicon" , "turret")
|
||||
|
||||
@@ -348,13 +349,10 @@
|
||||
if((!on) || (!message))
|
||||
return
|
||||
if(channel && Radio.channels[channel])// Use radio if we have channel key
|
||||
Radio.talk_into(src, message, channel, get_spans(), get_default_language())
|
||||
Radio.talk_into(src, message, channel)
|
||||
else
|
||||
say(message)
|
||||
|
||||
/mob/living/simple_animal/bot/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
/mob/living/simple_animal/bot/radio(message, message_mode, list/spans, language)
|
||||
. = ..()
|
||||
if(. != 0)
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
gender = NEUTER
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
speak_emote = list("chirps")
|
||||
speech_span = SPAN_ROBOT
|
||||
bubble_icon = "machine"
|
||||
initial_language_holder = /datum/language_holder/drone
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
/////////////
|
||||
//DRONE SAY//
|
||||
/////////////
|
||||
//Drone speach
|
||||
|
||||
/mob/living/simple_animal/drone/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
|
||||
|
||||
//Base proc for anything to call
|
||||
/proc/_alert_drones(msg, dead_can_hear = 0, atom/source, mob/living/faction_checked_mob, exact_faction_match)
|
||||
if (dead_can_hear && source)
|
||||
@@ -31,7 +21,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/proc/drone_chat(msg)
|
||||
alert_drones("<i>Drone Chat: <span class='name'>[name]</span> <span class='message'>[say_quote(msg, get_spans())]</span></i>", TRUE)
|
||||
alert_drones("<i>Drone Chat: <span class='name'>[name]</span> <span class='message'>[say_quote(msg)]</span></i>", TRUE)
|
||||
|
||||
/mob/living/simple_animal/drone/binarycheck()
|
||||
return TRUE
|
||||
|
||||
@@ -69,16 +69,11 @@
|
||||
if(name != real_name)
|
||||
alt_name = " (died as [real_name])"
|
||||
|
||||
var/K
|
||||
|
||||
if(key)
|
||||
K = src.key
|
||||
|
||||
var/spanned = src.say_quote(message, get_spans())
|
||||
var/spanned = say_quote(message)
|
||||
message = emoji_parse(message)
|
||||
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>[name]</span>[alt_name] <span class='message'>[emoji_parse(spanned)]</span></span>"
|
||||
log_talk(message, LOG_SAY, tag="DEAD")
|
||||
deadchat_broadcast(rendered, follow_target = src, speaker_key = K)
|
||||
deadchat_broadcast(rendered, follow_target = src, speaker_key = key)
|
||||
|
||||
/mob/proc/check_emote(message)
|
||||
if(copytext(message, 1, 2) == "*")
|
||||
|
||||
@@ -78,10 +78,6 @@ global procs
|
||||
say_quote(input, spans, message_mode)
|
||||
Adds a verb and quotes to a message. Also attaches span classes to a message. Verbs are determined by verb_say/verb_ask/verb_yell variables. Called on the speaker.
|
||||
|
||||
get_spans(input, spans)
|
||||
Returns the list of spans that are always applied to messages of this atom.
|
||||
Always return ..() | + youroutput when overriding this proc!
|
||||
|
||||
/mob
|
||||
say_dead(message)
|
||||
Sends a message to all dead people. Does not use Hear().
|
||||
|
||||
@@ -17,16 +17,19 @@ Contents:
|
||||
item_state = "s-ninja_mask"
|
||||
strip_delay = 120
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/clothing/mask/gas/space_ninja/speechModification(message)
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
/obj/item/clothing/mask/gas/space_ninja/handle_speech(datum/source, list/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
var/list/temp_message = text2list(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++)
|
||||
for(var/i in 1 to temp_message.len)
|
||||
pick_list += i
|
||||
for(var/i=1, i <= abs(temp_message.len/3), i++)
|
||||
for(var/i in 1 to abs(temp_message.len/3))
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
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 = list2text(temp_message, " ")
|
||||
@@ -56,5 +59,4 @@ Contents:
|
||||
message = replacetext(message, "than", "sen")
|
||||
message = replacetext(message, ".", "")
|
||||
message = lowertext(message)
|
||||
|
||||
return message
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
@@ -184,9 +184,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
to_chat(H, "<span class='danger'>You get headaches just from looking at it.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/get_spans()
|
||||
return list(SPAN_ROBOT)
|
||||
|
||||
#define CRITICAL_TEMPERATURE 10000
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/proc/get_status()
|
||||
@@ -244,10 +241,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
add_overlay(causality_field, TRUE)
|
||||
|
||||
var/speaking = "[emergency_alert] The supermatter has reached critical integrity failure. Emergency causality destabilization field has been activated."
|
||||
radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, speaking, common_channel, language = get_default_language())
|
||||
for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10)
|
||||
if(damage < explosion_point) // Cutting it a bit close there engineers
|
||||
radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel)
|
||||
cut_overlay(causality_field, TRUE)
|
||||
final_countdown = FALSE
|
||||
return
|
||||
@@ -258,7 +255,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization."
|
||||
else
|
||||
speaking = "[i*0.1]..."
|
||||
radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, speaking, common_channel)
|
||||
sleep(10)
|
||||
|
||||
explode()
|
||||
@@ -459,27 +456,27 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
alarm()
|
||||
|
||||
if(damage > emergency_point)
|
||||
radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "[emergency_alert] Integrity: [get_integrity()]%", common_channel)
|
||||
lastwarning = REALTIMEOFDAY
|
||||
if(!has_reached_emergency)
|
||||
investigate_log("has reached the emergency point for the first time.", INVESTIGATE_SUPERMATTER)
|
||||
message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].")
|
||||
has_reached_emergency = TRUE
|
||||
else if(damage >= damage_archived) // The damage is still going up
|
||||
radio.talk_into(src, "[warning_alert] Integrity: [get_integrity()]%", engineering_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "[warning_alert] Integrity: [get_integrity()]%", engineering_channel)
|
||||
lastwarning = REALTIMEOFDAY - (WARNING_DELAY * 5)
|
||||
|
||||
else // Phew, we're safe
|
||||
radio.talk_into(src, "[safe_alert] Integrity: [get_integrity()]%", engineering_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "[safe_alert] Integrity: [get_integrity()]%", engineering_channel)
|
||||
lastwarning = REALTIMEOFDAY
|
||||
|
||||
if(power > POWER_PENALTY_THRESHOLD)
|
||||
radio.talk_into(src, "Warning: Hyperstructure has reached dangerous power level.", engineering_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "Warning: Hyperstructure has reached dangerous power level.", engineering_channel)
|
||||
if(powerloss_inhibitor < 0.5)
|
||||
radio.talk_into(src, "DANGER: CHARGE INERTIA CHAIN REACTION IN PROGRESS.", engineering_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "DANGER: CHARGE INERTIA CHAIN REACTION IN PROGRESS.", engineering_channel)
|
||||
|
||||
if(combined_gas > MOLE_PENALTY_THRESHOLD)
|
||||
radio.talk_into(src, "Warning: Critical coolant mass reached.", engineering_channel, get_spans(), get_default_language())
|
||||
radio.talk_into(src, "Warning: Critical coolant mass reached.", engineering_channel)
|
||||
|
||||
if(damage > explosion_point)
|
||||
countdown()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
name = "\improper PM-9HEDP"
|
||||
desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward mechs."
|
||||
caliber = "84mm"
|
||||
icon_state = "s-casing-live"
|
||||
icon_state = "84mm-hedp"
|
||||
projectile_type = /obj/item/projectile/bullet/a84mm
|
||||
|
||||
/obj/item/ammo_casing/caseless/a75
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
max_ammo = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/rocketlauncher
|
||||
name = "grenade launcher internal magazine"
|
||||
name = "rocket launcher internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/rocket
|
||||
caliber = "84mm"
|
||||
max_ammo = 1
|
||||
|
||||
@@ -32,9 +32,10 @@
|
||||
var/fire_delay = 0 //rate of fire for burst firing and semi auto
|
||||
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
|
||||
var/semicd = 0 //cooldown handler
|
||||
var/weapon_weight = WEAPON_LIGHT
|
||||
var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy
|
||||
var/spread = 0 //Spread induced by the gun itself.
|
||||
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
|
||||
var/inaccuracy_modifier = 1
|
||||
|
||||
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
|
||||
@@ -538,3 +539,13 @@
|
||||
if(A == chambered)
|
||||
chambered = null
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/proc/getinaccuracy(mob/living/user)
|
||||
if(!iscarbon(user))
|
||||
return FALSE
|
||||
else
|
||||
var/mob/living/carbon/holdingdude = user
|
||||
if(istype(holdingdude) && holdingdude.combatmode)
|
||||
return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier)
|
||||
else
|
||||
return ((weapon_weight * 25) * inaccuracy_modifier)
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
pin = /obj/item/firing_pin/implant/pindicate
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
inaccuracy_modifier = 0.7
|
||||
casing_ejector = FALSE
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
magazine_wording = "rocket"
|
||||
@@ -108,34 +109,34 @@
|
||||
/obj/item/gun/ballistic/rocketlauncher/can_shoot()
|
||||
return chambered?.BB
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/process_chamber()
|
||||
if(chambered)
|
||||
chambered = null
|
||||
if(magazine)
|
||||
QDEL_NULL(magazine)
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user)
|
||||
return //too difficult to remove the rocket with TK
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/attack_self(mob/living/user)
|
||||
if(magazine)
|
||||
if(chambered)
|
||||
chambered.forceMove(magazine)
|
||||
magazine.stored_ammo.Insert(1, chambered)
|
||||
var/obj/item/ammo_casing/AC = chambered
|
||||
if(AC)
|
||||
if(!user.put_in_hands(AC))
|
||||
AC.bounce_away(FALSE, NONE)
|
||||
to_chat(user, "<span class='notice'>You remove \the [AC] from \the [src]!</span>")
|
||||
playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE)
|
||||
chambered = null
|
||||
else
|
||||
stack_trace("Removed [magazine] from [src] without a chambered round")
|
||||
magazine.forceMove(drop_location())
|
||||
if(user.is_holding(src))
|
||||
user.put_in_hands(magazine)
|
||||
playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE)
|
||||
to_chat(user, "<span class='notice'>You work the [magazine] out from [src].</span>")
|
||||
magazine = null
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's no rocket in [src].</span>")
|
||||
to_chat(user, "<span class='notice'>There's no [magazine_wording] in [src].</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
|
||||
if(magazine && istype(A, /obj/item/ammo_casing))
|
||||
if(user.temporarilyRemoveItemFromInventory(A))
|
||||
if(!chambered)
|
||||
to_chat(user, "<span class='notice'>You load a new [A] into \the [src].</span>")
|
||||
playsound(src, "gun_insert_full_magazine", 70, 1)
|
||||
chamber_round()
|
||||
update_icon()
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You cannot seem to get \the [A] out of your hands!</span>")
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/update_icon()
|
||||
icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/anti_armour_damage = 200
|
||||
armour_penetration = 100
|
||||
dismemberment = 100
|
||||
ricochets_max = 0
|
||||
|
||||
/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
|
||||
..()
|
||||
|
||||
@@ -209,7 +209,12 @@
|
||||
|
||||
/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(is_servant_of_ratvar(M))
|
||||
to_chat(M, "<span class='userdanger'>A darkness begins to spread its unholy tendrils through your mind, purging the Justiciar's influence!</span>")
|
||||
to_chat(M, "<span class='userdanger'>A fog spreads through your mind, purging the Justiciar's influence!</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(iscultist(M))
|
||||
to_chat(M, "<span class='userdanger'>A fog spreads through your mind, weakening your connection to the veil and purging Nar-sie's influence</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M)
|
||||
@@ -264,7 +269,7 @@
|
||||
qdel(R)
|
||||
T.Bless()
|
||||
|
||||
/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
|
||||
/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
|
||||
name = "Unholy Water"
|
||||
id = "unholywater"
|
||||
description = "Something that shouldn't exist on this plane of existence."
|
||||
@@ -284,7 +289,7 @@
|
||||
M.AdjustStun(-40, 0)
|
||||
M.AdjustKnockdown(-40, 0)
|
||||
M.adjustStaminaLoss(-10, 0)
|
||||
M.adjustToxLoss(-2, 0)
|
||||
M.adjustToxLoss(-2, 0, TRUE)
|
||||
M.adjustOxyLoss(-2, 0)
|
||||
M.adjustBruteLoss(-2, 0)
|
||||
M.adjustFireLoss(-2, 0)
|
||||
@@ -314,6 +319,45 @@
|
||||
holder.remove_reagent(id, 1)
|
||||
pH = 0.1
|
||||
|
||||
/datum/reagent/fuel/holyoil //Its oil
|
||||
name = "Zelus Oil"
|
||||
id = "holyoil"
|
||||
description = "Oil blessed by a greater being."
|
||||
taste_description = "metallic oil"
|
||||
|
||||
/datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M)
|
||||
if(is_servant_of_ratvar(M))
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustUnconscious(-60, 0)
|
||||
M.AdjustStun(-30, 0)
|
||||
M.AdjustKnockdown(-70, 0)
|
||||
M.adjustStaminaLoss(-15, 0)
|
||||
M.adjustToxLoss(-5, 0, TRUE)
|
||||
M.adjustOxyLoss(-3, 0)
|
||||
M.adjustBruteLoss(-3, 0)
|
||||
M.adjustFireLoss(-5, 0)
|
||||
if(iscultist(M))
|
||||
M.AdjustUnconscious(1, 0)
|
||||
M.AdjustStun(10, 0)
|
||||
M.AdjustKnockdown(20, 0)
|
||||
M.adjustStaminaLoss(15, 0)
|
||||
else
|
||||
M.adjustToxLoss(3, 0)
|
||||
M.adjustOxyLoss(2, 0)
|
||||
M.adjustStaminaLoss(10, 0)
|
||||
holder.remove_reagent(id, 1)
|
||||
return TRUE
|
||||
|
||||
//We only get 30u to start with...
|
||||
|
||||
/datum/reagent/fuel/holyoil/reaction_obj(obj/O, reac_volume)
|
||||
. = ..()
|
||||
if(istype(O, /obj/item/stack/sheet/metal))
|
||||
var/obj/item/stack/sheet/metal/M = O
|
||||
reac_volume = min(reac_volume, M.amount)
|
||||
new/obj/item/stack/tile/brass(get_turf(M), reac_volume)
|
||||
M.use(reac_volume)
|
||||
|
||||
/datum/reagent/medicine/omnizine/godblood
|
||||
name = "Godblood"
|
||||
id = "godblood"
|
||||
|
||||
@@ -37,14 +37,13 @@
|
||||
"<span class='danger'>Your face starts burning up, but the flames are repulsed by your anti-magic protection!</span>")
|
||||
return
|
||||
|
||||
var/list/masks = list(/obj/item/clothing/mask/spig, /obj/item/clothing/mask/cowmask, /obj/item/clothing/mask/horsehead)
|
||||
var/list/masks = list(/obj/item/clothing/mask/pig/cursed, /obj/item/clothing/mask/cowmask/cursed, /obj/item/clothing/mask/horsehead/cursed)
|
||||
var/list/mSounds = list('sound/magic/pighead_curse.ogg', 'sound/magic/cowhead_curse.ogg', 'sound/magic/horsehead_curse.ogg')
|
||||
var/randM = rand(1,3)
|
||||
|
||||
|
||||
var/choice = masks[randM]
|
||||
var/obj/item/clothing/mask/magichead = new choice
|
||||
magichead.item_flags |= NODROP
|
||||
magichead.flags_inv = null
|
||||
target.visible_message("<span class='danger'>[target]'s face bursts into flames, and a barnyard animal's head takes its place!</span>", \
|
||||
"<span class='danger'>Your face burns up, and shortly after the fire you realise you have the face of a barnyard animal!</span>")
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
var/taste_sensitivity = 15 // lower is more sensitive.
|
||||
var/maxHealth = TONGUE_MAX_HEALTH
|
||||
var/damage = 0
|
||||
var/modifies_speech = FALSE
|
||||
var/static/list/languages_possible_base = typecacheof(list(
|
||||
/datum/language/common,
|
||||
/datum/language/draconic,
|
||||
@@ -28,11 +29,7 @@
|
||||
. = ..()
|
||||
languages_possible = languages_possible_base
|
||||
|
||||
/obj/item/organ/tongue/get_spans()
|
||||
return list()
|
||||
|
||||
/obj/item/organ/tongue/proc/TongueSpeech(var/message)
|
||||
return message
|
||||
/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args)
|
||||
|
||||
/obj/item/organ/tongue/proc/adjustTongueLoss(mob/living/carbon/M, damage_mod)
|
||||
if (maxHealth == "alien")
|
||||
@@ -61,14 +58,19 @@
|
||||
..()
|
||||
if(say_mod && M.dna && M.dna.species)
|
||||
M.dna.species.say_mod = say_mod
|
||||
if (modifies_speech)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
M.UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/organ/tongue/Remove(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
if(say_mod && M.dna && M.dna.species)
|
||||
M.dna.species.say_mod = initial(M.dna.species.say_mod)
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
M.RegisterSignal(M, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech)
|
||||
|
||||
/obj/item/organ/tongue/could_speak_in_language(datum/language/dt)
|
||||
. = is_type_in_typecache(dt, languages_possible)
|
||||
return is_type_in_typecache(dt, languages_possible)
|
||||
|
||||
/obj/item/organ/tongue/lizard
|
||||
name = "forked tongue"
|
||||
@@ -77,14 +79,16 @@
|
||||
say_mod = "hisses"
|
||||
taste_sensitivity = 10 // combined nose + tongue, extra sensitive
|
||||
maxHealth = 40 //extra sensitivity means tongue is more susceptible to damage
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/organ/tongue/lizard/TongueSpeech(var/message)
|
||||
var/regex/lizard_hiss = new("s+", "g")
|
||||
var/regex/lizard_hiSS = new("S+", "g")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
/obj/item/organ/tongue/lizard/handle_speech(datum/source, list/speech_args)
|
||||
var/static/regex/lizard_hiss = new("s+", "g")
|
||||
var/static/regex/lizard_hiSS = new("S+", "g")
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
message = lizard_hiss.Replace(message, "sss")
|
||||
message = lizard_hiSS.Replace(message, "SSS")
|
||||
return message
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
/obj/item/organ/tongue/fly
|
||||
name = "proboscis"
|
||||
@@ -93,14 +97,16 @@
|
||||
say_mod = "buzzes"
|
||||
taste_sensitivity = 25 // you eat vomit, this is a mercy
|
||||
maxHealth = 80 //years of eatting trash has made your tongue strong
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/organ/tongue/fly/TongueSpeech(var/message)
|
||||
var/regex/fly_buzz = new("z+", "g")
|
||||
var/regex/fly_buZZ = new("Z+", "g")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
/obj/item/organ/tongue/fly/handle_speech(datum/source, list/speech_args)
|
||||
var/static/regex/fly_buzz = new("z+", "g")
|
||||
var/static/regex/fly_buZZ = new("Z+", "g")
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
if(message[1] != "*")
|
||||
message = fly_buzz.Replace(message, "zzz")
|
||||
message = fly_buZZ.Replace(message, "ZZZ")
|
||||
return message
|
||||
speech_args[SPEECH_MESSAGE] = message
|
||||
|
||||
/obj/item/organ/tongue/abductor
|
||||
name = "superlingual matrix"
|
||||
@@ -109,9 +115,11 @@
|
||||
say_mod = "gibbers"
|
||||
taste_sensitivity = 101 // ayys cannot taste anything.
|
||||
maxHealth = 120 //Ayys probe a lot
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/organ/tongue/abductor/TongueSpeech(var/message)
|
||||
/obj/item/organ/tongue/abductor/handle_speech(datum/source, list/speech_args)
|
||||
//Hacks
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
var/mob/living/carbon/human/user = usr
|
||||
var/rendered = "<span class='abductor'><b>[user.name]:</b> [message]</span>"
|
||||
user.log_talk(message, LOG_SAY, tag="abductor")
|
||||
@@ -127,7 +135,7 @@
|
||||
for(var/mob/M in GLOB.dead_mob_list)
|
||||
var/link = FOLLOW_LINK(M, user)
|
||||
to_chat(M, "[link] [rendered]")
|
||||
return ""
|
||||
speech_args[SPEECH_MESSAGE] = ""
|
||||
|
||||
/obj/item/organ/tongue/zombie
|
||||
name = "rotting tongue"
|
||||
@@ -136,9 +144,10 @@
|
||||
say_mod = "moans"
|
||||
taste_sensitivity = 32
|
||||
maxHealth = 65 //Stop! It's already dead...!
|
||||
modifies_speech = TRUE
|
||||
|
||||
/obj/item/organ/tongue/zombie/TongueSpeech(var/message)
|
||||
var/list/message_list = splittext(message, " ")
|
||||
/obj/item/organ/tongue/zombie/handle_speech(datum/source, list/speech_args)
|
||||
var/list/message_list = splittext(speech_args[SPEECH_MESSAGE], " ")
|
||||
var/maxchanges = max(round(message_list.len / 1.5), 2)
|
||||
|
||||
for(var/i = rand(maxchanges / 2, maxchanges), i > 0, i--)
|
||||
@@ -151,7 +160,7 @@
|
||||
if(prob(20) && message_list.len > 3)
|
||||
message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...")
|
||||
|
||||
return jointext(message_list, " ")
|
||||
speech_args[SPEECH_MESSAGE] = jointext(message_list, " ")
|
||||
|
||||
/obj/item/organ/tongue/alien
|
||||
name = "alien tongue"
|
||||
@@ -160,6 +169,7 @@
|
||||
say_mod = "hisses"
|
||||
taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED
|
||||
maxHealth = "alien" //Their blood is acid, so, no, though a tongueless xeno might be funny
|
||||
modifies_speech = TRUE // not really, they just hiss
|
||||
var/static/list/languages_possible_alien = typecacheof(list(
|
||||
/datum/language/xenocommon,
|
||||
/datum/language/common,
|
||||
@@ -171,9 +181,8 @@
|
||||
. = ..()
|
||||
languages_possible = languages_possible_alien
|
||||
|
||||
/obj/item/organ/tongue/alien/TongueSpeech(var/message)
|
||||
/obj/item/organ/tongue/alien/handle_speech(datum/source, list/speech_args)
|
||||
playsound(owner, "hiss", 25, 1, 1)
|
||||
return message
|
||||
|
||||
/obj/item/organ/tongue/bone
|
||||
name = "bone \"tongue\""
|
||||
@@ -183,7 +192,7 @@
|
||||
attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned")
|
||||
taste_sensitivity = 101 // skeletons cannot taste anything
|
||||
maxHealth = "bone" //Take brute damage instead
|
||||
|
||||
modifies_speech = TRUE
|
||||
var/chattering = FALSE
|
||||
var/phomeme_type = "sans"
|
||||
var/list/phomeme_types = list("sans", "papyrus")
|
||||
@@ -192,30 +201,21 @@
|
||||
. = ..()
|
||||
phomeme_type = pick(phomeme_types)
|
||||
|
||||
/obj/item/organ/tongue/bone/TongueSpeech(var/message)
|
||||
. = message
|
||||
|
||||
if(chattering)
|
||||
//Annoy everyone nearby with your chattering.
|
||||
chatter(message, phomeme_type, usr)
|
||||
|
||||
/obj/item/organ/tongue/bone/get_spans()
|
||||
. = ..()
|
||||
// Feature, if the tongue talks directly, it will speak with its span
|
||||
/obj/item/organ/tongue/bone/handle_speech(datum/source, list/speech_args)
|
||||
if (chattering)
|
||||
chatter(speech_args[SPEECH_MESSAGE], phomeme_type, source)
|
||||
switch(phomeme_type)
|
||||
if("sans")
|
||||
. |= SPAN_SANS
|
||||
speech_args[SPEECH_SPANS] |= SPAN_SANS
|
||||
if("papyrus")
|
||||
. |= SPAN_PAPYRUS
|
||||
speech_args[SPEECH_SPANS] |= SPAN_PAPYRUS
|
||||
|
||||
/obj/item/organ/tongue/bone/plasmaman
|
||||
name = "plasma bone \"tongue\""
|
||||
desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech."
|
||||
icon_state = "tongueplasma"
|
||||
maxHealth = "alien"
|
||||
|
||||
/obj/item/organ/tongue/bone/plasmaman/get_spans()
|
||||
return
|
||||
modifies_speech = FALSE
|
||||
|
||||
/obj/item/organ/tongue/robot
|
||||
name = "robotic voicebox"
|
||||
@@ -224,16 +224,17 @@
|
||||
icon_state = "tonguerobot"
|
||||
say_mod = "states"
|
||||
attack_verb = list("beeped", "booped")
|
||||
modifies_speech = TRUE
|
||||
taste_sensitivity = 25 // not as good as an organic tongue
|
||||
maxHealth = 100 //RoboTongue!
|
||||
var/electronics_magic = TRUE
|
||||
|
||||
/obj/item/organ/tongue/robot/can_speak_in_language(datum/language/dt)
|
||||
. = TRUE // THE MAGIC OF ELECTRONICS
|
||||
return ..() || electronics_magic
|
||||
|
||||
/obj/item/organ/tongue/robot/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
/obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
|
||||
|
||||
//FermiChem
|
||||
/obj/item/organ/tongue/fluffy
|
||||
name = "fluffy tongue"
|
||||
desc = "OwO what's this?"
|
||||
@@ -262,5 +263,11 @@
|
||||
taste_sensitivity = 10
|
||||
maxHealth = 60 //It's robotic!
|
||||
|
||||
/obj/item/organ/tongue/cybernetic/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
/obj/item/organ/tongue/cybernetic/handle_speech(datum/source, list/speech_args)
|
||||
speech_args[SPEECH_SPANS] |= SPAN_ROBOT
|
||||
|
||||
/obj/item/organ/tongue/robot/ipc
|
||||
name = "positronic voicebox"
|
||||
say_mod = "beeps"
|
||||
desc = "A voice synthesizer used by IPCs to smoothly interface with organic lifeforms."
|
||||
electronics_magic = FALSE
|
||||
|
||||
@@ -49,9 +49,14 @@
|
||||
|
||||
var/datum/surgery_step/S = get_surgery_step()
|
||||
if(S)
|
||||
if(S.try_op(user, target, user.zone_selected, user.get_active_held_item(), src, try_to_fail))
|
||||
return 1
|
||||
return 0
|
||||
var/obj/item/tool = user.get_active_held_item()
|
||||
if(S.try_op(user, target, user.zone_selected, tool, src, try_to_fail))
|
||||
return TRUE
|
||||
if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
|
||||
return TRUE
|
||||
if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
|
||||
to_chat(user, "<span class='warning'>This step requires a different tool!</span>")
|
||||
return TRUE
|
||||
|
||||
/datum/surgery/proc/get_surgery_step()
|
||||
var/step_type = steps[status]
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "retractor"
|
||||
materials = list(MAT_METAL=6000, MAT_GLASS=3000)
|
||||
item_flags = SURGICAL_TOOL
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
@@ -33,6 +34,7 @@
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "hemostat"
|
||||
materials = list(MAT_METAL=5000, MAT_GLASS=2500)
|
||||
item_flags = SURGICAL_TOOL
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb = list("attacked", "pinched")
|
||||
@@ -66,6 +68,7 @@
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "cautery"
|
||||
materials = list(MAT_METAL=2500, MAT_GLASS=750)
|
||||
item_flags = SURGICAL_TOOL
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb = list("burnt")
|
||||
@@ -102,6 +105,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
hitsound = 'sound/weapons/circsawhit.ogg'
|
||||
materials = list(MAT_METAL=10000, MAT_GLASS=6000)
|
||||
item_flags = SURGICAL_TOOL
|
||||
flags_1 = CONDUCT_1
|
||||
force = 15
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -151,6 +155,7 @@
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
materials = list(MAT_METAL=4000, MAT_GLASS=1000)
|
||||
item_flags = SURGICAL_TOOL
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
@@ -209,6 +214,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
hitsound = 'sound/weapons/circsawhit.ogg'
|
||||
throwhitsound = 'sound/weapons/pierce.ogg'
|
||||
item_flags = SURGICAL_TOOL
|
||||
flags_1 = CONDUCT_1
|
||||
force = 15
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -278,6 +284,7 @@
|
||||
desc = "A container for holding body parts."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "evidenceobj"
|
||||
item_flags = SURGICAL_TOOL
|
||||
|
||||
/obj/item/organ_storage/afterattack(obj/item/I, mob/user, proximity)
|
||||
. = ..()
|
||||
|
||||
Reference in New Issue
Block a user