Merge pull request #3529 from Zuhayr/dev

Fixes form master, Unathi<->Soghun removal, dionaea changes, lots of say refactoring.
This commit is contained in:
Mloc
2013-08-16 05:07:42 -07:00
31 changed files with 195 additions and 418 deletions

View File

@@ -407,9 +407,6 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles, dbg_output)
if(sharing_lookup_table.len >= unsimulated_tiles.len) //6 or more interconnecting tiles will max at 42% of air moved per tick.
ratio = sharing_lookup_table[unsimulated_tiles.len]
//We need to adjust it to account for the insulation settings.
ratio *= 1 - vsc.connection_insulation
A.oxygen = max(0, (A.oxygen - oxy_avg) * (1 - ratio) + oxy_avg )
A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1 - ratio) + nit_avg )
A.carbon_dioxide = max(0, (A.carbon_dioxide - co2_avg) * (1 - ratio) + co2_avg )
@@ -444,6 +441,9 @@ proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles)
ratio = sharing_lookup_table[connecting_tiles]
//WOOT WOOT TOUCH THIS AND YOU ARE A RETARD
//We need to adjust it to account for the insulation settings.
ratio *= 1 - vsc.connection_insulation
A.temperature = max(0, (A.temperature - temp_avg) * (1- (ratio / max(1,A.group_multiplier)) ) + temp_avg )
B.temperature = max(0, (B.temperature - temp_avg) * (1- (ratio / max(1,B.group_multiplier)) ) + temp_avg )

View File

@@ -807,7 +807,7 @@ datum/preferences
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
for(var/S in whitelisted_species)
if(is_alien_whitelisted(user,S) || (S == "Unathi" && is_alien_whitelisted(user,"Soghun")))
if(is_alien_whitelisted(user,S))
new_species += S
whitelisted = 1
if(!whitelisted)

View File

@@ -1,6 +1,3 @@
/mob/dead/observer/say_understands(var/other)
return 1
/mob/dead/observer/say(var/message)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))

View File

@@ -6,7 +6,7 @@
name = "alien"
voice_name = "alien"
voice_message = "hisses"
say_message = "hisses"
speak_emote = list("hisses")
icon = 'icons/mob/alien.dmi'
gender = NEUTER
dna = null

View File

@@ -1,8 +1,3 @@
/mob/living/carbon/alien/say_understands(var/other)
if (istype(other, /mob/living/carbon/alien))
return 1
return ..()
/mob/living/carbon/alien/say(var/message)
if (silent)
@@ -22,12 +17,6 @@
return ..(message)
else
// ~lol~
/mob/living/carbon/alien/say_quote(var/text)
// var/ending = copytext(text, length(text))
return "[say_message], \"[text]\"";
/mob/living/proc/alien_talk(var/message)
log_say("[key_name(src)] : [message]")

View File

@@ -477,4 +477,79 @@
return num2text(method ? temp : temp + rand(-10, 10))
if(PULSE_THREADY)
return method ? ">250" : "extremely weak and fast, patient's artery feels like a thread"
// output for machines^ ^^^^^^^output for people^^^^^^^^^
// output for machines^ ^^^^^^^output for people^^^^^^^^^
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
set category = "Alien"
set name = "Release Control"
set desc = "Release control of your host's body."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.controlling)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
B.host_brain << "\red <B>Your vision swims as the alien parasite releases control of your body.</B>"
B.ckey = ckey
B.controlling = 0
if(B.host_brain.ckey)
ckey = B.host_brain.ckey
B.host_brain.ckey = null
B.host_brain.name = "host brain"
B.host_brain.real_name = "host brain"
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
set category = "Alien"
set name = "Torment host"
set desc = "Punish your host with agony."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.host_brain.ckey)
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
//Check for brain worms in head.
/mob/living/carbon/proc/has_brain_worms()
for(var/I in contents)
if(istype(I,/mob/living/simple_animal/borer))
return I
return 0
/mob/living/carbon/proc/spawn_larvae()
set category = "Alien"
set name = "Reproduce"
set desc = "Spawn several young."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.chemicals >= 100)
src << "\red <B>Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
B.chemicals -= 100
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(src))
else
src << "You do not have enough chemicals stored to reproduce."
return

