Merge pull request #3488 from Baystation12/dev-freeze

Dev freeze
This commit is contained in:
Zuhayr
2013-08-11 22:00:01 -07:00
150 changed files with 16024 additions and 13658 deletions

View File

@@ -286,3 +286,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(host)
host.ckey = src.ckey
host << "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>"
/mob/dead/observer/verb/view_manfiest()
set name = "View Crew Manifest"
set category = "Ghost"
var/dat
dat += "<h4>Crew Manifest</h4>"
dat += data_core.get_manifest()
src << browse(dat, "window=manifest;size=370x420;can_close=1")

View File

@@ -18,6 +18,29 @@
return
. = src.say_dead(message)
/mob/dead/observer/emote(var/act, var/type, var/message)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(!message)
return
if(act != "me")
return
log_emote("Ghost/[src.key] : [message]")
if(src.client)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot emote in deadchat (muted)."
return
if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT))
return
. = src.emote_dead(message)
/*
for (var/mob/M in hearers(null, null))
if (!M.stat)

View File

@@ -1,5 +1,5 @@
// 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)
usr << "You are unable to emote."
@@ -25,7 +25,7 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Maybe some people are okay with that.
for(var/mob/M in world)
for(var/mob/M in player_list)
if (!M.client)
continue //skip monkeys and leavers
if (istype(M, /mob/new_player))
@@ -42,3 +42,38 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
else if (m_type & 2)
for (var/mob/O in hearers(src.loc, null))
O.show_message(message, m_type)
/mob/proc/emote_dead(var/message)
if(client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot send deadchat emotes (muted)."
return
if(!(client.prefs.toggles & CHAT_DEAD))
src << "\red You have deadchat muted."
return
var/input
if(!message)
input = copytext(sanitize(input(src, "Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN)
else
input = message
if(input)
message = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <b>[src]</b> [message]</span>"
else
return
if(message)
log_emote("Ghost/[src.key] : [message]")
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods
M << message
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on
M.show_message(message, 2)

View File

@@ -0,0 +1,58 @@
/*
Datum based languages. Easily editable and modular.
*/
/datum/language
var/name = "name" // Fluff name of language if any.
var/speech_verb // 'says', 'hisses', 'farts'.
var/colour // CSS style to use for strings in this language.
var/key // Character used to speak in language eg. :o for Unathi.
/datum/language/unathi
name = "Sinta'unathi"
speech_verb = "hisses"
colour = "soghun"
key = "o"
/datum/language/tajaran
name = "Siik'mas"
speech_verb = "mrowls"
colour = "tajaran"
key = "j"
/datum/language/skrell
name = "Skrellian"
speech_verb = "warbles"
colour = "skrell"
key = "k"
/datum/language/vox
name = "Vox-pidgin"
speech_verb = "shrieks"
colour = "vox"
key = "v"
// Language handling.
/mob/proc/add_language(var/language)
for(var/datum/language/L in languages)
if(L && L.name == language)
return 0
var/datum/language/new_language = all_languages[language]
if(!istype(new_language,/datum/language))
return 0
languages += new_language
return 1
/mob/proc/remove_language(var/rem_language)
for(var/datum/language/L in languages)
if(L && L.name == rem_language)
languages -= L
return 1
return 0

View File

