Fix isolator, simple_mobs, and language. Also add system for marking forced speech for admins.

This commit is contained in:
Rob Nelson
2013-09-20 09:53:20 -07:00
parent c564faedf0
commit af5284e006
35 changed files with 493 additions and 265 deletions

View File

@@ -324,7 +324,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"name" = displayname, // the mob's display name "name" = displayname, // the mob's display name
"job" = jobname, // the mob's job "job" = jobname, // the mob's job
"key" = mobkey, // the mob's key "key" = mobkey, // the mob's key
"vmessage" = M.voice_message, // the message to display if the voice wasn't understood "vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood "vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mask "vmask" = voicemask, // 1 if the mob is using a voice gas mask
@@ -381,7 +381,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"name" = displayname, // the mob's display name "name" = displayname, // the mob's display name
"job" = jobname, // the mob's job "job" = jobname, // the mob's job
"key" = mobkey, // the mob's key "key" = mobkey, // the mob's key
"vmessage" = M.voice_message, // the message to display if the voice wasn't understood "vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood "vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mas "vmask" = voicemask, // 1 if the mob is using a voice gas mas
@@ -414,7 +414,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
//THIS IS TEMPORARY. //THIS IS TEMPORARY.
if(!connection) return //~Carn if(!connection) return //~Carn
Broadcast_Message(connection, M, voicemask, M.voice_message, Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name, src, message, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency) filter_type, signal.data["compression"], list(position.z), connection.frequency)
@@ -477,10 +477,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
else else
heard_normal += R heard_normal += R
else else
if (M.voice_message) heard_garbled += R
heard_voice += R
else
heard_garbled += R
if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled)) if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled))
var/part_a = "<span class='radio'><span class='name'>" var/part_a = "<span class='radio'><span class='name'>"
@@ -576,11 +573,11 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
R.show_message(rendered, 2) R.show_message(rendered, 2)
if (length(heard_voice)) if (length(heard_voice))
var/rendered = "[part_a][M.voice_name][part_b][M.voice_message][part_c]" var/rendered = "[part_a][M.voice_name][part_b][pick(M.speak_emote)][part_c]"
for (var/mob/R in heard_voice) for (var/mob/R in heard_voice)
if(istype(R, /mob/living/silicon/ai)) if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name] ([eqjobname]) </a>[part_b][M.voice_message][part_c]", 2) R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name] ([eqjobname]) </a>[part_b][pick(M.speak_emote)][part_c]", 2)
else else
R.show_message(rendered, 2) R.show_message(rendered, 2)

View File

@@ -1,7 +1,7 @@
// All mobs should have custom emote, really.. // All mobs should have custom emote, really..
/mob/proc/custom_emote(var/m_type=1,var/message = null) /mob/proc/custom_emote(var/m_type=1,var/message = null)
if(!use_me && usr == src) if(stat || !use_me && usr == src)
usr << "You are unable to emote." usr << "You are unable to emote."
return return

View File

@@ -43,11 +43,18 @@
key = "v" key = "v"
flags = RESTRICTED flags = RESTRICTED
/* /datum/language/diona
name = "Rootspeak"
desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes."
speech_verb = "creaks and rustles"
colour = "soghun"
key = "q"
flags = RESTRICTED
/datum/language/human /datum/language/human
name = "Sol Common" name = "Sol Common"
desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system." desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
key = "hum" key = "1"
flags = RESTRICTED flags = RESTRICTED
// Galactic common languages (systemwide accepted standards). // Galactic common languages (systemwide accepted standards).
@@ -55,14 +62,13 @@
name = "Tradeband" name = "Tradeband"
desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining." desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining."
speech_verb = "enunciates" speech_verb = "enunciates"
key = "tra" key = "2"
/datum/language/gutter /datum/language/gutter
name = "Gutter" name = "Gutter"
desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements." desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements."
speech_verb = "growls" speech_verb = "growls"
key = "gut" key = "3"
*/
// Language handling. // Language handling.
/mob/proc/add_language(var/language) /mob/proc/add_language(var/language)

View File

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

View File

@@ -22,11 +22,12 @@
return ..(message) return ..(message)
else else
// ~lol~ /* ~lol~
/mob/living/carbon/alien/say_quote(var/text) /mob/living/carbon/alien/say_quote(var/text)
// var/ending = copytext(text, length(text)) // var/ending = copytext(text, length(text))
return "[say_message], \"[text]\""; return "[say_message], \"[text]\"";
*/
/mob/living/proc/alien_talk(var/message) /mob/living/proc/alien_talk(var/message)
@@ -77,4 +78,4 @@
continue continue
if (M.stat > 1 && istype(M, /mob/dead/observer)) if (M.stat > 1 && istype(M, /mob/dead/observer))
rendered2 = "<i><span class='game say'>Hivemind, <span class='name'>[name]</span> <a href='byond://?src=\ref[M];follow2=\ref[M];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span></i>" rendered2 = "<i><span class='game say'>Hivemind, <span class='name'>[name]</span> <a href='byond://?src=\ref[M];follow2=\ref[M];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span></i>"
M.show_message(rendered2, 2) M.show_message(rendered2, 2)

View File

@@ -5,7 +5,6 @@
var/list/datum/disease2/disease/virus2 = list() var/list/datum/disease2/disease/virus2 = list()
var/antibodies = 0 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/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. var/life_tick = 0 // The amount of life ticks that have processed on this mob.

View File

@@ -169,6 +169,114 @@
stat("Energy Charge", round(wear_suit:cell:charge/100)) stat("Energy Charge", round(wear_suit:cell:charge/100))
/mob/living/carbon/human/ex_act(severity)
if(!blinded)
flick("flash", flash)
var/shielded = 0
var/b_loss = null
var/f_loss = null
switch (severity)
if (1.0)
b_loss += 500
if (!prob(getarmor(null, "bomb")))
gib()
return
else
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
//return
// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
//user.throw_at(target, 200, 4)
if (2.0)
if (!shielded)
b_loss += 60
f_loss += 60
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/1.5
f_loss = f_loss/1.5
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
ear_damage += 30
ear_deaf += 120
if (prob(70) && !shielded)
Paralyse(10)
if(3.0)
b_loss += 30
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/2
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
ear_damage += 15
ear_deaf += 60
if (prob(50) && !shielded)
Paralyse(10)
var/update = 0
// focus most of the blast on one organ
var/datum/organ/external/take_blast = pick(organs)
update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9, used_weapon = "Explosive blast")
// distribute the remaining 10% on all limbs equally
b_loss *= 0.1
f_loss *= 0.1
var/weapon_message = "Explosive Blast"
for(var/datum/organ/external/temp in organs)
switch(temp.name)
if("head")
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
if("chest")
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
if("l_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_leg")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_leg")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_foot")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_foot")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
/mob/living/carbon/human/blob_act()
if(stat == 2) return
show_message("\red The blob attacks you!")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
return
/mob/living/carbon/human/meteorhit(O as obj)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [src] has been hit by [O]", 1)
if (health > 0)
var/datum/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
if(!affecting) return
if (istype(O, /obj/effect/immovablerod))
if(affecting.take_damage(101, 0))
UpdateDamageIcon()
else
if(affecting.take_damage((istype(O, /obj/effect/meteor/small) ? 10 : 25), 30))
UpdateDamageIcon()
updatehealth()
return
/mob/living/carbon/human/hand_p(mob/M as mob) /mob/living/carbon/human/hand_p(mob/M as mob)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone)) var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))

View File