View File

@@ -4,8 +4,6 @@
var/brain_op_stage = 0.0
var/list/datum/disease2/disease/virus2 = list()
var/antibodies = 0
var/silent = null //Can't talk. Value goes down every life proc.
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
@@ -20,4 +18,4 @@
//Active emote/pose
var/pose = null
var/pulse = PULSE_NORM //current pulse level
var/pulse = PULSE_NORM //current pulse level

View File

@@ -71,7 +71,7 @@
B.host_brain.name = "host brain"
B.host_brain.real_name = "host brain"
verbs -= /mob/living/carbon/human/proc/release_control
verbs -= /mob/living/carbon/proc/release_control
//Check for heist mode kill count.
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) )

View File

@@ -1278,84 +1278,4 @@ mob/living/carbon/human/yank_out_object()
if(species)
return 1
else
return 0
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/human/proc/release_control()
set category = "Alien"
set name = "Release Control"
set desc = "Release control of your host's body."
var/datum/organ/external/head = get_organ("head")
var/mob/living/simple_animal/borer/B
for(var/I in head.implants)
if(istype(I,/mob/living/simple_animal/borer))
B = I
if(!B)
return
if(B.controlling)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
B.host_brain << "\red <B>Your vision swims as the alien parasite releases control of your body.</B>"
B.ckey = ckey
B.controlling = 0
if(B.host_brain.ckey)
ckey = B.host_brain.ckey
B.host_brain.ckey = null
B.host_brain.name = "host brain"
B.host_brain.real_name = "host brain"
verbs -= /mob/living/carbon/human/proc/release_control
verbs -= /mob/living/carbon/human/proc/punish_host
verbs -= /mob/living/carbon/human/proc/spawn_larvae
//Brain slug proc for tormenting the host.
/mob/living/carbon/human/proc/punish_host()
set category = "Alien"
set name = "Torment host"
set desc = "Punish your host with agony."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.host_brain.ckey)
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
//Check for brain worms in head.
/mob/living/carbon/human/proc/has_brain_worms()
var/datum/organ/external/head = get_organ("head")
for(var/I in head.implants)
if(istype(I,/mob/living/simple_animal/borer))
return I
return 0
/mob/living/carbon/human/proc/spawn_larvae()
set category = "Alien"
set name = "Reproduce"
set desc = "Spawn several young."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.chemicals >= 100)
src << "\red <B>Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
B.chemicals -= 100
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(src))
else
src << "You do not have enough chemicals stored to reproduce."
return
return 0

View File