@@ -54,6 +54,34 @@
dizziness = 0
jitteriness = 0
//Handle brain slugs.
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)
if(!B.ckey && ckey && B.controlling)
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
//Check for heist mode kill count.
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) )
//Check for last assailant's mutantrace.
/*if( LAssailant && ( istype( LAssailant,/mob/living/carbon/human ) ) )
var/mob/living/carbon/human/V = LAssailant
if (V.dna && (V.dna.mutantrace == "vox"))*/ //Not currently feasible due to terrible LAssailant tracking.
//world << "Vox kills: [vox_kills]"
vox_kills++ //Bad vox. Shouldn't be killing humans.
if(!gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD

View File

@@ -190,6 +190,12 @@
else if(jitteriness >= 100)
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
//splints
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/datum/organ/external/o = get_organ(organ)
if(o && o.status & ORGAN_SPLINTED)
msg += "<span class='warning'>[t_He] [t_has] a splint on his [o.display_name]!</span>\n"
if(suiciding)
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"

View File

@@ -5,15 +5,46 @@
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
var/list/hud_list = list()
var/datum/species/species //Contains icon generation and language information, set during New().
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
/mob/living/carbon/human/skrell/New()
h_style = "Skrell Male Tentacles"
set_species("Skrell")
..()
/mob/living/carbon/human/tajaran/New()
h_style = "Tajaran Ears"
set_species("Tajaran")
..()
/mob/living/carbon/human/unathi/New()
h_style = "Unathi Horns"
set_species("Unathi")
..()
/mob/living/carbon/human/vox/New()
h_style = "Short Vox Quills"
set_species("Vox")
..()
/mob/living/carbon/human/diona/New()
species = new /datum/species/diona(src)
..()
/mob/living/carbon/human/New()
if(!species)
set_species()
if(species.language)
var/datum/language/L = all_languages[species.language]
if(L)
languages += L
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
@@ -379,6 +410,7 @@
<BR>[(handcuffed ? text("<A href='?src=\ref[src];item=handcuff'>Handcuffed</A>") : text("<A href='?src=\ref[src];item=handcuff'>Not Handcuffed</A>"))]
<BR>[(legcuffed ? text("<A href='?src=\ref[src];item=legcuff'>Legcuffed</A>") : text(""))]
<BR>[(internal ? text("<A href='?src=\ref[src];item=internal'>Remove Internal</A>") : "")]
<BR><A href='?src=\ref[src];item=splints'>Remove Splints</A>
<BR><A href='?src=\ref[src];item=pockets'>Empty Pockets</A>
<BR><A href='?src=\ref[user];refresh=1'>Refresh</A>
<BR><A href='?src=\ref[user];mach_close=mob[name]'>Close</A>
@@ -794,44 +826,14 @@
return
/mob/living/carbon/human/get_species()
if(dna)
switch(dna.mutantrace)
if("lizard")
return "Unathi"
if("tajaran")
return "Tajaran"
if("skrell")
return "Skrell"
if("vox")
return "Vox"
if("plant")
return "Mobile vegetation"
if("golem")
return "Animated Construct"
else
return "Human"
/mob/living/carbon/get_species()
if(src.dna)
if(src.dna.mutantrace == "lizard")
return "Unathi"
else if(src.dna.mutantrace == "skrell")
return "Skrell"
else if(src.dna.mutantrace == "tajaran")
return "Tajaran"
else if(src.dna.mutantrace == "vox")
return "vox"
if(!species)
set_species()
/mob/living/carbon/proc/update_mutantrace_languages()
if(src.dna)
if(src.dna.mutantrace == "lizard")
src.soghun_talk_understand = 1
else if(src.dna.mutantrace == "skrell")
src.skrell_talk_understand = 1
else if(src.dna.mutantrace == "tajaran")
src.tajaran_talk_understand = 1
else if(src.dna.mutantrace == "vox")
src.vox_talk_understand = 1
if(dna && dna.mutantrace == "golem")
return "Animated Construct"
return species.name
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
@@ -1119,9 +1121,9 @@ mob/living/carbon/human/yank_out_object()
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
if(!isliving(usr) || usr.next_move > world.time)
if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
return
usr.next_move = world.time + 20
usr.delay_click(20)
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
@@ -1202,6 +1204,8 @@ mob/living/carbon/human/yank_out_object()
/mob/living/carbon/human/proc/handle_embedded_objects()
for(var/datum/organ/external/organ in src.organs)
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
continue
for(var/obj/item/weapon/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
// All kinds of embedded objects cause bleeding.
@@ -1215,9 +1219,10 @@ mob/living/carbon/human/yank_out_object()
msg ="<span class='warning'>[O] in your [organ.display_name] twists painfully as you move.</span>"
src << msg
organ.status |= ORGAN_BLEEDING
organ.take_damage(rand(1,3), 0, 0)
src.adjustToxLoss(rand(1,3))
if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses.
organ.status |= ORGAN_BLEEDING
src.adjustToxLoss(rand(1,3))
/mob/living/carbon/human/verb/check_pulse()
set category = "Object"
@@ -1251,3 +1256,106 @@ mob/living/carbon/human/yank_out_object()
else
usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
/mob/living/carbon/human/proc/set_species(var/new_species)
if(!new_species)
new_species = "Human"
if(species && (species.name && species.name == new_species))
return
species = all_species[new_species]
see_in_dark = species.darksight
if(see_in_dark > 2)
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_invisible = SEE_INVISIBLE_LIVING
spawn(0)
update_icons()
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

View File

@@ -12,6 +12,8 @@
..()
M.delay_click(10)
if((M != src) && check_shields(0, M.name))
visible_message("\red <B>[M] attempted to touch [src]!</B>")
return 0
@@ -103,34 +105,19 @@
if("hurt")
var/attack_verb
if(M.dna)
switch(M.dna.mutantrace)
if("lizard")
attack_verb = "scratch"
if("tajaran")
attack_verb = "scratch"
if("plant")
attack_verb = "slash"
else
attack_verb = "punch"
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[M.species.attack_verb]ed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [M.species.attack_verb]ed by [M.name] ([M.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[attack_verb]ed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [attack_verb]ed by [M.name] ([M.ckey])</font>")
log_attack("<font color='red'>[M.name] ([M.ckey]) [attack_verb]ed [src.name] ([src.ckey])</font>")
log_attack("<font color='red'>[M.name] ([M.ckey]) [M.species.attack_verb]ed [src.name] ([src.ckey])</font>")
var/damage = rand(0, 5)//BS12 EDIT
if(!damage)
switch(attack_verb)
if("slash")
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
if("scratch")
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
if(M.species.attack_verb == "punch")
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("\red <B>[M] has attempted to [attack_verb] [src]!</B>")
visible_message("\red <B>[M] has attempted to [M.species.attack_verb] [src]!</B>")
return 0
@@ -140,21 +127,18 @@
if(HULK in M.mutations) damage += 5
switch(attack_verb)
if("slash")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
if("scratch")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
else
playsound(loc, "punch", 25, 1, -1)
if(M.species.attack_verb == "punch")
playsound(loc, "punch", 25, 1, -1)
else
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
visible_message("\red <B>[M] has [attack_verb]ed [src]!</B>")
visible_message("\red <B>[M] has [M.species.attack_verb]ed [src]!</B>")
//Rearranged, so claws don't increase weaken chance.
if(damage >= 5 && prob(50))
visible_message("\red <B>[M] has weakened [src]!</B>")
apply_effect(2, WEAKEN, armor_block)
if(attack_verb == "scratch") damage += 5
if(M.species.attack_verb != "punch") damage += 5
apply_damage(damage, BRUTE, affecting, armor_block)

View File

@@ -1,14 +1,14 @@
/mob/living/carbon/human/movement_delay()
var/tally = 0
if(reagents.has_reagent("hyperzine")) return -1
if(reagents.has_reagent("nuka_cola")) return -1
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
if(reagents.has_reagent("hyperzine")) return -1
if(reagents.has_reagent("nuka_cola")) return -1
var/health_deficiency = (100 - health - halloss)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
@@ -25,6 +25,8 @@
var/datum/organ/external/E = get_organ(organ_name)
if(!E || (E.status & ORGAN_DESTROYED))
tally += 4
if(E.status & ORGAN_SPLINTED)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5

View File

@@ -340,6 +340,16 @@
if("id")
if ((!( target.wear_id ) || !( target.w_uniform )))
del(src)
if("splints")
var/count = 0
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/datum/organ/external/o = target.organs_by_name[organ]
if(o.status & ORGAN_SPLINTED)
count = 1
break
if(count == 0)
del(src)
return
if("internal")
if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal )))
del(src)
@@ -443,6 +453,9 @@
message = "\red <B>[source] is trying to remove [target]'s internals</B>"
else
message = "\red <B>[source] is trying to set on [target]'s internals.</B>"
if("splints")
message = text("\red <B>[] is trying to remove []'s splints!</B>", source, target)
for(var/mob/M in viewers(target, null))
M.show_message(message, 1)
spawn( HUMAN_STRIP_DELAY )
@@ -541,6 +554,16 @@ It can still be worn/put on as normal.
slot_to_process = slot_legcuffed
if (target.legcuffed)
strip_item = target.legcuffed
if("splints")
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/datum/organ/external/o = target.get_organ(organ)
if (o && o.status & ORGAN_SPLINTED)
var/obj/item/W = new /obj/item/stack/medical/splint/single()
o.status &= ~ORGAN_SPLINTED
if (W)
W.loc = target.loc
W.layer = initial(W.layer)
W.add_fingerprint(source)
if("CPR")
if ((target.health > config.health_threshold_dead && target.health < config.health_threshold_crit))
var/suff = min(target.getOxyLoss(), 7)

View File

@@ -408,7 +408,7 @@
// Nitrogen, for Vox.
var/Nitrogen_pp = (breath.nitrogen/breath.total_moles())*breath_pressure
if(O2_pp < safe_oxygen_min && src.dna.mutantrace!="vox") // Too little oxygen
if(O2_pp < safe_oxygen_min && species.name != "Vox") // Too little oxygen
if(prob(20))
spawn(0) emote("gasp")
if(O2_pp > 0)
@@ -426,7 +426,7 @@
oxyloss += 5*ratio
oxygen_used = breath.oxygen*ratio/6
oxygen_alert = max(oxygen_alert, 1)*/
else if(Nitrogen_pp < safe_oxygen_min && src.dna.mutantrace=="vox") //Vox breathe nitrogen, not oxygen.
else if(Nitrogen_pp < safe_oxygen_min && species.name == "Vox") //Vox breathe nitrogen, not oxygen.
if(prob(20))
spawn(0) emote("gasp")
@@ -471,7 +471,7 @@
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
else if(O2_pp > vox_oxygen_max && species.name == "Vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
@@ -492,30 +492,30 @@
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
if(status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260.15 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(breath.temperature < species.cold_level_1)
if(prob(20))
src << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > 360.15)
else if(breath.temperature > species.heat_level_1)
if(prob(20))
src << "\red You feel your face burning and a searing heat in your lungs!"
switch(breath.temperature)
if(-INFINITY to 120)
if(-INFINITY to species.cold_level_3)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(120 to 200 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(species.cold_level_3 to species.cold_level_2)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(200 to 260 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(species.cold_level_2 to species.cold_level_1)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(360 to 400)
if(species.heat_level_1 to species.heat_level_2)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
if(400 to 1000)
if(species.heat_level_2 to species.heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
if(1000 to INFINITY)
if(species.heat_level_3 to INFINITY)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
@@ -596,22 +596,22 @@
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
pressure_alert = 2
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
pressure_alert = 1
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
pressure_alert = 0
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
pressure_alert = -1
if(adjusted_pressure >= species.hazard_high_pressure)
adjustBruteLoss( min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
pressure_alert = 2
else if(adjusted_pressure >= species.warning_high_pressure)
pressure_alert = 1
else if(adjusted_pressure >= species.warning_low_pressure)
pressure_alert = 0
else if(adjusted_pressure >= species.hazard_low_pressure)
pressure_alert = -1
else
if( !(COLD_RESISTANCE in mutations))
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") //Vox are resistant to pressure loss.
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
pressure_alert = -1
pressure_alert = -1
if(environment.toxins > MOLES_PLASMA_VISIBLE)
pl_effects()
@@ -841,8 +841,7 @@
if(status_flags & GODMODE) return 0 //godmode
adjustToxLoss(total_plasmaloss)
// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
if(PLANT in mutations)
if(species.flags & REQUIRE_LIGHT)
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
@@ -900,8 +899,7 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
// if(dna && dna.mutantrace == "plant")
if(PLANT in mutations)
if(species.flags & REQUIRE_LIGHT)
if(nutrition < 200)
take_overall_damage(2,0)
@@ -1148,14 +1146,12 @@
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
if(dna)
switch(dna.mutantrace)
if("lizard","slime")
if("slime")
see_in_dark = 3
see_invisible = SEE_INVISIBLE_LEVEL_ONE
if("shadow","tajaran")
if("shadow")
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_in_dark = 2
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
@@ -1230,18 +1226,22 @@
see_invisible = SEE_INVISIBLE_LIVING
if(healths)
switch(hal_screwyhud)
if(1) healths.icon_state = "health6"
if(2) healths.icon_state = "health7"
else
switch(health - halloss)
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
if(40 to 60) healths.icon_state = "health3"
if(20 to 40) healths.icon_state = "health4"
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
if (analgesic)
healths.icon_state = "health_health_numb"
else
switch(hal_screwyhud)
if(1) healths.icon_state = "health6"
if(2) healths.icon_state = "health7"
else
//switch(health - halloss)
switch(100 - traumatic_shock)
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
if(40 to 60) healths.icon_state = "health3"
if(20 to 40) healths.icon_state = "health4"
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
if(nutrition_icon)
switch(nutrition)

View File

@@ -68,7 +68,7 @@
message = replacetext(message, "u", "<22>")
message = replacetext(message, "b", "<22>")
else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
/*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")
@@ -88,7 +88,7 @@
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!"
message += " OLE!"*/
else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask

View File

@@ -220,14 +220,12 @@ proc/get_damage_icon_part(damage_state, body_part)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
var/plant_color_mod = rgb(144,224,144)
var/necrosis_color_mod = rgb(10,50,0)
var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete
var/fat = (FAT in src.mutations)
var/hulk = (HULK in src.mutations)
var/skeleton = (SKELETON in src.mutations)
var/plant = (PLANT in src.mutations)
var/g = "m"
if(gender == FEMALE) g = "f"
@@ -240,8 +238,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else if(hulk)
var/list/TONE = ReadRGB(hulk_color_mod)
stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
else if(plant)
stand_icon.ColorTone(plant_color_mod)
var/datum/organ/external/head = get_organ("head")
var/has_head = 0
@@ -269,8 +265,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else if(hulk)
var/list/TONE = ReadRGB(hulk_color_mod)
temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
else if(plant)
temp.ColorTone(plant_color_mod)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
@@ -293,7 +287,7 @@ proc/get_damage_icon_part(damage_state, body_part)
stand_icon.Blend(temp, ICON_OVERLAY)
//Skin tone
if(!skeleton && !husk && !hulk && !plant)
if(!skeleton && !husk && !hulk && (species.flags & HAS_SKIN_TONE))
if(s_tone >= 0)
stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
@@ -309,18 +303,16 @@ proc/get_damage_icon_part(damage_state, body_part)
if(has_head)
//Eyes
if(!skeleton)
var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s")
if(src.get_species()=="Vox")
eyes_s = new/icon('icons/mob/human_face.dmi', "vox_eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes_s, ICON_OVERLAY)
var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes)
eyes.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes, ICON_OVERLAY)
//Mouth (lipstick!)
if(lip_style) //skeletons are allowed to wear lipstick no matter what you think, agouri.
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
//Mouth (lipstick!)
if(lip_style && (species && species.flags & HAS_LIPS)) //skeletons are allowed to wear lipstick no matter what you think, agouri.
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
//Underwear
if(underwear >0 && underwear < 12 && (src.dna.mutantrace != "vox" && src.dna.mutantrace != "kidan"))
if(underwear >0 && underwear < 12 && species.flags & HAS_UNDERWEAR)
if(!fat && !skeleton)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
@@ -429,47 +421,23 @@ proc/get_damage_icon_part(damage_state, body_part)
var/skeleton = (SKELETON in src.mutations)
if(skeleton)
race_icon = 'icons/mob/human_races/r_skeleton.dmi'
else if(dna)
switch(dna.mutantrace)
if("tajaran")
race_icon = 'icons/mob/human_races/r_tajaran.dmi'
deform_icon = 'icons/mob/human_races/r_def_tajaran.dmi'
if("lizard")
race_icon = 'icons/mob/human_races/r_lizard.dmi'
deform_icon = 'icons/mob/human_races/r_def_lizard.dmi'
if("skrell")
race_icon = 'icons/mob/human_races/r_skrell.dmi'
deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
if("vox")
race_icon = 'icons/mob/human_races/r_vox.dmi'
deform_icon = 'icons/mob/human_races/r_def_vox.dmi'
else
race_icon = 'icons/mob/human_races/r_human.dmi'
deform_icon = 'icons/mob/human_races/r_def_human.dmi'
else
icon = 'icons/mob/human_races/r_human.dmi'
//Icon data is kept in species datums within the mob.
race_icon = species.icobase
deform_icon = species.deform
if(dna)
switch(dna.mutantrace)
if("golem","slime","shadow","adamantine")
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
// if("lizard","tajaran","skrell")
// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_l")
// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_s")
if("plant")
if(stat == DEAD) //TODO
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d")
else
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
else
overlays_lying[MUTANTRACE_LAYER] = null
overlays_standing[MUTANTRACE_LAYER] = null
if(!dna || !(dna.mutantrace in list("golem","metroid")))
update_body(0)
update_hair(0)
if(update_icons) update_icons()
@@ -806,15 +774,11 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_lying[TAIL_LAYER] = null
overlays_standing[TAIL_LAYER] = null
var/cur_species = get_species()
if( cur_species == "Tajaran")
if(species.tail && species.flags & HAS_TAIL)
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_s")
else if( cur_species == "Unathi")
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_s")
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(update_icons)
update_icons()

View File

@@ -10,116 +10,43 @@
update_icon = 0 ///no need to call regenerate_icon
var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
var/greaterform = "Human" // Used when humanizing a monkey.
var/ico = "monkey" // Used when updating icons.
var/uni_append = "12C4E2" // Small appearance modifier for different species.
/mob/living/carbon/monkey/tajara
name = "farwa"
voice_name = "farwa"
voice_message = "mews"
say_message = "mews"
icon_state = "tajkey1"
ico = "tajkey"
uni_append = "0A0E00"
/mob/living/carbon/monkey/skrell
name = "neaera"
voice_name = "neaera"
voice_message = "squicks"
say_message = "squicks"
icon_state = "skrellkey1"
ico = "skrellkey"
uni_append = "01CC92"
/mob/living/carbon/monkey/unathi
name = "stok"
voice_name = "stok"
voice_message = "hisses"
say_message = "hisses"
icon_state = "stokkey1"
/mob/living/carbon/monkey/unathi/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "stok")
name = text("stok ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "lizard"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "044"
dna.uni_identity += "C5D"
..()
/mob/living/carbon/monkey/skrell/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "neaera")
name = text("neaera ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "skrell"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "01C"
dna.uni_identity += "C92"
..()
/mob/living/carbon/monkey/tajara/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "farwa")
name = text("farwa ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "tajaran"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "0A0"
dna.uni_identity += "E00"
..()
ico = "stokkey"
uni_append = "044C5D"
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "monkey")
name = text("monkey ([rand(1, 1000)])")
real_name = name
if(name == "monkey" || name == "farwa" || name == "stok" || name == "neara") //Hideous but necessary to stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
@@ -134,12 +61,29 @@
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "12C"
dna.uni_identity += "4E2"
dna.uni_identity += "[gendervar][uni_append]"
..()
update_icons()
return
/mob/living/carbon/monkey/unathi/New()
..()
dna.mutantrace = "lizard"
greaterform = "Unathi"
/mob/living/carbon/monkey/skrell/New()
..()
dna.mutantrace = "skrell"
greaterform = "Skrell"
/mob/living/carbon/monkey/tajara/New()
..()
dna.mutantrace = "tajaran"
greaterform = "Tajaran"
/mob/living/carbon/monkey/movement_delay()
var/tally = 0
if(reagents)

View File

@@ -28,14 +28,7 @@
update_hud()
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
overlays.Cut()
var/ico = "monkey"
switch(src.dna.mutantrace) //On monkey spawn, check the DNA of the mob. If alien, change to appropriate alien monkey sprite
if("tajaran")
ico = "tajkey"
if("lizard")
ico = "stokkey"
if("skrell")
ico = "skrellkey"
if(lying)
icon_state = ico + "0"
for(var/image/I in overlays_lying)

View File

@@ -3,7 +3,14 @@
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/proc/updateshock()
src.traumatic_shock = src.getOxyLoss() + src.getToxLoss() + src.getFireLoss() + 1.2*src.getBruteLoss() + 2*src.getCloneLoss() + src.halloss
src.traumatic_shock = \
1 * src.getOxyLoss() + \
0.5 * src.getToxLoss() + \
2.5 * src.getFireLoss() + \
1.5 * src.getBruteLoss() + \
2 * src.getCloneLoss() + \
1 * src.halloss
if(reagents.has_reagent("alkysine"))
src.traumatic_shock -= 10
if(reagents.has_reagent("inaprovaline"))

View File

@@ -0,0 +1,96 @@
/*
Datum-based species. Should make for much cleaner and easier to maintain mutantrace code.
*/
/datum/species
var/name // Species name.
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/eyes = "eyes_s" // Icon for eyes.
var/primitive // Lesser form, if any (ie. monkey for humans)
var/tail // Name of tail image in species effects icon file.
var/language // Default racial language, if any.
var/attack_verb = "punch" // Empty hand hurt intent verb.
var/mutantrace // Safeguard due to old code.
var/breath_type // Non-oxygen gas breathed, if any.
var/cold_level_1 = 260 // Cold damage level 1 below this point.
var/cold_level_2 = 200 // Cold damage level 2 below this point.
var/cold_level_3 = 120 // Cold damage level 3 below this point.
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 1000 // Heat damage level 2 above this point.
var/darksight = 2
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
var/brute_resist // Physical damage reduction.
var/burn_resist // Burn damage reduction.
var/flags = 0 // Various specific features.
/datum/species/human
name = "Human"
primitive = /mob/living/carbon/monkey
flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR
/datum/species/unathi
name = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
language = "Sinta'unathi"
tail = "sogtail"
attack_verb = "scratch"
primitive = /mob/living/carbon/monkey/unathi
darksight = 3
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
/datum/species/tajaran
name = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
language = "Siik'mas"
tail = "tajtail"
attack_verb = "scratch"
darksight = 8
primitive = /mob/living/carbon/monkey/tajara
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
/datum/species/skrell
name = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
language = "Skrellian"
primitive = /mob/living/carbon/monkey/skrell
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR
/datum/species/vox
name = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi'
language = "Vox-pidgin"
eyes = "vox_eyes_s"
breath_type = "nitrogen"
flags = NO_SCAN
/datum/species/diona
name = "Diona"
icobase = 'icons/mob/human_races/r_plant.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
attack_verb = "slash"
flags = NO_EAT | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT

View File

@@ -85,6 +85,8 @@ var/list/department_radio_keys = list(
if(dongle.translate_hive) return 1
/mob/living/say(var/message)
//world << "[src] speaks! [message]"
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = capitalize(message)
@@ -123,11 +125,14 @@ var/list/department_radio_keys = list(
var/italics = 0
var/message_range = null
var/message_mode = null
var/datum/language/speaking //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"
// Special message handling
// General public key. Special message handling
else if (copytext(message, 1, 2) == ";")
if (ishuman(src))
message_mode = "headset"
@@ -138,6 +143,12 @@ var/list/department_radio_keys = list(
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]")
//world << "Key [L.key] matches [lowertext(channel_prefix)] for [src]."
speaking = L
break
message_mode = department_radio_keys[channel_prefix]
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
@@ -183,11 +194,6 @@ var/list/department_radio_keys = list(
message += "Z"
*/
var/list/obj/item/used_radios = new
var/is_speaking_skrell = 0
var/is_speaking_soghun = 0
var/is_speaking_taj = 0
var/is_speaking_vox = 0
var/is_speaking_radio = 0
switch (message_mode)
@@ -274,22 +280,6 @@ var/list/department_radio_keys = list(
message_range = 1
italics = 1
if ("tajaran")
if(tajaran_talk_understand || universal_speak)
is_speaking_taj = 1
if ("soghun")
if(soghun_talk_understand || universal_speak)
is_speaking_soghun = 1
if ("skrell")
if(skrell_talk_understand || universal_speak)
is_speaking_skrell = 1
if ("vox")
if(vox_talk_understand || universal_speak)
is_speaking_vox = 1
if("changeling")
if(mind && mind.changeling)
for(var/mob/Changeling in mob_list)
@@ -377,20 +367,37 @@ var/list/department_radio_keys = list(
for (var/M in listening)
if(hascall(M,"say_understands"))
if (M:say_understands(src) && !is_speaking_skrell && !is_speaking_soghun && !is_speaking_vox && !is_speaking_taj)
if ((M:say_understands(src) && !speaking))
//world << "[M] understood [src] (0)."
heard_a += M
else if(ismob(M))
if(is_speaking_skrell && (M:skrell_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_soghun && (M:soghun_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_taj && (M:tajaran_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_vox && (M:vox_talk_understand || M:universal_speak))
heard_a += M
// If speaking is set, it means that a language has been found that uses the given key.
// If it hasn't, then they are likely just speaking English.
var/understood
var/mob/P = M
if (speaking)
for(var/datum/language/L in P.languages)
if(speaking.name == L.name)
understood = 1
if(understood || P.universal_speak)
//world << "[M] understood [src] (1)."
heard_a += M
else if(istype(P,/mob/living/carbon/human))
var/mob/living/carbon/human/H = P
if(H.has_brain_worms()) // Brain worms act like Babelfish.
heard_a += M
else
heard_b += M
else
//world << "[M] didn't understand [src]."
heard_b += M
else
heard_b += M
heard_a += M
else
//world << "[M] understood [src] (2)."
heard_a += M
var/speech_bubble_test = say_test(message)
@@ -403,7 +410,7 @@ var/list/department_radio_keys = list(
var/rendered = null
if (length(heard_a))
var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
var/message_a = say_quote(message,speaking)
if (italics)
message_a = "<i>[message_a]</i>"
@@ -428,7 +435,7 @@ var/list/department_radio_keys = list(
message_b = voice_message
else
message_b = stars(message)
message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
message_b = say_quote(message_b,speaking)
if (italics)
message_b = "<i>[message_b]</i>"

View File

@@ -340,7 +340,7 @@ var/list/ai_list = list()
if(href_list["say_word"])
src.announcement(href_list["say_word"])
return
if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawi"])
switch(ioncheck[L])
@@ -561,10 +561,9 @@ var/list/ai_list = list()
if(!C.can_use())
continue
var/list/tempnetwork = C.network
tempnetwork.Remove("CREED", "thunder", "RD", "toxins", "Prison")
var/list/tempnetwork = difflist(C.network,RESTRICTED_CAMERA_NETWORKS,1)
if(tempnetwork.len)
for(var/i in C.network)
for(var/i in tempnetwork)
cameralist[i] = i
var/old_network = network
network = input(U, "Which network would you like to view?") as null|anything in cameralist

View File

@@ -67,7 +67,7 @@
var/oldLoc = src.loc
. = ..()
if(.)
if(src.camera)
if(src.camera && src.camera.network.len)
if(!updating)
updating = 1
spawn(BORG_CAMERA_BUFFER)
@@ -89,12 +89,16 @@
/obj/machinery/camera/New()
..()
cameranet.cameras += src
cameranet.addCamera(src)
cameranet.cameras += src //Camera must be added to global list of all cameras no matter what...
var/list/open_networks = difflist(network,RESTRICTED_CAMERA_NETWORKS) //...but if all of camera's networks are restricted, it only works for specific camera consoles.
if(open_networks.len) //If there is at least one open network, chunk is available for AI usage.
cameranet.addCamera(src)
/obj/machinery/camera/Del()
cameranet.cameras -= src
cameranet.removeCamera(src)
var/list/open_networks = difflist(network,RESTRICTED_CAMERA_NETWORKS)
if(open_networks.len)
cameranet.removeCamera(src)
..()
#undef BORG_CAMERA_BUFFER

View File

@@ -38,8 +38,9 @@ var/const/VOX_VOLUME = 75
set desc = "Display a list of vocal words to announce to the crew."
set category = "AI Commands"
var/dat = "Here is a list of words you can type into the Announcement button to create sentences to vocally announce.<BR> \
src << "\red VOX is disabled until issues with the code can be sorted."
return
/* var/dat = "Here is a list of words you can type into the Announcement button to create sentences to vocally announce.<BR> \
Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.<BR>"
var/index = 0
@@ -49,7 +50,7 @@ var/const/VOX_VOLUME = 75
if(index != vox_sounds.len)
dat += " / "
src << browse(dat, "window=announce_help;size=500x400")
src << browse(dat, "window=announce_help;size=500x400")*/
/mob/living/silicon/ai/verb/announcement(var/message as text)
@@ -58,6 +59,9 @@ var/const/VOX_VOLUME = 75
set desc = "Create a vocal announcement by typing in the available words to create a setence. More help is available in 'Announcement Help'"
set category = "AI Commands"
src << "\red VOX is disabled until issues with the code can be sorted."
return
/*
if(!message)
return
//if(!announcing_vox > world.time)
@@ -81,9 +85,9 @@ var/const/VOX_VOLUME = 75
if(incorrect_words.len)
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
*/
/proc/play_vox_word(var/word, var/z_level)
/*
word = lowertext(word)
if(vox_sounds[word])
@@ -99,12 +103,12 @@ var/const/VOX_VOLUME = 75
if(T.z == z_level)
M << voice
return 1
return 0
return 0*/
// List is required to compile the resources into the game when it loads.
// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
var/list/vox_sounds = list("," = 'sound/vox/,.wav',
var/list/vox_sounds = list(/*"," = 'sound/vox/,.wav',
"." = 'sound/vox/..wav',
"a" = 'sound/vox/a.wav',
"accelerating" = 'sound/vox/accelerating.wav',
@@ -719,4 +723,4 @@ var/list/vox_sounds = list("," = 'sound/vox/,.wav',
"yourself" = 'sound/vox/yourself.wav',
"zero" = 'sound/vox/zero.wav',
"zone" = 'sound/vox/zone.wav',
"zulu" = 'sound/vox/zulu.wav')
"zulu" = 'sound/vox/zulu.wav'*/)

View File

@@ -102,7 +102,7 @@
if(!scrambledcodes && !camera)
camera = new /obj/machinery/camera(src)
camera.c_tag = real_name
camera.network = list("SS13")
camera.network = list("SS13","Robots")
if(isWireCut(5)) // 5 = BORG CAMERA
camera.status = 0
@@ -177,6 +177,8 @@
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
channels = list("Supply" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("MINE")
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
@@ -184,6 +186,8 @@
if("Medical")
module = new /obj/item/weapon/robot_module/medical(src)
channels = list("Medical" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("Medical")
module_sprites["Basic"] = "Medbot"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
@@ -196,7 +200,6 @@
module_sprites["Red Knight"] = "Security"
module_sprites["Black Knight"] = "securityrobot"
module_sprites["Bloodhound"] = "bloodhound"
module_sprites["Mark II"] = "droid-combat"
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
@@ -1176,12 +1179,8 @@
scrambledcodes = 1
//Disconnect it's camera so it's not so easily tracked.
if(src.camera)
del(src.camera)
src.camera = null
// I'm trying to get the Cyborg to not be listed in the camera list
// Instead of being listed as "deactivated". The downside is that I'm going
// to have to check if every camera is null or not before doing anything, to prevent runtime errors.
// I could change the network to null but I don't know what would happen, and it seems too hacky for me.
src.camera.network = list()
cameranet.removeCamera(src.camera)
/mob/living/silicon/robot/proc/ResetSecurityCodes()

View File

@@ -145,8 +145,8 @@
if (bot.connected_ai == ai)
return 1
return 0
// this function shows the health of the pAI in the Status panel
/mob/living/silicon/proc/show_system_integrity()
if(!src.stat)
@@ -154,25 +154,25 @@
else
stat(null, text("Systems nonfunctional"))
// This is a pure virtual function, it should be overwritten by all subclasses
/mob/living/silicon/proc/show_malf_ai()
return 0
// this function displays the station time in the status panel
/mob/living/silicon/proc/show_station_time()
stat(null, "Station Time: [worldtime2text()]")
// this function displays the shuttles ETA in the status panel if the shuttle has been called
/mob/living/silicon/proc/show_emergency_shuttle_eta()
if(emergency_shuttle.online && emergency_shuttle.location < 2)
var/timeleft = emergency_shuttle.timeleft()
if (timeleft)
stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
/mob/living/silicon/Stat()
..()
@@ -182,13 +182,13 @@
show_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
// this function displays the stations manifest in a separate window
/mob/living/silicon/proc/show_station_manifest()
var/dat
dat += "<h4>Crew Manifest</h4>"
if(data_core)
dat += data_core.get_manifest(0) // make it monochrome
dat += data_core.get_manifest(1) // make it monochrome
dat += "<br>"
src << browse(dat, "window=airoster")
onclose(src, "airoster")

View File

@@ -0,0 +1,272 @@
/mob/living/captive_brain
name = "host brain"
real_name = "host brain"
/mob/living/captive_brain/say(var/message)
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if(istype(src.loc,/mob/living/simple_animal/borer))
var/mob/living/simple_animal/borer/B = src.loc
src << "You whisper silently, \"[message]\""
B.host << "The captive mind of [src] whispers, \"[message]\""
/mob/living/captive_brain/emote(var/message)
return
/mob/living/simple_animal/borer
name = "cortical borer"
real_name = "cortical borer"
desc = "A small, quivering sluglike creature."
speak_emote = list("chirrups")
emote_hear = list("chirrups")
response_help = "pokes the"
response_disarm = "prods the"
response_harm = "stomps on the"
icon_state = "brainslug"
icon_living = "brainslug"
icon_dead = "brainslug_dead"
speed = 5
a_intent = "harm"
stop_automated_movement = 1
status_flags = CANPUSH
attacktext = "nips"
friendly = "prods"
wander = 0
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
var/mob/living/carbon/human/host // Human 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.
/mob/living/simple_animal/borer/Life()
..()
if(host)
if(!stat && !host.stat)
if(chemicals < 250)
chemicals++
if(controlling)
if(prob(5))
host.adjustBrainLoss(rand(1,2))
if(prob(host.brainloss/20))
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
//if(host.brainloss > 100)
/mob/living/simple_animal/borer/New()
..()
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
host_brain = new/mob/living/captive_brain(src)
for(var/mob/M in player_list)
if(istype(M,/mob/dead/observer))
var/mob/dead/observer/O = M
if(O.client)
if(O.client.prefs.be_special & BE_ALIEN)
src.ckey = O.ckey
break
/mob/living/simple_animal/borer/say(var/message)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = capitalize(message)
if(!message)
return
if (stat == 2)
return say_dead(message)
if (stat)
return
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (copytext(message, 1, 2) == "*")
return emote(copytext(message, 2))
if (copytext(message, 1, 2) == ";") //Brain borer hivemind.
return borer_speak(message)
if(!host)
src << "You have no host to speak to."
return //No host, no audible speech.
src << "You drop words into [host]'s mind: \"[message]\""
host << "Your own thoughts speak: \"[message]\""
/mob/living/simple_animal/borer/proc/borer_speak(var/message)
if(!message)
return
for(var/mob/M in mob_list)
if(M.mind && (istype(M, /mob/living/simple_animal/borer) || istype(M, /mob/dead/observer)))
M << "<i>Cortical link, <b>[truename]:</b> [copytext(message, 2)]</i>"
/mob/living/simple_animal/borer/verb/bond_brain()
set category = "Alien"
set name = "Assume Control"
set desc = "Fully connect to the brain of your host."
if(!host)
src << "You are not inside a host body."
return
if(src.stat)
src << "You cannot do that in your current state."
return
src << "You begin delicately adjusting your connection to the host brain..."
spawn(300+(host.brainloss*5))
if(!host || !src || controlling) return
else
src << "\red <B>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</B>"
host << "\red <B>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</B>"
host_brain.ckey = host.ckey
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
mob/living/simple_animal/borer/verb/release_host()
set category = "Alien"
set name = "Release Host"
set desc = "Slither out of your host."
if(!host)
src << "You are not inside a host body."
return
if(stat)
src << "You cannot leave your host in your current state."
if(!host || !src) return
src << "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal."
if(!host.stat)
host << "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..."
spawn(200)
if(!host || !src) return
if(src.stat)
src << "You cannot infest a target in your current state."
return
src << "You wiggle out of [host]'s ear and plop to the ground."
if(!host.stat)
host << "Something slimy wiggles out of your ear and plops to the ground!"
detatch()
mob/living/simple_animal/borer/proc/detatch()
if(!host) return
var/datum/organ/external/head = host.get_organ("head")
head.implants -= src
src.loc = get_turf(host)
controlling = 0
reset_view(null)
machine = null
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
if(host_brain.ckey)
src.ckey = host.ckey
host.ckey = host_brain.ckey
host_brain.ckey = null
host_brain.name = "host brain"
host_brain.real_name = "host brain"
host = null
/mob/living/simple_animal/borer/verb/infest(var/mob/living/carbon/human/H)
set category = "Alien"
set name = "Infest"
set desc = "Infest a suitable humanoid host."
if(host)
src << "You are already within a host."
return
if(stat)
src << "You cannot infest a target in your current state."
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)
choices += C
var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices
if(!M || !src) return
if(M.has_brain_worms())
src << "You cannot infest someone who is already infested!"
return
M << "Something slimy begins probing at the opening of your ear canal..."
src << "You slither up [M] and begin probing at their ear canal..."
if(!do_after(src,50))
src << "As [M] moves away, you are dislodged and fall to the ground."
return
if(!M || !src) return
if(src.stat)
src << "You cannot infest a target in your current state."
return
if(M.stat == 2)
src << "That is not an appropriate target."
return
if(M in view(1, src))
src << "You wiggle into [M]'s ear."
if(!M.stat)
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
host_brain.name = M.name
host_brain.real_name = M.real_name
return
else
src << "They are no longer in range!"
return

View File

@@ -18,7 +18,6 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
status_flags = 0
universal_speak = 1
vox_talk_understand = 1
var/armour = null
var/amp = null
@@ -70,7 +69,7 @@
var/obj/item/weapon/arrow/quill/Q = new(loc)
Q.fingerprintslast = src.ckey
Q.throw_at(target,10,20)
Q.throw_at(target,10,30)
quills--
spawn(100)
@@ -102,7 +101,7 @@
M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]"
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.dna.mutantrace == "vox")
if(H.species.name == "Vox")
return
H << "\red Your nose begins to bleed..."
H.drip(1)

View File

@@ -33,7 +33,7 @@
if(hud_used) del(hud_used) //remove the hud objects
hud_used = new /datum/hud(src)
next_move = 1
last_click = world.time
sight |= SEE_SELF
..()

View File

@@ -905,9 +905,9 @@ mob/verb/yank_out_object()
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
if(!isliving(usr) || usr.next_move > world.time)
if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
return
usr.next_move = world.time + 20
usr.delay_click(20)
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
@@ -960,4 +960,4 @@ mob/verb/yank_out_object()
pinned -= O
if(!pinned.len)
anchored = 0
return 1
return 1

View File

@@ -54,8 +54,8 @@
var/sdisabilities = 0 //Carbon
var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
var/next_move = null
var/prev_move = null
var/last_click = null
var/click_delay = 0
var/monkeyizing = null //Carbon
var/other = 0.0
var/hand = null
@@ -69,6 +69,7 @@
var/flavor_text = ""
var/med_record = ""
var/sec_record = ""
var/gen_record = ""
var/blinded = null
var/bhunger = 0 //Carbon
var/ajourn = 0
@@ -85,9 +86,9 @@
var/lastpuke = 0
var/unacidable = 0
var/small = 0
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/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/name_archive //For admin things like possession
var/timeofdeath = 0.0//Living
@@ -210,10 +211,6 @@
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
var/robot_talk_understand = 0
var/alien_talk_understand = 0
var/tajaran_talk_understand = 0
var/soghun_talk_understand = 0
var/skrell_talk_understand = 0
var/vox_talk_understand = 0
var/has_limbs = 1 //Whether this mob have any limbs he can move with
var/can_stand = 1 //Whether this mob have ability to stand

View File

@@ -128,7 +128,7 @@
return
if(killing)
return
if (assailant.next_move > world.time)
if (assailant.last_click + assailant.click_delay > world.time)
return
if ((!( assailant.canmove ) || assailant.lying))
//SN src = null
@@ -140,7 +140,7 @@
if (!( killing ))
assailant.visible_message("\red [assailant] has temporarily tightened \his grip on [affecting]!")
//Foreach goto(97)
assailant.next_move = world.time + 10
assailant.delay_click(10)
//affecting.stunned = max(2, affecting.stunned)
//affecting.paralysis = max(1, affecting.paralysis)
affecting.losebreath = min(affecting.losebreath + 1, 3)
@@ -162,6 +162,8 @@
if(killing)
return
assailant.delay_click(10)
switch(S.id)
if(1.0)
if (state < 2)
@@ -235,7 +237,7 @@
assailant.attack_log += text("\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>")
log_attack("<font color='red'>[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>")
assailant.next_move = world.time + 10
assailant.delay_click(10)
affecting.losebreath += 1
else
assailant.visible_message("\red [assailant] was unable to tighten \his grip on [affecting]'s neck!")

View File

@@ -454,3 +454,7 @@ var/list/intents = list("help","disarm","grab","hurt")
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
/mob/proc/delay_click(var/delay)
src.click_delay = max(src.click_delay, delay)
return src.click_delay

View File

@@ -119,7 +119,7 @@
src << "\blue Now teleporting."
observer.loc = O.loc
if(client.prefs.be_random_name)
client.prefs.real_name = random_name()
client.prefs.real_name = random_name(client.prefs.gender)
observer.real_name = client.prefs.real_name
observer.name = observer.real_name
observer.key = key
@@ -347,37 +347,25 @@
var/mob/living/carbon/human/new_character = new(loc)
new_character.lastarea = get_area(loc)
if(client.prefs.species == "Tajaran") //This is like the worst, but it works, so meh. - Erthilo
if(is_alien_whitelisted(src, "Tajaran") || !config.usealienwhitelist)
new_character.dna.mutantrace = "tajaran"
new_character.tajaran_talk_understand = 1
if(client.prefs.species == "Unathi")
if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist)
new_character.dna.mutantrace = "lizard"
new_character.soghun_talk_understand = 1
if(client.prefs.species == "Skrell")
if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist)
new_character.dna.mutantrace = "skrell"
new_character.skrell_talk_understand = 1
if(client.prefs.species == "Vox")
if(is_alien_whitelisted(src, "Vox"|| !config.usealienwhitelist))
new_character.dna.mutantrace = "vox"
new_character.vox_talk_understand = 1
if(client.prefs.language == "Tajaran")
if(is_alien_whitelisted(src, "Language_Tajaran") || !config.usealienwhitelist)
new_character.tajaran_talk_understand = 1
if(client.prefs.language == "Unathi")
if(is_alien_whitelisted(src, "Language_Soghun") || !config.usealienwhitelist)
new_character.soghun_talk_understand = 1
if(client.prefs.language == "Skrell")
if(is_alien_whitelisted(src, "Language_Skrell") || !config.usealienwhitelist)
new_character.skrell_talk_understand = 1
var/datum/species/chosen_species
if(client.prefs.species)
chosen_species = all_species[client.prefs.species]
if(chosen_species)
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)
var/datum/language/chosen_language
if(client.prefs.language)
chosen_language = all_languages[client.prefs.language]
if(chosen_language)
if(is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist)
new_character.add_language(client.prefs.language)
if(ticker.random_players)
new_character.gender = pick(MALE, FEMALE)
client.prefs.real_name = random_name()
client.prefs.real_name = random_name(new_character.gender)
client.prefs.randomize_appearance_for(new_character)
else
client.prefs.copy_to(new_character)

View File

@@ -137,19 +137,13 @@ datum/preferences
if(gender == FEMALE) g = "f"
var/icon/icobase
switch(species)
if("Tajaran")
icobase = 'icons/mob/human_races/r_tajaran.dmi'
if("Unathi")
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
var/datum/species/current_species = all_species[species]
if("Vox")
icobase = 'icons/mob/human_races/r_vox.dmi'
if(current_species)
icobase = current_species.icobase
else
icobase = 'icons/mob/human_races/r_human.dmi'
else
icobase = 'icons/mob/human_races/r_human.dmi'
preview_icon = new /icon(icobase, "torso_[g]")
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
@@ -169,16 +163,13 @@ datum/preferences
preview_icon.Blend(temp, ICON_OVERLAY)
// Skin tone
if(species == "Human")
if(current_species && (current_species.flags & HAS_SKIN_TONE))
if (s_tone >= 0)
preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s")
if(species=="Vox")
eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "vox_eyes_s")
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]

View File

@@ -66,9 +66,9 @@
name = "Shoulder-length Hair Alt"
icon_state = "hair_longfringe"
longish
/*longish
name = "Longer Hair"
icon_state = "hair_b2"
icon_state = "hair_b2"*/
longer
name = "Long Hair"

View File

@@ -37,6 +37,10 @@
usr << "\red Speech is currently admin-disabled."
return
if(!(client.prefs.toggles & CHAT_DEAD))
usr << "\red You have deadchat muted."
return
if(mind && mind.name)
name = "[mind.name]"
else
@@ -50,9 +54,10 @@
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the message to admins/mods with deadchat toggled on
M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
else if(M.stat == DEAD)
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the message to regular ghosts with deadchat toggled on.
M.show_message(rendered, 2) //Takes into account blindness and such.
return
@@ -69,19 +74,15 @@
return 1
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)
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
var/ending = copytext(text, length(text))
if (is_speaking_soghun)
return "<span class='say_quote'>hisses</span>, \"<span class='soghun'>[text]</span>\"";
if (is_speaking_skrell)
return "<span class='say_quote'>warbles</span>, \"<span class='skrell'>[text]</span>\"";
if (is_speaking_tajaran)
return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\"";
if (is_speaking_vox)
return "<span class='say_quote'>chirps</span>, \"<span class='vox'>[text]</span>\"";
if (speaking)
return "<span class='say_quote'>[speaking.speech_verb]</span>, \"<span class='[speaking.colour]'>[text]</span>\"";
//Needs Virus2
// if (src.disease_symptoms & DISEASE_HOARSE)
// return "rasps, \"[text]\"";

View File

@@ -600,12 +600,43 @@
set name = "Resist"
set category = "IC"
if(!isliving(usr) || usr.next_move > world.time)
if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
return
usr.next_move = world.time + 20
usr.delay_click(20)
var/mob/living/L = usr
//Resisting control by an alien mind.
if(istype(src.loc,/mob/living/simple_animal/borer))
var/mob/living/simple_animal/borer/B = src.loc
var/mob/living/captive_brain/H = src
H << "\red <B>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</B>"
B.host << "\red <B>You feel the captive mind of [src] begin to resist your control.</B>"
spawn(rand(350,450)+B.host.brainloss)
if(!B || !B.controlling)
return
B.host.adjustBrainLoss(rand(5,10))
H << "\red <B>With an immense exertion of will, you regain control of your body!</B>"
B.host << "\red <B>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</b>"
B.controlling = 0
B.ckey = B.host.ckey
B.host.ckey = H.ckey
H.ckey = null
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
return
//resisting grabs (as if it helps anyone...)
if ((!( L.stat ) && L.canmove && !( L.restrained() )))
var/resisting = 0
@@ -639,7 +670,7 @@
if(iscarbon(L))
var/mob/living/carbon/C = L
if( C.handcuffed )
C.next_move = world.time + 100
C.delay_click(100)
C.last_special = world.time + 100
C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)"
for(var/mob/O in viewers(L))
@@ -673,7 +704,7 @@
// breakout_time++ //Harder to get out of welded lockers than locked lockers
//okay, so the closet is either welded or locked... resist!!!
usr.next_move = world.time + 100
usr.delay_click(100)
L.last_special = world.time + 100
L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)"
for(var/mob/O in viewers(usr.loc))
@@ -726,7 +757,7 @@
else if(iscarbon(L))
var/mob/living/carbon/CM = L
if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time))
CM.next_move = world.time + 100
CM.delay_click(100)
CM.last_special = world.time + 100
if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)"
@@ -764,7 +795,7 @@
CM.handcuffed = null
CM.update_inv_handcuffed()
else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time))
CM.next_move = world.time + 100
CM.delay_click(100)
CM.last_special = world.time + 100
if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)"