@@ -235,6 +235,16 @@
radiation = 0 radiation = 0
else else
if(species.flags & RAD_ABSORB)
var/rads = radiation/25
radiation -= rads
nutrition += rads
heal_overall_damage(rads,rads)
adjustOxyLoss(-(rads))
adjustToxLoss(-(rads))
updatehealth()
return
var/damage = 0 var/damage = 0
switch(radiation) switch(radiation)
if(1 to 49) if(1 to 49)
@@ -274,6 +284,7 @@
if(reagents.has_reagent("lexorin")) return if(reagents.has_reagent("lexorin")) return
if(mNobreath in mutations) return // No breath mutation means no breathing. if(mNobreath in mutations) return // No breath mutation means no breathing.
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
if(species && species.flags & NO_BREATHE) return
var/datum/organ/internal/lungs/L = internal_organs["lungs"] var/datum/organ/internal/lungs/L = internal_organs["lungs"]
L.process() L.process()
@@ -311,7 +322,6 @@
breath = loc.remove_air(breath_moles) breath = loc.remove_air(breath_moles)
if(!is_lung_ruptured()) if(!is_lung_ruptured())
if(!breath || breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5) if(!breath || breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5)
if(prob(5)) if(prob(5))

View File

@@ -68,11 +68,18 @@
O.hear_talk(src, message) O.hear_talk(src, message)
var/list/listening = hearers(message_range, src) var/list/listening = hearers(message_range, src)
listening -= src listening |= src
listening += src
//Pass whispers on to anything inside the immediate listeners.
for(var/mob/L in listening)
for(var/mob/C in L.contents)
if(istype(C,/mob/living))
listening += C
var/list/eavesdropping = hearers(2, src) var/list/eavesdropping = hearers(2, src)
eavesdropping -= src eavesdropping -= src
eavesdropping -= listening eavesdropping -= listening
var/list/watching = hearers(5, src) var/list/watching = hearers(5, src)
watching -= src watching -= src
watching -= listening watching -= listening
@@ -110,10 +117,7 @@
if (length(heard_b)) if (length(heard_b))
var/message_b var/message_b
if (src.voice_message) message_b = stars(message)
message_b = src.voice_message
else
message_b = stars(message)
if (italics) if (italics)
message_b = "<i>[message_b]</i>" message_b = "<i>[message_b]</i>"

View File

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

View File

@@ -117,6 +117,17 @@
emote("collapse") emote("collapse")
if (radiation) if (radiation)
if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea don't take rad damage.
var/rads = radiation/25
radiation -= rads
nutrition += rads
heal_overall_damage(rads,rads)
adjustOxyLoss(-(rads))
adjustToxLoss(-(rads))
updatehealth()
return
if (radiation > 100) if (radiation > 100)
radiation = 100 radiation = 100
Weaken(10) Weaken(10)
@@ -408,6 +419,25 @@
proc/handle_chemicals_in_body() proc/handle_chemicals_in_body()
if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea nymphs need light or they get sad.
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
var/area/A = T.loc
if(A)
if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
else light_amount = 5
nutrition += light_amount
traumatic_shock -= light_amount
if(nutrition > 500)
nutrition = 500
if(light_amount > 2) //if there's enough light, heal
heal_overall_damage(1,1)
adjustToxLoss(-1)
adjustOxyLoss(-1)
if(reagents) reagents.metabolize(src) if(reagents) reagents.metabolize(src)
if (drowsyness) if (drowsyness)

View File

@@ -1,8 +1,7 @@
/mob/living/carbon/monkey /mob/living/carbon/monkey
name = "monkey" name = "monkey"
voice_name = "monkey" voice_name = "monkey"
voice_message = "chimpers" speak_emote = list("chimpers")
say_message = "chimpers"
icon_state = "monkey1" icon_state = "monkey1"
icon = 'icons/mob/monkey.dmi' icon = 'icons/mob/monkey.dmi'
gender = NEUTER gender = NEUTER
@@ -17,24 +16,21 @@
/mob/living/carbon/monkey/tajara /mob/living/carbon/monkey/tajara
name = "farwa" name = "farwa"
voice_name = "farwa" voice_name = "farwa"
voice_message = "mews" speak_emote = list("mews")
say_message = "mews"
ico = "tajkey" ico = "tajkey"
uni_append = "0A0E00" uni_append = "0A0E00"
/mob/living/carbon/monkey/skrell /mob/living/carbon/monkey/skrell
name = "neaera" name = "neaera"
voice_name = "neaera" voice_name = "neaera"
voice_message = "squicks" speak_emote = list("squicks")
say_message = "squicks"
ico = "skrellkey" ico = "skrellkey"
uni_append = "01CC92" uni_append = "01CC92"
/mob/living/carbon/monkey/unathi /mob/living/carbon/monkey/unathi
name = "stok" name = "stok"
voice_name = "stok" voice_name = "stok"
voice_message = "hisses" speak_emote = list("hisses")
say_message = "hisses"
ico = "stokkey" ico = "stokkey"
uni_append = "044C5D" uni_append = "044C5D"
@@ -43,7 +39,7 @@
reagents = R reagents = R
R.my_atom = src 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)])" name = "[name] ([rand(1, 1000)])"
real_name = name real_name = name
@@ -71,18 +67,29 @@
..() ..()
dna.mutantrace = "lizard" dna.mutantrace = "lizard"
greaterform = "Unathi" greaterform = "Unathi"
add_language("Sinta'unathi")
/mob/living/carbon/monkey/skrell/New() /mob/living/carbon/monkey/skrell/New()
..() ..()
dna.mutantrace = "skrell" dna.mutantrace = "skrell"
greaterform = "Skrell" greaterform = "Skrell"
add_language("Skrellian")
/mob/living/carbon/monkey/tajara/New() /mob/living/carbon/monkey/tajara/New()
..() ..()
dna.mutantrace = "tajaran" dna.mutantrace = "tajaran"
greaterform = "Tajaran" greaterform = "Tajaran"
add_language("Siik'tajr")
/mob/living/carbon/monkey/diona/New()
..()
gender = NEUTER
dna.mutantrace = "plant"
greaterform = "Diona"
add_language("Rootspeak")
/mob/living/carbon/monkey/movement_delay() /mob/living/carbon/monkey/movement_delay()
var/tally = 0 var/tally = 0

View File

@@ -1,8 +1,9 @@
/mob/living/carbon/monkey/say(var/message) /mob/living/carbon/monkey/say(var/message,var/forced_by=null)
if (silent) if (silent)
return return
else else
return ..() return ..()
/*
/mob/living/carbon/monkey/say_quote(var/text) /mob/living/carbon/monkey/say_quote(var/text)
return "[src.say_message], \"[text]\""; return "[src.say_message], \"[text]\"";
*/

View File

@@ -15,7 +15,7 @@
var/attack_verb = "punch" // Empty hand hurt intent verb. var/attack_verb = "punch" // Empty hand hurt intent verb.
var/mutantrace // Safeguard due to old code. var/mutantrace // Safeguard due to old code.
var/breath_type // Non-oxygen gas breathed, if any. var/breath_type = "oxygen" // Non-oxygen gas breathed, if any.
var/survival_gear = /obj/item/weapon/storage/box/survival // For spawnin'. var/survival_gear = /obj/item/weapon/storage/box/survival // For spawnin'.
var/cold_level_1 = 260 // Cold damage level 1 below this point. var/cold_level_1 = 260 // Cold damage level 1 below this point.
@@ -73,6 +73,14 @@
attack_verb = "scratch" attack_verb = "scratch"
darksight = 8 darksight = 8
cold_level_1 = 200
cold_level_2 = 140
cold_level_3 = 80
heat_level_1 = 330
heat_level_2 = 380
heat_level_3 = 800
primitive = /mob/living/carbon/monkey/tajara primitive = /mob/living/carbon/monkey/tajara
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
@@ -92,6 +100,13 @@
deform = 'icons/mob/human_races/r_def_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi'
language = "Vox-pidgin" language = "Vox-pidgin"
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 80
cold_level_2 = 50
cold_level_3 = 0
eyes = "vox_eyes_s" eyes = "vox_eyes_s"
breath_type = "nitrogen" breath_type = "nitrogen"
survival_gear=/obj/item/weapon/storage/box/survival/vox survival_gear=/obj/item/weapon/storage/box/survival/vox
@@ -102,6 +117,19 @@
name = "Diona" name = "Diona"
icobase = 'icons/mob/human_races/r_plant.dmi' icobase = 'icons/mob/human_races/r_plant.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Rootspeak"
attack_verb = "slash" attack_verb = "slash"
primitive = /mob/living/carbon/monkey/diona
flags = WHITELISTED | NO_EAT | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT warning_low_pressure = 50
hazard_low_pressure = -1
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
flags = WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT | RAD_ABSORB