@@ -1,53 +1,5 @@
/mob/living/carbon/human/say(var/message)
if(silent)
return
//Mimes dont speak! Changeling hivemind and emotes are allowed.
if(miming)
if(length(message) >= 2)
if(mind && mind.changeling)
if(copytext(message, 1, 2) != "*" && department_radio_keys[copytext(message, 1, 3)] != "changeling")
return
else
return ..(message)
if(stat == DEAD)
return ..(message)
if(length(message) >= 1) //In case people forget the '*help' command, this will slow them the message and prevent people from saying one letter at a time
if (copytext(message, 1, 2) != "*")
return
/*if(dna)
if(dna.mutantrace == "lizard")
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))
if(dna.mutantrace == "slime" && prob(5))
if(copytext(message, 1, 2) != "*")
if(copytext(message, 1, 2) == ";")
message = ";"
else
message = ""
message += "SKR"
var/imax = rand(5,20)
for(var/i = 0,i<imax,i++)
message += "E"*/
if(stat != DEAD)
for(var/datum/disease/pierrot_throat/D in viruses)
var/list/temp_message = text2list(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 = 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) != "*")
@@ -68,28 +20,6 @@
message = replacetext(message, "u", "<22>")
message = replacetext(message, "b", "<22>")
/*else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "captain", "CAPIT<49>N")
message = replacetext(message, "station", "ESTACI<43>N")
message = replacetext(message, "sir", "SE<53>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)
@@ -109,13 +39,7 @@
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
if (istype(other, /mob/living/silicon/ai))
return 1
if (istype(other, /mob/living/silicon/decoy))
return 1
if (istype(other, /mob/living/silicon/pai))
return 1
if (istype(other, /mob/living/silicon/robot))
if (istype(other, /mob/living/silicon))
return 1
if (istype(other, /mob/living/carbon/brain))
return 1

View File

@@ -4,7 +4,7 @@
icon_state = "grey baby slime"
pass_flags = PASSTABLE
voice_message = "skree!"
say_message = "hums"
speak_emote = list("hums")
layer = 5
@@ -56,6 +56,7 @@
name = "adult slime"
icon = 'icons/mob/slimes.dmi'
icon_state = "grey adult slime"
speak_emote = list("telepathically chirps")
health = 200
gender = NEUTER

View File

@@ -1,21 +0,0 @@
/mob/living/carbon/slime/say(var/message)
if (silent)
return
else
return ..()
/mob/living/carbon/slime/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "telepathically asks, \"[text]\"";
else if (ending == "!")
return "telepathically cries, \"[text]\"";
return "telepathically chirps, \"[text]\"";
/mob/living/carbon/slime/say_understands(var/other)
if (istype(other, /mob/living/carbon/slime))
return 1
return ..()

View File

@@ -2,7 +2,7 @@
name = "monkey"
voice_name = "monkey"
voice_message = "chimpers"
say_message = "chimpers"
speak_emote = list("chimpers")
icon_state = "monkey1"
icon = 'icons/mob/monkey.dmi'
gender = NEUTER
@@ -18,7 +18,7 @@
name = "farwa"
voice_name = "farwa"
voice_message = "mews"
say_message = "mews"
speak_emote = list("mews")
ico = "tajkey"
uni_append = "0A0E00"
@@ -26,7 +26,7 @@
name = "neaera"
voice_name = "neaera"
voice_message = "squicks"
say_message = "squicks"
speak_emote = list("squicks")
ico = "skrellkey"
uni_append = "01CC92"
@@ -34,16 +34,23 @@
name = "stok"
voice_name = "stok"
voice_message = "hisses"
say_message = "hisses"
speak_emote = list("hisses")
ico = "stokkey"
uni_append = "044C5D"
/mob/living/carbon/monkey/diona
name = "diona nymph"
voice_name = "diona nymph"
voice_message = "chirrups"
speak_emote = list("chirrups")
ico = "nymph"
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "monkey" || name == "farwa" || name == "stok" || name == "neara") //Hideous but necessary to stop Pun-Pun becoming generic.
if(name == "monkey" || name == "farwa" || name == "stok" || name == "neara" || name == "diona nymph") //Hideous but necessary to stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
real_name = name

View File

@@ -3,6 +3,3 @@
return
else
return ..()
/mob/living/carbon/monkey/say_quote(var/text)
return "[src.say_message], \"[text]\"";

View File

@@ -92,5 +92,6 @@
icobase = 'icons/mob/human_races/r_plant.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
attack_verb = "slash"
primitive = /mob/living/carbon/monkey/diona
flags = NO_EAT | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT

View File

@@ -29,10 +29,10 @@
var/t_sl_gas = null
var/t_n2 = null
var/now_pushing = null
var/cameraFollow = null
var/tod = null // Time of death
var/update_slimes = 1
var/update_slimes = 1
var/silent = null //Can't talk. Value goes down every life proc.

View File

@@ -15,10 +15,6 @@ var/list/department_radio_keys = list(
":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate",
":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
":g" = "changeling", "#g" = "changeling", ".g" = "changeling",
":k" = "skrell", "#k" = "skrell", ".k" = "skrell",
":j" = "tajaran", "#j" = "tajaran", ".j" = "tajaran",
":o" = "soghun", "#o" = "soghun", ".o" = "soghun",
":v" = "vox", "#v" = "vox", ".v" = "vox",
":R" = "right hand", "#R" = "right hand", ".R" = "right hand",
":L" = "left hand", "#L" = "left hand", ".L" = "left hand",
@@ -35,10 +31,6 @@ var/list/department_radio_keys = list(
":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate",
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":G" = "changeling", "#G" = "changeling", ".G" = "changeling",
":K" = "skrell", "#K" = "skrell", ".K" = "skrell",
":J" = "tajaran", "#J" = "tajaran", ".J" = "tajaran",
":O" = "soghun", "#O" = "soghun", ".O" = "soghun",
":V" = "vox", "#V" = "vox", ".V" = "vox",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -56,10 +48,7 @@ var/list/department_radio_keys = list(
":<3A>" = "alientalk", "#<23>" = "alientalk", ".<2E>" = "alientalk",
":<3A>" = "Syndicate", "#<23>" = "Syndicate", ".<2E>" = "Syndicate",
":<3A>" = "Supply", "#<23>" = "Supply", ".<2E>" = "Supply",
":<3A>" = "changeling", "#<23>" = "changeling", ".<2E>" = "changeling",
":<3A>" = "skrell", "#<23>" = "skrell", ".<2E>" = "skrell",
":<3A>" = "tajaran", "#<23>" = "tajaran", ".<2E>" = "tajaran",
":<3A>" = "soghun", "#<23>" = "soghun", ".<2E>" = "soghun"
":<3A>" = "changeling", "#<23>" = "changeling", ".<2E>" = "changeling"
)
/mob/living/proc/binarycheck()
@@ -86,14 +75,27 @@ var/list/department_radio_keys = list(
/mob/living/say(var/message)
/*
Formatting and sanitizing.
*/
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = capitalize(message)
/*
Sanity checking and speech failure.
*/
if (!message)
return
if (stat == 2)
if(silent)
return
if (stat == 2) // Dead.
return say_dead(message)
else if (stat) // Unconcious.
return
if (src.client)
if(client.prefs.muted & MUTE_IC)
@@ -102,52 +104,59 @@ var/list/department_radio_keys = list(
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
// stat == 2 is handled above, so this stops transmission of uncontious messages
if (stat)
return
// Mute disability
if (sdisabilities & MUTE)
return
// Muzzled.
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
return
// emotes
// Emotes.
if (copytext(message, 1, 2) == "*" && !stat)
return emote(copytext(message, 2))
/*
Identity hiding.
*/
var/alt_name = ""
if (istype(src, /mob/living/carbon/human) && name != GetVoice())
var/mob/living/carbon/human/H = src
alt_name = " (as [H.get_id_name("Unknown")])"
/*
Now we get into the real meat of the say processing. Determining the message mode.
*/
var/italics = 0
var/message_range = null
var/message_mode = null
var/datum/language/speaking = null //For use if a specific language is being spoken.
// If brain damaged, talk on headset at random.
if (getBrainLoss() >= 60 && prob(50))
if (ishuman(src))
message_mode = "headset"
var/braindam = getBrainLoss()
if (braindam >= 60)
if(prob(braindam/4))
message = stutter(message)
if(prob(braindam))
message = uppertext(message)
// General public key. Special message handling
else if (copytext(message, 1, 2) == ";")
if (ishuman(src))
message_mode = "headset"
else if(ispAI(src) || isrobot(src))
message_mode = "pAI"
if (copytext(message, 1, 2) == ";" || prob(braindam/2))
message_mode = "broadcast"
message = copytext(message, 2)
// Begin checking for either a message mode or a language to speak.
else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3)
//Check if the person is speaking a language that they know.
for(var/datum/language/L in languages)
if(lowertext(channel_prefix) == ":[L.key]")
speaking = L
break
if(languages.len)
for(var/datum/language/L in languages)
if(lowertext(channel_prefix) == ":[L.key]")
speaking = L
break
message_mode = department_radio_keys[channel_prefix]
if (message_mode)
message = trim(copytext(message, 3))
if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels))))
@@ -161,35 +170,9 @@ var/list/department_radio_keys = list(
if (!message)
return
// :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)
if (stuttering)
message = stutter(message)
/* //qw do not have beesease atm.
if(virus)
if(virus.name=="beesease" && virus.stage>=2)
if(prob(virus.stage*10))
var/bzz = length(message)
message = "B"
for(var/i=0,i<bzz,i++)
message += "Z"
*/
var/list/obj/item/used_radios = new
var/is_speaking_radio = 0

View File

@@ -5,29 +5,15 @@
//If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
..(message)
/mob/living/silicon/ai/say_understands(var/other)
/mob/living/silicon/say_understands(var/other)
if (istype(other, /mob/living/carbon/human))
return 1
if (istype(other, /mob/living/silicon/robot))
return 1
if (istype(other, /mob/living/silicon/decoy))
if (istype(other, /mob/living/silicon))
return 1
if (istype(other, /mob/living/carbon/brain))
return 1
if (istype(other, /mob/living/silicon/pai))
return 1
return ..()
/mob/living/silicon/ai/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "queries, \"[text]\"";
else if (ending == "!")
return "declares, \"[text]\"";
return "states, \"[text]\"";
var/announcing_vox = 0
var/const/VOX_CHANNEL = 200
var/const/VOX_VOLUME = 75

View File

@@ -9,23 +9,4 @@
src.icon = 'icons/mob/AI.dmi'
src.icon_state = "ai"
src.anchored = 1
src.canmove = 0
/mob/living/silicon/decoy/say_understands(var/other)
if (istype(other, /mob/living/carbon/human))
return 1
if (istype(other, /mob/living/silicon/robot))
return 1
if (istype(other, /mob/living/silicon/ai))
return 1
return ..()
/mob/living/silicon/decoy/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "queries, \"[text]\"";
else if (ending == "!")
return "declares, \"[copytext(text, 1, length(text))]\"";
return "states, \"[text]\"";
src.canmove = 0

View File

@@ -1,28 +1,3 @@
/mob/living/silicon/pai/say_understands(var/other)
if (istype(other, /mob/living/carbon/human))
return 1
if (istype(other, /mob/living/silicon/robot))
return 1
if (istype(other, /mob/living/silicon/pai))
return 1
if (istype(other, /mob/living/silicon/ai))
return 1
if (istype(other, /mob/living/silicon/decoy))
return 1
if (istype(other, /mob/living/carbon/brain))
return 1
return ..()
/mob/living/silicon/pai/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "[src.speakQuery], \"[text]\"";
else if (ending == "!")
return "[src.speakExclamation], \"[text]\"";
return "[src.speakStatement], \"[text]\"";
/mob/living/silicon/pai/say(var/msg)
if(silence_time)
src << "<font color=green>Communication circuits remain unitialized.</font>"

View File

@@ -1,24 +0,0 @@
/mob/living/silicon/robot/say_understands(var/other)
if (istype(other, /mob/living/silicon/ai))
return 1
if (istype(other, /mob/living/silicon/decoy))
return 1
if (istype(other, /mob/living/carbon/human))
return 1
if (istype(other, /mob/living/carbon/brain))
return 1
if (istype(other, /mob/living/silicon/pai))
return 1
// if (istype(other, /mob/living/silicon/hivebot))
// return 1
return ..()
/mob/living/silicon/robot/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "queries, \"[text]\"";
else if (ending == "!")
return "declares, \"[text]\"";
return "states, \"[text]\"";

View File

@@ -1,3 +1,13 @@
/mob/living/silicon/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "queries, \"[text]\"";
else if (ending == "!")
return "declares, \"[copytext(text, 1, length(text))]\"";
return "states, \"[text]\"";
/mob/living/silicon/say(var/message)
if (!message)
return

View File

@@ -41,7 +41,7 @@
pass_flags = PASSTABLE
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
var/mob/living/carbon/human/host // Human host for the brain worm.
var/mob/living/host // Host for the brain worm.
var/truename // Name used for brainworm-speak.
var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
var/controlling // Used in human death check.
@@ -160,9 +160,9 @@
host.ckey = src.ckey
controlling = 1
host.verbs += /mob/living/carbon/human/proc/release_control
host.verbs += /mob/living/carbon/human/proc/punish_host
host.verbs += /mob/living/carbon/human/proc/spawn_larvae
host.verbs += /mob/living/carbon/proc/release_control
host.verbs += /mob/living/carbon/proc/punish_host
host.verbs += /mob/living/carbon/proc/spawn_larvae
/mob/living/simple_animal/borer/verb/secrete_chemicals()
set category = "Alien"
@@ -226,8 +226,11 @@ mob/living/simple_animal/borer/proc/detatch()
if(!host) return
var/datum/organ/external/head = host.get_organ("head")
head.implants -= src
if(istype(host,/mob/living/carbon/human))
var/mob/living/carbon/human/H = host
var/datum/organ/external/head = H.get_organ("head")
head.implants -= src
src.loc = get_turf(host)
controlling = 0
@@ -237,9 +240,9 @@ mob/living/simple_animal/borer/proc/detatch()
host.reset_view(null)
host.machine = null
host.verbs -= /mob/living/carbon/human/proc/release_control
host.verbs -= /mob/living/carbon/human/proc/punish_host
host.verbs -= /mob/living/carbon/human/proc/spawn_larvae
host.verbs -= /mob/living/carbon/proc/release_control
host.verbs -= /mob/living/carbon/proc/punish_host
host.verbs -= /mob/living/carbon/proc/spawn_larvae
if(host_brain.ckey)
src.ckey = host.ckey
@@ -250,7 +253,7 @@ mob/living/simple_animal/borer/proc/detatch()
host = null
/mob/living/simple_animal/borer/verb/infest(var/mob/living/carbon/human/H)
/mob/living/simple_animal/borer/verb/infest()
set category = "Alien"
set name = "Infest"
set desc = "Infest a suitable humanoid host."
@@ -264,11 +267,11 @@ mob/living/simple_animal/borer/proc/detatch()
return
var/list/choices = list()
for(var/mob/living/carbon/human/C in view(1,src))
if(istype(C,/mob/living/carbon/human) && C.stat != 2)
for(var/mob/living/carbon/C in view(1,src))
if(C.ckey != ckey && !(istype(C,/mob/living/captive_brain)) && !(istype(C,/mob/living/simple_animal/borer)))
choices += C
var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices
var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
if(!M || !src) return
@@ -299,10 +302,13 @@ mob/living/simple_animal/borer/proc/detatch()
M << "Something disgusting and slimy wiggles into your ear!"
src.host = M
var/datum/organ/external/head = M.get_organ("head")
head.implants += src
src.loc = M
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/head = H.get_organ("head")
head.implants += src
host_brain.name = M.name
host_brain.real_name = M.real_name

View File

@@ -9,7 +9,6 @@
var/icon_gib = null //We only try to show a gibbing animation if this exists.
var/list/speak = list()
var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
var/speak_chance = 0
var/list/emote_hear = list() //Hearable emotes
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
@@ -217,13 +216,6 @@
new meat_type(src.loc)
..()
/mob/living/simple_animal/say_quote(var/text)
if(speak_emote && speak_emote.len)
var/emote = pick(speak_emote)
if(emote)
return "[emote], \"[text]\""
return "says, \"[text]\"";
/mob/living/simple_animal/emote(var/act, var/type, var/desc)
if(act)
if(act == "scream") act = "whimper" //ugly hack to stop animals screaming when crushed :P

View File

@@ -89,6 +89,8 @@
var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm)
var/list/embedded = list() //Embedded items, since simple mobs don't have organs.
var/list/languages = list() // For speaking/listening.
var/list/speak_emote = null //Verbs used when speaking. Defaults to 'say' if speak_emote is null.
var/name_archive //For admin things like possession
var/timeofdeath = 0.0//Living
@@ -156,7 +158,6 @@
var/voice_name = "unidentifiable voice"
var/voice_message = null // When you are not understood by others (replaced with just screeches, hisses, chimpers etc.)
var/say_message = null // When you are understood by others. Currently only used by aliens and monkeys in their say_quote procs
var/faction = "neutral" //Used for checking whether hostile simple animals will attack you, possibly more stuff later