View File

@@ -21,102 +21,33 @@
sleep(48)
//animation = null
if(!species.primitive) //If the creature in question has no primitive set, this is going to be messy.
gib()
return
var/mob/living/carbon/monkey/O = null
switch(dna.mutantrace)
if("tajara")
O = new /mob/living/carbon/monkey/tajara( loc )
O.name = "farwa"
O.dna = dna
dna = null
O.dna.uni_identity = "000000000000000000DC00000660004DA0A0E00"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
O = new species.primitive(loc)
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a farwa. </B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
if("lizard")
O = new /mob/living/carbon/monkey/unathi( loc )
O.name = "stok"
O.dna = dna
dna = null
O.dna.uni_identity = "000000000000000000DC00000660002A8044C5D"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
O.dna = dna
O.dna.uni_identity = "000000000000000000DC00000660004DA0A0E00"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.viruses = viruses
O.a_intent = "hurt"
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a stok. </B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
if("skrell")
O = new /mob/living/carbon/monkey/unathi( loc )
O.name = "neaera"
O.dna = dna
dna = null
O.dna.uni_identity = "000000000000000000DC00000660002A8044C5D"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a neaera. </B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
else
O = new /mob/living/carbon/monkey( loc )
O.name = "monkey"
O.dna = dna
dna = null
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a monkey.</B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
O << "<B>You are now [O]. </B>"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
return O