View File

@@ -29,7 +29,6 @@
var/t_sl_gas = null var/t_sl_gas = null
var/t_n2 = null var/t_n2 = null
var/now_pushing = null var/now_pushing = null
var/cameraFollow = null var/cameraFollow = null
@@ -39,4 +38,5 @@
var/specialsauce = 0 //Has this person consumed enough special sauce? IF so they're a ticking time bomb of death. var/specialsauce = 0 //Has this person consumed enough special sauce? IF so they're a ticking time bomb of death.
var/implanting = 0 //Used for the mind-slave implant var/implanting = 0 //Used for the mind-slave implant
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", ":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate",
":u" = "Supply", "#u" = "Supply", ".u" = "Supply", ":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
":g" = "changeling", "#g" = "changeling", ".g" = "changeling", ":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", ":R" = "right hand", "#R" = "right hand", ".R" = "right hand",
":L" = "left hand", "#L" = "left hand", ".L" = "left 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", ":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate",
":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":G" = "changeling", "#G" = "changeling", ".G" = "changeling", ":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 //kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. //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>" = "alientalk", "#<23>" = "alientalk", ".<2E>" = "alientalk",
":<3A>" = "Syndicate", "#<23>" = "Syndicate", ".<2E>" = "Syndicate", ":<3A>" = "Syndicate", "#<23>" = "Syndicate", ".<2E>" = "Syndicate",
":<3A>" = "Supply", "#<23>" = "Supply", ".<2E>" = "Supply", ":<3A>" = "Supply", "#<23>" = "Supply", ".<2E>" = "Supply",
":<3A>" = "changeling", "#<23>" = "changeling", ".<2E>" = "changeling", ":<3A>" = "changeling", "#<23>" = "changeling", ".<2E>" = "changeling"
":<3A>" = "skrell", "#<23>" = "skrell", ".<2E>" = "skrell",
":<3A>" = "tajaran", "#<23>" = "tajaran", ".<2E>" = "tajaran",
":<3A>" = "soghun", "#<23>" = "soghun", ".<2E>" = "soghun"
) )
/mob/living/proc/binarycheck() /mob/living/proc/binarycheck()
@@ -84,15 +73,21 @@ var/list/department_radio_keys = list(
if(!istype(dongle)) return if(!istype(dongle)) return
if(dongle.translate_hive) return 1 if(dongle.translate_hive) return 1
/mob/living/say(var/message) // /vg/edit: Added forced_by for handling braindamage messages and meme stuff
/mob/living/say(var/message, var/forced_by=null)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = capitalize(message) message = capitalize(message)
if (!message) if (!message)
return return
if (stat == 2) if(silent)
return
if (stat == 2) // Dead.
return say_dead(message) return say_dead(message)
else if (stat) // Unconcious.
return
if (src.client) if (src.client)
if(client.prefs.muted & MUTE_IC) if(client.prefs.muted & MUTE_IC)
@@ -109,6 +104,7 @@ var/list/department_radio_keys = list(
if (sdisabilities & MUTE) if (sdisabilities & MUTE)
return return
// Muzzled.
if (istype(wear_mask, /obj/item/clothing/mask/muzzle)) if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
return return
@@ -125,38 +121,41 @@ var/list/department_radio_keys = list(
var/message_mode = null var/message_mode = null
var/datum/language/speaking = null //For use if a specific language is being spoken. var/datum/language/speaking = null //For use if a specific language is being spoken.
// If brain damaged, talk on headset at random. var/braindam = getBrainLoss()
if (getBrainLoss() >= 60 && prob(50)) if (braindam >= 60)
if (ishuman(src)) if(prob(braindam/4))
message_mode = "headset" message = stutter(message)
if(prob(braindam))
message = uppertext(message)
// General public key. Special message handling // General public key. Special message handling
else if (copytext(message, 1, 2) == ";") else if (copytext(message, 1, 2) == ";" || prob(braindam/2))
if (ishuman(src)) if (ishuman(src))
message_mode = "headset" message_mode = "headset"
else if(ispAI(src) || isrobot(src)) else if(ispAI(src) || isrobot(src))
message_mode = "pAI" message_mode = "pAI"
message = copytext(message, 2) message = copytext(message, 2)
// Begin checking for either a message mode or a language to speak.
else if (length(message) >= 2) else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3) var/channel_prefix = copytext(message, 1, 3)
//Check if the person is speaking a language that they know. //Check if the person is speaking a language that they know.
for(var/datum/language/L in languages) if(languages.len)
if(lowertext(channel_prefix) == ":[L.key]") for(var/datum/language/L in languages)
speaking = L if(lowertext(channel_prefix) == ":[L.key]")
break speaking = L
break
message_mode = department_radio_keys[channel_prefix] message_mode = department_radio_keys[channel_prefix]
if (message_mode) if (message_mode || speaking || copytext(message,1,2) == ":")
message = trim(copytext(message, 3)) message = trim(copytext(message, 3))
if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels)))) if (!(istype(src,/mob/living/carbon/human) || istype(src,/mob/living/carbon/monkey) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels))))
message_mode = null //only humans can use headsets message_mode = null //only humans can use headsets
// Check changed so that parrots can use headsets. Other simple animals do not have ears and will cause runtimes. // Check changed so that parrots can use headsets. Other simple animals do not have ears and will cause runtimes.
// And borgs -Sieve // And borgs -Sieve
/* /vg/ removals /* /vg/ removals
if(src.stunned > 2 || (traumatic_shock > 61 && prob(50))) if(src.stunned > 2 || (traumatic_shock > 61 && prob(50)))
message_mode = "" //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it message_mode = null //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
*/ */
if (!message) if (!message)
return return
@@ -398,7 +397,10 @@ var/list/department_radio_keys = list(
//BEGIN TELEPORT CHANGES //BEGIN TELEPORT CHANGES
if(!istype(M, /mob/new_player)) if(!istype(M, /mob/new_player))
if(M && M.stat == DEAD) if(M && M.stat == DEAD)
rendered2 = "<span class='game say'><span class='name'>[GetVoice()]</span></span> [alt_name] <a href='byond://?src=\ref[M];follow2=\ref[M];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span>" if(forced_by)
rendered2 = "<span class='game say'><span class='name'>[GetVoice()] (forced by [forced_by])</span></span>[alt_name] <a href='byond://?src=\ref[M];follow2=\ref[M];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span>"
else
rendered2 = "<span class='game say'><span class='name'>[GetVoice()]</span></span> [alt_name] <a href='byond://?src=\ref[M];follow2=\ref[M];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span>"
M:show_message(rendered2, 2) M:show_message(rendered2, 2)
continue continue
//END CHANGES //END CHANGES
@@ -415,12 +417,8 @@ var/list/department_radio_keys = list(
if (length(heard_b)) if (length(heard_b))
var/message_b var/message_b
message_b = stars(message)
if (voice_message) message_b = say_quote(message_b,speaking)
message_b = voice_message
else
message_b = stars(message)
message_b = say_quote(message_b,speaking)
if (italics) if (italics)
message_b = "<i>[message_b]</i>" message_b = "<i>[message_b]</i>"
@@ -434,7 +432,10 @@ var/list/department_radio_keys = list(
MM = M MM = M
if(!istype(MM, /mob/new_player) && MM) if(!istype(MM, /mob/new_player) && MM)
if(MM && MM.stat == DEAD) if(MM && MM.stat == DEAD)
rendered2 = "<span class='game say'><span class='name'>[voice_name]</span></span> <a href='byond://?src=\ref[MM];follow2=\ref[MM];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_b]</span></span>" if(forced_by)
rendered2 = "<span class='game say'><span class='name'>[voice_name] (forced by [forced_by])</span></span> <a href='byond://?src=\ref[MM];follow2=\ref[MM];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_b]</span></span>"
else
rendered2 = "<span class='game say'><span class='name'>[voice_name]</span></span> <a href='byond://?src=\ref[MM];follow2=\ref[MM];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_b]</span></span>"
MM:show_message(rendered2, 2) MM:show_message(rendered2, 2)
continue continue
if(hascall(M,"show_message")) if(hascall(M,"show_message"))

View File

@@ -14,9 +14,9 @@
turns_per_move = 5 turns_per_move = 5
see_in_dark = 6 see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
response_help = "pets" response_help = "pets the"
response_disarm = "gently pushes aside" response_disarm = "gently pushes aside the"
response_harm = "hits" response_harm = "pokes the"
stop_automated_movement_when_pulled = 0 stop_automated_movement_when_pulled = 0
maxHealth = 60 maxHealth = 60
health = 60 health = 60
@@ -43,28 +43,25 @@
desc = "" desc = ""
response_help = "pets" response_help = "pets"
response_disarm = "gently pushes aside" response_disarm = "gently pushes aside"
response_harm = "hits" response_harm = "pokes"
/mob/living/simple_animal/hostile/bear/Move()
..()
if(stat != DEAD)
if(loc && istype(loc,/turf/space))
icon_state = "bear"
else
icon_state = "bearfloor"
/mob/living/simple_animal/hostile/bear/Life() /mob/living/simple_animal/hostile/bear/Life()
. =..() . =..()
if(!.) if(!.)
return return
if(loc && istype(loc,/turf/space))
icon_state = "bear"
else
icon_state = "bearfloor"
switch(stance) switch(stance)
if(HOSTILE_STANCE_TIRED) if(HOSTILE_STANCE_TIRED)
stop_automated_movement = 1 stop_automated_movement = 1
stance_step++ stance_step++
if(stance_step >= 10) //rests for 10 ticks if(stance_step >= 10) //rests for 10 ticks
if(target && target in ListTargets()) if(target_mob && target_mob in ListTargets(10))
stance = HOSTILE_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. stance = HOSTILE_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
else else
stance = HOSTILE_STANCE_IDLE stance = HOSTILE_STANCE_IDLE
@@ -72,15 +69,15 @@
if(HOSTILE_STANCE_ALERT) if(HOSTILE_STANCE_ALERT)
stop_automated_movement = 1 stop_automated_movement = 1
var/found_mob = 0 var/found_mob = 0
if(target && target in ListTargets()) if(target_mob && target_mob in ListTargets(10))
if(!(SA_attackable(target))) if(!(SA_attackable(target_mob)))
stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again.
stance_step++ stance_step++
found_mob = 1 found_mob = 1
src.dir = get_dir(src,target) //Keep staring at the mob src.dir = get_dir(src,target_mob) //Keep staring at the mob
if(stance_step in list(1,4,7)) //every 3 ticks if(stance_step in list(1,4,7)) //every 3 ticks
var/action = pick( list( "growls at [target]", "stares angrily at [target]", "prepares to attack [target]", "closely watches [target]" ) ) var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) )
if(action) if(action)
emote(action) emote(action)
if(!found_mob) if(!found_mob)
@@ -105,18 +102,18 @@
if(stance != HOSTILE_STANCE_ATTACK && stance != HOSTILE_STANCE_ATTACKING) if(stance != HOSTILE_STANCE_ATTACK && stance != HOSTILE_STANCE_ATTACKING)
stance = HOSTILE_STANCE_ALERT stance = HOSTILE_STANCE_ALERT
stance_step = 6 stance_step = 6
target = user target_mob = user
..() ..()
/mob/living/simple_animal/hostile/bear/attack_hand(mob/living/carbon/human/M as mob) /mob/living/simple_animal/hostile/bear/attack_hand(mob/living/carbon/human/M as mob)
if(stance != HOSTILE_STANCE_ATTACK && stance != HOSTILE_STANCE_ATTACKING) if(stance != HOSTILE_STANCE_ATTACK && stance != HOSTILE_STANCE_ATTACKING)
stance = HOSTILE_STANCE_ALERT stance = HOSTILE_STANCE_ALERT
stance_step = 6 stance_step = 6
target = M target_mob = M
..() ..()
/mob/living/simple_animal/hostile/bear/Process_Spacemove(var/check_drift = 0) /mob/living/simple_animal/hostile/bear/Process_Spacemove(var/check_drift = 0)
return 1 //No drifting in space for space bears! return //No drifting in space for space bears!
/mob/living/simple_animal/hostile/bear/FindTarget() /mob/living/simple_animal/hostile/bear/FindTarget()
. = ..() . = ..()
@@ -128,22 +125,22 @@
..(5) ..(5)
/mob/living/simple_animal/hostile/bear/AttackingTarget() /mob/living/simple_animal/hostile/bear/AttackingTarget()
emote( pick( list("slashes at [target]", "bites [target]") ) ) emote( pick( list("slashes at [target_mob]", "bites [target_mob]") ) )
var/damage = rand(20,30) var/damage = rand(20,30)
if(ishuman(target)) if(ishuman(target_mob))
var/mob/living/carbon/human/H = target var/mob/living/carbon/human/H = target_mob
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee")) H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"))
return H return H
else if(isliving(target)) else if(isliving(target_mob))
var/mob/living/L = target var/mob/living/L = target_mob
L.adjustBruteLoss(damage) L.adjustBruteLoss(damage)
return L return L
else if(istype(target,/obj/mecha)) else if(istype(target_mob,/obj/mecha))
var/obj/mecha/M = target var/obj/mecha/M = target_mob
M.attack_animal(src) M.attack_animal(src)
return M return M