View File

@@ -134,9 +134,7 @@
if(client.prefs.species != "Human")
var/S = client.prefs.species
if(S == "Unathi") S = "Soghun"
if(!is_alien_whitelisted(src, S) && config.usealienwhitelist)
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
@@ -151,9 +149,7 @@
usr << "\blue There is an administrative lock on entering the game!"
return
var/S = client.prefs.species
if(S == "Unathi") S = "Soghun"
if(!is_alien_whitelisted(src, S) && config.usealienwhitelist)
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
@@ -351,7 +347,7 @@
if(client.prefs.species)
chosen_species = all_species[client.prefs.species]
if(chosen_species)
if(is_alien_whitelisted(src, client.prefs.species) || (client.prefs.species == "Unathi" && is_alien_whitelisted(src, "Soghun")) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED))
if(is_alien_whitelisted(src, client.prefs.species) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED))
new_character.set_species(client.prefs.species)
if(chosen_species.language)
new_character.add_language(chosen_species.language)

View File

@@ -37,7 +37,7 @@
usr << "\red Speech is currently admin-disabled."
return
if(!(client.prefs.toggles & CHAT_DEAD))
if(client && !(client.prefs.toggles & CHAT_DEAD))
usr << "\red You have deadchat muted."
return
@@ -62,8 +62,12 @@
return
/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)
if(!other)
return 1
//Universal speak makes everything understandable, for obvious reasons.
else if(other.universal_speak || src.universal_speak)
return 1
else if (src.stat == 2)
return 1
else if (speaking) //Language check.
@@ -78,16 +82,13 @@
return 1
else
return 0
else if(other.universal_speak || src.universal_speak)
return 1
else if(isAI(src) && ispAI(other))
return 1
else if (istype(other, src.type))
//Sharing a type implies understanding.
else if (istype(other, src.type) || istype(src.type, other))
return 1
return 0
/mob/proc/say_quote(var/text,var/datum/language/speaking)
if(!text)
return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
//tcomms code is still runtiming somewhere here
@@ -97,6 +98,8 @@
if (speaking)
speechverb = "[speaking.speech_verb]</span>, \"<span class='[speaking.colour]'>"
else if(speak_emote && speak_emote.len)
speechverb = "[pick(speak_emote)], \""
else if (src.stuttering)
speechverb = "stammers, \""
else if (src.slurring)

View File

@@ -631,9 +631,9 @@
H.name = "host brain"
H.real_name = "host brain"
verbs -= /mob/living/carbon/human/proc/release_control
verbs -= /mob/living/carbon/human/proc/punish_host
verbs -= /mob/living/carbon/human/proc/spawn_larvae
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
return

View File

@@ -1,20 +0,0 @@
/mob/living/silicon/hivebot/say_understands(var/other)
if (istype(other, /mob/living/silicon/ai))
return 1
if (istype(other, /mob/living/carbon/human))
return 1
if (istype(other, /mob/living/carbon/human/tajaran))
return 1
if (istype(other, /mob/living/silicon/robot))
return 1
return ..()
/mob/living/silicon/hivebot/say_quote(var/text)
var/ending = copytext(text, length(text))
if (ending == "?")
return "queries, \"[text]\"";
else if (ending == "!")
return "declares, \"[copytext(text, 1, length(text))]\"";
return "states, \"[text]\"";