Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into DisMemberments

This commit is contained in:
Aurorablade
2018-02-08 02:31:44 -05:00
784 changed files with 20471 additions and 10727 deletions
+2 -2
View File
@@ -289,9 +289,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
switch(data_hud_seen) //give new huds
if(0)
show_me_the_hud(DATA_HUD_SECURITY_BASIC)
show_me_the_hud(DATA_HUD_SECURITY_ADVANCED)
to_chat(src, "<span class='notice'>Security HUD set.</span>")
if(DATA_HUD_SECURITY_BASIC)
if(DATA_HUD_SECURITY_ADVANCED)
show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED)
to_chat(src, "<span class='notice'>Medical HUD set.</span>")
if(DATA_HUD_MEDICAL_ADVANCED)
+3 -2
View File
@@ -559,9 +559,10 @@
if(!message)
return
log_robot("[key_name(speaker)] : [message]")
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
var/message_body = "<span class='message'>[speaker.say_quote(message)], \"[message]\"</span></span></i>"
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i> <span class='ibm'>\"[message]\"</span></span></span>"
for(var/mob/M in dead_mob_list)
if(!isnewplayer(M) && !isbrain(M))
@@ -13,6 +13,9 @@
var/leap_on_click = 0
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
pass_flags = PASSTABLE
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
@@ -121,7 +124,7 @@
stuttering = power
Stun(power)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -1,10 +1,3 @@
/mob/living/carbon/alien/humanoid
oxygen_alert = 0
toxins_alert = 0
fire_alert = 0
pass_flags = PASSTABLE
/mob/living/carbon/alien/humanoid/Life()
. = ..()
update_icons()
+3 -4
View File
@@ -4,15 +4,16 @@
if(!breath || (breath.total_moles() == 0))
//Aliens breathe in vaccuum
return 0
return FALSE
var/toxins_used = 0
var/tox_detect_threshold = 0.02
var/breath_pressure = (breath.total_moles() * R_IDEAL_GAS_EQUATION * breath.temperature) / BREATH_VOLUME
//Partial pressure of the toxins in our breath
var/Toxins_pp = (breath.toxins / breath.total_moles()) * breath_pressure
if(Toxins_pp) // Detect toxins in air
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
adjustPlasma(breath.toxins*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
@@ -28,8 +29,6 @@
//BREATH TEMPERATURE
handle_breath_temperature(breath)
return 1
/mob/living/carbon/alien/update_sight()
if(!client)
return
@@ -135,6 +135,11 @@ var/const/MAX_ACTIVE_TIME = 400
if(target.wear_mask)
if(prob(20))
return 0
if(istype(target.wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/S = target.wear_mask
if(S.do_break())
target.visible_message("<span class='danger'>[src] spits acid onto [S] melting the lock!</span>", \
"<span class='userdanger'>[src] spits acid onto [S] melting the lock!</span>")
var/obj/item/clothing/W = target.wear_mask
if(W.flags & NODROP)
return 0
@@ -47,7 +47,7 @@
to_chat(O, "<span class='boldnotice'>\A [src] has been activated. (<a href='?src=[O.UID()];jump=\ref[src]'>Teleport</a> | <a href='?src=[UID()];signup=\ref[O]'>Sign Up</a>)</span>")
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
if(cannotPossess(O))
return 0
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
return 0
@@ -133,7 +133,7 @@
if(!check_observer(O))
to_chat(O, "<span class='warning'>You cannot be \a [src].</span>")
return
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
if(cannotPossess(O))
to_chat(O, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
return
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
+32 -45
View File
@@ -2,20 +2,6 @@
var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0"
var/datum/middleClickOverride/middleClickOverride = null
/mob/living/carbon/prepare_huds()
..()
prepare_data_huds()
/mob/living/carbon/proc/prepare_data_huds()
..()
med_hud_set_health()
med_hud_set_status()
/mob/living/carbon/updatehealth()
..()
med_hud_set_health()
med_hud_set_status()
/mob/living/carbon/Destroy()
QDEL_LIST(internal_organs)
QDEL_LIST(stomach_contents)
@@ -23,7 +9,6 @@
if(B)
B.leave_host()
qdel(B)
remove_from_all_data_huds()
return ..()
/mob/living/carbon/blob_act()
@@ -68,7 +53,7 @@
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/organ = H.get_organ("chest")
if(istype(organ))
if(organ.take_damage(d, 0))
if(organ.receive_damage(d, 0))
H.UpdateDamageIcon()
H.updatehealth()
@@ -313,6 +298,7 @@
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
. = ..()
var/damage = intensity - check_eye_prot()
var/extra_damage = 0
if(.)
if(visual)
return
@@ -323,19 +309,32 @@
if(!E || (E && E.weld_proof))
return
var/extra_darkview = 0
if(E.dark_view)
extra_darkview = max(E.dark_view - 2, 0)
extra_damage = extra_darkview
var/light_amount = 10 // assume full brightness
if(isturf(src.loc))
var/turf/T = src.loc
light_amount = round(T.get_lumcount() * 10)
// a dark view of 8, in full darkness, will result in maximum 1st tier damage
var/extra_prob = (10 - light_amount) * extra_darkview
switch(damage)
if(1)
to_chat(src, "<span class='warning'>Your eyes sting a little.</span>")
if(prob(40)) //waiting on carbon organs
E.take_damage(1, 1)
var/minor_damage_multiplier = min(40 + extra_prob, 100) / 100
var/minor_damage = minor_damage_multiplier * (1 + extra_damage)
E.receive_damage(minor_damage, 1)
if(2)
to_chat(src, "<span class='warning'>Your eyes burn.</span>")
E.take_damage(rand(2, 4), 1)
E.receive_damage(rand(2, 4) + extra_damage, 1)
else
to_chat(src, "Your eyes itch and burn severely!</span>")
E.take_damage(rand(12, 16), 1)
E.receive_damage(rand(12, 16) + extra_damage, 1)
if(E.damage > E.min_bruised_damage)
AdjustEyeBlind(damage)
@@ -625,6 +624,13 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/M = wear_mask
if(M.security_lock)
dat += "&nbsp;<A href='?src=[M.UID()];locked=\ref[src]'>[M.locked ? "Disable Lock" : "Set Lock"]</A>"
dat += "</td></tr><tr><td>&nbsp;</td></tr>"
if(handcuffed)
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=[UID()];item=[slot_handcuffed]'>Remove</A></td></tr>"
if(legcuffed)
@@ -661,7 +667,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(do_mob(usr, src, POCKET_STRIP_DELAY))
if(internal)
internal = null
update_internals_hud_icon(0)
update_action_buttons_icon()
else
var/no_mask2
if(!get_organ_slot("breathing_tube"))
@@ -672,7 +678,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
to_chat(usr, "<span class='warning'>[src] is not wearing a suitable mask or helmet!</span>")
return
internal = ITEM
update_internals_hud_icon(1)
update_action_buttons_icon()
visible_message("<span class='danger'>[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].</span>", \
"<span class='userdanger'>[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].</span>")
@@ -727,23 +733,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
/mob/living/carbon/proc/spin(spintime, speed)
spawn()
var/D = dir
while(spintime >= speed)
sleep(speed)
switch(D)
if(NORTH)
D = EAST
if(SOUTH)
D = WEST
if(EAST)
D = SOUTH
if(WEST)
D = NORTH
dir = D
spintime -= speed
/mob/living/carbon/resist_buckle()
spawn(0)
resist_muzzle()
@@ -802,6 +791,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(do_after(src, time, 0, target = src))
visible_message("<span class='warning'>[src] removes [I]!</span>")
to_chat(src, "<span class='notice'>You get rid of [I]!</span>")
if(I.security_lock)
I.do_break()
unEquip(I)
@@ -1069,10 +1060,6 @@ so that different stomachs can handle things in different ways VB*/
return FALSE
/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
if(hud_used && hud_used.internals)
hud_used.internals.icon_state = "internal[internal_state]"
//to recalculate and update the mob's total tint from tinted equipment it's wearing.
/mob/living/carbon/proc/update_tint()
if(!tinted_weldhelh)
@@ -1117,4 +1104,4 @@ so that different stomachs can handle things in different ways VB*/
update_tint()
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
update_inv_head()
@@ -1,6 +1,5 @@
/mob/living/carbon
gender = MALE
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/stomach_contents = list()
var/list/internal_organs = list()
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
@@ -23,12 +22,7 @@
var/wetlevel = 0 //how wet the mob is
var/oxygen_alert = 0
var/toxins_alert = 0
var/co2_alert = 0
var/fire_alert = 0
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
blood_volume = BLOOD_VOLUME_NORMAL
@@ -97,7 +97,7 @@ var/global/list/body_accessory_by_species = list("None" = null)
animated_icon_state = "null"
/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H)
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space))
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL))
return 1
return 0
@@ -140,4 +140,3 @@ var/global/list/body_accessory_by_species = list("None" = null)
icon_state = "vulptail6"
animated_icon_state = "vulptail6_a"
allowed_species = list("Vulpkanin")
@@ -40,7 +40,7 @@
hgibs(loc, dna)
else
new /obj/effect/decal/cleanable/blood/gibs/robot(loc)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
+54 -11
View File
@@ -34,24 +34,24 @@
else //Everyone else fails, skip the emote attempt
return
if("drone","drones","hum","hums","rumble","rumbles")
if(species.name == "Drask") //Only Drask can make whale noises
if(get_species() == "Drask") //Only Drask can make whale noises
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else
return
if("howl", "howls")
if (species.name == "Vulpkanin") //Only Vulpkanin can howl
if(get_species() == "Vulpkanin") //Only Vulpkanin can howl
on_CD = handle_emote_CD(100)
else
return
if("growl", "growls")
if (species.name == "Vulpkanin") //Only Vulpkanin can growl
if(get_species() == "Vulpkanin") //Only Vulpkanin can growl
on_CD = handle_emote_CD()
else
return
if("squish", "squishes")
var/found_slime_bodypart = 0
if(species.name == "Slime People") //Only Slime People can squish
if(get_species() == "Slime People") //Only Slime People can squish
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
found_slime_bodypart = 1
else
@@ -65,25 +65,31 @@
return
if("clack", "clacks")
if(species.name == "Kidan") //Only Kidan can clack and rightfully so.
if(get_species() == "Kidan") //Only Kidan can clack and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("click", "clicks")
if(species.name == "Kidan") //Only Kidan can click and rightfully so.
if(get_species() == "Kidan") //Only Kidan can click and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("creaks", "creak")
if(species.name == "Diona") //Only Dionas can Creaks.
if(get_species() == "Diona") //Only Dionas can Creaks.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("hiss", "hisses")
if(species.name == "Unathi") //Only Unathi can hiss.
if(get_species() == "Unathi") //Only Unathi can hiss.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("quill", "quills")
if(get_species() == "Vox") //Only Vox can rustle their quills.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
@@ -92,7 +98,7 @@
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
if("cough", "coughs", "slap", "slaps")
if("cough", "coughs", "slap", "slaps", "highfive")
on_CD = handle_emote_CD()
if("sneeze", "sneezes")
on_CD = handle_emote_CD()
@@ -190,6 +196,13 @@
playsound(loc, 'sound/effects/unathihiss.ogg', 50, 0) //Credit to Jamius (freesound.org) for the sound.
m_type = 2
if("quill", "quills")
var/M = handle_emote_param(param)
message = "<B>[src]</B> rustles their quills[M ? " at [M]" : ""]."
playsound(loc, 'sound/effects/voxrustle.ogg', 50, 0) //Credit to sound-ideas (freesfx.co.uk) for the sound.
m_type = 2
if("yes")
var/M = handle_emote_param(param)
@@ -821,12 +834,40 @@
continue
M.reagents.add_reagent("jenkem", 1)
if("hem")
message = "<b>[src]</b> hems."
if("highfive")
if(restrained())
return
if(has_status_effect(STATUS_EFFECT_HIGHFIVE))
to_chat(src, "You give up on the highfive.")
remove_status_effect(STATUS_EFFECT_HIGHFIVE)
return
visible_message("<b>[name]</b> requests a highfive.", "You request a high five.")
apply_status_effect(STATUS_EFFECT_HIGHFIVE)
for(var/mob/living/L in orange(1))
if(L.has_status_effect(STATUS_EFFECT_HIGHFIVE))
if((mind && mind.special_role == SPECIAL_ROLE_WIZARD) && (L.mind && L.mind.special_role == SPECIAL_ROLE_WIZARD))
visible_message("<span class='danger'><b>[name]</b> and <b>[L.name]</b> high-five EPICALLY!</span>")
status_flags |= GODMODE
L.status_flags |= GODMODE
explosion(loc,5,2,1,3)
status_flags &= ~GODMODE
L.status_flags &= ~GODMODE
return
visible_message("<b>[name]</b> and <b>[L.name]</b> high-five!")
playsound('sound/effects/snap.ogg', 50)
remove_status_effect(STATUS_EFFECT_HIGHFIVE)
L.remove_status_effect(STATUS_EFFECT_HIGHFIVE)
return
if("help")
var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dance, dap(s)(none)/mob," \
+ " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \
+ " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ " handshake-mob, hug(s)-(none)/mob, hem, highfive, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s)"
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s), quill(s)"
switch(species.name)
if("Machine")
@@ -839,6 +880,8 @@
emotelist += "\nUnathi specific emotes :- hiss(es)"
if("Vulpkanin")
emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob"
if("Vox")
emotelist += "\nVox specific emotes :- quill(s)"
if("Diona")
emotelist += "\nDiona specific emotes :- creak(s)"
@@ -245,7 +245,7 @@
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
else if(E.status & ORGAN_SPLINTED)
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on his [E.name]!\n"
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on [t_his] [E.name]!\n"
for(var/obj/item/I in E.embedded_objects)
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [E.name]!</B>\n"
+10 -37
View File
@@ -399,7 +399,7 @@
Stuttering(power)
Stun(power)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -455,7 +455,14 @@
if(slot_wear_mask in obscured)
dat += "<tr><td><font color=grey><B>Mask:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
else
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A>"
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
var/obj/item/clothing/mask/muzzle/M = wear_mask
if(M.security_lock)
dat += "&nbsp;<A href='?src=[M.UID()];locked=\ref[src]'>[M.locked ? "Disable Lock" : "Set Lock"]</A>"
dat += "</td></tr><tr><td>&nbsp;</td></tr>"
if(!issmall(src))
if(slot_glasses in obscured)
@@ -708,7 +715,7 @@
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
I.forceMove(get_turf(src))
usr.put_in_hands(I)
usr.emote("scream")
@@ -1299,36 +1306,6 @@
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)
to_chat(world, "Reached stage 1 in [ticks] ticks")
if(germs > 100)
if(prob(10))
damage++
germs++
if(germs == 1000)
to_chat(world, "Reached stage 2 in [ticks] ticks")
if(germs > 1000)
damage++
germs++
if(germs == 2500)
to_chat(world, "Reached stage 3 in [ticks] ticks")
to_chat(world, "Mob took [tdamage] tox damage")
*/
//returns 1 if made bloody, returns 0 otherwise
/mob/living/carbon/human/clean_blood(var/clean_feet)
@@ -1434,10 +1411,6 @@
maxHealth = species.total_health
toxins_alert = 0
oxygen_alert = 0
fire_alert = 0
if(species.language)
add_language(species.language)
@@ -37,7 +37,7 @@
if(sponge)
if(species)
amount = amount * species.brain_mod
sponge.take_damage(amount, 1)
sponge.receive_damage(amount, 1)
brainloss = sponge.damage
else
brainloss = 200
@@ -112,7 +112,7 @@
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
O.take_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source)
O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source)
else
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
@@ -126,7 +126,7 @@
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
O.take_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source)
O.receive_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source)
else
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
@@ -240,7 +240,7 @@
if(!parts.len)
return
var/obj/item/organ/external/picked = pick(parts)
if(picked.take_damage(brute, burn, sharp))
if(picked.receive_damage(brute, burn, sharp))
UpdateDamageIcon()
updatehealth()
speech_problem_flag = 1
@@ -285,7 +285,7 @@
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute_per_part, burn_per_part, sharp, used_weapon)
update |= picked.receive_damage(brute_per_part, burn_per_part, sharp, used_weapon)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
@@ -355,7 +355,7 @@ This function restores all organs.
if(species)
damage = damage * species.brute_mod
if(organ.take_damage(damage, 0, sharp, used_weapon))
if(organ.receive_damage(damage, 0, sharp, used_weapon))
UpdateDamageIcon()
if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers
@@ -372,7 +372,7 @@ This function restores all organs.
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
receive_damage()
receiving_damage()
if(BURN)
damageoverlaytemp = 20
@@ -380,7 +380,7 @@ This function restores all organs.
if(species)
damage = damage * species.burn_mod
if(organ.take_damage(0, damage, sharp, used_weapon))
if(organ.receive_damage(0, damage, sharp, used_weapon))
UpdateDamageIcon()
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
@@ -311,7 +311,7 @@ emp_act
L.embedded_objects |= I
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.forceMove(src)
L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
visible_message("<span class='danger'>[I] embeds itself in [src]'s [L.name]!</span>","<span class='userdanger'>[I] embeds itself in your [L.name]!</span>")
hitpush = 0
skipcatch = 1 //can't catch the now embedded item
@@ -358,10 +358,10 @@ emp_act
if("brute")
if(M.force > 20)
Paralyse(1)
update |= affecting.take_damage(rand(M.force/2, M.force), 0)
update |= affecting.receive_damage(rand(M.force/2, M.force), 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if("fire")
update |= affecting.take_damage(0, rand(M.force/2, M.force))
update |= affecting.receive_damage(0, rand(M.force/2, M.force))
playsound(src, 'sound/items/Welder.ogg', 50, 1)
if("tox")
M.mech_toxin_damage(src)
@@ -21,7 +21,7 @@
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.name]!", 1)
I.take_damage(rand(3,5))
I.receive_damage(rand(3,5))
//handle_stance()
handle_grasp()
@@ -107,7 +107,7 @@
custom_emote(1, "drops what they were holding, their [E.name] malfunctioning!")
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
spark_system.start()
@@ -618,7 +618,7 @@
if(istype(D,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/AL = D
if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through
AL.p_open = 1
AL.panel_open = 1
AL.update_icon()
AL.shock(src, mistake_chance)
sleep(5)
@@ -638,7 +638,7 @@
if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY))
AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY)
sleep(5)
AL.p_open = 0
AL.panel_open = 0
AL.update_icon()
D.open()
@@ -152,7 +152,7 @@
update_head_accessory()
if(internal && !get_organ_slot("breathing_tube"))
internal = null
update_internals_hud_icon(0)
update_action_buttons_icon()
wear_mask_update(I, toggle_off = FALSE)
sec_hud_set_ID()
update_inv_wear_mask()
+64 -103
View File
@@ -1,5 +1,4 @@
/mob/living/carbon/human/Life()
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
life_tick++
voice = GetVoice()
@@ -94,32 +93,49 @@
if(getBrainLoss() >= 60 && stat != DEAD)
speech_problem_flag = 1
if(prob(3))
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
var/list/s1 = list("IM A [pick("PONY","LIZARD","taJaran","kitty","Vulpakin","drASK","BIRDIE","voxxie","race car","combat meCH","SPESSSHIP")] [pick("NEEEEEEIIIIIIIIIGH","sKREEEEEE","MEOW","NYA~","rawr","Barkbark","Hissssss","vROOOOOM","pewpew","choo Choo")]!",
"without oxigen blob don't evoluate?",
"CAPTAINS A COMDOM",
"[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
"can u give me [pick("telikesis","halk","eppilapse")]?",
"THe saiyans screwed",
"Bi is THE BEST OF BOTH WORLDS>",
"Bi is THE BEST OF BOTH WORLDS",
"I WANNA PET TEH monkeyS",
"stop grifing me!!!!",
"SOTP IT#")
"SOTP IT!",
"HALPZ SITCULITY",
"VOXES caN't LOVE",
"my dad own this station",
"the CHef put [pick("PROTEIN", "toiret waTer", "RiPPleing TendIes", "Einzymes","HORRY WALTER","nuTriments","ReActive MutAngen","TeSLium","sKrektonium")] in my [pick("wiSh soup","Bullito","rAingurber","sOilent GREEn","KoI Susishes","yaya")]!",
"the monkey have TASER ARMS!",
"qM blew my points on [pick("cOMbat Shtogun","inSuLated gloves","LOTS MASSHEEN!")]",
"EI'NATH!",
"WAKE UP SHEEPLES!",
"et wus my [pick("wittle brother!!","fiancee","friend staying over","entiRe orphanage","love interest","wife","husband","liTTle kids","sentient cAT","accidentally")]!")
var/list/s2 = list("FUS RO DAH",
"fucking 4rries!",
"fuckin tangerines!!!",
"stat me",
">my face",
"roll it easy!",
"waaaaaagh!!!",
"red wonz go fasta",
"FOR TEH EMPRAH",
"lol2cat",
"HAZ A SECURE DAY!!!!",
"dem dwarfs man, dem dwarfs",
"SPESS MAHREENS",
"hwee did eet fhor khayosss",
"lifelike texture ;_;",
"lifelike texture",
"luv can bloooom",
"PACKETS!!!")
"PACKETS!!!",
"[pick("WHERE MY","aYE need","giv me my","bath me inn.")] [pick("dermaline","alKkyZine","dylOvene","inAprovaline","biCaridine","Hyperzine","kELotane","lePorazine","bAcch Salts","tricord","clOnexazone","hydroChloric Acid","chlorine Hydrate","paRoxetine")]!",
"mALPRACTICEBAY",
"I HavE A pe H dee iN ENTerpriSE resOUrCE pLaNNIN",
"h-h-HalP MaINT",
"dey come, dey COME! DEY COME!!!",
"THE END IS NIGH!",
"I FOT AND DIED FOR MUH [pick("RITES","FREEDOM","payCHECK","cARGO points","teCH Level","doG","mAPLe syrup","fluffy fWiends","gateway Loot")]",
"KILL DEM [pick("mainTnacE cHickinNS","kiRA CulwnNES","FLOOR CLUWNEs","MIME ASSASSIN","BOMBING TAJARAN","cC offiser","morPhlings","slinglings")]!")
switch(pick(1,2,3))
if(1)
say(pick(s1))
@@ -222,61 +238,38 @@
chest.add_autopsy_data("Radiation Poisoning", autopsy_damage)
/mob/living/carbon/human/breathe()
if(!species.breathe(src))
..()
if((NO_BREATH in mutations) || (NO_BREATHE in species.species_traits) || reagents.has_reagent("lexorin"))
adjustOxyLoss(-5)
oxygen_alert = 0
toxins_alert = 0
return
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
return
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
var/datum/gas_mixture/environment
if(loc)
environment = loc.return_air()
var/obj/item/organ/internal/L = get_organ_slot("lungs")
var/datum/gas_mixture/breath
if(!L || L && (L.status & ORGAN_DEAD))
if(health >= config.health_threshold_crit)
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
else
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
if(health <= config.health_threshold_crit)
AdjustLoseBreath(1)
failed_last_breath = TRUE
if(losebreath > 0)
AdjustLoseBreath(-1)
if(prob(10))
emote("gasp")
if(istype(loc, /obj/))
var/obj/loc_as_obj = loc
loc_as_obj.handle_internal_lifeform(src, 0)
if(species)
var/datum/species/S = species
if(S.breathid == "o2")
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else if(S.breathid == "tox")
throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else if(S.breathid == "co2")
throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
else if(S.breathid == "n2")
throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
return FALSE
else
breath = get_breath_from_internal(BREATH_VOLUME)
if(!breath)
if(isobj(loc)) //Breathe from loc as object
var/obj/loc_as_obj = loc
breath = loc_as_obj.handle_internal_lifeform(src, BREATH_MOLES)
else if(isturf(loc)) //Breathe from loc as turf
var/breath_moles = 0
if(environment)
breath_moles = environment.total_moles()*BREATH_PERCENTAGE
breath = loc.remove_air(breath_moles)
if(!is_lung_ruptured()) // THIS FUCKING EXCERPT, THIS LITTLE FUCKING EXCERPT, SNOWFLAKED
if(!breath || breath.total_moles() < BREATH_MOLES / 5 || breath.total_moles() > BREATH_MOLES * 5) // RIGHT IN THE CENTER OF THE FUCKING BREATHE PROC
if(prob(5)) // IT IS THE ONLY FUCKING REASONS HUMAN OVERRIDE breathe()
rupture_lung() // GOD FUCKING DAMNIT
else //Breathe from loc as obj again
if(istype(loc, /obj/))
var/obj/loc_as_obj = loc
loc_as_obj.handle_internal_lifeform(src,0)
check_breath(breath)
if(breath)
loc.assume_air(breath)
if(istype(L, /obj/item/organ/internal/lungs))
var/obj/item/organ/internal/lungs/lun = L
lun.check_breath(breath, src)
// USED IN DEATHWHISPERS
/mob/living/carbon/human/proc/isInCrit()
@@ -307,45 +300,13 @@
if(null_internals) //something wants internals gone
internal = null //so do it
update_action_buttons_icon()
if(internal) //check for hud updates every time this is called
update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed) //returns the valid air
else
update_internals_hud_icon(0)
return null
/mob/living/carbon/human/check_breath(var/datum/gas_mixture/breath)
if(status_flags & GODMODE)
return 0
if(!breath || (breath.total_moles() == 0) || suiciding)
var/oxyloss = 0
if(suiciding)
oxyloss = 2
adjustOxyLoss(oxyloss)//If you are suiciding, you should die a little bit faster
failed_last_breath = 1
oxygen_alert = max(oxygen_alert, 1)
return 0
if(health > 0)
oxyloss = HUMAN_MAX_OXYLOSS
adjustOxyLoss(oxyloss)
failed_last_breath = 1
else
oxyloss = HUMAN_CRIT_MAX_OXYLOSS
adjustOxyLoss(oxyloss)
failed_last_breath = 1
var/obj/item/organ/external/affected = get_organ("chest")
affected.add_autopsy_data("Suffocation", oxyloss)
throw_alert("oxy", /obj/screen/alert/oxy)
return 0
return species.handle_breath(breath, src)
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
if(!environment)
return
@@ -374,7 +335,7 @@
if(bodytemperature > species.heat_level_1)
//Body temperature is too hot.
if(status_flags & GODMODE) return 1 //godmode
var/mult = species.hot_env_multiplier
var/mult = species.heatmod
if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2)
throw_alert("temp", /obj/screen/alert/hot, 1)
@@ -396,7 +357,7 @@
return 1
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
var/mult = species.cold_env_multiplier
var/mult = species.coldmod
if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1)
throw_alert("temp", /obj/screen/alert/cold, 1)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature")
@@ -419,7 +380,7 @@
if(status_flags & GODMODE) return 1 //godmode
if(adjusted_pressure >= species.hazard_high_pressure)
if(!(RESIST_HEAT in mutations))
if(!(HEATRES in mutations))
var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
@@ -432,7 +393,7 @@
else if(adjusted_pressure >= species.hazard_low_pressure)
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
if(RESIST_COLD in mutations)
if(COLDRES in mutations)
clear_alert("pressure")
else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
@@ -443,7 +404,7 @@
/mob/living/carbon/human/handle_fire()
if(..())
return
if(RESIST_HEAT in mutations)
if(HEATRES in mutations)
return
if(on_fire)
var/thermal_protection = get_thermal_protection()
@@ -507,7 +468,7 @@
/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to.
if(RESIST_HEAT in mutations)
if(HEATRES in mutations)
return 1
var/thermal_protection_flags = get_heat_protection_flags(temperature)
@@ -568,7 +529,7 @@
/mob/living/carbon/human/proc/get_cold_protection(temperature)
if(RESIST_COLD in mutations)
if(COLDRES in mutations)
return 1 //Fully protected from the cold.
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
@@ -746,16 +707,16 @@
Paralyse(5/sober_str)
Drowsy(30/sober_str)
if(L)
L.take_damage(0.1, 1)
L.receive_damage(0.1, 1)
adjustToxLoss(0.1)
else //stuff only for synthetics
if(alcohol_strength >= spark_start && prob(25))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
if(alcohol_strength >= collapse_start && prob(10))
emote("collapse")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
if(alcohol_strength >= braindamage_start && prob(10))
@@ -918,11 +879,11 @@
var/obj/item/organ/external/BP = X
for(var/obj/item/I in BP.embedded_objects)
if(prob(I.embedded_pain_chance))
BP.take_damage(I.w_class*I.embedded_pain_multiplier)
BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
to_chat(src, "<span class='userdanger'>[I] embedded in your [BP.name] hurts!</span>")
if(prob(I.embedded_fall_chance))
BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier)
BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
BP.embedded_objects -= I
I.forceMove(get_turf(src))
visible_message("<span class='danger'>[I] falls out of [name]'s [BP.name]!</span>","<span class='userdanger'>[I] falls out of your [BP.name]!</span>")
@@ -1016,7 +977,7 @@
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags_cover & MASKCOVERSMOUTH))
return
if(NO_BREATHE in species.species_traits)
if(NO_BREATHE in H.species.species_traits)
return //no puking if you can't smell!
// Humans can lack a mind datum, y'know
if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner"))
+6 -1
View File
@@ -86,9 +86,14 @@
return real_name
/mob/living/carbon/human/IsVocal()
// how do species that don't breathe talk? magic, that's what.
var/breathes = (!(NO_BREATHE in species.species_traits))
var/obj/item/organ/internal/L = get_organ_slot("lungs")
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
return FALSE
if(mind)
return !mind.miming
return 1
return TRUE
/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice)
if(new_voice)
@@ -10,7 +10,6 @@
eyes = "blank_eyes"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
@@ -30,7 +30,6 @@
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
heat_level_3_breathe = 999999999
blood_color = "#515573"
flesh_color = "#137E8F"
@@ -14,8 +14,7 @@
butt_sprite = "plasma"
breath_type = "plasma"
poison_type = null //Certainly isn't plasma.
breathid = "tox"
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
@@ -29,6 +28,16 @@
"realizes the existential problem of being made out of plasma!",
"shows their true colors, which happens to be the color of plasma!")
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs/plasmaman,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes
)
/datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking)
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))
@@ -146,109 +155,7 @@
H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
to_chat(H, "<span class='notice'>You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.</span>")
H.internal = H.get_item_by_slot(tank_slot)
H.update_internals_hud_icon(1)
// Plasmamen are so fucking different that they need their own proc.
/datum/species/plasmaman/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
var/safe_plasma_min = 16 // Minimum safe partial pressure of PLASMA, in kPa
//var/safe_oxygen_max = 140 // Maximum safe partial pressure of PLASMA, in kPa (Not used for now)
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
var/SA_para_min = 1
var/SA_sleep_min = 5
var/plasma_used = 0
var/nitrogen_used = 0
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
// Partial pressure of plasma
var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure
// And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun)
var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE
if(Toxins_pp < safe_plasma_min)
if(prob(20))
H.emote("gasp")
if(Toxins_pp > 0)
var/ratio = safe_plasma_min/Toxins_pp
H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!)
H.failed_last_breath = 1
plasma_used = breath.toxins*ratio/6
else
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
H.failed_last_breath = 1
H.oxygen_alert = max(H.oxygen_alert, 1)
else // We're in safe limits
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
plasma_used = breath.toxins/6
H.oxygen_alert = 0
breath.toxins -= plasma_used
breath.nitrogen -= nitrogen_used
breath.carbon_dioxide += plasma_used
//CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick.
if(CO2_pp > safe_co2_max)
if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
H.co2overloadtime = world.time
else if(world.time - H.co2overloadtime > 120)
H.Paralyse(3)
H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
H.adjustOxyLoss(8)
if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
H.emote("cough")
else
H.co2overloadtime = 0
if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here.
for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
H.emote(pick("giggle", "laugh"))
SA.moles = 0
if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :(
if(H.status_flags & GODMODE)
return 1 //godmode
if(breath.temperature < cold_level_1)
if(prob(20))
to_chat(src, "<span class='warning'>You feel your face freezing and an icicle forming in your lungs!</span>")
else if(breath.temperature > heat_level_1)
if(prob(20))
to_chat(src, "<span class='warning'>You feel your face burning and a searing heat in your lungs!</span>")
switch(breath.temperature)
if(-INFINITY to cold_level_3)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_3 to cold_level_2)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(cold_level_2 to cold_level_1)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
H.fire_alert = max(H.fire_alert, 1)
if(heat_level_1 to heat_level_2)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_2 to heat_level_3)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
return 1
H.update_action_buttons_icon()
/datum/species/plasmaman/handle_life(var/mob/living/carbon/human/H)
if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
@@ -264,6 +171,7 @@
if(istype(P))
P.Extinguish(H)
H.update_fire()
..()
/datum/species/plasmaman/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
if(R.id == "plasma")
@@ -70,4 +70,5 @@
H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
else if(light_amount < 2) //heal in the dark
H.heal_overall_damage(1,1)
H.clear_alert("lightexposure")
H.clear_alert("lightexposure")
..()
@@ -32,7 +32,6 @@
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
heat_level_3_breathe = 999999999
suicide_messages = list(
"is snapping their own bones!",
@@ -26,20 +26,15 @@
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
var/silent_steps = 0 // Stops step noises
var/breath_type = "oxygen" // Non-oxygen gas breathed, if any.
var/poison_type = "plasma" // Poisonous air.
var/exhale_type = "carbon_dioxide" // Exhaled gas type.
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/cold_env_multiplier = 1 // Damage multiplier for being in a cold environment
var/coldmod = 1 // Damage multiplier for being in a cold environment
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 = 460 // Heat damage level 3 above this point; used for body temperature
var/hot_env_multiplier = 1 // Damage multiplier for being in a hot environment
var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
var/heatmod = 1 // Damage multiplier for being in a hot environment
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/reagent_tag //Used for metabolizing reagents.
@@ -56,19 +51,6 @@
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
var/list/atmos_requirements = list(
"min_oxy" = 16,
"max_oxy" = 0,
"min_nitro" = 0,
"max_nitro" = 0,
"min_tox" = 0,
"max_tox" = 0.005,
"min_co2" = 0,
"max_co2" = 10,
"sa_para" = 1,
"sa_sleep" = 5
)
var/brute_mod = 1 // Physical damage reduction/amplification
var/burn_mod = 1 // Burn damage reduction/amplification
var/tox_mod = 1 // Toxin damage reduction/amplification
@@ -94,6 +76,8 @@
var/list/species_traits = list()
var/breathid = "o2"
var/clothing_flags = 0 // Underwear and socks.
var/exotic_blood
var/bodyflags = 0
@@ -211,171 +195,9 @@
for(var/obj/item/organ/external/O in H.bodyparts)
O.owner = H
/datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/O2_used = 0
var/N2_used = 0
var/Tox_used = 0
var/CO2_used = 0
//Partial pressure of the O2 in our breath
var/O2_pp = (breath.oxygen/breath.total_moles()) * breath_pressure
// Partial pressure of Nitrogen
var/N2_pp = (breath.nitrogen/breath.total_moles()) * breath_pressure
// Partial pressure of plasma
var/Tox_pp = (breath.toxins/breath.total_moles()) * breath_pressure
// Partial pressure of CO2
var/CO2_pp = (breath.carbon_dioxide/breath.total_moles()) * breath_pressure
if(O2_pp < atmos_requirements["min_oxy"])
if(prob(20))
H.emote("gasp")
H.failed_last_breath = 1
if(O2_pp > 0)
var/ratio = atmos_requirements["min_oxy"] / O2_pp
H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
else
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
H.throw_alert("oxy", /obj/screen/alert/oxy)
else if(atmos_requirements["max_oxy"] && O2_pp > atmos_requirements["max_oxy"])
var/ratio = (breath.oxygen / atmos_requirements["max_oxy"]) * 1000
H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
H.throw_alert("oxy", /obj/screen/alert/too_much_oxy)
else
H.clear_alert("oxy")
if(atmos_requirements["min_oxy"]) //species breathes this gas, so, they got their air
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
O2_used = breath.oxygen / 6
if(N2_pp < atmos_requirements["min_nitro"])
if(prob(20))
H.emote("gasp")
H.failed_last_breath = 1
if(N2_pp > 0)
var/ratio = atmos_requirements["min_nitro"] / N2_pp
H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
else
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
H.throw_alert("nitro", /obj/screen/alert/nitro)
else if(atmos_requirements["max_nitro"] && N2_pp > atmos_requirements["max_nitro"])
var/ratio = (breath.nitrogen / atmos_requirements["max_nitro"]) * 1000
H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
H.throw_alert("nitro", /obj/screen/alert/too_much_nitro)
else
H.clear_alert("nitro")
if(atmos_requirements["min_nitro"]) //species breathes this gas, so they got their air
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
N2_used = breath.nitrogen / 6
if(Tox_pp < atmos_requirements["min_tox"])
if(prob(20))
H.emote("gasp")
H.failed_last_breath = 1
if(Tox_pp > 0)
var/ratio = atmos_requirements["min_tox"] / Tox_pp
H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
else
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
H.throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox)
else if(atmos_requirements["max_tox"] && Tox_pp > atmos_requirements["max_tox"])
var/ratio = (breath.toxins / atmos_requirements["max_tox"]) * 10
if(H.reagents)
H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
else
H.clear_alert("tox_in_air")
if(atmos_requirements["min_tox"]) //species breathes this gas, so, they got their air
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
Tox_used = breath.toxins / 6
if(CO2_pp < atmos_requirements["min_co2"])
if(prob(20))
H.emote("gasp")
H.failed_last_breath = 1
if(CO2_pp)
var/ratio = atmos_requirements["min_co2"] / CO2_pp
H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
else
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
H.throw_alert("co2", /obj/screen/alert/not_enough_co2)
else if(atmos_requirements["max_co2"] && CO2_pp > atmos_requirements["max_co2"])
if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
H.co2overloadtime = world.time
else if(world.time - H.co2overloadtime > 120)
H.Paralyse(5)
H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
H.adjustOxyLoss(8)
if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
H.emote("cough")
else
H.clear_alert("co2")
H.co2overloadtime = 0
if(atmos_requirements["min_co2"]) //species breathes this gas, so they got their air
H.failed_last_breath = 0
H.adjustOxyLoss(-5)
CO2_used = breath.carbon_dioxide / 6
breath.oxygen -= O2_used
breath.nitrogen -= N2_used
breath.toxins -= Tox_used
breath.carbon_dioxide -= CO2_used
breath.carbon_dioxide += O2_used
if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here.
for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
var/SA_pp = (SA.moles / breath.total_moles()) * breath_pressure
if(SA_pp > atmos_requirements["sa_para"]) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > atmos_requirements["sa_sleep"]) // Enough to make us sleep as well
// This value is large because breaths are taken only once every 4 life ticks.
H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
H.emote(pick("giggle", "laugh"))
handle_temperature(breath, H)
return 1
/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures
if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :(
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < cold_level_1)
if(prob(20))
to_chat(H, "<span class='warning'>You feel your face freezing and an icicle forming in your lungs!</span>")
else if(breath.temperature > heat_level_1)
if(prob(20))
to_chat(H, "<span class='warning'>You feel your face burning and a searing heat in your lungs!</span>")
switch(breath.temperature)
if(-INFINITY to cold_level_3)
H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
if(cold_level_3 to cold_level_2)
H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
if(cold_level_2 to cold_level_1)
H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
if(heat_level_1 to heat_level_2)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
/datum/species/proc/breathe(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
return TRUE
////////////////
// MOVE SPEED //
@@ -477,7 +299,9 @@
// For special snowflake species effects
// (Slime People changing color based on the reagents they consume)
/datum/species/proc/handle_life(var/mob/living/carbon/human/H)
return 1
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
H.setOxyLoss(0)
H.SetLoseBreath(0)
/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
return
@@ -741,7 +565,5 @@ It'll return null if the organ doesn't correspond, so include null checks when u
H.see_invisible = H.see_override
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
if(temperature >= 330)
M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature)
if(temperature <= 280)
M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
@@ -50,7 +50,6 @@
heat_level_1 = 380 //Default 360 - Higher is better
heat_level_2 = 420 //Default 400
heat_level_3 = 480 //Default 460
heat_level_3_breathe = 1100 //Default 1000
flesh_color = "#34AF10"
reagent_tag = PROCESS_ORG
@@ -106,7 +105,6 @@
heat_level_1 = 340
heat_level_2 = 380
heat_level_3 = 440
heat_level_3_breathe = 900
primitive_form = "Farwa"
@@ -276,24 +274,10 @@
cold_level_2 = 50
cold_level_3 = 0
atmos_requirements = list(
"min_oxy" = 0,
"max_oxy" = 1,
"min_nitro" = 16,
"max_nitro" = 0,
"min_tox" = 0,
"max_tox" = 0.005,
"min_co2" = 0,
"max_co2" = 10,
"sa_para" = 1,
"sa_sleep" = 5
)
breathid = "n2"
eyes = "vox_eyes_s"
breath_type = "nitrogen"
poison_type = "oxygen"
species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING)
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
@@ -326,7 +310,7 @@
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver/vox,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
@@ -368,7 +352,7 @@
H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand)
to_chat(H, "<span class='notice'>You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.</span>")
H.internal = H.l_hand
H.update_internals_hud_icon(1)
H.update_action_buttons_icon()
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
updatespeciescolor(H)
@@ -438,14 +422,11 @@
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
heat_level_3_breathe = 4000
brute_mod = 0.2
burn_mod = 0.2
eyes = "blank_eyes"
breath_type = "nitrogen"
poison_type = "oxygen"
species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
bodyflags = HAS_TAIL
@@ -461,7 +442,7 @@
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
@@ -538,7 +519,7 @@
cold_level_1 = 280
cold_level_2 = 240
cold_level_3 = 200
cold_env_multiplier = 3
coldmod = 3
oxy_mod = 0
brain_mod = 2.5
@@ -593,7 +574,7 @@
E.sync_colour_to_human(H)
H.update_hair(0)
H.update_body()
return ..()
..()
#undef SLIMEPERSON_COLOR_SHIFT_TRIGGER
#undef SLIMEPERSON_ICON_UPDATE_PERIOD
@@ -789,7 +770,6 @@
heat_level_1 = 300
heat_level_2 = 340
heat_level_3 = 400
heat_level_3_breathe = 700
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -877,6 +857,7 @@
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
..()
/datum/species/machine
name = "Machine"
@@ -1012,13 +993,12 @@
cold_level_1 = -1 //Default 260 - Lower is better
cold_level_2 = -1 //Default 200
cold_level_3 = -1 //Default 120
cold_env_multiplier = -1
coldmod = -1
heat_level_1 = 300 //Default 360 - Higher is better
heat_level_2 = 340 //Default 400
heat_level_3 = 400 //Default 460
heat_level_3_breathe = 600 //Default 1000
hot_env_multiplier = 2
heatmod = 2
flesh_color = "#a3d4eb"
reagent_tag = PROCESS_ORG
@@ -1032,40 +1012,4 @@
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
"eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight.
"brain" = /obj/item/organ/internal/brain/drask
)
/datum/species/drask/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H)
if( abs(310.15 - breath.temperature) > 50)
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260)
if(prob(20))
to_chat(H, "<span class='notice'> You feel an invigorating coldness in your lungs!</span>")
if(breath.temperature > heat_level_1)
if(prob(20))
to_chat(H, "<span class='warning'>You feel your face burning and a searing heat in your lungs!</span>")
switch(breath.temperature)
if(-INFINITY to 60)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3*0.5) //3 points healed, applied every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 3)
if(61 to 200)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2*0.5) //1.5 healed every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 2)
if(201 to 260)
H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1*0.5) //0.5 healed every 4 ticks
H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1)
H.throw_alert("temp", /obj/screen/alert/cold/drask, 1)
if(heat_level_1 to heat_level_2)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
)
@@ -539,7 +539,7 @@ var/global/list/damage_icon_parts = list()
if(LASER)
standing.overlays += "lasereyes_s"
add_image = 1
if((RESIST_COLD in mutations) && (RESIST_HEAT in mutations))
if((COLDRES in mutations) && (HEATRES in mutations))
standing.underlays -= "cold[fat]_s"
standing.underlays -= "fire[fat]_s"
standing.underlays += "coldfire[fat]_s"
+25 -26
View File
@@ -27,7 +27,7 @@
//Start of a breath chain, calls breathe()
/mob/living/carbon/handle_breathing()
if(mob_master.current_cycle%4==2 || failed_last_breath)
if(mob_master.current_cycle % 4 == 2 || failed_last_breath)
breathe() //Breathe per 4 ticks, unless suffocating
else
if(istype(loc, /obj/))
@@ -40,8 +40,6 @@
return
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
return
if(NO_BREATH in mutations)
return // No breath mutation means no breathing.
var/datum/gas_mixture/environment
if(loc)
@@ -52,6 +50,7 @@
if(health <= config.health_threshold_crit)
AdjustLoseBreath(1)
//Suffocate
if(losebreath > 0)
AdjustLoseBreath(-1)
if(prob(10))
@@ -75,7 +74,6 @@
breath_moles = environment.total_moles()*BREATH_PERCENTAGE
breath = loc.remove_air(breath_moles)
else //Breathe from loc as obj again
if(istype(loc, /obj/))
var/obj/loc_as_obj = loc
@@ -90,14 +88,18 @@
//Third link in a breath chain, calls handle_breath_temperature()
/mob/living/carbon/proc/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
return 0
return FALSE
var/lungs = get_organ_slot("lungs")
if(!lungs)
adjustOxyLoss(2)
//CRIT
if(!breath || (breath.total_moles() == 0))
if(!breath || (breath.total_moles() == 0) || !lungs)
adjustOxyLoss(1)
failed_last_breath = 1
throw_alert("oxy", /obj/screen/alert/oxy)
return 0
failed_last_breath = TRUE
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
return FALSE
var/safe_oxy_min = 16
var/safe_co2_max = 10
@@ -117,20 +119,20 @@
if(prob(20))
emote("gasp")
if(O2_partialpressure > 0)
var/ratio = safe_oxy_min/O2_partialpressure
var/ratio = 1 - O2_partialpressure/safe_oxy_min
adjustOxyLoss(min(5*ratio, 3))
failed_last_breath = 1
oxygen_used = breath.oxygen*ratio/6
failed_last_breath = TRUE
oxygen_used = breath.oxygen*ratio
else
adjustOxyLoss(3)
failed_last_breath = 1
throw_alert("oxy", /obj/screen/alert/oxy)
failed_last_breath = TRUE
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else //Enough oxygen
failed_last_breath = 0
failed_last_breath = FALSE
adjustOxyLoss(-5)
oxygen_used = breath.oxygen/6
clear_alert("oxy")
oxygen_used = breath.oxygen
clear_alert("not_enough_oxy")
breath.oxygen -= oxygen_used
breath.carbon_dioxide += oxygen_used
@@ -146,17 +148,17 @@
adjustOxyLoss(8)
if(prob(20))
emote("cough")
else
co2overloadtime = 0
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
var/ratio = (breath.toxins/safe_tox_max) * 10
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
adjustToxLoss(Clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
clear_alert("tox_in_air")
clear_alert("too_much_tox")
//TRACE GASES
if(breath.trace_gases.len)
@@ -173,7 +175,7 @@
//BREATH TEMPERATURE
handle_breath_temperature(breath)
return 1
return TRUE
//Fourth and final link in a breath chain
/mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath)
@@ -189,12 +191,9 @@
internal = null //turn off internals
if(internal)
update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed)
else
update_internals_hud_icon(0)
return
update_action_buttons_icon()
/mob/living/carbon/handle_diseases()
for(var/thing in viruses)
@@ -12,6 +12,9 @@
if(!ckey)
handle_speech_and_mood()
/mob/living/carbon/slime/breathe()
return
/mob/living/carbon/slime/proc/AIprocess() // the master AI process
if(AIproc || stat == DEAD || client) return
@@ -66,6 +66,10 @@
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
..()
/mob/living/carbon/slime/random/New()
colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black")
..()
/mob/living/carbon/slime/Destroy()
for(var/obj/machinery/computer/camera_advanced/xenobio/X in machines)
if(src in X.stored_slimes)
@@ -7,7 +7,7 @@
var/name
var/desc
var/class
var/list/default_genes = list(REGEN, NO_BREATH, RESIST_COLD)
var/list/default_genes = list(REGEN, BREATHLESS, COLDRES)
var/list/default_spells = list()
/datum/superheroes/proc/create(var/mob/living/carbon/human/H)
@@ -188,7 +188,7 @@
switch(progress)
if(1)
to_chat(user, "<span class='notice'>You begin by introducing yourself and explaining what you're about.</span>")
user.visible_message("<span class='danger'>[user]'s introduces himself and explains his plans.</span>")
user.visible_message("<span class='danger'>[user] introduces \himself and explains \his plans.</span>")
if(2)
to_chat(user, "<span class='notice'>You begin the recruitment of [target].</span>")
user.visible_message("<span class='danger'>[user] leans over towards [target], whispering excitedly as he gives a speech.</span>")
@@ -214,7 +214,7 @@
recruiting = 0
to_chat(user, "<span class='notice'>You have recruited <b>[target]</b> as your henchman!</span>")
to_chat(target, "<span class='deadsay'><b>You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.</b></span>")
to_chat(target, "<span class='deadsay'><b>You must follow the orders of [user], and help him succeed in his dastardly schemes.</span>")
to_chat(target, "<span class='deadsay'><b>You must follow the orders of [user], and help him succeed in \his dastardly schemes.</span>")
to_chat(target, "<span class='deadsay'>You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.</span>")
ticker.mode.greyshirts += target.mind
target.set_species("Human")
+6
View File
@@ -1,6 +1,9 @@
/mob/living/death(gibbed)
blinded = max(blinded, 1)
if(suiciding)
mind.suicided = TRUE
clear_fullscreens()
update_action_buttons_icon()
@@ -11,4 +14,7 @@
var/datum/soullink/S = s
S.sharerDies(gibbed, src)
med_hud_set_health()
med_hud_set_status()
..(gibbed)
+27 -3
View File
@@ -1,7 +1,30 @@
/mob/living/New()
. = ..()
var/datum/atom_hud/data/human/medical/advanced/medhud = huds[DATA_HUD_MEDICAL_ADVANCED]
medhud.add_to_hud(src)
/mob/living/prepare_huds()
..()
prepare_data_huds()
/mob/living/proc/prepare_data_huds()
..()
med_hud_set_health()
med_hud_set_status()
/mob/living/Destroy()
if(ranged_ability)
ranged_ability.remove_ranged_ability(src)
remove_from_all_data_huds()
if(LAZYLEN(status_effects))
for(var/s in status_effects)
var/datum/status_effect/S = s
if(S.on_remove_on_mob_delete) //the status effect calls on_remove when its mob is deleted
qdel(S)
else
S.be_replaced()
return ..()
/mob/living/ghostize(can_reenter_corpse = 1)
@@ -214,6 +237,7 @@
stat = CONSCIOUS
return
health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss()
med_hud_set_health()
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
@@ -896,13 +920,13 @@
// And animate the attack!
animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
/atom/movable/proc/receive_damage(atom/A)
/atom/movable/proc/receiving_damage(atom/A)
var/pixel_x_diff = rand(-3,3)
var/pixel_y_diff = rand(-3,3)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
/mob/living/receive_damage(atom/A)
/mob/living/receiving_damage(atom/A)
..()
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
@@ -1036,7 +1060,7 @@
return //no message spam
if(final_taste_list.len == 0)//too many reagents - none meet their thresholds
to_chat(src, "<span class='notice'>You you can't really make out what you're tasting...</span>")
to_chat(src, "<span class='notice'>You can't really make out what you're tasting...</span>")
return
to_chat(src, "<span class='notice'>You can taste [english_list(final_taste_list)].</span>")
@@ -43,6 +43,8 @@
var/list/icon/pipes_shown = list()
var/last_played_vent
var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
var/step_count = 0
var/list/butcher_results = null
@@ -62,3 +64,7 @@
var/list/recent_tastes = list()
var/blood_volume = 0 //how much blood the mob has
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/status_effects //a list of all status effects the mob has
+3 -2
View File
@@ -30,6 +30,7 @@ var/list/department_radio_keys = list(
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
":Z" = "Service", "#Z" = "Service", ".Z" = "Service",
":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private",
":$" = "Response Team", "#$" = "Response Team", ".$" = "Response Team",
":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops",
":_" = "SyndTeam", "#_" = "SyndTeam", "._" = "SyndTeam",
":X" = "cords", "#X" = "cords", ".X" = "cords"
@@ -163,10 +164,10 @@ proc/get_radio_key_from_channel(var/channel)
if(is_muzzled())
var/obj/item/clothing/mask/muzzle/G = wear_mask
if(G.mute) //if the mask is supposed to mute you completely or just muffle you
if(G.mute == MUTE_ALL) //if the mask is supposed to mute you completely or just muffle you
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
return
else
else if(G.mute == MUTE_MUFFLE)
message = muffledspeech(message)
verb = "mumbles"
@@ -360,7 +360,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
return 0
if(!player_old_enough_antag(O.client,ROLE_PAI))
return 0
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
if(cannotPossess(O))
return 0
if(!(O in respawnable_list))
return 0
@@ -1,3 +1,4 @@
#define EMAG_TIMER 3000
/mob/living/silicon/robot/drone
name = "drone"
real_name = "drone"
@@ -30,6 +31,7 @@
var/mail_destination = 0
var/reboot_cooldown = 60 // one minute
var/last_reboot
var/emagged_time
holder_type = /obj/item/weapon/holder/drone
// var/sprite[0]
@@ -180,14 +182,21 @@
return
to_chat(user, "<span class='warning'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>")
to_chat(src, "<span class='warning'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>")
if(jobban_isbanned(src, ROLE_SYNDICATE))
ticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE)
to_chat(src, "<span class='warning'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script. You sense you have five minutes before the drone server detects this and automatically shuts you down.</span>")
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] <B>:</B> [H.name]([H.key]) emagged [name]([key])")
emagged_time = world.time
emagged = 1
density = 1
pass_flags = 0
icon_state = "repairbot-emagged"
holder_type = /obj/item/weapon/holder/drone/emagged
update_icons()
@@ -196,11 +205,11 @@
clear_supplied_laws()
clear_inherent_laws()
laws = new /datum/ai_laws/syndicate_override
set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.")
set_zeroth_law("Only [H.real_name] and people [H.real_name] designates as being such are Syndicate Agents.")
to_chat(src, "<b>Obey these laws:</b>")
laws.show_laws(src)
to_chat(src, "<span class='boldwarning'>ALERT: [H.real_name] is your new master. Obey your new laws and his commands.</span>")
to_chat(src, "<span class='boldwarning'>ALERT: [H.real_name] is your new master. Obey your new laws and [H.real_name]'s commands.</span>")
return
//DRONE LIFE/DEATH
@@ -245,13 +254,16 @@
full_law_reset()
show_laws()
/mob/living/silicon/robot/drone/proc/shut_down()
if(stat != 2)
if(emagged)
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.</span>")
else
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.</span>")
death()
/mob/living/silicon/robot/drone/proc/shut_down(force=FALSE)
if(stat == 2)
return
if(emagged && !force)
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.</span>")
return
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.</span>")
death()
/mob/living/silicon/robot/drone/proc/full_law_reset()
clear_supplied_laws()
@@ -263,7 +275,7 @@
/mob/living/silicon/robot/drone/proc/request_player()
for(var/mob/dead/observer/O in player_list)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
if(cannotPossess(O))
continue
if(jobban_isbanned(O,"nonhumandept") || jobban_isbanned(O,"Drone"))
continue
@@ -347,6 +359,11 @@
/mob/living/silicon/robot/drone/update_canmove(delay_action_updates = 0)
. = ..()
if(emagged)
density = 1
if(world.time - emagged_time > EMAG_TIMER)
shut_down(TRUE)
return
density = 0 //this is reset every canmove update otherwise
/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
@@ -24,7 +24,6 @@
/obj/item/mounted/frame/firealarm,
/obj/item/mounted/frame/newscaster_frame,
/obj/item/mounted/frame/intercom,
/obj/item/weapon/table_parts,
/obj/item/weapon/rack_parts,
/obj/item/weapon/camera_assembly,
/obj/item/weapon/tank,
@@ -118,7 +118,7 @@
var/joinedasobserver = 0
if(istype(src,/mob/dead/observer))
var/mob/dead/observer/G = src
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
if(cannotPossess(G))
to_chat(usr, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
return
if(G.started_as_observer == 1)
+71 -19
View File
@@ -50,6 +50,12 @@ var/list/robot_verbs_default = list(
var/opened = 0
var/emagged = 0
var/list/force_modules = list()
var/allow_rename = TRUE
var/weapons_unlock = FALSE
var/static_radio_channels = FALSE
var/wiresexposed = 0
var/locked = 1
var/list/req_access = list(access_robotics)
@@ -59,7 +65,7 @@ var/list/robot_verbs_default = list(
var/viewalerts = 0
var/modtype = "Default"
var/lower_mod = 0
var/datum/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N
var/datum/effect_system/spark_spread/spark_system//So they can initialize sparks whenever/N
var/jeton = 0
var/low_power_mode = 0 //whether the robot has no charge left.
var/weapon_lock = 0
@@ -85,13 +91,13 @@ var/list/robot_verbs_default = list(
var/magpulse = 0
var/ionpulse = 0 // Jetpack-like effect.
var/ionpulse_on = 0 // Jetpack-like effect.
var/datum/effect/system/ion_trail_follow/ion_trail // Ionpulse effect.
var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect.
var/datum/action/item_action/toggle_research_scanner/scanner = null
var/list/module_actions = list()
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0)
spark_system = new /datum/effect/system/spark_spread()
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -215,7 +221,9 @@ var/list/robot_verbs_default = list(
set category = "Robot Commands"
if(custom_name)
return 0
if(!allow_rename)
to_chat(src, "<span class='warning'>Rename functionality is not enabled on this unit.</span>");
return 0
rename_self(braintype, 1)
/mob/living/silicon/robot/proc/sync()
@@ -266,11 +274,9 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service")
if(!config.forbid_secborg)
modules += "Security"
if(!config.forbid_peaceborg)
modules += "Peacekeeper"
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
if(islist(force_modules) && force_modules.len)
modules = force_modules.Copy()
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
to_chat(src, "<span class='warning'>Crisis mode active. Combat module available.</span>")
modules += "Combat"
@@ -344,11 +350,6 @@ var/list/robot_verbs_default = list(
module_sprites["Noble-SEC"] = "Noble-SEC"
status_flags &= ~CANPUSH
if("Peacekeeper")
module = new /obj/item/weapon/robot_module/peacekeeper(src)
module_sprites["Peacekeeper"] = "peace"
status_flags &= ~CANPUSH
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
module.channels = list("Engineering" = 1)
@@ -401,11 +402,12 @@ var/list/robot_verbs_default = list(
feedback_inc("cyborg_[lowertext(modtype)]",1)
rename_character(real_name, get_default_name())
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper" || modtype == "Nations")
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Nations")
status_flags &= ~CANPUSH
choose_icon(6,module_sprites)
radio.config(module.channels)
if(!static_radio_channels)
radio.config(module.channels)
notify_ai(2)
//for borg hotkeys, here module refers to borg inv slot, not core module
@@ -1012,7 +1014,7 @@ var/list/robot_verbs_default = list(
dat += text("<tr><td>[obj]</td><td><B>Activated</B></td></tr>")
else
dat += text("<tr><td>[obj]</td><td><A HREF=?src=[UID()];act=\ref[obj]>Activate</A></td></tr>")
if(emagged)
if(emagged || weapons_unlock)
if(activated(module.emag))
dat += text("<tr><td>[module.emag]</td><td><B>Activated</B></td></tr>")
else
@@ -1170,14 +1172,18 @@ var/list/robot_verbs_default = list(
if(module.type == /obj/item/weapon/robot_module/janitor)
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
var/floor_only = TRUE
if(istype(tile, /turf/simulated))
var/turf/simulated/S = tile
S.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
qdel(A)
var/obj/effect/decal/cleanable/blood/B = A
if(istype(B) && B.off_floor)
floor_only = FALSE
else
qdel(A)
else if(istype(A, /obj/item))
var/obj/item/cleaned_item = A
cleaned_item.clean_blood()
@@ -1198,6 +1204,8 @@ var/list/robot_verbs_default = list(
cleaned_human.update_inv_shoes(0,0)
cleaned_human.clean_blood()
to_chat(cleaned_human, "<span class='danger'>[src] cleans your face!</span>")
if(floor_only)
tile.clean_blood()
return
#undef BORG_CAMERA_BUFFER
@@ -1342,6 +1350,7 @@ var/list/robot_verbs_default = list(
designation = "Nanotrasen Combat"
req_access = list(access_cent_specops)
ionpulse = 1
magpulse = 1
var/searching_for_ckey = 0
/mob/living/silicon/robot/deathsquad/New(loc)
@@ -1391,6 +1400,7 @@ var/list/robot_verbs_default = list(
modtype = "Syndicate"
req_access = list(access_syndicate)
ionpulse = 1
magpulse = 1
lawchannel = "State"
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -1452,6 +1462,48 @@ var/list/robot_verbs_default = list(
radio.config(module.channels)
notify_ai(2)
/mob/living/silicon/robot/ert
designation = "ERT"
lawupdate = 0
scrambledcodes = 1
req_access = list(access_cent_specops)
ionpulse = 1
force_modules = list("Engineering", "Medical", "Security")
static_radio_channels = 1
allow_rename = FALSE
weapons_unlock = TRUE
/mob/living/silicon/robot/ert/init()
laws = new /datum/ai_laws/ert_override
radio = new /obj/item/device/radio/borg/ert(src)
radio.recalculateChannels()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
/mob/living/silicon/robot/ert/New(loc, cyborg_unlock)
..(loc)
cell.maxcharge = 25000
cell.charge = 25000
var/rnum = rand(1,1000)
var/borgname = "ERT [rnum]"
name = borgname
custom_name = borgname
real_name = name
mind = new
mind.current = src
mind.original = src
mind.assigned_role = "MODE"
mind.special_role = SPECIAL_ROLE_ERT
if(cyborg_unlock)
crisis = 1
if(!(mind in ticker.minds))
ticker.minds += mind
ticker.mode.ert += mind
/mob/living/silicon/robot/ert/gamma
crisis = 1
/mob/living/silicon/robot/nations
base_icon = "droidpeace"
icon_state = "droidpeace"
@@ -229,22 +229,6 @@
fix_modules()
/obj/item/weapon/robot_module/peacekeeper
name = "peacekeeping robot module"
module_type = "Standard"
/obj/item/weapon/robot_module/peacekeeper/New()
..()
modules += new /obj/item/weapon/cookiesynth(src)
modules += new /obj/item/device/harmalarm(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
modules += new /obj/item/taperoll/police(src)
modules += new /obj/item/borg/cyborghug/peacekeeper(src)
modules += new /obj/item/weapon/extinguisher(src)
emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
fix_modules()
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
module_type = "Janitor"
@@ -270,10 +254,27 @@
/obj/item/weapon/robot_module/butler/New()
..()
modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/cola(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater(src)
modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice(src) // -0.3 oxy/sec
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice(src) // -0.2 fire/sec
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice(src) // -0.2 tox/sec
modules += new /obj/item/weapon/reagent_containers/food/drinks/coffee(src) // -1 paralysis stunned & weakened/sec
modules += new /obj/item/weapon/reagent_containers/food/drinks/tea(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/milk(src) // -0.2 brute/sec
modules += new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/ice(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/cream(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/tequila(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src)
modules += new /obj/item/weapon/pen(src)
modules += new /obj/item/weapon/razor(src)
modules += new /obj/item/device/instrument/piano_synth(src)
modules += new /obj/item/device/healthanalyzer/advanced(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
@@ -501,8 +502,6 @@
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/weapon/rpd(src)
emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
+9 -3
View File
@@ -30,7 +30,7 @@
var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use
var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use
var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud
var/d_hud = DATA_HUD_DIAGNOSTIC_ADVANCED //There is only one kind of diag hud
var/obj/item/device/radio/common_radio
@@ -44,6 +44,12 @@
add_language("Galactic Common")
init_subsystems()
/mob/living/silicon/med_hud_set_health()
return //we use a different hud
/mob/living/silicon/med_hud_set_status()
return //we use a different hud
/mob/living/silicon/Destroy()
silicon_mob_list -= src
for(var/datum/alarm_handler/AH in alarm_handlers)
@@ -232,8 +238,8 @@
medsensor.add_hud_to(src)
/mob/living/silicon/proc/add_diag_hud()
var/datum/atom_hud/diagsensor = huds[d_hud]
diagsensor.add_hud_to(src)
for(var/datum/atom_hud/data/diagnostic/diagsensor in huds)
diagsensor.add_hud_to(src)
/mob/living/silicon/proc/toggle_sensor_mode()
+109 -21
View File
@@ -47,7 +47,7 @@
var/frustration = 0 //Used by some bots for tracking failures to reach their target.
var/base_speed = 2 //The speed at which the bot moves, or the number of times it moves per process() tick.
var/turf/ai_waypoint //The end point of a bot's path, or the target location.
var/list/path = list() //List of turfs through which a bot 'steps' to reach the waypoint.
var/list/path = list() //List of turfs through which a bot 'steps' to reach the waypoint, associated with the path image, if there is one.
var/pathset = 0
var/list/ignore_list = list() //List of unreachable targets for an ignore-list enabled bot to ignore.
var/mode = BOT_IDLE //Standardizes the vars that indicate the bot is busy with its function.
@@ -75,6 +75,7 @@
var/control_freq = BOT_FREQ // bot control frequency
var/bot_filter // The radio filter the bot uses to identify itself on the network.
var/bot_type = 0 //The type of bot it is, for radio control.
var/data_hud_type = DATA_HUD_DIAGNOSTIC //The type of data HUD the bot uses. Diagnostic by default.
//This holds text for what the bot is mode doing, reported on the remote bot control interface.
var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \
"Beginning Patrol", "Patrolling", "Summoned by PDA", \
@@ -82,7 +83,13 @@
"Responding", "Navigating to Delivery Location", "Navigating to Home", \
"Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination")
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD) //Diagnostic HUD views
var/datum/atom_hud/data/bot_path/path_hud = new /datum/atom_hud/data/bot_path()
var/path_image_icon = 'icons/obj/aibots.dmi'
var/path_image_icon_state = "path_indicator"
var/path_image_color = "#FFFFFF"
var/reset_access_timer_id
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_PATH_HUD = HUD_LIST_LIST)//Diagnostic HUD views
/obj/item/device/radio/headset/bot
subspace_transmission = 1
@@ -130,6 +137,7 @@
/mob/living/simple_animal/bot/New()
..()
bots_list += src
icon_living = icon_state
icon_dead = icon_state
access_card = new /obj/item/weapon/card/id(src)
@@ -151,14 +159,24 @@
radio_controller.add_object(bot_core, control_freq, bot_filter)
prepare_huds()
var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
for(var/datum/atom_hud/data/diagnostic/diag_hud in huds)
diag_hud.add_to_hud(src)
diag_hud.add_hud_to(src)
permanent_huds |= diag_hud
diag_hud_set_bothealth()
diag_hud_set_botstat()
diag_hud_set_botmode()
// give us the hud too!
diag_hud.add_hud_to(src)
permanent_huds |= diag_hud
if(path_hud)
path_hud.add_to_hud(src)
path_hud.add_hud_to(src)
/mob/living/simple_animal/bot/med_hud_set_health()
return //we use a different hud
/mob/living/simple_animal/bot/med_hud_set_status()
return //we use a different hud
/mob/living/simple_animal/bot/update_canmove(delay_action_updates = 0)
. = ..()
@@ -169,6 +187,10 @@
/mob/living/simple_animal/bot/Destroy()
if(paicard)
ejectpai()
if(path_hud)
QDEL_NULL(path_hud)
path_hud = null
bots_list -= src
QDEL_NULL(Radio)
QDEL_NULL(access_card)
if(radio_controller && bot_filter)
@@ -345,7 +367,7 @@
to_chat(user, "<span class='warning'>The welder must be on for this task!</span>")
else
if(W.force) //if force is non-zero
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
..()
@@ -353,7 +375,7 @@
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
if(prob(75) && Proj.damage > 0)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return ..()
@@ -367,8 +389,7 @@
pulse2.name = "emp sparks"
pulse2.anchored = 1
pulse2.dir = pick(cardinal)
spawn(10)
pulse2.delete()
QDEL_IN(pulse2, 10)
if(paicard)
paicard.emp_act(severity)
@@ -447,14 +468,14 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/bot_move(dest, move_speed)
if(!dest || !path || path.len == 0) //A-star failed or a path/destination was not set.
path = list()
set_path(null)
return 0
dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else.
var/turf/last_node = get_turf(path[path.len]) //This is the turf at the end of the path, it should be equal to dest.
if(get_turf(src) == dest) //We have arrived, no need to move again.
return 1
else if(dest != last_node) //The path should lead us to our given destination. If this is not true, we must stop.
path = list()
set_path(null)
return 0
var/step_count = move_speed ? move_speed : base_speed //If a value is passed into move_speed, use that instead of the default speed var.
@@ -473,14 +494,14 @@ Pass a positive integer as an argument to override a bot's default speed.
if(path.len > 1)
step_towards(src, path[1])
if(get_turf(src) == path[1]) //Successful move
path -= path[1]
increment_path()
tries = 0
else
tries++
return 0
else if(path.len == 1)
step_to(src, dest)
path = list()
set_path(null)
return 1
@@ -497,7 +518,7 @@ Pass a positive integer as an argument to override a bot's default speed.
var/datum/job/captain/All = new/datum/job/captain
all_access.access = All.get_access()
path = get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access)
set_path(get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access))
calling_ai = caller //Link the AI to the bot!
ai_waypoint = waypoint
@@ -505,6 +526,9 @@ Pass a positive integer as an argument to override a bot's default speed.
if(!on)
turn_on() //Saves the AI the hassle of having to activate a bot manually.
access_card = all_access //Give the bot all-access while under the AI's command.
if(client)
reset_access_timer_id = addtimer(src, "bot_reset", 600) //if the bot is player controlled, they get the extra access for a limited time
to_chat(src, "<span class='notice'><span class='big'>Priority waypoint set by [calling_ai] <b>[caller]</b>. Proceed to <b>[end_area.name]</b>.</span><br>[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.</span>")
if(message)
to_chat(calling_ai, "<span class='notice'>[bicon(src)] [name] called to [end_area.name]. [path.len-1] meters to destination.</span>")
pathset = 1
@@ -514,7 +538,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(message)
to_chat(calling_ai, "<span class='danger'>Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.</span>")
calling_ai = null
path = list()
set_path(null)
/mob/living/simple_animal/bot/proc/call_mode() //Handles preparing a bot for a call, as well as calling the move proc.
//Handles the bot's movement during a call.
@@ -529,7 +553,10 @@ Pass a positive integer as an argument to override a bot's default speed.
if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot.
to_chat(calling_ai, "<span class='danger'>Call command to a bot has been reset.</span>")
calling_ai = null
path = list()
if(reset_access_timer_id)
deltimer(reset_access_timer_id)
reset_access_timer_id = null
set_path(null)
summon_target = null
pathset = 0
access_card.access = prev_access
@@ -594,7 +621,7 @@ Pass a positive integer as an argument to override a bot's default speed.
else if(path.len > 0 && patrol_target) // valid path
var/turf/next = path[1]
if(next == loc)
path -= next
increment_path()
return
@@ -750,12 +777,12 @@ Pass a positive integer as an argument to override a bot's default speed.
// given an optional turf to avoid
/mob/living/simple_animal/bot/proc/calc_path(turf/avoid)
check_bot_access()
path = get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid)
set_path(get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid))
/mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid)
check_bot_access()
spawn()
path = get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid)
set_path(get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid))
if(!path.len) //Cannot reach target. Give up and announce the issue.
speak("Summon command failed, destination unreachable.",radio_channel)
bot_reset()
@@ -772,7 +799,7 @@ Pass a positive integer as an argument to override a bot's default speed.
else if(path.len > 0 && summon_target) //Proper path acquired!
var/turf/next = path[1]
if(next == loc)
path -= next
increment_path()
return
var/moved = bot_move(summon_target, 3) // Move attempt
@@ -1016,3 +1043,64 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/is_mechanical()
return 1
/mob/living/simple_animal/bot/proc/set_path(list/newpath)
path = newpath ? newpath : list()
if(!path_hud)
return
var/list/path_huds_watching_me = list(huds[DATA_HUD_DIAGNOSTIC_ADVANCED])
if(path_hud)
path_huds_watching_me += path_hud
for(var/V in path_huds_watching_me)
var/datum/atom_hud/H = V
H.remove_from_hud(src)
var/list/path_images = hud_list[DIAG_PATH_HUD]
QDEL_LIST(path_images)
if(newpath)
for(var/i in 1 to newpath.len)
var/turf/T = newpath[i]
var/direction = NORTH
if(i > 1)
var/turf/prevT = path[i - 1]
var/image/prevI = path[prevT]
direction = get_dir(prevT, T)
if(i > 2)
var/turf/prevprevT = path[i - 2]
var/prevDir = get_dir(prevprevT, prevT)
var/mixDir = direction|prevDir
if(mixDir in diagonals)
prevI.dir = mixDir
if(prevDir & (NORTH|SOUTH))
var/matrix/ntransform = matrix()
ntransform.Turn(90)
if((mixDir == NORTHWEST) || (mixDir == SOUTHEAST))
ntransform.Scale(-1, 1)
else
ntransform.Scale(1, -1)
prevI.transform = ntransform
var/mutable_appearance/MA = new /mutable_appearance()
MA.icon = path_image_icon
MA.icon_state = path_image_icon_state
MA.layer = ABOVE_OPEN_TURF_LAYER
MA.plane = 0
MA.appearance_flags = RESET_COLOR|RESET_TRANSFORM
MA.color = path_image_color
MA.dir = direction
var/image/I = image(loc = T)
I.appearance = MA
path[T] = I
path_images += I
for(var/V in path_huds_watching_me)
var/datum/atom_hud/H = V
H.add_to_hud(src)
/mob/living/simple_animal/bot/proc/increment_path()
if(!path || !path.len)
return
var/image/I = path[path[1]]
if(I)
I.icon = null
path.Cut(1, 2)
@@ -17,6 +17,8 @@
window_id = "autoclean"
window_name = "Automatic Station Cleaner v1.1"
pass_flags = PASSMOB
path_image_color = "#993299"
var/blood = 1
var/list/target_types = list()
@@ -98,7 +100,7 @@
if(prob(5)) //Spawns foam!
visible_message("<span class='danger'>[src] whirs and bubbles violently, before releasing a plume of froth!</span>")
new /obj/structure/foam(loc)
new /obj/effect/particle_effect/foam(loc)
else if(prob(5))
audible_message("[src] makes an excited beeping booping sound!")
@@ -184,7 +186,7 @@
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
@@ -20,6 +20,8 @@
bot_core = /obj/machinery/bot_core/secbot
window_id = "autoed209"
window_name = "Automatic Security Unit v2.6"
path_image_color = "#FF0000"
data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/lastfired = 0
var/shot_delay = 3 //.3 seconds between shots
@@ -393,7 +395,7 @@ Auto Patrol[]"},
if(lasercolor == "r")
new /obj/item/clothing/suit/redtag(Tsec)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -17,6 +17,7 @@
bot_core = /obj/machinery/bot_core/floorbot
window_id = "autofloor"
window_name = "Automatic Station Floor Repairer v1.1"
path_image_color = "#FFA500"
var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details.
var/targetdirection
@@ -406,7 +407,7 @@
T.amount = amount
amount = 0
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
@@ -19,6 +19,8 @@
bot_core_type = /obj/machinery/bot_core/medbot
window_id = "automed"
window_name = "Automatic Medical Unit v1.1"
path_image_color = "#DDDDFF"
data_hud_type = DATA_HUD_MEDICAL_ADVANCED
var/obj/item/weapon/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
@@ -569,7 +571,7 @@
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
@@ -26,6 +26,8 @@
model = "MULE"
bot_purpose = "deliver crates and other packages between departments, as requested"
bot_core_type = /obj/machinery/bot_core/mulebot
path_image_color = "#7F5200"
suffix = ""
@@ -502,7 +504,7 @@
var/turf/next = path[1]
reached_target = 0
if(next == loc)
path -= next
increment_path()
return
if(istype(next, /turf/simulated))
// to_chat(world, "at ([x],[y]) moving to ([next.x],[next.y])")
@@ -513,7 +515,7 @@
if(moved && oldloc!=loc) // successful move
// to_chat(world, "Successful move.")
blockcount = 0
path -= loc
increment_path()
if(destination == home_destination)
mode = BOT_GO_HOME
@@ -570,7 +572,7 @@
// given an optional turf to avoid
/mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null)
check_bot_access()
path = get_path_to(src, target, /turf/proc/Distance_cardinal, 0, 250, id=access_card, exclude=avoid)
set_path(get_path_to(src, target, /turf/proc/Distance_cardinal, 0, 250, id=access_card, exclude=avoid))
// sets the current destination
// signals all beacons matching the delivery code
@@ -834,7 +836,7 @@
cell.update_icon()
cell = null
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -18,6 +18,8 @@
bot_core_type = /obj/machinery/bot_core/secbot
window_id = "autosec"
window_name = "Automatic Security Unit v1.6"
path_image_color = "#FF0000"
data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/base_icon = "secbot"
var/mob/living/carbon/target
@@ -437,7 +439,7 @@ Auto Patrol: []"},
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -67,7 +67,7 @@
if(health < maxHealth)
adjustBruteLoss(-5)
if(src != M)
Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
Beam(M,icon_state="sendbeam",time=4)
M.visible_message("<span class='danger'>[M] repairs some of \the <b>[src]'s</b> dents.</span>", \
"<span class='cult'>You repair some of <b>[src]'s</b> dents, leaving <b>[src]</b> at <b>[health]/[maxHealth]</b> health.</span>")
else
@@ -169,7 +169,7 @@
icon_dead = "Syndicat_dead"
icon_resting = "Syndicat_rest"
gender = FEMALE
flags = NO_BREATHE
mutations = list(BREATHLESS)
faction = list("syndicate")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
eats_mice = 0
@@ -123,7 +123,7 @@
emote_see = list("shakes its head", "shivers")
desc = "It's a corgi."
set_light(0)
flags &= ~NO_BREATHE
mutations.Remove(BREATHLESS)
atmos_requirements = default_atmos_requirements
minbodytemp = initial(minbodytemp)
inventory_head.loc = src.loc
@@ -365,7 +365,7 @@
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
flags |= NO_BREATHE
mutations.Add(BREATHLESS)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -466,10 +466,7 @@
if(prob(1))
custom_emote(1, pick("dances around.","chases its tail!"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
sleep(1)
spin(20, 1)
/obj/item/weapon/reagent_containers/food/snacks/meat/corgi
name = "Corgi meat"
@@ -554,10 +551,7 @@
if(!resting && !buckled)
if(prob(1))
custom_emote(1, pick("dances around.","chases her tail."))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
sleep(1)
spin(20, 1)
/mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M)
. = ..()
@@ -569,7 +563,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the corgi) is dead to fix issue 2454
flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",MOB_LAYER+1), list(M.client), 20)
new /obj/effect/temp_visual/heart(loc)
custom_emote(1, "yaps happily!")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
@@ -627,12 +621,12 @@
//spark for no reason
if(prob(5))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
/mob/living/simple_animal/pet/corgi/Ian/borgi/death(gibbed)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
@@ -6,6 +6,4 @@
for(var/mob/O in oviewers(src, null))
if((O.client && !( O.blinded )))
to_chat(O, text("[] [pick("dances around","chases its tail")].", src))
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
sleep(1)
spin(20, 1)
@@ -33,7 +33,7 @@
icon_living = "Syndifox"
icon_dead = "Syndifox_dead"
icon_resting = "Syndifox_rest"
flags = NO_BREATHE
mutations = list(BREATHLESS)
faction = list("syndicate")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
@@ -0,0 +1,61 @@
//Penguins
/mob/living/simple_animal/pet/penguin
name = "penguin"
real_name = "penguin"
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!")
speak_emote = list("squawks", "gakkers")
emote_hear = list("squawk!", "gakkers!", "noots.","NOOTS!")
emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.")
faction = list("penguin")
see_in_dark = 5
speak_chance = 1
turns_per_move = 10
icon = 'icons/mob/penguins.dmi'
/mob/living/simple_animal/pet/penguin/emperor
name = "Emperor penguin"
real_name = "penguin"
desc = "Emperor of all he surveys."
icon_state = "penguin"
icon_living = "penguin"
icon_dead = "penguin_dead"
butcher_results = list()
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/pet/penguin/eldrich
name = "Albino penguin"
real_name = "penguin"
desc = "Found in the depths of mountains."
response_help = "taps"
response_disarm = "pokes"
response_harm = "flails at"
icon_state = "penguin_elder"
icon_living = "penguin_elder"
icon_dead = "penguin_dead"
speak = list("Gah Gah!", "Tekeli-li! Tekeli-li!", "Tekeli-li!", "Teke", "li")
speak_emote = list("gibbers", "gakkers")
emote_hear = list("whistles!", "gakkers!")
emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.")
faction = list("penguin", "cult")
/mob/living/simple_animal/pet/penguin/emperor/shamebrero
name = "Shamebrero penguin"
desc = "Shameful of all he surveys."
icon_state = "penguin_shamebrero"
icon_living = "penguin_shamebrero"
/mob/living/simple_animal/pet/penguin/baby
speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!")
name = "Penguin chick"
real_name = "penguin"
desc = "Can't fly and can barely waddles, but the prince of all chicks."
icon_state = "penguin_baby"
icon_living = "penguin_baby"
icon_dead = "penguin_baby_dead"
density = FALSE
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
@@ -23,6 +23,8 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
heat_damage_per_tick = 20
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
faction = list("alien")
status_flags = CANPUSH
minbodytemp = 0
@@ -0,0 +1,49 @@
/mob/living/simple_animal/hostile/deathsquid
name = "death squid"
desc = "A large, floating eldritch horror. Its body glows with an evil red light, and its tentacles look to have been dipped in alien blood."
speed = 1
speak_emote = list("telepathically thunders", "telepathically booms")
maxHealth = 2500 // same as megafauna
health = 2500
icon = 'icons/mob/deathsquid_large.dmi' // Credit: FullofSkittles
icon_state = "deathsquid"
icon_living = "deathsquid"
icon_dead = "deathsquiddead"
attacktext = "slices"
attack_sound = 'sound/weapons/bladeslice.ogg'
armour_penetration = 25
melee_damage_lower = 10
melee_damage_upper = 100
environment_smash = 3
force_threshold = 15
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
heat_damage_per_tick = 0
see_in_dark = 8
mob_size = MOB_SIZE_LARGE
ventcrawler = 0
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(var/movement_dir = 0)
return 1 //copypasta from carp code
/mob/living/simple_animal/hostile/deathsquid/ex_act(severity)
return
/mob/living/simple_animal/hostile/deathsquid/joke
name = "deaf squid"
desc = "An elderly, hard-of-hearing eldrich horror."
maxHealth = 200
health = 200
speed = 3
armour_penetration = 5
melee_damage_lower = 10
melee_damage_upper = 20
environment_smash = 2
@@ -237,7 +237,7 @@
E = locate() in get_turf(src)
if(!E)
var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc)
C.faction = faction
C.faction = faction.Copy()
C.master_commander = master_commander
if(ckey)
C.player_spiders = 1
@@ -48,7 +48,7 @@
ranged = 1
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
@@ -75,7 +75,7 @@
/mob/living/simple_animal/hostile/hivebot/tele/New()
..()
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(5, 0, src.loc)
smoke.start()
visible_message("<span class='danger'>The [src] warps in!</span>")
@@ -131,7 +131,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
if(charging)
new /obj/effect/overlay/temp/decoy/fading(loc, src)
new /obj/effect/temp_visual/decoy/fading(loc, src)
DestroySurroundings()
. = ..()
if(!stat && .)
@@ -152,12 +152,12 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!T || T == loc)
return
new /obj/effect/overlay/temp/dragon_swoop(T)
new /obj/effect/temp_visual/dragon_swoop(T)
charging = 1
DestroySurroundings()
walk(src, 0)
dir = get_dir(src, T)
var/obj/effect/overlay/temp/decoy/D = new /obj/effect/overlay/temp/decoy(loc, src)
var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc, src)
animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5)
sleep(5)
throw_at(T, get_dist(src, T), 1, src, 0)
@@ -242,9 +242,9 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
if(handedness)
new /obj/effect/overlay/temp/bubblegum_hands/rightsmack(T)
new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T)
else
new /obj/effect/overlay/temp/bubblegum_hands/leftsmack(T)
new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T)
sleep(2.5)
for(var/mob/living/L in T)
if(!faction_check(L))
@@ -256,11 +256,11 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
if(handedness)
new /obj/effect/overlay/temp/bubblegum_hands/rightpaw(T)
new /obj/effect/overlay/temp/bubblegum_hands/rightthumb(T)
new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T)
new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T)
else
new /obj/effect/overlay/temp/bubblegum_hands/leftpaw(T)
new /obj/effect/overlay/temp/bubblegum_hands/leftthumb(T)
new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T)
new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T)
sleep(6)
for(var/mob/living/L in T)
if(!faction_check(L))
@@ -274,28 +274,28 @@ Difficulty: Hard
devour(L)
sleep(1)
/obj/effect/overlay/temp/bubblegum_hands
/obj/effect/temp_visual/bubblegum_hands
icon = 'icons/effects/bubblegum.dmi'
duration = 9
/obj/effect/overlay/temp/bubblegum_hands/rightthumb
/obj/effect/temp_visual/bubblegum_hands/rightthumb
icon_state = "rightthumbgrab"
/obj/effect/overlay/temp/bubblegum_hands/leftthumb
/obj/effect/temp_visual/bubblegum_hands/leftthumb
icon_state = "leftthumbgrab"
/obj/effect/overlay/temp/bubblegum_hands/rightpaw
/obj/effect/temp_visual/bubblegum_hands/rightpaw
icon_state = "rightpawgrab"
layer = MOB_LAYER - 0.1
/obj/effect/overlay/temp/bubblegum_hands/leftpaw
/obj/effect/temp_visual/bubblegum_hands/leftpaw
icon_state = "leftpawgrab"
layer = MOB_LAYER - 0.1
/obj/effect/overlay/temp/bubblegum_hands/rightsmack
/obj/effect/temp_visual/bubblegum_hands/rightsmack
icon_state = "rightsmack"
/obj/effect/overlay/temp/bubblegum_hands/leftsmack
/obj/effect/temp_visual/bubblegum_hands/leftsmack
icon_state = "leftsmack"
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
@@ -311,7 +311,7 @@ Difficulty: Hard
if(!pools.len)
return FALSE
var/obj/effect/overlay/temp/decoy/DA = new /obj/effect/overlay/temp/decoy(loc, src)
var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc, src)
DA.color = "#FF0000"
var/oldtransform = DA.transform
DA.transform = matrix()*2
@@ -353,7 +353,7 @@ Difficulty: Hard
new /obj/effect/decal/cleanable/blood/bubblegum(J)
for(var/i in 1 to range)
J = get_step(previousturf, targetdir)
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1)
if(!J || !previousturf.CanAtmosPass(J))
break
@@ -97,7 +97,7 @@ Difficulty: Very Hard
..()
internal_gps = new/obj/item/device/gps/internal/colossus(src)
/obj/effect/overlay/temp/at_shield
/obj/effect/temp_visual/at_shield
name = "anti-toolbox field"
desc = "A shimmering forcefield protecting the colossus."
icon = 'icons/effects/effects.dmi'
@@ -107,7 +107,7 @@ Difficulty: Very Hard
duration = 8
var/target
/obj/effect/overlay/temp/at_shield/New(new_loc, new_target)
/obj/effect/temp_visual/at_shield/New(new_loc, new_target)
..()
target = new_target
spawn(0)
@@ -115,7 +115,7 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
if(!stat)
var/obj/effect/overlay/temp/at_shield/AT = new /obj/effect/overlay/temp/at_shield(loc, src)
var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(loc, src)
var/random_x = rand(-32, 32)
AT.pixel_x += random_x
@@ -86,7 +86,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
return 1
/obj/effect/overlay/temp/fireball
/obj/effect/temp_visual/fireball
icon = 'icons/obj/wizard.dmi'
icon_state = "fireball"
name = "fireball"
@@ -96,18 +96,18 @@ Difficulty: Medium
duration = 12
pixel_z = 500
/obj/effect/overlay/temp/fireball/New(loc)
/obj/effect/temp_visual/fireball/New(loc)
..()
animate(src, pixel_z = 0, time = 12)
/obj/effect/overlay/temp/target
/obj/effect/temp_visual/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
layer = MOB_LAYER - 0.1
luminosity = 2
duration = 12
/obj/effect/overlay/temp/dragon_swoop
/obj/effect/temp_visual/dragon_swoop
name = "certain death"
desc = "Don't just stand there, move!"
icon = 'icons/effects/96x96.dmi'
@@ -118,18 +118,18 @@ Difficulty: Medium
color = "#FF0000"
duration = 10
/obj/effect/overlay/temp/target/ex_act()
/obj/effect/temp_visual/target/ex_act()
return
/obj/effect/overlay/temp/target/New(loc)
/obj/effect/temp_visual/target/New(loc)
..()
spawn(0)
fall()
/obj/effect/overlay/temp/target/proc/fall()
/obj/effect/temp_visual/target/proc/fall()
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Fireball.ogg', 200, 1)
new /obj/effect/overlay/temp/fireball(T)
new /obj/effect/temp_visual/fireball(T)
sleep(12)
explosion(T, 0, 0, 1, 0, 0, 0, 1)
@@ -161,7 +161,7 @@ Difficulty: Medium
visible_message("<span class='boldwarning'>Fire rains from the sky!</span>")
for(var/turf/turf in range(12,get_turf(src)))
if(prob(10))
new /obj/effect/overlay/temp/target(turf)
new /obj/effect/temp_visual/target(turf)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
@@ -223,7 +223,7 @@ Difficulty: Medium
else
tturf = get_turf(src)
forceMove(tturf)
new /obj/effect/overlay/temp/dragon_swoop(tturf)
new /obj/effect/temp_visual/dragon_swoop(tturf)
animate(src, pixel_x = initial(pixel_x), pixel_z = 0, time = 10)
sleep(10)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
@@ -242,7 +242,7 @@ Difficulty: Hard
pickedtarget = pick_n_take(targets)
if(pickedtarget.stat == DEAD)
pickedtarget = target
var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
C.moving = 3
C.moving_dir = pick_n_take(cardinal_copy)
sleep(10)
@@ -277,10 +277,10 @@ Difficulty: Hard
spawn(0)
diagonal_blasts(target)
else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some!
var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
chaser_cooldown = world.time + initial(chaser_cooldown)
if((prob(anger_modifier) || target.Adjacent(src)) && target != src)
var/obj/effect/overlay/temp/hierophant/chaser/OC = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
OC.moving = 4
OC.moving_dir = pick(cardinal - C.moving_dir)
else //just release a burst of power
@@ -291,11 +291,11 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph/diagonal(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/diagonal(T, src)
playsound(T,'sound/magic/blink.ogg', 200, 1)
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in diagonals)
spawn(0)
blast_wall(T, d)
@@ -304,11 +304,11 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, src)
playsound(T,'sound/magic/blink.ogg', 200, 1)
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in cardinal)
spawn(0)
blast_wall(T, d)
@@ -317,11 +317,11 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/magic/blink.ogg', 200, 1)
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in alldirs)
spawn(0)
blast_wall(T, d)
@@ -331,7 +331,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, dir)
for(var/i in 1 to range)
new /obj/effect/overlay/temp/hierophant/blast(J, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(J, src, FALSE)
previousturf = J
J = get_step(previousturf, dir)
@@ -340,21 +340,21 @@ Difficulty: Hard
return
var/turf/T = get_turf(victim)
var/turf/source = get_turf(src)
new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
new /obj/effect/overlay/temp/hierophant/telegraph(source, src)
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(source, src)
playsound(T,'sound/magic/blink.ogg', 200, 1)
//playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/magic/blink.ogg', 200, 1)
//playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
blinking = TRUE
sleep(2) //short delay before we start...
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, src)
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, src)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src)
for(var/t in RANGE_TURFS(1, T))
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
sleep(1)
@@ -376,12 +376,12 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/magic/blink.ogg', 200, 1)
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts
playsound(original,'sound/magic/blink.ogg', 200, 1)
@@ -395,7 +395,7 @@ Difficulty: Hard
if(dist > last_dist)
last_dist = dist
sleep(1 + (burst_range - last_dist) * 0.5) //gets faster as it gets further out
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
if(!istype(A) || get_dist(A, src) <= 2)
@@ -403,16 +403,16 @@ Difficulty: Hard
blink(A)
//Hierophant overlays
/obj/effect/overlay/temp/hierophant
/obj/effect/temp_visual/hierophant
layer = MOB_LAYER - 0.1
var/mob/living/caster //who made this, anyway
/obj/effect/overlay/temp/hierophant/New(loc, new_caster)
/obj/effect/temp_visual/hierophant/New(loc, new_caster)
..()
if(new_caster)
caster = new_caster
/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
/obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
duration = 98
var/mob/living/target //what it's following
var/turf/targetturf //what turf the target is actually on
@@ -426,7 +426,7 @@ Difficulty: Hard
var/currently_seeking = FALSE
var/friendly_fire_check = FALSE //if blasts produced apply friendly fire
/obj/effect/overlay/temp/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire)
/obj/effect/temp_visual/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire)
..()
target = new_target
friendly_fire_check = is_friendly_fire
@@ -435,14 +435,14 @@ Difficulty: Hard
spawn(0)
seek_target()
/obj/effect/overlay/temp/hierophant/chaser/proc/get_target_dir()
/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir()
. = get_cardinal_dir(src, targetturf)
if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate
var/list/cardinal_copy = cardinal.Copy()
cardinal_copy -= more_previouser_moving_dir
. = pick(cardinal_copy)
/obj/effect/overlay/temp/hierophant/chaser/proc/seek_target()
/obj/effect/temp_visual/hierophant/chaser/proc/seek_target()
if(!currently_seeking)
currently_seeking = TRUE
targetturf = get_turf(target)
@@ -470,27 +470,27 @@ Difficulty: Hard
sleep(speed)
targetturf = get_turf(target)
/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast()
new /obj/effect/overlay/temp/hierophant/blast(loc, caster, friendly_fire_check)
/obj/effect/temp_visual/hierophant/chaser/proc/make_blast()
new /obj/effect/temp_visual/hierophant/blast(loc, caster, friendly_fire_check)
/obj/effect/overlay/temp/hierophant/telegraph
/obj/effect/temp_visual/hierophant/telegraph
icon = 'icons/effects/96x96.dmi'
icon_state = "hierophant_telegraph"
pixel_x = -32
pixel_y = -32
duration = 3
/obj/effect/overlay/temp/hierophant/telegraph/diagonal
/obj/effect/temp_visual/hierophant/telegraph/diagonal
icon_state = "hierophant_telegraph_diagonal"
/obj/effect/overlay/temp/hierophant/telegraph/cardinal
/obj/effect/temp_visual/hierophant/telegraph/cardinal
icon_state = "hierophant_telegraph_cardinal"
/obj/effect/overlay/temp/hierophant/telegraph/teleport
/obj/effect/temp_visual/hierophant/telegraph/teleport
icon_state = "hierophant_telegraph_teleport"
duration = 9
/obj/effect/overlay/temp/hierophant/blast
/obj/effect/temp_visual/hierophant/blast
icon = 'icons/effects/effects.dmi'
icon_state = "hierophant_blast"
name = "vortex blast"
@@ -502,7 +502,7 @@ Difficulty: Hard
var/friendly_fire_check = FALSE
var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
/obj/effect/overlay/temp/hierophant/blast/New(loc, new_caster, friendly_fire)
/obj/effect/temp_visual/hierophant/blast/New(loc, new_caster, friendly_fire)
..()
friendly_fire_check = friendly_fire
if(new_caster)
@@ -513,7 +513,7 @@ Difficulty: Hard
spawn(0)
blast()
/obj/effect/overlay/temp/hierophant/blast/proc/blast()
/obj/effect/temp_visual/hierophant/blast/proc/blast()
var/turf/T = get_turf(src)
if(!T)
return
@@ -524,12 +524,12 @@ Difficulty: Hard
sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds
bursting = FALSE //we no longer damage crossers
/obj/effect/overlay/temp/hierophant/blast/Crossed(atom/movable/AM)
/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM)
..()
if(bursting)
do_damage(get_turf(src))
/obj/effect/overlay/temp/hierophant/blast/proc/do_damage(turf/T)
/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T)
for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
hit_things += L
if((friendly_fire_check && caster && caster.faction_check(L)) || L.stat == DEAD)
@@ -570,7 +570,7 @@ Difficulty: Hard
H.timer = world.time + 51
if(do_after(user, 50, target = src))
playsound(src,'sound/magic/Blind.ogg', 200, 1, -4)
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(get_turf(src), user)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user)
to_chat(user, "<span class='hierophant_warning'>You touch the rune with the staff, dispelling it!</span>")
H.rune = null
user.update_action_buttons_icon()
@@ -22,7 +22,7 @@
speed = 8
projectiletype = /obj/item/projectile/beam/drone
projectilesound = 'sound/weapons/laser3.ogg'
var/datum/effect/system/ion_trail_follow/ion_trail
var/datum/effect_system/trail_follow/ion/ion_trail
//the drone randomly switches between these states because it's malfunctioning
var/hostile_drone = 0
@@ -80,14 +80,14 @@
//repair a bit of damage
if(prob(1))
src.visible_message("<span class='warning'>[bicon(src)] [src] shudders and shakes as some of it's damaged systems come back online.</span>")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
health += rand(25,100)
//spark for no reason
if(prob(5))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -129,7 +129,7 @@
src.visible_message("<span class='warning'>[bicon(src)] [src] begins to spark and shake violenty!</span>")
else
src.visible_message("<span class='warning'>[bicon(src)] [src] sparks and shakes like it's about to explode!</span>")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -154,7 +154,7 @@
/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell.
//some random debris left behind
if(has_loot)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
var/obj/O
@@ -16,7 +16,7 @@
humanize_prompt += " Role: [spider_role_summary]"
if(user.ckey in ts_ckey_blacklist)
error_on_humanize = "You are not able to control any terror spider this round."
else if(user.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
else if(cannotPossess(user))
error_on_humanize = "You have enabled antag HUD and are unable to re-enter the round."
else if(spider_awaymission)
error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts."
@@ -38,6 +38,8 @@ var/global/list/ts_spiderling_list = list()
// Movement
move_to_delay = 6
turns_per_move = 5
pressure_resistance = 50 //50 kPa difference required to push
throw_pressure_limit = 100 //100 kPa difference required to throw
pass_flags = PASSTABLE
// Ventcrawling
@@ -11,9 +11,6 @@
var/icon_resting = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
var/oxygen_alert = 0
var/toxins_alert = 0
var/fire_alert = 0
var/healable = 1
var/list/speak = list()
@@ -70,7 +67,7 @@
var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood
var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
var/mob/living/carbon/human/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
var/mob/living/simple_animal/hostile/spawner/nest
@@ -109,19 +106,8 @@
/mob/living/simple_animal/updatehealth()
..()
health = Clamp(health, 0, maxHealth)
med_hud_set_status()
/mob/living/simple_animal/handle_hud_icons_health()
..()
if(healths && maxHealth > 0)
switch(health / maxHealth * 30)
if(30 to INFINITY) healths.icon_state = "health0"
if(26 to 29) healths.icon_state = "health1"
if(21 to 25) healths.icon_state = "health2"
if(16 to 20) healths.icon_state = "health3"
if(11 to 15) healths.icon_state = "health4"
if(6 to 10) healths.icon_state = "health5"
if(1 to 5) healths.icon_state = "health6"
if(0) healths.icon_state = "health7"
/mob/living/simple_animal/proc/process_ai()
handle_automated_movement()
@@ -201,7 +187,7 @@
var/areatemp = get_temperature(environment)
if(abs(areatemp - bodytemperature) > 40 && !(flags & NO_BREATHE))
if(abs(areatemp - bodytemperature) > 40 && !(BREATHLESS in mutations))
var/diff = areatemp - bodytemperature
diff = diff / 5
bodytemperature += diff
@@ -213,21 +199,23 @@
if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"])
atmos_suitable = 0
throw_alert("oxy", /obj/screen/alert/oxy)
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"])
atmos_suitable = 0
throw_alert("oxy", /obj/screen/alert/too_much_oxy)
throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
else
clear_alert("oxy")
clear_alert("not_enough_oxy")
clear_alert("too_much_oxy")
if(atmos_requirements["min_tox"] && tox < atmos_requirements["min_tox"])
atmos_suitable = 0
throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox)
throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else if(atmos_requirements["max_tox"] && tox > atmos_requirements["max_tox"])
atmos_suitable = 0
throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
clear_alert("tox_in_air")
clear_alert("too_much_tox")
clear_alert("not_enough_tox")
if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"])
atmos_suitable = 0
+26 -2
View File
@@ -34,8 +34,15 @@
..()
/atom/proc/prepare_huds()
hud_list = list()
for(var/hud in hud_possible)
hud_list[hud] = image('icons/mob/hud.dmi', src, "")
var/hint = hud_possible[hud]
switch(hint)
if(HUD_LIST_LIST)
hud_list[hud] = list()
else
var/image/I = image('icons/mob/hud.dmi', src, "")
hud_list[hud] = I
/mob/proc/generate_name()
return name
@@ -1264,4 +1271,21 @@ var/list/slot_equipment_priority = list( \
.["Add Verb"] = "?_src_=vars;addverb=[UID()]"
.["Remove Verb"] = "?_src_=vars;remverb=[UID()]"
.["Gib"] = "?_src_=vars;gib=[UID()]"
.["Gib"] = "?_src_=vars;gib=[UID()]"
/mob/proc/spin(spintime, speed)
set waitfor = 0
var/D = dir
while(spintime >= speed)
sleep(speed)
switch(D)
if(NORTH)
D = EAST
if(SOUTH)
D = WEST
if(EAST)
D = SOUTH
if(WEST)
D = NORTH
setDir(D)
spintime -= speed
-2
View File
@@ -100,8 +100,6 @@
var/in_throw_mode = 0
var/coughedtime = null
var/emote_cd = 0 // Used to supress emote spamming. 1 if on CD, 2 if disabled by admin (manually set), else 0
var/job = null//Living
+14 -7
View File
@@ -51,17 +51,17 @@
return 1
return 0
proc/isLivingSSD(mob/M)
/proc/isLivingSSD(mob/M)
return istype(M) && M.player_logged && M.stat != DEAD
proc/isAntag(A)
/proc/isAntag(A)
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
if(C.mind && C.mind.special_role)
return 1
return 0
proc/isNonCrewAntag(A)
/proc/isNonCrewAntag(A)
if(!isAntag(A))
return 0
@@ -85,21 +85,28 @@ proc/isNonCrewAntag(A)
return 1
proc/iscuffed(A)
/proc/cannotPossess(A)
var/mob/dead/observer/G = A
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
return 1
return 0
/proc/iscuffed(A)
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
if(C.handcuffed)
return 1
return 0
proc/hassensorlevel(A, var/level)
/proc/hassensorlevel(A, var/level)
var/mob/living/carbon/human/H = A
if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
return U.sensor_mode >= level
return 0
proc/getsensorlevel(A)
/proc/getsensorlevel(A)
var/mob/living/carbon/human/H = A
if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
@@ -170,7 +177,7 @@ proc/getsensorlevel(A)
p++
return t
proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters
/proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters
phrase = html_decode(phrase)
var/leng=lentext(phrase)
var/counter=lentext(phrase)
+15 -11
View File
@@ -147,11 +147,12 @@
mob.control_object.forceMove(get_step(mob.control_object, direct))
return
#define MOVEMENT_DELAY_BUFFER 0.75
#define MOVEMENT_DELAY_BUFFER_DELTA 1.25
/client/Move(n, direct)
if(world.time < move_delay)
return
var/old_move_delay = move_delay
move_delay = world.time + world.tick_lag //this is here because Move() can now be called multiple times per tick
if(!mob || !mob.loc)
return 0
@@ -203,9 +204,9 @@
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
var/atom/O = mob.loc
return O.relaymove(mob, direct)
if(!mob.Process_Spacemove(direct))
return 0
return 0
if(mob.restrained()) // Why being pulled while cuffed prevents you from moving
for(var/mob/M in orange(1, mob))
@@ -220,7 +221,11 @@
//We are now going to move
moving = 1
move_delay = mob.movement_delay() + world.time
var/delay = mob.movement_delay()
if(old_move_delay + (delay * MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time)
move_delay = old_move_delay + delay
else
move_delay = delay + world.time
mob.last_movement = world.time
if(locate(/obj/item/weapon/grab, mob))
@@ -252,7 +257,7 @@
return
spawn(1)
M.other_mobs = null
M.animate_movement = 2
M.animate_movement = 2
return
else if(mob.confused)
@@ -361,13 +366,12 @@
spawn(0)
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
spawn(0)
anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir)
new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
limit--
if(limit<=0) break
if(limit<=0)
break
else
spawn(0)
anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir)
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.forceMove(get_step(L, direct))
L.dir = direct
if(3) //Incorporeal move, but blocked by holy-watered tiles
+5 -2
View File
@@ -236,6 +236,10 @@
if(!IsJobAvailable(rank))
to_chat(src, alert("[rank] is not available. Please try another."))
return 0
var/datum/job/thisjob = job_master.GetJob(rank)
if(thisjob.barred_by_disability(client))
to_chat(src, alert("[rank] is not available due to your character's disability. Please try another."))
return 0
job_master.AssignRole(src, rank, 1)
@@ -300,7 +304,6 @@
AnnounceArrival(character, rank, join_message)
callHook("latespawn", list(character))
var/datum/job/thisjob = job_master.GetJob(rank)
if(!thisjob.is_position_available() && thisjob in job_master.prioritized_jobs)
job_master.prioritized_jobs -= thisjob
qdel(src)
@@ -389,7 +392,7 @@
"Supply" = list(jobs = list(), titles = supply_positions, color = "#ead4ae"),
)
for(var/datum/job/job in job_master.occupations)
if(job && IsJobAvailable(job.title))
if(job && IsJobAvailable(job.title) && !job.barred_by_disability(client))
activePlayers[job] = 0
var/categorized = 0
// Only players with the job assigned and AFK for less than 10 minutes count as active
@@ -433,6 +433,343 @@
//////END VG HAIRSTYLES///////
//////////////////////////////
///////////////////////////////////
//////START POLARIS HAIRSTYLES/////
//////////////////////////////////
/datum/sprite_accessory/hair/dave
name = "Dave"
icon_state = "hair_dave"
/datum/sprite_accessory/hair/rosa
name = "Rosa"
icon_state = "hair_rosa"
/datum/sprite_accessory/hair/jade
name = "Jade"
icon_state = "hair_jade"
/datum/sprite_accessory/hair/shy
name = "Shy"
icon_state = "hair_shy"
/datum/sprite_accessory/hair/manbun
name = "Manbun"
icon_state = "hair_manbun"
/datum/sprite_accessory/hair/thinningback
name = "Thinning Back"
icon_state = "hair_thinningrear"
/datum/sprite_accessory/hair/thinningfront
name = "Thinning Front"
icon_state = "hair_thinningfront"
/datum/sprite_accessory/hair/thinning
name = "Thinning"
icon_state = "hair_thinning"
/datum/sprite_accessory/hair/bowlcut2
name = "Bowl 2"
icon_state = "hair_bowlcut2"
/datum/sprite_accessory/hair/ronin
name = "Ronin"
icon_state = "hair_ronin"
/datum/sprite_accessory/hair/topknot
name = "Topknot"
icon_state = "hair_topknot"
/datum/sprite_accessory/hair/regulationmohawk
name = "Regulation Mohawk"
icon_state = "hair_shavedmohawk"
/datum/sprite_accessory/hair/rowbraid
name = "Row Braid"
icon_state = "hair_rowbraid"
/datum/sprite_accessory/hair/rowdualbraid
name = "Row Dual Braid"
icon_state = "hair_rowdualtail"
/datum/sprite_accessory/hair/rowbun
name = "Row Bun"
icon_state = "hair_rowbun"
/datum/sprite_accessory/hair/hightight
name = "High and Tight"
icon_state = "hair_hightight"
/datum/sprite_accessory/hair/partfade
name = "Parted Fade"
icon_state = "hair_shavedpart"
gender = MALE
/datum/sprite_accessory/hair/undercut3
name = "Undercut Swept Left"
icon_state = "hair_undercut3"
gender = MALE
/datum/sprite_accessory/hair/undercut2
name = "Undercut Swept Right"
icon_state = "hair_undercut2"
gender = MALE
/datum/sprite_accessory/hair/undercut1
name = "Undercut"
icon_state = "hair_undercut1"
gender = MALE
/datum/sprite_accessory/hair/coffeehouse
name = "Coffee House Cut"
icon_state = "hair_coffeehouse"
gender = MALE
/datum/sprite_accessory/hair/tightbun
name = "Tight Bun"
icon_state = "hair_tightbun"
gender = FEMALE
/datum/sprite_accessory/hair/trimmed
name = "Trimmed"
icon_state = "hair_trimmed"
gender = MALE
/datum/sprite_accessory/hair/trimflat
name = "Trimmed Flat Top"
icon_state = "hair_trimflat"
gender = MALE
/datum/sprite_accessory/hair/nofade
name = "Regulation Cut"
icon_state = "hair_nofade"
gender = MALE
/datum/sprite_accessory/hair/baldfade
name = "Balding Fade"
icon_state = "hair_baldfade"
gender = MALE
/datum/sprite_accessory/hair/highfade
name = "High Fade"
icon_state = "hair_highfade"
gender = MALE
/datum/sprite_accessory/hair/medfade
name = "Medium Fade"
icon_state = "hair_medfade"
/datum/sprite_accessory/hair/lowfade
name = "Low Fade"
icon_state = "hair_lowfade"
gender = MALE
/datum/sprite_accessory/hair/oxton
name = "Oxton"
icon_state = "hair_oxton"
/datum/sprite_accessory/hair/doublebun
name = "Double-Bun"
icon_state = "hair_doublebun"
/datum/sprite_accessory/hair/halfshaved
name = "Half-Shaved Emo"
icon_state = "hair_halfshaved"
/datum/sprite_accessory/hair/shortbangs
name = "Short Bangs"
icon_state = "hair_shortbangs"
/datum/sprite_accessory/hair/longeralt2
name = "Long Hair Alt 2"
icon_state = "hair_longeralt2"
/datum/sprite_accessory/hair/nia
name = "Nia"
icon_state = "hair_nia"
/datum/sprite_accessory/hair/eighties
name = "80's"
icon_state = "hair_80s"
/datum/sprite_accessory/hair/volaju
name = "Volaju"
icon_state = "hair_volaju"
/datum/sprite_accessory/hair/joestar
name = "Joestar"
icon_state = "hair_joestar"
gender = MALE
/datum/sprite_accessory/hair/nitori
name = "Nitori"
icon_state = "hair_nitori"
/datum/sprite_accessory/hair/scully
name = "Scully"
icon_state = "hair_scully"
/datum/sprite_accessory/hair/vegeta
name = "Vegeta"
icon_state = "hair_toriyama2"
/datum/sprite_accessory/hair/crono
name = "Chrono"
icon_state = "hair_toriyama"
/datum/sprite_accessory/hair/poofy2
name = "Poofy2"
icon_state = "hair_poofy2"
/datum/sprite_accessory/hair/poofy
name = "Poofy"
icon_state = "hair_poofy"
/datum/sprite_accessory/hair/dandypomp
name = "Dandy Pompadour"
icon_state = "hair_dandypompadour"
/datum/sprite_accessory/hair/fringetail
name = "Fringetail"
icon_state = "hair_fringetail"
/datum/sprite_accessory/hair/mahdrills
name = "Drillruru"
icon_state = "hair_drillruru"
/datum/sprite_accessory/hair/familyman
name = "The Family Man"
icon_state = "hair_thefamilyman"
/datum/sprite_accessory/hair/grandebraid
name = "Grande Braid"
icon_state = "hair_grande"
/datum/sprite_accessory/hair/fringeemo
name = "Emo Fringe"
icon_state = "hair_emofringe"
/datum/sprite_accessory/hair/emo2
name = "Emo Alt"
icon_state = "hair_emo2"
/datum/sprite_accessory/hair/sargeant
name = "Flat Top"
icon_state = "hair_sargeant"
/datum/sprite_accessory/hair/rows2
name = "Rows 2"
icon_state = "hair_rows2"
/datum/sprite_accessory/hair/rows
name = "Rows"
icon_state = "hair_rows1"
/datum/sprite_accessory/hair/reversemohawk
name = "Reverse Mohawk"
icon_state = "hair_reversemohawk"
/datum/sprite_accessory/hair/father
name = "Father"
icon_state = "hair_father"
/datum/sprite_accessory/hair/beehive2
name = "Beehive 2"
icon_state = "hair_beehive2"
/datum/sprite_accessory/hair/sleeze
name = "Sleeze"
icon_state = "hair_sleeze"
/datum/sprite_accessory/hair/zieglertail
name = "Zieglertail"
icon_state = "hair_ziegler"
/datum/sprite_accessory/hair/spikyponytail
name = "Spiky Ponytail"
icon_state = "hair_spikyponytail"
/datum/sprite_accessory/hair/tresshoulder
name = "Tress Shoulder"
icon_state = "hair_tressshoulder"
/datum/sprite_accessory/hair/oneshoulder
name = "One Shoulder"
icon_state = "hair_oneshoulder"
/datum/sprite_accessory/hair/ponytail6
name = "Ponytail 6"
icon_state = "hair_ponytail6"
/datum/sprite_accessory/hair/ponytail5
name = "Ponytail 5"
icon_state = "hair_ponytail5"
/datum/sprite_accessory/hair/ponytail4
name = "Ponytail 4"
icon_state = "hair_ponytail4"
/datum/sprite_accessory/hair/country
name = "Country"
icon_state = "hair_country"
/datum/sprite_accessory/hair/bedheadlong
name = "Bedhead Long"
icon_state = "hair_long_bedhead"
/datum/sprite_accessory/hair/flair
name = "Flaired Hair"
icon_state = "hair_flair"
/datum/sprite_accessory/hair/twintail
name = "Twintail"
icon_state = "hair_twintail"
/datum/sprite_accessory/hair/short2
name = "Short Hair 2"
icon_state = "hair_shorthair3"
/datum/sprite_accessory/hair/bun2
name = "Bun 2"
icon_state = "hair_bun2"
/datum/sprite_accessory/hair/bun3
name = "Bun 3"
icon_state = "hair_bun3"
/datum/sprite_accessory/hair/shavehair
name = "Shaved Hair"
icon_state = "hair_shaved"
/datum/sprite_accessory/hair/veryshortovereyealternate
name = "Overeye Very Short, Alternate"
icon_state = "hair_veryshortovereyealternate"
/datum/sprite_accessory/hair/veryshortovereye
name = "Overeye Very Short"
icon_state = "hair_veryshortovereye"
/datum/sprite_accessory/hair/shortovereye
name = "Overeye Short"
icon_state = "hair_shortovereye"
/datum/sprite_accessory/hair/longovereye
name = "Overeye Long"
icon_state = "hair_longovereye"
/datum/sprite_accessory/hair/father
name = "Father"
icon_state = "hair_father"
/datum/sprite_accessory/hair/bun4 // Due to a vulp hairstyle called bun
name = "Bun 4"
icon_state = "hair_bun4"
///////////////////////////////////
//////END POLARIS HAIRSTYLES///////
//////////////////////////////////
/datum/sprite_accessory/hair/ipc
species_allowed = list("Machine")
glasses_over = 1