View File

@@ -34,7 +34,7 @@
max_n2 = 0 max_n2 = 0
minbodytemp = 0 minbodytemp = 0
//break_stuff_probability = 2 break_stuff_probability = 2
faction = "carp" faction = "carp"

View File

@@ -18,9 +18,9 @@
turns_per_move = 5 turns_per_move = 5
see_in_dark = 10 see_in_dark = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
response_help = "pets" response_help = "pets the"
response_disarm = "gently pushes aside" response_disarm = "gently pushes aside the"
response_harm = "hits" response_harm = "pokes the"
stop_automated_movement_when_pulled = 0 stop_automated_movement_when_pulled = 0
maxHealth = 75 // Was 200 maxHealth = 75 // Was 200
health = 75 // 150/2 health = 75 // 150/2
@@ -34,6 +34,7 @@
var/busy = 0 var/busy = 0
pass_flags = PASSTABLE pass_flags = PASSTABLE
move_to_delay = 6 move_to_delay = 6
speed = 3
//nursemaids - these create webs and eggs //nursemaids - these create webs and eggs
// Slower // Slower
@@ -69,8 +70,8 @@
/mob/living/simple_animal/hostile/giant_spider/AttackingTarget() /mob/living/simple_animal/hostile/giant_spider/AttackingTarget()
..() ..()
if(isliving(target)) if(isliving(target_mob))
var/mob/living/L = target var/mob/living/L = target_mob
if(L.reagents) if(L.reagents)
if(prob(poison_per_bite)) if(prob(poison_per_bite))
src.visible_message("\red \the [src] injects a powerful toxin!") src.visible_message("\red \the [src] injects a powerful toxin!")
@@ -107,14 +108,14 @@
if(D.density==1) // Closed if(D.density==1) // Closed
busy=MOVING_TO_TARGET busy=MOVING_TO_TARGET
Goto(D, move_to_delay) Goto(D, move_to_delay)
target=D target_mob=D
GiveUp(D) GiveUp(D)
return return
if(busy) if(busy)
if(busy == MOVING_TO_TARGET && target) if(busy == MOVING_TO_TARGET && target_mob)
var/obj/machinery/door/D = target var/obj/machinery/door/D = target_mob
if(D.density==1) if(D.density==1)
if(get_dist(src, target) > 1) if(get_dist(src, target_mob) > 1)
return // keep movin'. return // keep movin'.
stop_automated_movement = 1 stop_automated_movement = 1
walk(src,0) walk(src,0)
@@ -134,11 +135,12 @@
cocoon_target = null cocoon_target = null
busy = 0 busy = 0
stop_automated_movement = 0 stop_automated_movement = 0
/mob/living/simple_animal/hostile/giant_spider/hunter/proc/GiveUp(var/C) /mob/living/simple_animal/hostile/giant_spider/hunter/proc/GiveUp(var/C)
spawn(100) spawn(100)
if(busy == MOVING_TO_TARGET) if(busy == MOVING_TO_TARGET)
if(target == C && get_dist(src,target) > 1) if(target_mob == C && get_dist(src,target_mob) > 1)
target = null target_mob = null
busy = 0 busy = 0
stop_automated_movement = 0 stop_automated_movement = 0
@@ -146,7 +148,7 @@
..() ..()
if(!stat) if(!stat)
if(stance == HOSTILE_STANCE_IDLE) if(stance == HOSTILE_STANCE_IDLE)
var/list/can_see = ListTargets() var/list/can_see = view(src, 10)
//30% chance to stop wandering and do something //30% chance to stop wandering and do something
if(!busy && prob(30)) if(!busy && prob(30))
//first, check for potential food nearby to cocoon //first, check for potential food nearby to cocoon
@@ -220,7 +222,6 @@
//give up if we can't reach them after 10 seconds //give up if we can't reach them after 10 seconds
GiveUp(O) GiveUp(O)
else if(busy == MOVING_TO_TARGET && cocoon_target) else if(busy == MOVING_TO_TARGET && cocoon_target)
if(get_dist(src, cocoon_target) <= 1) if(get_dist(src, cocoon_target) <= 1)
if(istype(cocoon_target, /mob/living/simple_animal/hostile/giant_spider)) if(istype(cocoon_target, /mob/living/simple_animal/hostile/giant_spider))

