mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 06:27:26 +01:00
1355 lines
46 KiB
Plaintext
1355 lines
46 KiB
Plaintext
#define STRIP_DELAY 40 //time taken (in deciseconds) to strip somebody
|
|
/mob/living/carbon/human
|
|
name = "unknown"
|
|
real_name = "unknown"
|
|
voice_name = "unknown"
|
|
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/kidan/New()
|
|
species = new /datum/species/kidan(src)
|
|
..()
|
|
|
|
/mob/living/carbon/human/slime/New()
|
|
species = new /datum/species/slime(src)
|
|
dna = new /datum/dna(null)
|
|
dna.mutantrace = "slime"
|
|
..()
|
|
|
|
/mob/living/carbon/human/grey/New()
|
|
set_species("Grey")
|
|
..()
|
|
|
|
/mob/living/carbon/human/human/New()
|
|
species = new /datum/species/human(src)
|
|
..()
|
|
|
|
/mob/living/carbon/human/New()
|
|
|
|
if(!species)
|
|
set_species("Human")
|
|
|
|
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
|
|
|
|
if(!dna)
|
|
dna = new /datum/dna(null)
|
|
|
|
for(var/i=0;i<7;i++) // 2 for medHUDs and 5 for secHUDs
|
|
hud_list += image('icons/mob/hud.dmi', src, "hudunknown")
|
|
|
|
..()
|
|
|
|
if(dna)
|
|
dna.real_name = real_name
|
|
|
|
prev_gender = gender // Debug for plural genders
|
|
|
|
make_organs()
|
|
make_blood()
|
|
|
|
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
|
|
if ((!( yes ) || now_pushing))
|
|
return
|
|
now_pushing = 1
|
|
if (ismob(AM))
|
|
var/mob/tmob = AM
|
|
|
|
if( istype(tmob, /mob/living/carbon) && prob(10) )
|
|
src.spread_disease_to(AM, "Contact")
|
|
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
|
|
|
if(istype(tmob, /mob/living/carbon/human))
|
|
|
|
for(var/mob/M in range(tmob, 1))
|
|
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
|
if ( !(world.time % 5) )
|
|
src << "\red [tmob] is restrained, you cannot push past"
|
|
now_pushing = 0
|
|
return
|
|
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
|
|
if ( !(world.time % 5) )
|
|
src << "\red [tmob] is restraining [M], you cannot push past"
|
|
now_pushing = 0
|
|
return
|
|
|
|
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
|
|
if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
|
|
var/turf/oldloc = loc
|
|
loc = tmob.loc
|
|
tmob.loc = oldloc
|
|
now_pushing = 0
|
|
for(var/mob/living/carbon/slime/slime in view(1,tmob))
|
|
if(slime.Victim == tmob)
|
|
slime.UpdateFeed()
|
|
return
|
|
|
|
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
|
if(prob(40) && !(FAT in src.mutations))
|
|
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
|
now_pushing = 0
|
|
return
|
|
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
|
|
if(prob(99))
|
|
now_pushing = 0
|
|
return
|
|
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
|
|
if(prob(99))
|
|
now_pushing = 0
|
|
return
|
|
if(!(tmob.status_flags & CANPUSH))
|
|
now_pushing = 0
|
|
return
|
|
|
|
tmob.LAssailant = src
|
|
|
|
now_pushing = 0
|
|
spawn(0)
|
|
..()
|
|
if (!istype(AM, /atom/movable))
|
|
return
|
|
if (!now_pushing)
|
|
now_pushing = 1
|
|
|
|
if (!AM.anchored)
|
|
var/t = get_dir(src, AM)
|
|
if (istype(AM, /obj/structure/window))
|
|
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
|
for(var/obj/structure/window/win in get_step(AM,t))
|
|
now_pushing = 0
|
|
return
|
|
step(AM, t)
|
|
now_pushing = 0
|
|
return
|
|
return
|
|
|
|
/mob/living/carbon/human/Stat()
|
|
..()
|
|
statpanel("Status")
|
|
|
|
stat(null, "Intent: [a_intent]")
|
|
stat(null, "Move Mode: [m_intent]")
|
|
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
|
|
if(ticker.mode:malf_mode_declared)
|
|
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
|
|
if(emergency_shuttle)
|
|
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)]")
|
|
|
|
if (client.statpanel == "Status")
|
|
if (internal)
|
|
if (!internal.air_contents)
|
|
del(internal)
|
|
else
|
|
stat("Internal Atmosphere Info", internal.name)
|
|
stat("Tank Pressure", internal.air_contents.return_pressure())
|
|
stat("Distribution Pressure", internal.distribute_pressure)
|
|
if(mind)
|
|
if(mind.changeling)
|
|
stat("Chemical Storage", mind.changeling.chem_charges)
|
|
stat("Genetic Damage Time", mind.changeling.geneticdamage)
|
|
if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_initialized)
|
|
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(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /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(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /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(20,30), 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/attack_animal(mob/living/simple_animal/M as mob)
|
|
if(M.melee_damage_upper == 0)
|
|
M.emote("[M.friendly] [src]")
|
|
else
|
|
if(M.attack_sound)
|
|
playsound(loc, M.attack_sound, 50, 1, 1)
|
|
for(var/mob/O in viewers(src, null))
|
|
O.show_message("\red <B>[M]</B> [M.attacktext] [src]!", 1)
|
|
M.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
|
|
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
|
|
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
|
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/armor = run_armor_check(affecting, "melee")
|
|
apply_damage(damage, BRUTE, affecting, armor)
|
|
if(armor >= 2) return
|
|
|
|
|
|
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
|
|
if(M.Victim) return // can't attack while eating!
|
|
|
|
if (health > -100)
|
|
|
|
for(var/mob/O in viewers(src, null))
|
|
if ((O.client && !( O.blinded )))
|
|
O.show_message(text("\red <B>The [M.name] glomps []!</B>", src), 1)
|
|
|
|
var/damage = rand(1, 3)
|
|
|
|
if(istype(M, /mob/living/carbon/slime/adult))
|
|
damage = rand(10, 35)
|
|
else
|
|
damage = rand(5, 25)
|
|
|
|
|
|
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
|
|
|
|
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
|
var/armor_block = run_armor_check(affecting, "melee")
|
|
apply_damage(damage, BRUTE, affecting, armor_block)
|
|
|
|
|
|
if(M.powerlevel > 0)
|
|
var/stunprob = 10
|
|
var/power = M.powerlevel + rand(0,3)
|
|
|
|
switch(M.powerlevel)
|
|
if(1 to 2) stunprob = 20
|
|
if(3 to 4) stunprob = 30
|
|
if(5 to 6) stunprob = 40
|
|
if(7 to 8) stunprob = 60
|
|
if(9) stunprob = 70
|
|
if(10) stunprob = 95
|
|
|
|
if(prob(stunprob))
|
|
M.powerlevel -= 3
|
|
if(M.powerlevel < 0)
|
|
M.powerlevel = 0
|
|
|
|
for(var/mob/O in viewers(src, null))
|
|
if ((O.client && !( O.blinded )))
|
|
O.show_message(text("\red <B>The [M.name] has shocked []!</B>", src), 1)
|
|
|
|
Weaken(power)
|
|
if (stuttering < power)
|
|
stuttering = power
|
|
Stun(power)
|
|
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
s.set_up(5, 1, src)
|
|
s.start()
|
|
|
|
if (prob(stunprob) && M.powerlevel >= 8)
|
|
adjustFireLoss(M.powerlevel * rand(6,10))
|
|
|
|
|
|
updatehealth()
|
|
|
|
return
|
|
|
|
|
|
/mob/living/carbon/human/restrained()
|
|
if (handcuffed)
|
|
return 1
|
|
if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
|
|
/mob/living/carbon/human/var/co2overloadtime = null
|
|
/mob/living/carbon/human/var/temperature_resistance = T0C+75
|
|
|
|
|
|
/mob/living/carbon/human/show_inv(mob/user as mob)
|
|
var/obj/item/clothing/gloves/G
|
|
var/pickpocket = 0
|
|
if(ishuman(user))
|
|
if(user:gloves)
|
|
G = user:gloves
|
|
pickpocket = G.pickpocket
|
|
user.set_machine(src)
|
|
var/dat = {"
|
|
<B><HR><FONT size=3>[name]</FONT></B>
|
|
<BR><HR>
|
|
<BR><B>Head(Mask):</B> <A href='?src=\ref[src];item=mask'>[(wear_mask ? wear_mask : "Nothing")]</A>
|
|
<BR><B>Left Hand:</B> <A href='?src=\ref[src];item=l_hand'>[(l_hand ? l_hand : "Nothing")]</A>
|
|
<BR><B>Right Hand:</B> <A href='?src=\ref[src];item=r_hand'>[(r_hand ? r_hand : "Nothing")]</A>
|
|
<BR><B>Gloves:</B> <A href='?src=\ref[src];item=gloves'>[(gloves ? gloves : "Nothing")]</A>
|
|
<BR><B>Eyes:</B> <A href='?src=\ref[src];item=eyes'>[(glasses ? glasses : "Nothing")]</A>
|
|
<BR><B>Left Ear:</B> <A href='?src=\ref[src];item=l_ear'>[(l_ear ? l_ear : "Nothing")]</A>
|
|
<BR><B>Right Ear:</B> <A href='?src=\ref[src];item=r_ear'>[(r_ear ? r_ear : "Nothing")]</A>
|
|
<BR><B>Head:</B> <A href='?src=\ref[src];item=head'>[(head ? head : "Nothing")]</A>
|
|
<BR><B>Shoes:</B> <A href='?src=\ref[src];item=shoes'>[(shoes ? shoes : "Nothing")]</A>
|
|
<BR><B>Belt:</B> <A href='?src=\ref[src];item=belt'>[(belt ? belt : "Nothing")]</A>
|
|
<BR><B>Uniform:</B> <A href='?src=\ref[src];item=uniform'>[(w_uniform ? w_uniform : "Nothing")]</A>
|
|
<BR><B>(Exo)Suit:</B> <A href='?src=\ref[src];item=suit'>[(wear_suit ? wear_suit : "Nothing")]</A>
|
|
<BR><B>Back:</B> <A href='?src=\ref[src];item=back'>[(back ? back : "Nothing")]</A> [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" <A href='?src=\ref[];item=internal'>Set Internal</A>", src) : "")]
|
|
<BR><B>ID:</B> <A href='?src=\ref[src];item=id'>[(wear_id ? wear_id : "Nothing")]</A>
|
|
<BR><B>Suit Storage:</B> <A href='?src=\ref[src];item=s_store'>[(s_store ? s_store : "Nothing")]</A>
|
|
<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><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([l_store ? (pickpocket ? l_store.name : "Full") : "Empty"])</A>
|
|
<BR><A href='?src=\ref[src];pockets=right'>Right Pocket ([r_store ? (pickpocket ? r_store.name : "Full") : "Empty"])</A>
|
|
<BR><A href='?src=\ref[user];refresh=1'>Refresh</A>
|
|
<BR><A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
|
|
<BR>"}
|
|
user << browse(dat, text("window=mob\ref[src];size=340x480"))
|
|
onclose(user, "mob\ref[src]")
|
|
return
|
|
|
|
// called when something steps onto a human
|
|
// this could be made more general, but for now just handle mulebot
|
|
/mob/living/carbon/human/Crossed(var/atom/movable/AM)
|
|
var/obj/machinery/bot/mulebot/MB = AM
|
|
if(istype(MB))
|
|
MB.RunOver(src)
|
|
|
|
//gets assignment from ID or ID inside PDA or PDA itself
|
|
//Useful when player do something with computers
|
|
/mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job")
|
|
var/obj/item/device/pda/pda = wear_id
|
|
var/obj/item/weapon/card/id/id = wear_id
|
|
if (istype(pda))
|
|
if (pda.id && istype(pda.id, /obj/item/weapon/card/id))
|
|
. = pda.id.assignment
|
|
else
|
|
. = pda.ownjob
|
|
else if (istype(id))
|
|
. = id.assignment
|
|
else
|
|
return if_no_id
|
|
if (!.)
|
|
. = if_no_job
|
|
return
|
|
|
|
//gets name from ID or ID inside PDA or PDA itself
|
|
//Useful when player do something with computers
|
|
/mob/living/carbon/human/proc/get_authentification_name(var/if_no_id = "Unknown")
|
|
var/obj/item/device/pda/pda = wear_id
|
|
var/obj/item/weapon/card/id/id = wear_id
|
|
if (istype(pda))
|
|
if (pda.id)
|
|
. = pda.id.registered_name
|
|
else
|
|
. = pda.owner
|
|
else if (istype(id))
|
|
. = id.registered_name
|
|
else
|
|
return if_no_id
|
|
return
|
|
|
|
//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
|
|
/mob/living/carbon/human/proc/get_visible_name()
|
|
if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible
|
|
return get_id_name("Unknown")
|
|
if( head && (head.flags_inv&HIDEFACE) )
|
|
return get_id_name("Unknown") //Likewise for hats
|
|
var/face_name = get_face_name()
|
|
var/id_name = get_id_name("")
|
|
if(id_name && (id_name != face_name))
|
|
return "[face_name] (as [id_name])"
|
|
return face_name
|
|
|
|
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
|
/mob/living/carbon/human/proc/get_face_name()
|
|
var/datum/organ/external/head/head = get_organ("head")
|
|
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
|
|
return "Unknown"
|
|
return real_name
|
|
|
|
//gets name from ID or PDA itself, ID inside PDA doesn't matter
|
|
//Useful when player is being seen by other mobs
|
|
/mob/living/carbon/human/proc/get_id_name(var/if_no_id = "Unknown")
|
|
var/obj/item/device/pda/pda = wear_id
|
|
var/obj/item/weapon/card/id/id = wear_id
|
|
if(istype(pda)) . = pda.owner
|
|
else if(istype(id)) . = id.registered_name
|
|
if(!.) . = if_no_id //to prevent null-names making the mob unclickable
|
|
return
|
|
|
|
//gets ID card object from special clothes slot or null.
|
|
/mob/living/carbon/human/proc/get_idcard()
|
|
var/obj/item/weapon/card/id/id = wear_id
|
|
var/obj/item/device/pda/pda = wear_id
|
|
if (istype(pda) && pda.id)
|
|
id = pda.id
|
|
if (istype(id))
|
|
return id
|
|
|
|
//Added a safety check in case you want to shock a human mob directly through electrocute_act.
|
|
/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/safety = 0)
|
|
if(!safety)
|
|
if(gloves)
|
|
var/obj/item/clothing/gloves/G = gloves
|
|
siemens_coeff = G.siemens_coefficient
|
|
//If they have shock immunity mutation
|
|
if(mShock in src.mutations)
|
|
siemens_coeff = 0
|
|
return ..(shock_damage,source,siemens_coeff)
|
|
|
|
|
|
/mob/living/carbon/human/Topic(href, href_list)
|
|
var/pickpocket = 0
|
|
if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
|
|
if(href_list["pockets"])
|
|
if(usr:gloves)
|
|
var/obj/item/clothing/gloves/G = usr:gloves
|
|
pickpocket = G.pickpocket
|
|
var/pocket_side = href_list["pockets"]
|
|
var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store)
|
|
var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store)
|
|
var/obj/item/place_item = usr.get_active_hand() // Item to place in the pocket, if it's empty
|
|
|
|
if(pocket_item)
|
|
usr << "<span class='notice'>You try to empty [src]'s [pocket_side] pocket.</span>"
|
|
else if(place_item && place_item.mob_can_equip(src, pocket_id, 1))
|
|
usr << "<span class='notice'>You try to place [place_item] into [src]'s [pocket_side] pocket.</span>"
|
|
else
|
|
return
|
|
|
|
if(do_mob(usr, src, STRIP_DELAY))
|
|
if(pocket_item)
|
|
u_equip(pocket_item)
|
|
if(pickpocket) usr.put_in_hands(pocket_item)
|
|
else
|
|
if(place_item)
|
|
usr.u_equip(place_item)
|
|
equip_to_slot_if_possible(place_item, pocket_id, 0, 1)
|
|
|
|
// Update strip window
|
|
if(usr.machine == src && in_range(src, usr))
|
|
show_inv(usr)
|
|
|
|
|
|
|
|
else if(!pickpocket)
|
|
// Display a warning if the user mocks up
|
|
src << "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>"
|
|
|
|
if (href_list["refresh"])
|
|
if((machine)&&(in_range(src, usr)))
|
|
show_inv(machine)
|
|
|
|
if (href_list["mach_close"])
|
|
var/t1 = text("window=[]", href_list["mach_close"])
|
|
unset_machine()
|
|
src << browse(null, t1)
|
|
|
|
if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e
|
|
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
|
|
if(ishuman(usr) && usr:gloves)
|
|
var/obj/item/clothing/gloves/G = usr:gloves
|
|
pickpocket = G.pickpocket
|
|
O.source = usr
|
|
O.target = src
|
|
O.item = usr.get_active_hand()
|
|
O.s_loc = usr.loc
|
|
O.t_loc = loc
|
|
O.place = href_list["item"]
|
|
O.pickpocket = pickpocket //Stealthy
|
|
requests += O
|
|
spawn( 0 )
|
|
O.process()
|
|
return
|
|
|
|
if (href_list["criminal"])
|
|
if(hasHUD(usr,"security"))
|
|
|
|
var/modified = 0
|
|
var/perpname = "wot"
|
|
if(wear_id)
|
|
var/obj/item/weapon/card/id/I = wear_id.GetID()
|
|
if(I)
|
|
perpname = I.registered_name
|
|
else
|
|
perpname = name
|
|
else
|
|
perpname = name
|
|
|
|
if(perpname)
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.security)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
|
|
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
|
|
|
|
if(hasHUD(usr, "security"))
|
|
if(setcriminal != "Cancel")
|
|
R.fields["criminal"] = setcriminal
|
|
modified = 1
|
|
|
|
spawn()
|
|
if(istype(usr,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/U = usr
|
|
U.handle_regular_hud_updates()
|
|
if(istype(usr,/mob/living/silicon/robot))
|
|
var/mob/living/silicon/robot/U = usr
|
|
U.handle_regular_hud_updates()
|
|
|
|
if(!modified)
|
|
usr << "\red Unable to locate a data core entry for this person."
|
|
|
|
if (href_list["secrecord"])
|
|
if(hasHUD(usr,"security"))
|
|
var/perpname = "wot"
|
|
var/read = 0
|
|
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.security)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
if(hasHUD(usr,"security"))
|
|
usr << "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]"
|
|
usr << "<b>Minor Crimes:</b> [R.fields["mi_crim"]]"
|
|
usr << "<b>Details:</b> [R.fields["mi_crim_d"]]"
|
|
usr << "<b>Major Crimes:</b> [R.fields["ma_crim"]]"
|
|
usr << "<b>Details:</b> [R.fields["ma_crim_d"]]"
|
|
usr << "<b>Notes:</b> [R.fields["notes"]]"
|
|
usr << "<a href='?src=\ref[src];secrecordComment=`'>\[View Comment Log\]</a>"
|
|
read = 1
|
|
|
|
if(!read)
|
|
usr << "\red Unable to locate a data core entry for this person."
|
|
|
|
if (href_list["secrecordComment"])
|
|
if(hasHUD(usr,"security"))
|
|
var/perpname = "wot"
|
|
var/read = 0
|
|
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.security)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
if(hasHUD(usr,"security"))
|
|
read = 1
|
|
var/counter = 1
|
|
while(R.fields[text("com_[]", counter)])
|
|
usr << text("[]", R.fields[text("com_[]", counter)])
|
|
counter++
|
|
if (counter == 1)
|
|
usr << "No comment found"
|
|
usr << "<a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>"
|
|
|
|
if(!read)
|
|
usr << "\red Unable to locate a data core entry for this person."
|
|
|
|
if (href_list["secrecordadd"])
|
|
if(hasHUD(usr,"security"))
|
|
var/perpname = "wot"
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.security)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
if(hasHUD(usr,"security"))
|
|
var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN)
|
|
if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
|
|
return
|
|
var/counter = 1
|
|
while(R.fields[text("com_[]", counter)])
|
|
counter++
|
|
if(istype(usr,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/U = usr
|
|
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
|
|
if(istype(usr,/mob/living/silicon/robot))
|
|
var/mob/living/silicon/robot/U = usr
|
|
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
|
|
|
|
if (href_list["medical"])
|
|
if(hasHUD(usr,"medical"))
|
|
var/perpname = "wot"
|
|
var/modified = 0
|
|
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.general)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
|
|
var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*SSD*", "*Deceased*", "Physically Unfit", "Active", "Disabled", "Cancel")
|
|
|
|
if(hasHUD(usr,"medical"))
|
|
if(setmedical != "Cancel")
|
|
R.fields["p_stat"] = setmedical
|
|
modified = 1
|
|
|
|
spawn()
|
|
if(istype(usr,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/U = usr
|
|
U.handle_regular_hud_updates()
|
|
if(istype(usr,/mob/living/silicon/robot))
|
|
var/mob/living/silicon/robot/U = usr
|
|
U.handle_regular_hud_updates()
|
|
|
|
if(!modified)
|
|
usr << "\red Unable to locate a data core entry for this person."
|
|
|
|
if (href_list["medrecord"])
|
|
if(hasHUD(usr,"medical"))
|
|
var/perpname = "wot"
|
|
var/read = 0
|
|
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.medical)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
if(hasHUD(usr,"medical"))
|
|
usr << "<b>Name:</b> [R.fields["name"]] <b>Blood Type:</b> [R.fields["b_type"]]"
|
|
usr << "<b>DNA:</b> [R.fields["b_dna"]]"
|
|
usr << "<b>Minor Disabilities:</b> [R.fields["mi_dis"]]"
|
|
usr << "<b>Details:</b> [R.fields["mi_dis_d"]]"
|
|
usr << "<b>Major Disabilities:</b> [R.fields["ma_dis"]]"
|
|
usr << "<b>Details:</b> [R.fields["ma_dis_d"]]"
|
|
usr << "<b>Notes:</b> [R.fields["notes"]]"
|
|
usr << "<a href='?src=\ref[src];medrecordComment=`'>\[View Comment Log\]</a>"
|
|
read = 1
|
|
|
|
if(!read)
|
|
usr << "\red Unable to locate a data core entry for this person."
|
|
|
|
if (href_list["medrecordComment"])
|
|
if(hasHUD(usr,"medical"))
|
|
var/perpname = "wot"
|
|
var/read = 0
|
|
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.medical)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
if(hasHUD(usr,"medical"))
|
|
read = 1
|
|
var/counter = 1
|
|
while(R.fields[text("com_[]", counter)])
|
|
usr << text("[]", R.fields[text("com_[]", counter)])
|
|
counter++
|
|
if (counter == 1)
|
|
usr << "No comment found"
|
|
usr << "<a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>"
|
|
|
|
if(!read)
|
|
usr << "\red Unable to locate a data core entry for this person."
|
|
|
|
if (href_list["medrecordadd"])
|
|
if(hasHUD(usr,"medical"))
|
|
var/perpname = "wot"
|
|
if(wear_id)
|
|
if(istype(wear_id,/obj/item/weapon/card/id))
|
|
perpname = wear_id:registered_name
|
|
else if(istype(wear_id,/obj/item/device/pda))
|
|
var/obj/item/device/pda/tempPda = wear_id
|
|
perpname = tempPda.owner
|
|
else
|
|
perpname = src.name
|
|
for (var/datum/data/record/E in data_core.general)
|
|
if (E.fields["name"] == perpname)
|
|
for (var/datum/data/record/R in data_core.medical)
|
|
if (R.fields["id"] == E.fields["id"])
|
|
if(hasHUD(usr,"medical"))
|
|
var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
|
|
if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
|
|
return
|
|
var/counter = 1
|
|
while(R.fields[text("com_[]", counter)])
|
|
counter++
|
|
if(istype(usr,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/U = usr
|
|
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
|
|
if(istype(usr,/mob/living/silicon/robot))
|
|
var/mob/living/silicon/robot/U = usr
|
|
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
|
|
..()
|
|
return
|
|
|
|
|
|
///eyecheck()
|
|
///Returns a number between -1 to 2
|
|
/mob/living/carbon/human/eyecheck()
|
|
var/number = 0
|
|
if(istype(src.head, /obj/item/clothing/head/welding))
|
|
if(!src.head:up)
|
|
number += 2
|
|
if(istype(src.head, /obj/item/clothing/head/helmet/space))
|
|
number += 2
|
|
if(istype(src.glasses, /obj/item/clothing/glasses/thermal))
|
|
number -= 1
|
|
if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses))
|
|
number += 1
|
|
if(istype(src.glasses, /obj/item/clothing/glasses/welding))
|
|
var/obj/item/clothing/glasses/welding/W = src.glasses
|
|
if(!W.up)
|
|
number += 2
|
|
return number
|
|
|
|
|
|
/mob/living/carbon/human/IsAdvancedToolUser()
|
|
return 1//Humans can use guns and such
|
|
|
|
|
|
/mob/living/carbon/human/abiotic(var/full_body = 0)
|
|
if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.l_ear || src.r_ear || src.gloves)))
|
|
return 1
|
|
|
|
if( (src.l_hand && !src.l_hand.abstract) || (src.r_hand && !src.r_hand.abstract) )
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
/mob/living/carbon/human/proc/check_dna()
|
|
dna.check_integrity(src)
|
|
return
|
|
|
|
/mob/living/carbon/human/get_species()
|
|
|
|
if(!species)
|
|
set_species()
|
|
|
|
if(dna && dna.mutantrace == "golem")
|
|
return "Animated Construct"
|
|
|
|
return species.name
|
|
|
|
/mob/living/carbon/human/proc/play_xylophone()
|
|
if(!src.xylophone)
|
|
visible_message("\red [src] begins playing his ribcage like a xylophone. It's quite spooky.","\blue You begin to play a spooky refrain on your ribcage.","\red You hear a spooky xylophone melody.")
|
|
var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg')
|
|
playsound(loc, song, 50, 1, -1)
|
|
xylophone = 1
|
|
spawn(1200)
|
|
xylophone=0
|
|
return
|
|
|
|
/mob/living/carbon/human/proc/vomit(hairball=0)
|
|
if(!lastpuke)
|
|
lastpuke = 1
|
|
src << "<spawn class='warning'>You feel nauseous..."
|
|
spawn(150) //15 seconds until second warning
|
|
src << "<spawn class='warning'>You feel like you are about to throw up!"
|
|
spawn(100) //and you have 10 more for mad dash to the bucket
|
|
Stun(5)
|
|
|
|
if(hairball)
|
|
src.visible_message("<span class='warning'>[src] hacks up a hairball!</span>","<span class='warning'>You hack up a hairball!</span>")
|
|
else
|
|
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
|
|
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
|
|
|
var/turf/location = loc
|
|
if (istype(location, /turf/simulated))
|
|
location.add_vomit_floor(src, 1)
|
|
|
|
if(!hairball)
|
|
nutrition -= 40
|
|
adjustToxLoss(-3)
|
|
spawn(350) //wait 35 seconds before next volley
|
|
lastpuke = 0
|
|
|
|
/mob/living/carbon/human/proc/morph()
|
|
set name = "Morph"
|
|
set category = "Superpower"
|
|
|
|
if(stat!=CONSCIOUS)
|
|
reset_view(0)
|
|
remoteview_target = null
|
|
return
|
|
|
|
if(!(mMorph in mutations))
|
|
src.verbs -= /mob/living/carbon/human/proc/morph
|
|
return
|
|
|
|
var/new_facial = input("Please select facial hair color.", "Character Generation",rgb(r_facial,g_facial,b_facial)) as color
|
|
if(new_facial)
|
|
r_facial = hex2num(copytext(new_facial, 2, 4))
|
|
g_facial = hex2num(copytext(new_facial, 4, 6))
|
|
b_facial = hex2num(copytext(new_facial, 6, 8))
|
|
|
|
var/new_hair = input("Please select hair color.", "Character Generation",rgb(r_hair,g_hair,b_hair)) as color
|
|
if(new_facial)
|
|
r_hair = hex2num(copytext(new_hair, 2, 4))
|
|
g_hair = hex2num(copytext(new_hair, 4, 6))
|
|
b_hair = hex2num(copytext(new_hair, 6, 8))
|
|
|
|
var/new_eyes = input("Please select eye color.", "Character Generation",rgb(r_eyes,g_eyes,b_eyes)) as color
|
|
if(new_eyes)
|
|
r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
|
g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
|
b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
|
|
|
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-s_tone]") as text
|
|
|
|
if (!new_tone)
|
|
new_tone = 35
|
|
s_tone = max(min(round(text2num(new_tone)), 220), 1)
|
|
s_tone = -s_tone + 35
|
|
|
|
// hair
|
|
var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
|
|
var/list/hairs = list()
|
|
|
|
// loop through potential hairs
|
|
for(var/x in all_hairs)
|
|
var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x
|
|
hairs.Add(H.name) // add hair name to hairs
|
|
del(H) // delete the hair after it's all done
|
|
|
|
var/new_style = input("Please select hair style", "Character Generation",h_style) as null|anything in hairs
|
|
|
|
// if new style selected (not cancel)
|
|
if (new_style)
|
|
h_style = new_style
|
|
|
|
// facial hair
|
|
var/list/all_fhairs = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
|
|
var/list/fhairs = list()
|
|
|
|
for(var/x in all_fhairs)
|
|
var/datum/sprite_accessory/facial_hair/H = new x
|
|
fhairs.Add(H.name)
|
|
del(H)
|
|
|
|
new_style = input("Please select facial style", "Character Generation",f_style) as null|anything in fhairs
|
|
|
|
if(new_style)
|
|
f_style = new_style
|
|
|
|
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
|
|
if (new_gender)
|
|
if(new_gender == "Male")
|
|
gender = MALE
|
|
else
|
|
gender = FEMALE
|
|
regenerate_icons()
|
|
check_dna()
|
|
|
|
visible_message("\blue \The [src] morphs and changes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "\blue You change your appearance!", "\red Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
|
|
|
|
/mob/living/carbon/human/proc/remotesay()
|
|
set name = "Project mind"
|
|
set category = "Superpower"
|
|
|
|
if(stat!=CONSCIOUS)
|
|
reset_view(0)
|
|
remoteview_target = null
|
|
return
|
|
|
|
if(!(mRemotetalk in src.mutations))
|
|
src.verbs -= /mob/living/carbon/human/proc/remotesay
|
|
return
|
|
var/list/creatures = list()
|
|
for(var/mob/living/carbon/h in world)
|
|
creatures += h
|
|
var/mob/target = input ("Who do you want to project your mind to ?") as null|anything in creatures
|
|
if (isnull(target))
|
|
return
|
|
|
|
var/say = input ("What do you wish to say")
|
|
if(mRemotetalk in target.mutations)
|
|
target.show_message("\blue You hear [src.real_name]'s voice: [say]")
|
|
else
|
|
target.show_message("\blue You hear a voice that seems to echo around the room: [say]")
|
|
usr.show_message("\blue You project your mind into [target.real_name]: [say]")
|
|
for(var/mob/dead/observer/G in world)
|
|
G.show_message("<i>Telepathic message from <b>[src]</b> to <b>[target]</b>: [say]</i>")
|
|
|
|
/mob/living/carbon/human/proc/remoteobserve()
|
|
set name = "Remote View"
|
|
set category = "Superpower"
|
|
|
|
if(stat!=CONSCIOUS)
|
|
remoteview_target = null
|
|
reset_view(0)
|
|
return
|
|
|
|
if(!(mRemote in src.mutations))
|
|
remoteview_target = null
|
|
reset_view(0)
|
|
src.verbs -= /mob/living/carbon/human/proc/remoteobserve
|
|
return
|
|
|
|
if(istype(l_hand, /obj/item/tk_grab) || istype(r_hand, /obj/item/tk_grab/))
|
|
src << "\red Your mind is too busy with that telekinetic grab."
|
|
remoteview_target = null
|
|
reset_view(0)
|
|
return
|
|
|
|
if(client.eye != client.mob)
|
|
remoteview_target = null
|
|
reset_view(0)
|
|
return
|
|
|
|
var/list/mob/creatures = list()
|
|
|
|
for(var/mob/living/carbon/h in world)
|
|
var/turf/temp_turf = get_turf(h)
|
|
if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead
|
|
continue
|
|
creatures += h
|
|
|
|
var/mob/target = input ("Who do you want to project your mind to ?") as mob in creatures
|
|
|
|
if (target)
|
|
remoteview_target = target
|
|
reset_view(target)
|
|
else
|
|
remoteview_target = null
|
|
reset_view(0)
|
|
|
|
/mob/living/carbon/human/proc/get_visible_gender()
|
|
if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask))
|
|
return NEUTER
|
|
return gender
|
|
|
|
/mob/living/carbon/human/proc/increase_germ_level(n)
|
|
if(gloves)
|
|
gloves.germ_level += n
|
|
else
|
|
germ_level += n
|
|
|
|
/mob/living/carbon/human/revive()
|
|
for (var/datum/organ/external/O in organs)
|
|
O.status &= ~ORGAN_BROKEN
|
|
O.status &= ~ORGAN_BLEEDING
|
|
O.status &= ~ORGAN_SPLINTED
|
|
O.status &= ~ORGAN_ATTACHABLE
|
|
if (!O.amputated)
|
|
O.status &= ~ORGAN_DESTROYED
|
|
O.wounds.Cut()
|
|
O.heal_damage(1000,1000,1,1)
|
|
|
|
var/datum/organ/external/head/h = organs_by_name["head"]
|
|
h.disfigured = 0
|
|
|
|
vessel.add_reagent("blood",560-vessel.total_volume)
|
|
fixblood()
|
|
for (var/obj/item/weapon/organ/head/H in world)
|
|
if(H.brainmob)
|
|
if(H.brainmob.real_name == src.real_name)
|
|
if(H.brainmob.mind)
|
|
H.brainmob.mind.transfer_to(src)
|
|
del(H)
|
|
|
|
for(var/E in internal_organs)
|
|
var/datum/organ/internal/I = internal_organs[E]
|
|
I.damage = 0
|
|
|
|
for (var/datum/disease/virus in viruses)
|
|
virus.cure()
|
|
for (var/ID in virus2)
|
|
var/datum/disease2/disease/V = virus2[ID]
|
|
V.cure(src)
|
|
|
|
..()
|
|
|
|
/mob/living/carbon/human/proc/is_lung_ruptured()
|
|
var/datum/organ/internal/lungs/L = internal_organs["lungs"]
|
|
return L.is_bruised()
|
|
|
|
/mob/living/carbon/human/proc/rupture_lung()
|
|
var/datum/organ/internal/lungs/L = internal_organs["lungs"]
|
|
|
|
if(!L.is_bruised())
|
|
src.custom_pain("You feel a stabbing pain in your chest!", 1)
|
|
L.damage = L.min_bruised_damage
|
|
|
|
/*
|
|
/mob/living/carbon/human/verb/simulate()
|
|
set name = "sim"
|
|
set background = 1
|
|
|
|
var/damage = input("Wound damage","Wound damage") as num
|
|
|
|
var/germs = 0
|
|
var/tdamage = 0
|
|
var/ticks = 0
|
|
while (germs < 2501 && ticks < 100000 && round(damage/10)*20)
|
|
diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]"
|
|
ticks++
|
|
if (prob(round(damage/10)*20))
|
|
germs++
|
|
if (germs == 100)
|
|
world << "Reached stage 1 in [ticks] ticks"
|
|
if (germs > 100)
|
|
if (prob(10))
|
|
damage++
|
|
germs++
|
|
if (germs == 1000)
|
|
world << "Reached stage 2 in [ticks] ticks"
|
|
if (germs > 1000)
|
|
damage++
|
|
germs++
|
|
if (germs == 2500)
|
|
world << "Reached stage 3 in [ticks] ticks"
|
|
world << "Mob took [tdamage] tox damage"
|
|
*/
|
|
//returns 1 if made bloody, returns 0 otherwise
|
|
|
|
/mob/living/carbon/human/add_blood(mob/living/carbon/human/M as mob)
|
|
if (!..())
|
|
return 0
|
|
//if this blood isn't already in the list, add it
|
|
if(blood_DNA[M.dna.unique_enzymes])
|
|
return 0 //already bloodied with this blood. Cannot add more.
|
|
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
|
if(M.species.bloodflags & BLOOD_GREEN)
|
|
src.update_inv_gloves(1,1) //handles bloody hands overlays and updating
|
|
else
|
|
src.update_inv_gloves(1,0)
|
|
return 1 //we applied blood to the item
|
|
|
|
/mob/living/carbon/human/clean_blood()
|
|
.=..()
|
|
if(istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
|
|
del(feet_blood_DNA)
|
|
return 1
|
|
|
|
mob/living/carbon/human/yank_out_object()
|
|
set category = "Object"
|
|
set name = "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)
|
|
return
|
|
usr.next_move = world.time + 20
|
|
|
|
if(usr.stat == 1)
|
|
usr << "You are unconcious and cannot do that!"
|
|
return
|
|
|
|
if(usr.restrained())
|
|
usr << "You are restrained and cannot do that!"
|
|
return
|
|
|
|
var/list/valid_objects = list()
|
|
var/datum/organ/external/affected = null
|
|
var/mob/living/carbon/human/S = src
|
|
var/mob/living/carbon/human/U = usr
|
|
var/self = null
|
|
|
|
if(S == U)
|
|
self = 1 // Removing object from yourself.
|
|
|
|
valid_objects = get_visible_implants(1)
|
|
|
|
if(!valid_objects.len)
|
|
if(self)
|
|
src << "You have nothing stuck in your wounds that is large enough to remove without surgery."
|
|
else
|
|
U << "[src] has nothing stuck in their wounds that is large enough to remove without surgery."
|
|
return
|
|
|
|
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
|
|
|
|
for(var/datum/organ/external/organ in organs) //Grab the organ holding the implant.
|
|
for(var/obj/item/weapon/O in organ.implants)
|
|
if(O == selection)
|
|
affected = organ
|
|
if(self)
|
|
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your [affected.display_name] with bloody fingers.</span>"
|
|
else
|
|
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s [affected.display_name] with bloody fingers.</span>"
|
|
|
|
if(istype(U,/mob/living/carbon/human/)) U.bloody_hands(S)
|
|
|
|
if(!do_after(U, 80))
|
|
return
|
|
|
|
if(!selection || !affected || !S || !U)
|
|
return
|
|
|
|
if(self)
|
|
visible_message("<span class='warning'><b>[src] rips [selection] out of their [affected.display_name] in a welter of blood.</b></span>","<span class='warning'><b>You rip [selection] out of your [affected] in a welter of blood.</b></span>")
|
|
else
|
|
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s [affected.display_name] in a welter of blood.</b></span>","<span class='warning'><b>[usr] rips [selection] out of your [affected] in a welter of blood.</b></span>")
|
|
|
|
selection.loc = get_turf(src)
|
|
affected.implants -= selection
|
|
shock_stage+=10
|
|
|
|
for(var/obj/item/weapon/O in pinned)
|
|
if(O == selection)
|
|
pinned -= O
|
|
if(!pinned.len)
|
|
anchored = 0
|
|
|
|
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
|
|
var/datum/wound/internal_bleeding/I = new (15)
|
|
affected.wounds += I
|
|
custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
|
|
return 1
|
|
|
|
/mob/living/carbon/human/proc/get_visible_implants(var/class = 0)
|
|
|
|
var/list/visible_implants = list()
|
|
for(var/datum/organ/external/organ in src.organs)
|
|
for(var/obj/item/weapon/O in organ.implants)
|
|
if(!istype(O,/obj/item/weapon/implant) && O.w_class > class)
|
|
visible_implants += O
|
|
|
|
return(visible_implants)
|
|
|
|
/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.
|
|
var/msg = null
|
|
switch(rand(1,3))
|
|
if(1)
|
|
msg ="<span class='warning'>A spike of pain jolts your [organ.display_name] as you bump [O] inside.</span>"
|
|
if(2)
|
|
msg ="<span class='warning'>Your movement jostles [O] in your [organ.display_name] painfully.</span>"
|
|
if(3)
|
|
msg ="<span class='warning'>[O] in your [organ.display_name] twists painfully as you move.</span>"
|
|
src << msg
|
|
|
|
organ.take_damage(rand(1,3), 0, 0)
|
|
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"
|
|
set name = "Check pulse"
|
|
set desc = "Approximately count somebody's pulse. Requires you to stand still at least 6 seconds."
|
|
set src in view(1)
|
|
var/self = 0
|
|
|
|
if(usr.stat == 1 || usr.restrained() || !isliving(usr)) return
|
|
|
|
if(usr == src)
|
|
self = 1
|
|
if(!self)
|
|
usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\
|
|
"You begin counting [src]'s pulse")
|
|
else
|
|
usr.visible_message("\blue [usr] begins counting their pulse.",\
|
|
"You begin counting your pulse.")
|
|
|
|
if(src.pulse)
|
|
usr << "\blue [self ? "You have a" : "[src] has a"] pulse! Counting..."
|
|
else
|
|
usr << "\red [src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse
|
|
return
|
|
|
|
usr << "Don't move until counting is finished."
|
|
var/time = world.timeofday
|
|
sleep(60)
|
|
if(usr.l_move_time >= time) //checks if our mob has moved during the sleep()
|
|
usr << "You moved while counting. Try again."
|
|
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 1
|
|
|
|
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
|
|
|
|
if(species.name=="Slime People")
|
|
dna.mutantrace = "slime"
|
|
|
|
mutations+=species.default_mutations
|
|
|
|
spawn(0)
|
|
update_icons()
|
|
|
|
if(species)
|
|
return 1
|
|
else
|
|
return 0
|