View File

@@ -1,23 +1,27 @@
/mob/living/simple_animal/hostile /mob/living/simple_animal/hostile
faction = "hostile" faction = "hostile"
var/stance = HOSTILE_STANCE_IDLE //Used to determine behavior var/stance = HOSTILE_STANCE_IDLE //Used to determine behavior
var/target var/target_mob // /vg/ edit: Removed type specification so spiders can target doors.
var/attack_same = 0 var/attack_same = 0
var/ranged = 0 var/ranged = 0
var/rapid = 0 var/rapid = 0
var/projectiletype var/projectiletype
var/projectilesound var/projectilesound
var/casingtype var/casingtype
var/move_to_delay = 2 //delay for the automated movement. var/move_to_delay = 4 //delay for the automated movement.
var/list/friends = list() var/list/friends = list()
var/vision_range = 10 var/break_stuff_probability = 10
stop_automated_movement_when_pulled = 0 stop_automated_movement_when_pulled = 0
var/destroy_surroundings = 1
/mob/living/simple_animal/hostile/proc/FindTarget() /mob/living/simple_animal/hostile/proc/FindTarget()
var/atom/T = null var/atom/T = null
stop_automated_movement = 0 stop_automated_movement = 0
for(var/atom/A in ListTargets()) for(var/atom/A in ListTargets(10))
if(A == src)
continue
var/atom/F = Found(A) var/atom/F = Found(A)
if(F) if(F)
@@ -32,19 +36,27 @@
continue continue
else else
if(!L.stat) if(!L.stat)
stance = HOSTILE_STANCE_ATTACK
T = L T = L
break break
else if(istype(A, /obj/mecha)) // Our line of sight stuff was already done in ListTargets(). else if(istype(A, /obj/mecha)) // Our line of sight stuff was already done in ListTargets().
var/obj/mecha/M = A var/obj/mecha/M = A
if (M.occupant) if (M.occupant)
stance = HOSTILE_STANCE_ATTACK
T = M T = M
break break
if(istype(A, /obj/machinery/bot))
var/obj/machinery/bot/B = A
if (B.health > 0)
stance = HOSTILE_STANCE_ATTACK
T = B
break
return T return T
/mob/living/simple_animal/hostile/proc/GiveTarget(var/new_target) /mob/living/simple_animal/hostile/proc/GiveTarget(var/new_target)
target = new_target target_mob = new_target
stance = HOSTILE_STANCE_ATTACK stance = HOSTILE_STANCE_ATTACK
return return
@@ -56,44 +68,47 @@
/mob/living/simple_animal/hostile/proc/MoveToTarget() /mob/living/simple_animal/hostile/proc/MoveToTarget()
stop_automated_movement = 1 stop_automated_movement = 1
if(!target || SA_attackable(target)) if(!target_mob || SA_attackable(target_mob))
LoseTarget() stance = HOSTILE_STANCE_IDLE
if(target in ListTargets()) if(target_mob in ListTargets(10))
if(ranged) if(ranged)
if(get_dist(src, target) <= 6) if(get_dist(src, target_mob) <= 6)
OpenFire(target) OpenFire(target_mob)
else else
Goto(target, move_to_delay) Goto(target_mob, move_to_delay)
else else
stance = HOSTILE_STANCE_ATTACKING stance = HOSTILE_STANCE_ATTACKING
Goto(target, move_to_delay) Goto(target_mob, move_to_delay)
/mob/living/simple_animal/hostile/proc/AttackTarget() /mob/living/simple_animal/hostile/proc/AttackTarget()
stop_automated_movement = 1 stop_automated_movement = 1
if(!target || SA_attackable(target)) if(!target_mob || SA_attackable(target_mob))
LoseTarget() LoseTarget()
return 0 return 0
if(!(target in ListTargets())) if(!(target_mob in ListTargets(10)))
LostTarget() LostTarget()
return 0 return 0
if(get_dist(src, target) <= 1) //Attacking if(get_dist(src, target_mob) <= 1) //Attacking
AttackingTarget() AttackingTarget()
return 1 return 1
/mob/living/simple_animal/hostile/proc/AttackingTarget() /mob/living/simple_animal/hostile/proc/AttackingTarget()
if(isliving(target)) if(isliving(target_mob))
var/mob/living/L = target var/mob/living/L = target_mob
L.attack_animal(src) L.attack_animal(src)
return L return L
if(istype(target,/obj/mecha)) if(istype(target_mob,/obj/mecha))
var/obj/mecha/M = target var/obj/mecha/M = target_mob
M.attack_animal(src) M.attack_animal(src)
return M return M
if(istype(target_mob,/obj/machinery/bot))
var/obj/machinery/bot/B = target_mob
B.attack_animal(src)
/mob/living/simple_animal/hostile/proc/LoseTarget() /mob/living/simple_animal/hostile/proc/LoseTarget()
stance = HOSTILE_STANCE_IDLE stance = HOSTILE_STANCE_IDLE
target = null target_mob = null
walk(src, 0) walk(src, 0)
/mob/living/simple_animal/hostile/proc/LostTarget() /mob/living/simple_animal/hostile/proc/LostTarget()
@@ -101,16 +116,11 @@
walk(src, 0) walk(src, 0)
/mob/living/simple_animal/hostile/proc/ListTargets(var/override = -1) /mob/living/simple_animal/hostile/proc/ListTargets(var/dist = 7)
var/list/L = hearers(src, dist)
// Allows you to override how much the mob can see. Defaults to vision_range if none is entered.
if(override == -1)
override = vision_range
var/list/L = hearers(src, override)
for(var/obj/mecha/M in mechas_list) for(var/obj/mecha/M in mechas_list)
// Will check the distance before checking the line of sight, if the distance is small enough. // Will check the distance before checking the line of sight, if the distance is small enough.
if(get_dist(M, src) <= override && can_see(src, M, override)) if(get_dist(M, src) <= dist && can_see(src, M, dist))
L += M L += M
return L return L
@@ -130,19 +140,20 @@
if(!stat) if(!stat)
switch(stance) switch(stance)
if(HOSTILE_STANCE_IDLE) if(HOSTILE_STANCE_IDLE)
var/new_target = FindTarget() target_mob = FindTarget()
GiveTarget(new_target)
if(HOSTILE_STANCE_ATTACK) if(HOSTILE_STANCE_ATTACK)
DestroySurroundings() if(destroy_surroundings)
DestroySurroundings()
MoveToTarget() MoveToTarget()
if(HOSTILE_STANCE_ATTACKING) if(HOSTILE_STANCE_ATTACKING)
DestroySurroundings() if(destroy_surroundings)
DestroySurroundings()
AttackTarget() AttackTarget()
/mob/living/simple_animal/hostile/proc/OpenFire(var/the_target) /mob/living/simple_animal/hostile/proc/OpenFire(target_mob)
var/target = the_target var/target = target_mob
visible_message("\red <b>[src]</b> fires at [target]!", 1) visible_message("\red <b>[src]</b> fires at [target]!", 1)
var/tturf = get_turf(target) var/tturf = get_turf(target)
@@ -165,7 +176,7 @@
new casingtype new casingtype
stance = HOSTILE_STANCE_IDLE stance = HOSTILE_STANCE_IDLE
target = null target_mob = null
return return
@@ -188,7 +199,8 @@
return return
/mob/living/simple_animal/hostile/proc/DestroySurroundings() /mob/living/simple_animal/hostile/proc/DestroySurroundings()
for(var/dir in cardinal) // North, South, East, West if(prob(break_stuff_probability))
var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir)) for(var/dir in cardinal) // North, South, East, West
if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille)) var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
obstacle.attack_animal(src) if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
obstacle.attack_animal(src)

View File

@@ -22,7 +22,7 @@
speed = 8 speed = 8
projectiletype = /obj/item/projectile/beam/drone projectiletype = /obj/item/projectile/beam/drone
projectilesound = 'sound/weapons/laser3.ogg' projectilesound = 'sound/weapons/laser3.ogg'
//destroy_surroundings = 0 destroy_surroundings = 0
var/datum/effect/effect/system/ion_trail_follow/ion_trail var/datum/effect/effect/system/ion_trail_follow/ion_trail
//the drone randomly switches between these states because it's malfunctioning //the drone randomly switches between these states because it's malfunctioning

View File

@@ -2,7 +2,7 @@
/mob/living/simple_animal/kobold /mob/living/simple_animal/kobold
name = "kobold" name = "kobold"
desc = "A small, rat-like creature." desc = "A small, rat-like creature."
icon = 'mob.dmi' icon = 'icons/mob/mob.dmi'
icon_state = "kobold_idle" icon_state = "kobold_idle"
icon_living = "kobold_idle" icon_living = "kobold_idle"
icon_dead = "kobold_dead" icon_dead = "kobold_dead"

View File

@@ -9,7 +9,6 @@
var/icon_gib = null //We only try to show a gibbing animation if this exists. var/icon_gib = null //We only try to show a gibbing animation if this exists.
var/list/speak = list() 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/speak_chance = 0
var/list/emote_hear = list() //Hearable emotes 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 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
@@ -24,9 +23,9 @@
var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
//Interaction //Interaction
var/response_help = "pokes" var/response_help = "You try to help"
var/response_disarm = "shoves" var/response_disarm = "You try to disarm"
var/response_harm = "hits" var/response_harm = "You try to hurt"
var/harm_intent_damage = 3 var/harm_intent_damage = 3
//Temperature effect //Temperature effect
@@ -96,7 +95,7 @@
AdjustParalysis(-1) AdjustParalysis(-1)
//Movement //Movement
if(!client && !stop_automated_movement && wander) if(!client && !stop_automated_movement && wander && !anchored)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++ turns_since_move++
if(turns_since_move >= turns_per_move) if(turns_since_move >= turns_per_move)
@@ -229,14 +228,10 @@
return "[emote], \"[text]\"" return "[emote], \"[text]\""
return "says, \"[text]\""; return "says, \"[text]\"";
/mob/living/simple_animal/emote(var/act) /mob/living/simple_animal/emote(var/act, var/type, var/desc)
if(stat)
return
if(act) if(act)
if(act == "scream") act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P if(act == "scream") act = "whimper" //ugly hack to stop animals screaming when crushed :P
for (var/mob/O in viewers(src, null)) ..(act, type, desc)
O.show_message("<B>[src]</B> [act].")
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob) /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0) if(M.melee_damage_upper == 0)
@@ -265,7 +260,7 @@
if (health > 0) if (health > 0)
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded ))) if ((O.client && !( O.blinded )))
O.show_message("\blue [M] [response_help] [src].") O.show_message("\blue [M] [response_help] [src]")
if("grab") if("grab")
if (M == src || anchored) if (M == src || anchored)
@@ -290,7 +285,7 @@
adjustBruteLoss(harm_intent_damage) adjustBruteLoss(harm_intent_damage)
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded ))) if ((O.client && !( O.blinded )))
O.show_message("\red [M] [response_harm] [src]!") O.show_message("\red [M] [response_harm] [src]")
return return
@@ -353,7 +348,7 @@
if(M.Victim) return // can't attack while eating! if(M.Victim) return // can't attack while eating!
visible_message("\red <B>[M.name] glomps [src]!</B>") visible_message("\red <B>\The [M.name] glomps [src]!</B>")
var/damage = rand(1, 3) var/damage = rand(1, 3)
@@ -375,32 +370,22 @@
var/obj/item/stack/medical/MED = O var/obj/item/stack/medical/MED = O
if(health < maxHealth) if(health < maxHealth)
if(MED.amount >= 1) if(MED.amount >= 1)
if(MED.heal_brute >= 1) adjustBruteLoss(-MED.heal_brute)
adjustBruteLoss(-MED.heal_brute) MED.amount -= 1
MED.amount -= 1 if(MED.amount <= 0)
if(MED.amount <= 0) del(MED)
del(MED) for(var/mob/M in viewers(src, null))
for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded )))
if ((M.client && !( M.blinded ))) M.show_message("\blue [user] applies the [MED] on [src]")
M.show_message("\blue [user] applies [MED] on [src]")
return
else
user << "\blue [MED] won't help at all."
return
else
user << "\blue [src] is at full health."
return
else else
user << "\blue [src] is dead, medical items won't bring it back to life." user << "\blue this [src] is dead, medical items won't bring it back to life."
return if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch)) if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch))
new meat_type (get_turf(src)) new meat_type (get_turf(src))
if(prob(95)) if(prob(95))
del(src) del(src)
return return
gib() gib()
return
else else
if(O.force) if(O.force)
var/damage = O.force var/damage = O.force
@@ -409,12 +394,12 @@
adjustBruteLoss(damage) adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null)) for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded ))) if ((M.client && !( M.blinded )))
M.show_message("\red \b "+"[src] has been attacked with [O] by [user]. ") M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else else
usr << "\red This weapon is ineffective, it does no damage." usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null)) for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded ))) if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with [O]. ") M.show_message("\red [user] gently taps [src] with the [O]. ")
@@ -460,13 +445,25 @@
if(health < 1) if(health < 1)
Die() Die()
/mob/living/simple_animal/proc/SA_attackable(target) /mob/living/simple_animal/proc/SA_attackable(target_mob)
if (isliving(target)) if (isliving(target_mob))
var/mob/living/L = target var/mob/living/L = target_mob
if(!L.stat) if(!L.stat && L.health >= 0)
return 0 return (0)
if (istype(target,/obj/mecha)) if (istype(target_mob,/obj/mecha))
var/obj/mecha/M = target var/obj/mecha/M = target_mob
if (M.occupant) if (M.occupant)
return 0 return (0)
return 1 if (istype(target_mob,/obj/machinery/bot))
var/obj/machinery/bot/B = target_mob
if(B.health > 0)
return (0)
return (1)
//Call when target overlay should be added/removed
/mob/living/simple_animal/update_targeted()
if(!targeted_by && target_locked)
del(target_locked)
overlays = null
if (targeted_by && target_locked)
overlays += target_locked

View File

@@ -26,10 +26,10 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\mob.dm:25: t+= "\red Temperature: [environment.temperature] \n" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\mob.dm:25: t+= "\red Temperature: [environment.temperature] \n"
t += {"\red Temperature: [environment.temperature] \n t += {"\red Temperature: [environment.temperature] \n
\blue Nitrogen: [environment.nitrogen] \n \blue Nitrogen: [environment.nitrogen] \n
\blue Oxygen: [environment.oxygen] \n \blue Oxygen: [environment.oxygen] \n
\blue Plasma : [environment.toxins] \n \blue Plasma : [environment.toxins] \n
\blue Carbon Dioxide: [environment.carbon_dioxide] \n"} \blue Carbon Dioxide: [environment.carbon_dioxide] \n"}
// END AUTOFIX // END AUTOFIX
for(var/datum/gas/trace_gas in environment.trace_gases) for(var/datum/gas/trace_gas in environment.trace_gases)
usr << "\blue [trace_gas.type]: [trace_gas.moles] \n" usr << "\blue [trace_gas.type]: [trace_gas.moles] \n"

View File

@@ -86,9 +86,11 @@
var/lastpuke = 0 var/lastpuke = 0
var/unacidable = 0 var/unacidable = 0
var/small = 0 var/small = 0
var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) 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/embedded = list() //Embedded items, since simple mobs don't have organs.
var/list/languages = list() // For speaking/listening. var/list/languages = list() // For speaking/listening.
var/list/speak_emote = list("says") //Verbs used when speaking. Defaults to 'say' if speak_emote is null.
var/name_archive //For admin things like possession var/name_archive //For admin things like possession
var/timeofdeath = 0.0//Living var/timeofdeath = 0.0//Living
@@ -155,8 +157,6 @@
//see: setup.dm for list of mutations //see: setup.dm for list of mutations
var/voice_name = "unidentifiable voice" 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 var/faction = "neutral" //Used for checking whether hostile simple animals will attack you, possibly more stuff later
var/move_on_shuttle = 1 // Can move on the shuttle. var/move_on_shuttle = 1 // Can move on the shuttle.

View File

@@ -346,7 +346,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/proc/shake_camera(mob/M, duration, strength=1) /proc/shake_camera(mob/M, duration, strength=1)
if(!M || !M.client || M.shakecamera) if(!M || !M.client || M.shakecamera)
return return
spawn(0) spawn(1)
var/oldeye=M.client.eye var/oldeye=M.client.eye
var/x var/x
M.shakecamera = 1 M.shakecamera = 1

View File

@@ -37,6 +37,10 @@
usr << "\red Speech is currently admin-disabled." usr << "\red Speech is currently admin-disabled."
return return
if(client && !(client.prefs.toggles & CHAT_DEAD))
usr << "\red You have deadchat muted."
return
if(mind && mind.name) if(mind && mind.name)
name = "[mind.name]" name = "[mind.name]"
else else
@@ -57,49 +61,67 @@
M.show_message(rendered2, 2) //Takes into account blindness and such. M.show_message(rendered2, 2) //Takes into account blindness and such.
return return
/mob/proc/say_understands(var/mob/other) /mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)
if(!other) if(!other)
return 1 return 1
if (src.stat == 2) //Universal speak makes everything understandable, for obvious reasons.
else if(other.universal_speak || src.universal_speak)
return 1 return 1
else if (istype(other, src.type)) else if (src.stat == 2)
return 1 return 1
else if (speaking) //Language check.
var/understood
for(var/datum/language/L in src.languages)
if(speaking.name == L.name)
understood = 1
break
if(understood || universal_speak)
return 1
else
return 0
else if(other.universal_speak || src.universal_speak) else if(other.universal_speak || src.universal_speak)
return 1 return 1
else if(isAI(src) && ispAI(other)) else if(isAI(src) && ispAI(other))
return 1 return 1
else if (istype(other, src.type) || istype(src, other.type))
return 1
return 0 return 0
/mob/proc/say_quote(var/text,var/is_speaking_soghun,var/is_speaking_skrell,var/is_speaking_tajaran,var/is_speaking_vox) /mob/proc/say_quote(var/text,var/datum/language/speaking)
if(!text) 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 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 //tcomms code is still runtiming somewhere here
var/ending = copytext(text, length(text)) var/ending = copytext(text, length(text))
if (is_speaking_soghun)
return "<span class='say_quote'>hisses</span>, \"<span class='soghun'>[text]</span>\""; var/speechverb = "<span class='say_quote'>"
if (is_speaking_skrell)
return "<span class='say_quote'>warbles</span>, \"<span class='skrell'>[text]</span>\""; if (speaking)
if (is_speaking_tajaran) speechverb = "[speaking.speech_verb]</span>, \"<span class='[speaking.colour]'>"
return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\""; else if(speak_emote && speak_emote.len)
if (is_speaking_vox) speechverb = "[pick(speak_emote)], \""
return "<span class='say_quote'>chirps</span>, \"<span class='vox'>[text]</span>\""; else if (src.stuttering)
//Needs Virus2 speechverb = "stammers, \""
// if (src.disease_symptoms & DISEASE_HOARSE) else if (src.slurring)
// return "rasps, \"[text]\""; speechverb = "slurrs, \""
if (src.stuttering) else if (ending == "?")
return "<span class='say_quote'>stammers</span>, \"[text]\""; speechverb = "asks, \""
if (src.slurring) else if (ending == "!")
return "<span class='say_quote'>slurrs</span>, \"[text]\""; speechverb = "exclaims, \""
if(isliving(src)) else if(isliving(src))
var/mob/living/L = src var/mob/living/L = src
if (L.getBrainLoss() >= 60) if (L.getBrainLoss() >= 60)
return "<span class='say_quote'>gibbers</span>, \"[text]\""; speechverb = "gibbers, \""
if (ending == "?") else
return "<span class='say_quote'>asks</span>, \"[text]\""; speechverb = "says, \""
if (ending == "!") else
return "<span class='say_quote'>exclaims</span>, \"[text]\""; speechverb = "says, \""
return "<span class='say_quote'>says</span>, \"[text]\""; return "[speechverb][text]</span>\""
/mob/proc/emote(var/act, var/type, var/message) /mob/proc/emote(var/act, var/type, var/message)
if(act == "me") if(act == "me")

View File

@@ -42,7 +42,7 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\centrifuge.dm:41: dat += "<BR>Blood sample:" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\centrifuge.dm:41: dat += "<BR>Blood sample:"
dat += {"<BR>Blood sample: dat += {"<BR>Blood sample:
<br><table cellpadding='10'><tr><td>"} <br><table cellpadding='10'><tr><td>"}
// END AUTOFIX // END AUTOFIX
if(sample) if(sample)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list
@@ -53,8 +53,8 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\centrifuge.dm:48: dat += "</td></tr><tr><td>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\centrifuge.dm:48: dat += "</td></tr><tr><td>"
dat += {"</td></tr><tr><td> dat += {"</td></tr><tr><td>
Antibodies: [antigens2string(B.data["antibodies"])] Antibodies: [antigens2string(B.data["antibodies"])]
</td><td><A href='?src=\ref[src];action=antibody'>Isolate</a>"} </td><td><A href='?src=\ref[src];action=antibody'>Isolate</a>"}
// END AUTOFIX // END AUTOFIX
var/list/virus = B.data["virus2"] var/list/virus = B.data["virus2"]
for (var/ID in virus) for (var/ID in virus)
@@ -63,7 +63,7 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\centrifuge.dm:55: dat += " </td></tr><tr><td> pathogen [V.name()]" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\centrifuge.dm:55: dat += " </td></tr><tr><td> pathogen [V.name()]"
dat += {"</td></tr><tr><td> pathogen [V.name()] dat += {"</td></tr><tr><td> pathogen [V.name()]
</td><td><A href='?src=\ref[src];action=isolate;isolate=[V.uniqueID]'>Isolate</a>"} </td><td><A href='?src=\ref[src];action=isolate;isolate=[V.uniqueID]'>Isolate</a>"}
// END AUTOFIX // END AUTOFIX
else else
dat += "Please check container contents." dat += "Please check container contents."

View File

@@ -63,7 +63,7 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\curer.dm:62: dat += "<BR>Antibodies: [code]" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\curer.dm:62: dat += "<BR>Antibodies: [code]"
dat += {"<BR>Antibodies: [code] dat += {"<BR>Antibodies: [code]
<BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>"} <BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>"}
// END AUTOFIX // END AUTOFIX
else else
dat += "<BR>Please check container contents." dat += "<BR>Please check container contents."

View File

@@ -128,7 +128,10 @@
var/list/res = list() var/list/res = list()
for (var/ID in viruses) for (var/ID in viruses)
var/datum/disease2/disease/V = viruses[ID] var/datum/disease2/disease/V = viruses[ID]
res["[V.uniqueID]"] = V.getcopy() if(istype(V))
res["[V.uniqueID]"] = V.getcopy()
else
testing("Got a NULL disease2 in virus_copylist!")
return res return res

View File

@@ -62,7 +62,7 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\diseasesplicer.dm:61: dat += "</a>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\diseasesplicer.dm:61: dat += "</a>"
dat += {"</a> dat += {"</a>
<BR><A href='?src=\ref[src];disk=1'>Burn DNA Sequence to data storage disk</a>"} <BR><A href='?src=\ref[src];disk=1'>Burn DNA Sequence to data storage disk</a>"}
// END AUTOFIX // END AUTOFIX
else else
dat += "Empty." dat += "Empty."

View File

@@ -109,41 +109,41 @@
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:108: dat += "Power status : <A href='?src=\ref[src];power=1'>[string]</a>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:108: dat += "Power status : <A href='?src=\ref[src];power=1'>[string]</a>"
dat += {"Power status : <A href='?src=\ref[src];power=1'>[string]</a> dat += {"Power status : <A href='?src=\ref[src];power=1'>[string]</a>
<BR> <BR>
Food supply : [foodsupply] Food supply : [foodsupply]
<BR> <BR>
Radiation Levels : [radiation] RADS : <A href='?src=\ref[src];rad=1'>Radiate</a> Radiation Levels : [radiation] RADS : <A href='?src=\ref[src];rad=1'>Radiate</a>
<BR> <BR>
Toxins : [toxins] Toxins : [toxins]
<BR><BR>"} <BR><BR>"}
// END AUTOFIX // END AUTOFIX
if(beaker) if(beaker)
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:117: dat += "Eject chemicals : <A href='?src=\ref[src];ejectchem=1'> Eject</a>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:117: dat += "Eject chemicals : <A href='?src=\ref[src];ejectchem=1'> Eject</a>"
dat += {"Eject chemicals : <A href='?src=\ref[src];ejectchem=1'> Eject</a> dat += {"Eject chemicals : <A href='?src=\ref[src];ejectchem=1'> Eject</a>
<BR>"} <BR>"}
// END AUTOFIX // END AUTOFIX
if(dish) if(dish)
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:120: dat += "Eject Virus dish : <A href='?src=\ref[src];ejectdish=1'> Eject</a>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:120: dat += "Eject Virus dish : <A href='?src=\ref[src];ejectdish=1'> Eject</a>"
dat += {"Eject Virus dish : <A href='?src=\ref[src];ejectdish=1'> Eject</a> dat += {"Eject Virus dish : <A href='?src=\ref[src];ejectdish=1'> Eject</a>
<BR>"} <BR>"}
// END AUTOFIX // END AUTOFIX
if(beaker) if(beaker)
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:123: dat += "Breed viral culture in beaker : <A href='?src=\ref[src];virus=1'> Start</a>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:123: dat += "Breed viral culture in beaker : <A href='?src=\ref[src];virus=1'> Start</a>"
dat += {"Breed viral culture in beaker : <A href='?src=\ref[src];virus=1'> Start</a> dat += {"Breed viral culture in beaker : <A href='?src=\ref[src];virus=1'> Start</a>
<BR>"} <BR>"}
// END AUTOFIX // END AUTOFIX
// AUTOFIXED BY fix_string_idiocy.py // AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:125: dat += "<BR><BR>" // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\virus2\dishincubator.dm:125: dat += "<BR><BR>"
dat += {"<BR><BR> dat += {"<BR><BR>
<A href='?src=\ref[src];flush=1'>Flush system</a><BR> <A href='?src=\ref[src];flush=1'>Flush system</a><BR>
<A href='?src=\ref[src];close=1'>Close</A><BR>"} <A href='?src=\ref[src];close=1'>Close</A><BR>"}
// END AUTOFIX // END AUTOFIX
user << browse("<TITLE>Pathogenic incubator</TITLE>incubator menu:<BR><BR>[dat]", "window=incubator;size=575x400") user << browse("<TITLE>Pathogenic incubator</TITLE>incubator menu:<BR><BR>[dat]", "window=incubator;size=575x400")
onclose(user, "incubator") onclose(user, "incubator")

View File

@@ -39,6 +39,11 @@
if(B) if(B)
Blood = B Blood = B
break break
// /vg/: Try to fix isolators
if(!Blood)
usr << "\red ERROR: Unable to locate blood within the beaker. Bug?"
testing("Unable to locate blood in [beaker]!")
return
var/list/virus = virus_copylist(Blood.data["virus2"]) var/list/virus = virus_copylist(Blood.data["virus2"])
var/choice = text2num(href_list["isolate"]); var/choice = text2num(href_list["isolate"]);
for (var/datum/disease2/disease/V in virus) for (var/datum/disease2/disease/V in virus)

View File

@@ -722,7 +722,7 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define NO_EAT 1 #define NO_EAT 1
#define NO_BREATHE 2 #define NO_BREATHE 2
#define NO_SLEEP 4 #define NO_SLEEP 4
#define NO_SHOCK 8 #define RAD_ABSORB 8
#define NO_SCAN 16 #define NO_SCAN 16
#define NON_GENDERED 32 #define NON_GENDERED 32
#define REQUIRE_LIGHT 64 #define REQUIRE_LIGHT 64

View File

@@ -93,14 +93,14 @@
<h3 class="author">Pomf123 updated</h3> <h3 class="author">Pomf123 updated</h3>
<ul class="changes bgimages16"> <ul class="changes bgimages16">
<li class="rscadd">Space is cold for humans again.</li> <li class="rscadd">Space is cold for humans again.</li>
<li class="rscadd">Bhangometer now logs the 'theoretical' size of the bomb if its over the cap.</li> <li class="rscadd">Bhangmeter now logs the 'theoretical' size of the bomb if its over the cap.</li>
<li class="rscadd">Adds 50 milk and x5 meat button for biogenerator</li> <li class="rscadd">Adds 50 milk and x5 meat button for biogenerator</li>
<li class="bugfix">Fixed ventcrawling being broken by aliens (possibly).</li> <li class="bugfix">Fixed ventcrawling being broken by aliens (possibly).</li>
<li class="bugfix">Posibrains no longer speak or hear binary.</li> <li class="bugfix">Posibrains no longer speak or hear binary.</li>
<li class="bugfix">Fixed pump shotguns fucking up when fired point-blank.</li> <li class="bugfix">Fixed pump shotguns fucking up when fired point-blank.</li>
<li class="bugfix">Fixed users using flavor text to pretend being braindead.</li> <li class="bugfix">Fixed users using flavor text to pretend being braindead.</li>
<li class="bugfix">Aliums can see in the dark now</li> <li class="bugfix">Aliums can see in the dark now.</li>
<li class="rscdel">Phazon removed due to be imbalanced as fuck.</li> <li class="rscdel">Phazon removed due to being imbalanced as fuck.</li>
</ul> </ul>
</div> </div>
<div class="commit sansserif"> <div class="commit sansserif">