mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-26 18:13:35 +00:00
Merge branch 'master' of https://github.com/Baystation12/Baystation12
This commit is contained in:
@@ -21,12 +21,13 @@
|
||||
var/antagHUD = 0
|
||||
universal_speak = 1
|
||||
var/atom/movable/following = null
|
||||
|
||||
/mob/dead/observer/New(mob/body)
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
see_in_dark = 100
|
||||
verbs += /mob/dead/observer/proc/dead_tele
|
||||
|
||||
|
||||
stat = DEAD
|
||||
|
||||
var/turf/T
|
||||
@@ -93,18 +94,19 @@ Works together with spawning an observer, noted above.
|
||||
|
||||
/mob/dead/observer/Life()
|
||||
..()
|
||||
if(!loc) return
|
||||
if(!loc) return
|
||||
if(!client) return 0
|
||||
|
||||
|
||||
if(client.images.len)
|
||||
for(var/image/hud in client.images)
|
||||
for(var/image/hud in client.images)
|
||||
if(copytext(hud.icon_state,1,4) == "hud")
|
||||
client.images.Remove(hud)
|
||||
|
||||
if(antagHUD)
|
||||
var/list/target_list = list()
|
||||
for(var/mob/living/target in oview(src))
|
||||
if( target.mind&&(target.mind.special_role||issilicon(target)) )
|
||||
for(var/mob/living/target in oview(src, 14))
|
||||
if(target.mind&&(target.mind.special_role||issilicon(target)) )
|
||||
target_list += target
|
||||
if(target_list.len)
|
||||
assess_targets(target_list, src)
|
||||
@@ -112,84 +114,19 @@ Works together with spawning an observer, noted above.
|
||||
process_medHUD(src)
|
||||
|
||||
|
||||
// Direct copied from medical HUD glasses proc, used to determine what health bar to put over the targets head.
|
||||
/mob/dead/proc/RoundHealth(var/health)
|
||||
switch(health)
|
||||
if(100 to INFINITY)
|
||||
return "health100"
|
||||
if(70 to 100)
|
||||
return "health80"
|
||||
if(50 to 70)
|
||||
return "health60"
|
||||
if(30 to 50)
|
||||
return "health40"
|
||||
if(18 to 30)
|
||||
return "health25"
|
||||
if(5 to 18)
|
||||
return "health10"
|
||||
if(1 to 5)
|
||||
return "health1"
|
||||
if(-99 to 0)
|
||||
return "health0"
|
||||
else
|
||||
return "health-100"
|
||||
return "0"
|
||||
|
||||
|
||||
// Pretty much a direct copy of Medical HUD stuff, except will show ill if they are ill instead of also checking for known illnesses.
|
||||
|
||||
/mob/dead/proc/process_medHUD(var/mob/M)
|
||||
var/client/C = M.client
|
||||
var/image/holder
|
||||
for(var/mob/living/carbon/human/patient in oview(M))
|
||||
var/foundVirus = 0
|
||||
if(patient.virus2.len)
|
||||
foundVirus = 1
|
||||
if(!C) return
|
||||
holder = patient.hud_list[HEALTH_HUD]
|
||||
if(patient.stat == 2)
|
||||
holder.icon_state = "hudhealth-100"
|
||||
else
|
||||
holder.icon_state = "hud[RoundHealth(patient.health)]"
|
||||
C.images += holder
|
||||
|
||||
holder = patient.hud_list[STATUS_HUD]
|
||||
if(patient.stat == 2)
|
||||
holder.icon_state = "huddead"
|
||||
else if(patient.status_flags & XENO_HOST)
|
||||
holder.icon_state = "hudxeno"
|
||||
else if(foundVirus)
|
||||
holder.icon_state = "hudill"
|
||||
else
|
||||
holder.icon_state = "hudhealthy"
|
||||
C.images += holder
|
||||
|
||||
|
||||
/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U)
|
||||
var/icon/tempHud = 'icons/mob/hud.dmi'
|
||||
for(var/mob/living/target in target_list)
|
||||
if(iscarbon(target))
|
||||
switch(target.mind.special_role)
|
||||
if("traitor","Syndicate")
|
||||
U.client.images += image(tempHud,target,"hudsyndicate")
|
||||
if("Revolutionary")
|
||||
U.client.images += image(tempHud,target,"hudrevolutionary")
|
||||
if("Head Revolutionary")
|
||||
U.client.images += image(tempHud,target,"hudheadrevolutionary")
|
||||
if("Cultist")
|
||||
U.client.images += image(tempHud,target,"hudcultist")
|
||||
if("Changeling")
|
||||
U.client.images += image(tempHud,target,"hudchangeling")
|
||||
if("Wizard","Fake Wizard")
|
||||
U.client.images += image(tempHud,target,"hudwizard")
|
||||
if("Hunter","Sentinel","Drone","Queen")
|
||||
U.client.images += image(tempHud,target,"hudalien")
|
||||
if("Death Commando")
|
||||
U.client.images += image(tempHud,target,"huddeathsquad")
|
||||
if("Ninja")
|
||||
U.client.images += image(tempHud,target,"hudninja")
|
||||
else//If we don't know what role they have but they have one.
|
||||
U.client.images += image(tempHud,target,"hudunknown1")
|
||||
/mob/dead/proc/process_medHUD(var/mob/M)
|
||||
var/client/C = M.client
|
||||
for(var/mob/living/carbon/human/patient in oview(M, 14))
|
||||
C.images += patient.hud_list[HEALTH_HUD]
|
||||
C.images += patient.hud_list[STATUS_HUD_OOC]
|
||||
|
||||
/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U)
|
||||
var/client/C = U.client
|
||||
for(var/mob/living/carbon/human/target in target_list)
|
||||
C.images += target.hud_list[SPECIALROLE_HUD]
|
||||
|
||||
|
||||
/*
|
||||
else//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud.
|
||||
var/mob/living/silicon/silicon_target = target
|
||||
if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len))||silicon_target.mind.special_role=="traitor")
|
||||
@@ -197,8 +134,9 @@ Works together with spawning an observer, noted above.
|
||||
U.client.images += image(tempHud,silicon_target,"hudmalborg")
|
||||
else
|
||||
U.client.images += image(tempHud,silicon_target,"hudmalai")
|
||||
return 1
|
||||
|
||||
*/
|
||||
return 1
|
||||
|
||||
/mob/proc/ghostize(var/can_reenter_corpse = 1)
|
||||
if(key)
|
||||
var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc.
|
||||
@@ -319,7 +257,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(jobban_isbanned(M, "AntagHUD"))
|
||||
src << "\red <B>You have been banned from using this feature</B>"
|
||||
return
|
||||
if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder)
|
||||
if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder)
|
||||
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
|
||||
if(response == "No") return
|
||||
M.can_reenter_corpse = 0
|
||||
@@ -361,27 +299,30 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set name = "Follow" // "Haunt"
|
||||
set desc = "Follow and haunt a mob."
|
||||
|
||||
if(istype(usr, /mob/dead/observer))
|
||||
var/list/mobs = getmobs()
|
||||
var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs
|
||||
var/mob/target = mobs[input]
|
||||
if(target && target != usr)
|
||||
following = target
|
||||
spawn(0)
|
||||
var/turf/pos = get_turf(src)
|
||||
while(src.loc == pos)
|
||||
var/list/mobs = getmobs()
|
||||
var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs
|
||||
var/mob/target = mobs[input]
|
||||
ManualFollow(target)
|
||||
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T)
|
||||
break
|
||||
if(following != target)
|
||||
break
|
||||
if(!client)
|
||||
break
|
||||
src.loc = T
|
||||
pos = src.loc
|
||||
sleep(15)
|
||||
following = null
|
||||
// This is the ghost's follow verb with an argument
|
||||
/mob/dead/observer/proc/ManualFollow(var/atom/movable/target)
|
||||
if(target && target != src)
|
||||
if(following && following == target)
|
||||
return
|
||||
following = target
|
||||
src << "\blue Now following [target]"
|
||||
spawn(0)
|
||||
var/turf/pos = get_turf(src)
|
||||
while(loc == pos && target && following == target && client)
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T)
|
||||
break
|
||||
// To stop the ghost flickering.
|
||||
if(loc != T)
|
||||
loc = T
|
||||
pos = loc
|
||||
sleep(15)
|
||||
following = null
|
||||
|
||||
|
||||
/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
|
||||
@@ -433,6 +374,58 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set hidden = 1
|
||||
src << "\red You are dead! You have no mind to store memory!"
|
||||
|
||||
/mob/dead/observer/verb/analyze_air()
|
||||
set name = "Analyze Air"
|
||||
set category = "Ghost"
|
||||
|
||||
if(!istype(usr, /mob/dead/observer)) return
|
||||
|
||||
// Shamelessly copied from the Gas Analyzers
|
||||
if (!( istype(usr.loc, /turf) ))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/environment = usr.loc.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles()
|
||||
|
||||
src << "\blue <B>Results:</B>"
|
||||
if(abs(pressure - ONE_ATMOSPHERE) < 10)
|
||||
src << "\blue Pressure: [round(pressure,0.1)] kPa"
|
||||
else
|
||||
src << "\red Pressure: [round(pressure,0.1)] kPa"
|
||||
if(total_moles)
|
||||
var/o2_concentration = environment.oxygen/total_moles
|
||||
var/n2_concentration = environment.nitrogen/total_moles
|
||||
var/co2_concentration = environment.carbon_dioxide/total_moles
|
||||
var/plasma_concentration = environment.toxins/total_moles
|
||||
|
||||
var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
|
||||
if(abs(n2_concentration - N2STANDARD) < 20)
|
||||
src << "\blue Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)"
|
||||
else
|
||||
src << "\red Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)"
|
||||
|
||||
if(abs(o2_concentration - O2STANDARD) < 2)
|
||||
src << "\blue Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)"
|
||||
else
|
||||
src << "\red Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)"
|
||||
|
||||
if(co2_concentration > 0.01)
|
||||
src << "\red CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)"
|
||||
else
|
||||
src << "\blue CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)"
|
||||
|
||||
if(plasma_concentration > 0.01)
|
||||
src << "\red Plasma: [round(plasma_concentration*100)]% ([round(environment.toxins,0.01)] moles)"
|
||||
|
||||
if(unknown_concentration > 0.01)
|
||||
src << "\red Unknown: [round(unknown_concentration*100)]% ([round(unknown_concentration*total_moles,0.01)] moles)"
|
||||
|
||||
src << "\blue Temperature: [round(environment.temperature-T0C,0.1)]°C"
|
||||
src << "\blue Heat Capacity: [round(environment.heat_capacity(),0.1)]"
|
||||
|
||||
|
||||
/mob/dead/observer/verb/toggle_darkness()
|
||||
set name = "Toggle Darkness"
|
||||
set category = "Ghost"
|
||||
@@ -450,6 +443,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
src << "<span class='warning'>Spawning as a mouse is currently disabled.</span>"
|
||||
return
|
||||
|
||||
var/mob/dead/observer/M = usr
|
||||
if(config.antag_hud_restricted && M.has_enabled_antagHUD == 1)
|
||||
src << "<span class='warning'>antagHUD restrictions prevent you from spawning in as a mouse.</span>"
|
||||
return
|
||||
|
||||
var/timedifference = world.time - client.time_died_as_mouse
|
||||
if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600)
|
||||
var/timedifference_text
|
||||
@@ -489,3 +487,79 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
dat += data_core.get_manifest()
|
||||
|
||||
src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
|
||||
//Used for drawing on walls with blood puddles as a spooky ghost.
|
||||
/mob/dead/verb/bloody_doodle()
|
||||
|
||||
set category = "Ghost"
|
||||
set name = "Write in blood"
|
||||
set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC."
|
||||
|
||||
if(!(config.cult_ghostwriter))
|
||||
src << "\red That verb is not currently permitted."
|
||||
return
|
||||
|
||||
if (!src.stat)
|
||||
return
|
||||
|
||||
if (usr != src)
|
||||
return 0 //something is terribly wrong
|
||||
|
||||
var/ghosts_can_write
|
||||
if(ticker.mode.name == "cult")
|
||||
var/datum/game_mode/cult/C = ticker.mode
|
||||
if(C.cult.len > config.cult_ghostwriter_req_cultists)
|
||||
ghosts_can_write = 1
|
||||
|
||||
if(!ghosts_can_write)
|
||||
src << "\red The veil is not thin enough for you to do that."
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.amount > 0)
|
||||
choices += B
|
||||
|
||||
if(!choices.len)
|
||||
src << "<span class = 'warning'>There is no blood to use nearby.</span>"
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices
|
||||
|
||||
var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
|
||||
var/turf/simulated/T = src.loc
|
||||
if (direction != "Here")
|
||||
T = get_step(T,text2dir(direction))
|
||||
|
||||
if (!istype(T))
|
||||
src << "<span class='warning'>You cannot doodle there.</span>"
|
||||
return
|
||||
|
||||
if(!choice || choice.amount == 0 || !(src.Adjacent(choice)))
|
||||
return
|
||||
|
||||
var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808"
|
||||
|
||||
var/num_doodles = 0
|
||||
for (var/obj/effect/decal/cleanable/blood/writing/W in T)
|
||||
num_doodles++
|
||||
if (num_doodles > 4)
|
||||
src << "<span class='warning'>There is no space to write on!</span>"
|
||||
return
|
||||
|
||||
var/max_length = 50
|
||||
|
||||
var/message = stripped_input(src,"Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")
|
||||
|
||||
if (message)
|
||||
|
||||
if (length(message) > max_length)
|
||||
message += "-"
|
||||
src << "<span class='warning'>You ran out of blood to write with!</span>"
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/writing/W = new(T)
|
||||
W.basecolor = doodle_color
|
||||
W.update_icon()
|
||||
W.message = message
|
||||
W.add_hiddenprint(src)
|
||||
W.visible_message("\red Invisible fingers crudely paint something in blood on [T]...")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/dead/observer/say(var/message)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if (!message)
|
||||
return
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
|
||||
/mob/dead/observer/emote(var/act, var/type, var/message)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if(!message)
|
||||
return
|
||||
@@ -62,4 +62,4 @@
|
||||
M.show_message("<span class='game'><i>You hear muffled speech... you can almost make out some words...</i></span>", 2)
|
||||
// M.show_message("<span class='game'><i>[stutter(message)]</i></span>", 2)
|
||||
playsound(src.loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -36,11 +36,15 @@
|
||||
M.show_message(message)
|
||||
|
||||
|
||||
// Type 1 (Visual) emotes are sent to anyone in view of the item
|
||||
if (m_type & 1)
|
||||
for (var/mob/O in viewers(src, null))
|
||||
O.show_message(message, m_type)
|
||||
|
||||
// Type 2 (Audible) emotes are sent to anyone in hear range
|
||||
// of the *LOCATION* -- this is important for pAIs to be heard
|
||||
else if (m_type & 2)
|
||||
for (var/mob/O in hearers(src.loc, null))
|
||||
for (var/mob/O in hearers(get_turf(src), null))
|
||||
O.show_message(message, m_type)
|
||||
|
||||
/mob/proc/emote_dead(var/message)
|
||||
@@ -53,6 +57,12 @@
|
||||
src << "\red You have deadchat muted."
|
||||
return
|
||||
|
||||
if(!src.client.holder)
|
||||
if(!dsay_allowed)
|
||||
src << "\red Deadchat is globally muted"
|
||||
return
|
||||
|
||||
|
||||
var/input
|
||||
if(!message)
|
||||
input = copytext(sanitize(input(src, "Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/name = "an unknown language" // Fluff name of language if any.
|
||||
var/desc = "A language." // Short description for 'Check Languages'.
|
||||
var/speech_verb = "says" // 'says', 'hisses', 'farts'.
|
||||
var/colour = "say_quote" // CSS style to use for strings in this language.
|
||||
var/colour = "body" // CSS style to use for strings in this language.
|
||||
var/key = "x" // Character used to speak in language eg. :o for Unathi.
|
||||
var/flags = 0 // Various language flags.
|
||||
var/native // If set, non-native speakers will have trouble speaking.
|
||||
@@ -54,6 +54,7 @@
|
||||
/datum/language/human
|
||||
name = "Sol Common"
|
||||
desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
|
||||
colour = "rough"
|
||||
key = "1"
|
||||
flags = RESTRICTED
|
||||
|
||||
@@ -62,35 +63,30 @@
|
||||
name = "Tradeband"
|
||||
desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining."
|
||||
speech_verb = "enunciates"
|
||||
colour = "say_quote"
|
||||
key = "2"
|
||||
|
||||
/datum/language/gutter
|
||||
name = "Gutter"
|
||||
desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements."
|
||||
speech_verb = "growls"
|
||||
colour = "rough"
|
||||
key = "3"
|
||||
|
||||
// Language handling.
|
||||
/mob/proc/add_language(var/language)
|
||||
|
||||
for(var/datum/language/L in languages)
|
||||
if(L && L.name == language)
|
||||
return 0
|
||||
|
||||
var/datum/language/new_language = all_languages[language]
|
||||
|
||||
if(!istype(new_language,/datum/language))
|
||||
if(!istype(new_language) || new_language in languages)
|
||||
return 0
|
||||
|
||||
languages += new_language
|
||||
languages.Add(new_language)
|
||||
return 1
|
||||
|
||||
/mob/proc/remove_language(var/rem_language)
|
||||
|
||||
for(var/datum/language/L in languages)
|
||||
if(L && L.name == rem_language)
|
||||
languages -= L
|
||||
return 1
|
||||
languages.Remove(all_languages[rem_language])
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
continue
|
||||
no_queen = 0
|
||||
|
||||
if(src.has_brain_worms())
|
||||
src << "<span class='warning'>We cannot perform this ability at the present time!</span>"
|
||||
return
|
||||
|
||||
if(no_queen)
|
||||
adjustToxLoss(-500)
|
||||
src << "\green You begin to evolve!"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
brainmob = new(src)
|
||||
brainmob.name = H.real_name
|
||||
brainmob.real_name = H.real_name
|
||||
brainmob.dna = H.dna
|
||||
brainmob.dna = H.dna.Clone()
|
||||
brainmob.timeofhostdeath = H.timeofdeath
|
||||
if(H.mind)
|
||||
H.mind.transfer_to(brainmob)
|
||||
|
||||
@@ -46,6 +46,19 @@
|
||||
C.prefs.be_special ^= BE_PAI
|
||||
|
||||
|
||||
transfer_identity(var/mob/living/carbon/H)
|
||||
name = "positronic brain ([H])"
|
||||
brainmob.name = H.real_name
|
||||
brainmob.real_name = H.real_name
|
||||
brainmob.dna = H.dna
|
||||
brainmob.timeofhostdeath = H.timeofdeath
|
||||
if(brainmob.mind)
|
||||
brainmob.mind.assigned_role = "Positronic Brain"
|
||||
if(H.mind)
|
||||
H.mind.transfer_to(brainmob)
|
||||
brainmob << "\blue You feel slightly disoriented. That's normal when you're just a metal cube."
|
||||
icon_state = "posibrain-occupied"
|
||||
return
|
||||
|
||||
proc/transfer_personality(var/mob/candidate)
|
||||
|
||||
|
||||
@@ -221,99 +221,6 @@
|
||||
|
||||
// ++++ROCKDTBEN++++ MOB PROCS //END
|
||||
|
||||
/mob/living/carbon/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null) // -- TLE -- Merged by Carn
|
||||
if(stat)
|
||||
src << "You must be conscious to do this!"
|
||||
return
|
||||
if(lying)
|
||||
src << "You can't vent crawl while you're stunned!"
|
||||
return
|
||||
|
||||
if(vent_found) // one was passed in, probably from vent/AltClick()
|
||||
if(vent_found.welded)
|
||||
src << "That vent is welded shut."
|
||||
return
|
||||
if(!vent_found.Adjacent(src))
|
||||
return // don't even acknowledge that
|
||||
else
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
|
||||
if(!v.welded)
|
||||
if(v.Adjacent(src))
|
||||
vent_found = v
|
||||
if(!vent_found)
|
||||
src << "You'll need a non-welded vent to crawl into!"
|
||||
return
|
||||
|
||||
if(!vent_found.network || !vent_found.network.normal_members.len)
|
||||
src << "This vent is not connected to anything."
|
||||
return
|
||||
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
|
||||
if(temp_vent.welded)
|
||||
continue
|
||||
if(temp_vent in loc)
|
||||
continue
|
||||
var/turf/T = get_turf(temp_vent)
|
||||
|
||||
if(!T || T.z != loc.z)
|
||||
continue
|
||||
|
||||
var/i = 1
|
||||
var/index = "[T.loc.name]\[[i]\]"
|
||||
while(index in vents)
|
||||
i++
|
||||
index = "[T.loc.name]\[[i]\]"
|
||||
vents[index] = temp_vent
|
||||
if(!vents.len)
|
||||
src << "\red There are no available vents to travel to, they could be welded."
|
||||
return
|
||||
|
||||
var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents)
|
||||
if(!selection) return
|
||||
|
||||
if(!vent_found.Adjacent(src))
|
||||
src << "Never mind, you left."
|
||||
return
|
||||
|
||||
for(var/obj/item/carried_item in contents)//If the monkey got on objects.
|
||||
if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger
|
||||
src << "\red You can't be carrying items or have items equipped when vent crawling!"
|
||||
return
|
||||
if(isslime(src))
|
||||
var/mob/living/carbon/slime/S = src
|
||||
if(S.Victim)
|
||||
src << "\red You'll have to let [S.Victim] go or finish eating \him first."
|
||||
return
|
||||
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection]
|
||||
if(!target_vent)
|
||||
return
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
|
||||
loc = target_vent
|
||||
|
||||
var/travel_time = round(get_dist(loc, target_vent.loc) / 2)
|
||||
|
||||
spawn(travel_time)
|
||||
|
||||
if(!target_vent) return
|
||||
for(var/mob/O in hearers(target_vent,null))
|
||||
O.show_message("You hear something squeezing through the ventilation ducts.",2)
|
||||
|
||||
sleep(travel_time)
|
||||
|
||||
if(!target_vent) return
|
||||
if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled.
|
||||
target_vent = vent_found //travel back. No additional time required.
|
||||
src << "\red The vent you were heading to appears to be welded."
|
||||
loc = target_vent.loc
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
|
||||
|
||||
/mob/living/carbon/clean_blood()
|
||||
. = ..()
|
||||
if(ishuman(src))
|
||||
@@ -532,7 +439,7 @@
|
||||
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
|
||||
|
||||
//Check for brain worms in head.
|
||||
/mob/living/carbon/proc/has_brain_worms()
|
||||
/mob/proc/has_brain_worms()
|
||||
|
||||
for(var/I in contents)
|
||||
if(istype(I,/mob/living/simple_animal/borer))
|
||||
|
||||
@@ -20,7 +20,10 @@
|
||||
E.droplimb(1,1)
|
||||
|
||||
flick("gibbed-h", animation)
|
||||
hgibs(loc, viruses, dna)
|
||||
if(species)
|
||||
hgibs(loc, viruses, dna, species.flesh_color, species.blood_color)
|
||||
else
|
||||
hgibs(loc, viruses, dna)
|
||||
|
||||
spawn(15)
|
||||
if(animation) del(animation)
|
||||
@@ -50,10 +53,20 @@
|
||||
/mob/living/carbon/human/death(gibbed)
|
||||
if(stat == DEAD) return
|
||||
if(healths) healths.icon_state = "health5"
|
||||
|
||||
stat = DEAD
|
||||
dizziness = 0
|
||||
jitteriness = 0
|
||||
|
||||
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
hud_updateflag |= 1 << STATUS_HUD
|
||||
|
||||
handle_hud_list()
|
||||
|
||||
//Handle species-specific deaths.
|
||||
if(species) species.handle_death(src)
|
||||
|
||||
//Handle brain slugs.
|
||||
var/datum/organ/external/head = get_organ("head")
|
||||
var/mob/living/simple_animal/borer/B
|
||||
@@ -102,6 +115,8 @@
|
||||
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
|
||||
return ..(gibbed)
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
if(SKELETON in src.mutations) return
|
||||
|
||||
|
||||
@@ -148,6 +148,8 @@
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n"
|
||||
else if(feet_blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] blood-stained feet!</span>\n"
|
||||
|
||||
//mask
|
||||
if(wear_mask && !skipmask)
|
||||
@@ -243,7 +245,7 @@
|
||||
if(!key && brain_op_stage != 4 && stat != DEAD)
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely</span>\n"
|
||||
else if(!client && brain_op_stage != 4 && stat != DEAD)
|
||||
msg += "[t_He] [t_has] a vacant, braindead stare...\n"
|
||||
msg += "[t_He] [t_has] suddenly fallen asleep.\n"
|
||||
|
||||
var/list/wound_flavor_text = list()
|
||||
var/list/is_destroyed = list()
|
||||
@@ -256,8 +258,9 @@
|
||||
continue
|
||||
if(temp.status & ORGAN_ROBOT)
|
||||
if(!(temp.brute_dam + temp.burn_dam))
|
||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name]!</span>\n"
|
||||
continue
|
||||
if(!species.flags & IS_SYNTHETIC)
|
||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name]!</span>\n"
|
||||
continue
|
||||
else
|
||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name], it has"
|
||||
if(temp.brute_dam) switch(temp.brute_dam)
|
||||
@@ -272,7 +275,8 @@
|
||||
wound_flavor_text["[temp.display_name]"] += " some burns"
|
||||
if(21 to INFINITY)
|
||||
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
|
||||
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
|
||||
if(wound_flavor_text["[temp.display_name]"])
|
||||
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
|
||||
else if(temp.wounds.len > 0)
|
||||
var/list/wound_descriptors = list()
|
||||
for(var/datum/wound/W in temp.wounds)
|
||||
@@ -467,4 +471,4 @@
|
||||
else
|
||||
return 0
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
voice_name = "unknown"
|
||||
icon = 'icons/mob/human.dmi'
|
||||
icon_state = "body_m_s"
|
||||
var/list/hud_list = list()
|
||||
var/list/hud_list[9]
|
||||
var/datum/species/species //Contains icon generation and language information, set during New().
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
|
||||
/mob/living/carbon/human/dummy
|
||||
real_name = "Test Dummy"
|
||||
@@ -35,25 +36,34 @@
|
||||
species = new /datum/species/diona(src)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/machine/New()
|
||||
h_style = "blue IPC screen"
|
||||
set_species("Machine")
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/New()
|
||||
|
||||
if(!species)
|
||||
set_species()
|
||||
|
||||
if(species.language)
|
||||
var/datum/language/L = all_languages[species.language]
|
||||
if(L)
|
||||
languages += L
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
|
||||
if(!dna)
|
||||
dna = new /datum/dna(null)
|
||||
dna.species=species.name
|
||||
|
||||
for(var/i=0;i<7;i++) // 2 for medHUDs and 5 for secHUDs
|
||||
hud_list += image('icons/mob/hud.dmi', src, "hudunknown")
|
||||
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudunknown")
|
||||
hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
|
||||
|
||||
..()
|
||||
|
||||
@@ -551,6 +561,7 @@
|
||||
modified = 1
|
||||
|
||||
spawn()
|
||||
hud_updateflag |= 1 << WANTED_HUD
|
||||
if(istype(usr,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/U = usr
|
||||
U.handle_regular_hud_updates()
|
||||
@@ -675,6 +686,8 @@
|
||||
if(setmedical != "Cancel")
|
||||
R.fields["p_stat"] = setmedical
|
||||
modified = 1
|
||||
if(PDA_Manifest.len)
|
||||
PDA_Manifest.Cut()
|
||||
|
||||
spawn()
|
||||
if(istype(usr,/mob/living/carbon/human))
|
||||
@@ -776,6 +789,14 @@
|
||||
if(istype(usr,/mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/U = usr
|
||||
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
|
||||
|
||||
if (href_list["lookitem"])
|
||||
var/obj/item/I = locate(href_list["lookitem"])
|
||||
I.examine()
|
||||
|
||||
if (href_list["lookmob"])
|
||||
var/mob/M = locate(href_list["lookmob"])
|
||||
M.examine()
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1019,17 +1040,21 @@
|
||||
O.status &= ~ORGAN_BROKEN
|
||||
O.status &= ~ORGAN_BLEEDING
|
||||
O.status &= ~ORGAN_SPLINTED
|
||||
O.status &= ~ORGAN_CUT_AWAY
|
||||
O.status &= ~ORGAN_ATTACHABLE
|
||||
if (!O.amputated)
|
||||
O.status &= ~ORGAN_DESTROYED
|
||||
O.destspawn = 0
|
||||
O.wounds.Cut()
|
||||
O.heal_damage(1000,1000,1,1)
|
||||
|
||||
var/datum/organ/external/head/h = organs_by_name["head"]
|
||||
h.disfigured = 0
|
||||
|
||||
vessel.add_reagent("blood",560-vessel.total_volume)
|
||||
fixblood()
|
||||
if(species && !(species.flags & NO_BLOOD))
|
||||
vessel.add_reagent("blood",560-vessel.total_volume)
|
||||
fixblood()
|
||||
|
||||
for (var/obj/item/weapon/organ/head/H in world)
|
||||
if(H.brainmob)
|
||||
if(H.brainmob.real_name == src.real_name)
|
||||
@@ -1071,7 +1096,7 @@
|
||||
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]"
|
||||
log_misc("VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]")
|
||||
ticks++
|
||||
if (prob(round(damage/10)*20))
|
||||
germs++
|
||||
@@ -1099,92 +1124,20 @@
|
||||
if(blood_DNA[M.dna.unique_enzymes])
|
||||
return 0 //already bloodied with this blood. Cannot add more.
|
||||
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
hand_blood_color = blood_color
|
||||
src.update_inv_gloves() //handles bloody hands overlays and updating
|
||||
verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
return 1 //we applied blood to the item
|
||||
|
||||
/mob/living/carbon/human/clean_blood()
|
||||
/mob/living/carbon/human/clean_blood(var/clean_feet)
|
||||
.=..()
|
||||
if(istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
|
||||
if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
|
||||
feet_blood_color = null
|
||||
del(feet_blood_DNA)
|
||||
update_inv_shoes(1)
|
||||
return 1
|
||||
|
||||
mob/living/carbon/human/yank_out_object()
|
||||
set category = "Object"
|
||||
set name = "Yank out object"
|
||||
set desc = "Remove an embedded item at the cost of bleeding and pain."
|
||||
set src in view(1)
|
||||
|
||||
if(!isliving(usr) || usr.next_move > world.time)
|
||||
return
|
||||
usr.next_move = world.time + 20
|
||||
|
||||
if(usr.stat == 1)
|
||||
usr << "You are unconcious and cannot do that!"
|
||||
return
|
||||
|
||||
if(usr.restrained())
|
||||
usr << "You are restrained and cannot do that!"
|
||||
return
|
||||
|
||||
var/list/valid_objects = list()
|
||||
var/datum/organ/external/affected = null
|
||||
var/mob/living/carbon/human/S = src
|
||||
var/mob/living/carbon/human/U = usr
|
||||
var/self = null
|
||||
|
||||
if(S == U)
|
||||
self = 1 // Removing object from yourself.
|
||||
|
||||
valid_objects = get_visible_implants(1)
|
||||
|
||||
if(!valid_objects.len)
|
||||
if(self)
|
||||
src << "You have nothing stuck in your wounds that is large enough to remove without surgery."
|
||||
else
|
||||
U << "[src] has nothing stuck in their wounds that is large enough to remove without surgery."
|
||||
return
|
||||
|
||||
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
|
||||
|
||||
for(var/datum/organ/external/organ in organs) //Grab the organ holding the implant.
|
||||
for(var/obj/item/weapon/O in organ.implants)
|
||||
if(O == selection)
|
||||
affected = organ
|
||||
if(self)
|
||||
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your [affected.display_name] with bloody fingers.</span>"
|
||||
else
|
||||
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s [affected.display_name] with bloody fingers.</span>"
|
||||
|
||||
if(istype(U,/mob/living/carbon/human/)) U.bloody_hands(S)
|
||||
|
||||
if(!do_after(U, 80))
|
||||
return
|
||||
|
||||
if(!selection || !affected || !S || !U)
|
||||
return
|
||||
|
||||
if(self)
|
||||
visible_message("<span class='warning'><b>[src] rips [selection] out of their [affected.display_name] in a welter of blood.</b></span>","<span class='warning'><b>You rip [selection] out of your [affected] in a welter of blood.</b></span>")
|
||||
else
|
||||
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s [affected.display_name] in a welter of blood.</b></span>","<span class='warning'><b>[usr] rips [selection] out of your [affected] in a welter of blood.</b></span>")
|
||||
|
||||
selection.loc = get_turf(src)
|
||||
affected.implants -= selection
|
||||
shock_stage+=10
|
||||
|
||||
for(var/obj/item/weapon/O in pinned)
|
||||
if(O == selection)
|
||||
pinned -= O
|
||||
if(!pinned.len)
|
||||
anchored = 0
|
||||
|
||||
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
|
||||
var/datum/wound/internal_bleeding/I = new (15)
|
||||
affected.wounds += I
|
||||
custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/get_visible_implants(var/class = 0)
|
||||
/mob/living/carbon/human/get_visible_implants(var/class = 0)
|
||||
|
||||
var/list/visible_implants = list()
|
||||
for(var/datum/organ/external/organ in src.organs)
|
||||
@@ -1251,18 +1204,86 @@ mob/living/carbon/human/yank_out_object()
|
||||
|
||||
/mob/living/carbon/human/proc/set_species(var/new_species)
|
||||
|
||||
if(!new_species)
|
||||
new_species = "Human"
|
||||
if(!dna)
|
||||
if(!new_species)
|
||||
new_species = "Human"
|
||||
else
|
||||
if(!new_species)
|
||||
new_species = dna.species
|
||||
else
|
||||
dna.species = new_species
|
||||
|
||||
if(species && (species.name && species.name == new_species))
|
||||
return
|
||||
|
||||
if(species && species.language)
|
||||
remove_language(species.language)
|
||||
|
||||
species = all_species[new_species]
|
||||
|
||||
if(species.language)
|
||||
add_language(species.language)
|
||||
|
||||
spawn(0)
|
||||
update_icons()
|
||||
|
||||
if(species)
|
||||
species.handle_post_spawn(src)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/proc/bloody_doodle()
|
||||
set category = "IC"
|
||||
set name = "Write in blood"
|
||||
set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style."
|
||||
|
||||
if (src.stat)
|
||||
return
|
||||
|
||||
if (usr != src)
|
||||
return 0 //something is terribly wrong
|
||||
|
||||
if (!bloody_hands)
|
||||
verbs -= /mob/living/carbon/human/proc/bloody_doodle
|
||||
|
||||
if (src.gloves)
|
||||
src << "<span class='warning'>Your [src.gloves] are getting in the way.</span>"
|
||||
return
|
||||
|
||||
var/turf/simulated/T = src.loc
|
||||
if (!istype(T)) //to prevent doodling out of mechs and lockers
|
||||
src << "<span class='warning'>You cannot reach the floor.</span>"
|
||||
return
|
||||
|
||||
var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
|
||||
if (direction != "Here")
|
||||
T = get_step(T,text2dir(direction))
|
||||
if (!istype(T))
|
||||
src << "<span class='warning'>You cannot doodle there.</span>"
|
||||
return
|
||||
|
||||
var/num_doodles = 0
|
||||
for (var/obj/effect/decal/cleanable/blood/writing/W in T)
|
||||
num_doodles++
|
||||
if (num_doodles > 4)
|
||||
src << "<span class='warning'>There is no space to write on!</span>"
|
||||
return
|
||||
|
||||
var/max_length = bloody_hands * 30 //tweeter style
|
||||
|
||||
var/message = stripped_input(src,"Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")
|
||||
|
||||
if (message)
|
||||
var/used_blood_amount = round(length(message) / 30, 1)
|
||||
bloody_hands = max(0, bloody_hands - used_blood_amount) //use up some blood
|
||||
|
||||
if (length(message) > max_length)
|
||||
message += "-"
|
||||
src << "<span class='warning'>You ran out of blood to write with!</span>"
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/writing/W = new(T)
|
||||
W.basecolor = (hand_blood_color) ? hand_blood_color : "#A10808"
|
||||
W.update_icon()
|
||||
W.message = message
|
||||
W.add_fingerprint(src)
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[M.species.attack_verb]ed [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [M.species.attack_verb]ed by [M.name] ([M.ckey])</font>")
|
||||
log_attack("[M.name] ([M.ckey]) [M.species.attack_verb]ed [src.name] ([src.ckey])")
|
||||
msg_admin_attack("[key_name(M)] [M.species.attack_verb]ed [key_name(src)]")
|
||||
|
||||
var/damage = rand(0, 5)//BS12 EDIT
|
||||
if(!damage)
|
||||
@@ -153,7 +153,7 @@
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been disarmed by [M.name] ([M.ckey])</font>")
|
||||
|
||||
log_attack("[M.name] ([M.ckey]) disarmed [src.name] ([src.ckey])")
|
||||
msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey])")
|
||||
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
|
||||
@@ -40,16 +40,24 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/adjustBruteLoss(var/amount)
|
||||
if(species && species.brute_mod)
|
||||
amount = amount*species.brute_mod
|
||||
|
||||
if(amount > 0)
|
||||
take_overall_damage(amount, 0)
|
||||
else
|
||||
heal_overall_damage(-amount, 0)
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
|
||||
/mob/living/carbon/human/adjustFireLoss(var/amount)
|
||||
if(species && species.burn_mod)
|
||||
amount = amount*species.burn_mod
|
||||
|
||||
if(amount > 0)
|
||||
take_overall_damage(0, amount)
|
||||
else
|
||||
heal_overall_damage(0, -amount)
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
|
||||
/mob/living/carbon/human/Stun(amount)
|
||||
if(HULK in mutations) return
|
||||
@@ -91,6 +99,8 @@
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.display_name] is shaped normally again.</span>"
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
|
||||
////////////////////////////////////////////
|
||||
|
||||
//Returns a list of damaged organs
|
||||
@@ -118,6 +128,7 @@
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
if(picked.heal_damage(brute,burn))
|
||||
UpdateDamageIcon()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
updatehealth()
|
||||
|
||||
//Damages ONE external organ, organ gets randomly selected from damagable ones.
|
||||
@@ -129,6 +140,7 @@
|
||||
var/datum/organ/external/picked = pick(parts)
|
||||
if(picked.take_damage(brute,burn,sharp))
|
||||
UpdateDamageIcon()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
updatehealth()
|
||||
|
||||
|
||||
@@ -150,6 +162,7 @@
|
||||
|
||||
parts -= picked
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
if(update) UpdateDamageIcon()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
@@ -169,6 +182,7 @@
|
||||
|
||||
parts -= picked
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
if(update) UpdateDamageIcon()
|
||||
|
||||
|
||||
@@ -178,8 +192,9 @@
|
||||
This function restores the subjects blood to max.
|
||||
*/
|
||||
/mob/living/carbon/human/proc/restore_blood()
|
||||
var/blood_volume = vessel.get_reagent_amount("blood")
|
||||
vessel.add_reagent("blood",560.0-blood_volume)
|
||||
if(!species.flags & NO_BLOOD)
|
||||
var/blood_volume = vessel.get_reagent_amount("blood")
|
||||
vessel.add_reagent("blood",560.0-blood_volume)
|
||||
|
||||
|
||||
/*
|
||||
@@ -194,6 +209,7 @@ This function restores all organs.
|
||||
if(istype(E, /datum/organ/external))
|
||||
if (E.heal_damage(brute, burn))
|
||||
UpdateDamageIcon()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
else
|
||||
return 0
|
||||
return
|
||||
@@ -237,6 +253,7 @@ This function restores all organs.
|
||||
|
||||
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
|
||||
//Embedded projectile code.
|
||||
if(!organ) return
|
||||
@@ -245,10 +262,12 @@ This function restores all organs.
|
||||
if( (damage > (10*W.w_class)) && ( (sharp && !ismob(W.loc)) || prob(damage/W.w_class) ) )
|
||||
organ.implants += W
|
||||
visible_message("<span class='danger'>\The [W] sticks in the wound!</span>")
|
||||
embedded_flag = 1
|
||||
src.verbs += /mob/proc/yank_out_object
|
||||
W.add_blood(src)
|
||||
if(ismob(W.loc))
|
||||
var/mob/living/H = W.loc
|
||||
H.drop_item()
|
||||
W.loc = src
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -88,18 +88,20 @@ emp_act
|
||||
return
|
||||
//END TASER NERF
|
||||
|
||||
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
|
||||
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
|
||||
|
||||
var/armor = checkarmor(organ, "bullet")
|
||||
var/armor = checkarmor(organ, "bullet")
|
||||
|
||||
if((P.embed && prob(20 + max(P.damage - armor, -10))) && P.damage_type == BRUTE)
|
||||
var/obj/item/weapon/shard/shrapnel/SP = new()
|
||||
(SP.name) = "[P.name] shrapnel"
|
||||
(SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]."
|
||||
(SP.loc) = organ
|
||||
organ.implants += SP
|
||||
visible_message("<span class='danger'>The projectile sticks in the wound!</span>")
|
||||
SP.add_blood(src)
|
||||
if((P.embed && prob(20 + max(P.damage - armor, -10))) && P.damage_type == BRUTE)
|
||||
var/obj/item/weapon/shard/shrapnel/SP = new()
|
||||
(SP.name) = "[P.name] shrapnel"
|
||||
(SP.desc) = "[SP.desc] It looks like it was fired from [P.shot_from]."
|
||||
(SP.loc) = organ
|
||||
organ.implants += SP
|
||||
visible_message("<span class='danger'>The projectile sticks in the wound!</span>")
|
||||
embedded_flag = 1
|
||||
src.verbs += /mob/proc/yank_out_object
|
||||
SP.add_blood(src)
|
||||
|
||||
return (..(P , def_zone))
|
||||
|
||||
@@ -134,6 +136,16 @@ emp_act
|
||||
protection += C.armor[type]
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/proc/check_head_coverage()
|
||||
|
||||
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
|
||||
for(var/bp in body_parts)
|
||||
if(!bp) continue
|
||||
if(bp && istype(bp ,/obj/item/clothing))
|
||||
var/obj/item/clothing/C = bp
|
||||
if(C.body_parts_covered & HEAD)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/attack_text = "the attack")
|
||||
if(l_hand && istype(l_hand, /obj/item/weapon))//Current base is the prob(50-d/3)
|
||||
@@ -185,14 +197,14 @@ emp_act
|
||||
target_zone = user.zone_sel.selecting
|
||||
if(!target_zone)
|
||||
visible_message("\red <B>[user] misses [src] with \the [I]!")
|
||||
return
|
||||
return 0
|
||||
|
||||
var/datum/organ/external/affecting = get_organ(target_zone)
|
||||
if (!affecting)
|
||||
return
|
||||
return 0
|
||||
if(affecting.status & ORGAN_DESTROYED)
|
||||
user << "What [affecting.display_name]?"
|
||||
return
|
||||
return 0
|
||||
var/hit_area = affecting.display_name
|
||||
|
||||
if((user != src) && check_shields(I.force, "the [I.name]"))
|
||||
@@ -209,7 +221,7 @@ emp_act
|
||||
var/obj/item/weapon/card/emag/emag = I
|
||||
emag.uses--
|
||||
affecting.sabotaged = 1
|
||||
return
|
||||
return 1
|
||||
|
||||
if(I.attack_verb.len)
|
||||
visible_message("\red <B>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</B>")
|
||||
@@ -264,6 +276,7 @@ emp_act
|
||||
|
||||
if(bloody)
|
||||
bloody_body(src)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
|
||||
if (gloves)
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
|
||||
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/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
|
||||
var/list/bad_external_organs = list()// organs we check until they are good.
|
||||
|
||||
var/xylophone = 0 //For the spoooooooky xylophone cooldown
|
||||
|
||||
var/mob/remoteview_target = null
|
||||
var/hand_blood_color
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
/mob/living/carbon/human/movement_delay()
|
||||
var/tally = 0
|
||||
|
||||
if(species && species.flags & IS_SLOW)
|
||||
tally = 7
|
||||
|
||||
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
|
||||
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
if(embedded_flag)
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
if(reagents.has_reagent("hyperzine")) return -1
|
||||
|
||||
if(reagents.has_reagent("nuka_cola")) return -1
|
||||
|
||||
var/health_deficiency = (100 - health - halloss)
|
||||
var/health_deficiency = (100 - health + halloss)
|
||||
if(health_deficiency >= 40) tally += (health_deficiency / 25)
|
||||
|
||||
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
|
||||
|
||||
@@ -81,20 +81,20 @@
|
||||
|
||||
if (W == wear_suit)
|
||||
if(s_store)
|
||||
u_equip(s_store)
|
||||
drop_from_inventory(s_store)
|
||||
if(W)
|
||||
success = 1
|
||||
wear_suit = null
|
||||
update_inv_wear_suit()
|
||||
else if (W == w_uniform)
|
||||
if (r_store)
|
||||
u_equip(r_store)
|
||||
drop_from_inventory(r_store)
|
||||
if (l_store)
|
||||
u_equip(l_store)
|
||||
drop_from_inventory(l_store)
|
||||
if (wear_id)
|
||||
u_equip(wear_id)
|
||||
drop_from_inventory(wear_id)
|
||||
if (belt)
|
||||
u_equip(belt)
|
||||
drop_from_inventory(belt)
|
||||
w_uniform = null
|
||||
success = 1
|
||||
update_inv_w_uniform()
|
||||
|
||||
@@ -63,6 +63,9 @@
|
||||
in_stasis = istype(loc, /obj/structure/closet/body_bag/cryobag) && loc:opened == 0
|
||||
if(in_stasis) loc:used++
|
||||
|
||||
if(life_tick%30==15)
|
||||
hud_updateflag = 1022
|
||||
|
||||
//No need to update all of these procs if the guy is dead.
|
||||
if(stat != DEAD && !in_stasis)
|
||||
if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath
|
||||
@@ -101,11 +104,14 @@
|
||||
|
||||
handle_stasis_bag()
|
||||
|
||||
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
|
||||
return //We go ahead and process them 5 times for HUD images and other stuff though.
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
handle_environment(environment)
|
||||
handle_environment(environment) //Optimized a good bit.
|
||||
|
||||
//Status updates, death etc.
|
||||
handle_regular_status_updates() //TODO: optimise ~Carn
|
||||
handle_regular_status_updates() //Optimized a bit
|
||||
update_canmove()
|
||||
|
||||
//Update our name based on whether our face is obscured/disfigured
|
||||
@@ -179,7 +185,7 @@
|
||||
if (prob(3))
|
||||
switch(pick(1,2,3))
|
||||
if(1)
|
||||
say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that faggot 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>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
|
||||
say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that meatball 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>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
|
||||
if(2)
|
||||
say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!"))
|
||||
if(3)
|
||||
@@ -220,12 +226,13 @@
|
||||
if((COLD_RESISTANCE in mutations) || (prob(1)))
|
||||
heal_organ_damage(0,1)
|
||||
|
||||
if ((HULK in mutations) && health <= 25)
|
||||
mutations.Remove(HULK)
|
||||
update_mutations() //update our mutation overlays
|
||||
src << "\red You suddenly feel very weak."
|
||||
Weaken(3)
|
||||
emote("collapse")
|
||||
// DNA2 - Gene processing.
|
||||
// The HULK stuff that was here is now in the hulk gene.
|
||||
for(var/datum/dna/gene/gene in dna_genes)
|
||||
if(!gene.block)
|
||||
continue
|
||||
if(gene.is_active(src))
|
||||
gene.OnMobLife(src)
|
||||
|
||||
if (radiation)
|
||||
if (radiation > 100)
|
||||
@@ -286,7 +293,7 @@
|
||||
proc/breathe()
|
||||
if(reagents.has_reagent("lexorin")) return
|
||||
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
|
||||
if(species && species.flags & NO_BREATHE) return
|
||||
if(species && (species.flags & NO_BREATHE || species.flags & IS_SYNTHETIC)) return
|
||||
|
||||
var/datum/organ/internal/lungs/L = internal_organs["lungs"]
|
||||
L.process()
|
||||
@@ -324,7 +331,7 @@
|
||||
|
||||
breath = loc.remove_air(breath_moles)
|
||||
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/gas))
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/gas) && breath)
|
||||
var/obj/item/clothing/mask/gas/G = wear_mask
|
||||
var/datum/gas_mixture/filtered = new
|
||||
|
||||
@@ -379,7 +386,7 @@
|
||||
|
||||
//spread some viruses while we are at it
|
||||
if (virus2.len > 0)
|
||||
if (get_infection_chance(src) && prob(20))
|
||||
if (prob(10) && get_infection_chance(src))
|
||||
// log_debug("[src] : Exhaling some viruses")
|
||||
for(var/mob/living/carbon/M in view(1,src))
|
||||
src.spread_disease_to(M)
|
||||
@@ -571,25 +578,23 @@
|
||||
else
|
||||
loc_temp = environment.temperature
|
||||
|
||||
//world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]"
|
||||
if(abs(loc_temp - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.toxins < MOLES_PLASMA_VISIBLE)
|
||||
return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
|
||||
|
||||
//Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit.
|
||||
if(stat != 2)
|
||||
stabilize_temperature_from_calories()
|
||||
|
||||
// log_debug("Adjusting to atmosphere.")
|
||||
//After then, it reacts to the surrounding atmosphere based on your thermal protection
|
||||
if(loc_temp < BODYTEMP_COLD_DAMAGE_LIMIT) //Place is colder than we are
|
||||
var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
|
||||
if(thermal_protection < 1)
|
||||
var/amt = min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
|
||||
// log_debug("[loc_temp] is Cold. Cooling by [amt]")
|
||||
bodytemperature += amt
|
||||
else if (loc_temp > BODYTEMP_HEAT_DAMAGE_LIMIT) //Place is hotter than we are
|
||||
var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
|
||||
if(thermal_protection < 1)
|
||||
var/amt = min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
|
||||
// log_debug("[loc_temp] is Heat. Heating up by [amt]")
|
||||
bodytemperature += amt
|
||||
|
||||
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
|
||||
@@ -639,7 +644,15 @@
|
||||
pressure_alert = 0
|
||||
else if(adjusted_pressure >= species.hazard_low_pressure)
|
||||
pressure_alert = -1
|
||||
|
||||
if(species && species.flags & IS_SYNTHETIC)
|
||||
bodytemperature += 0.5 * TEMPERATURE_DAMAGE_COEFFICIENT //Synthetics suffer overheating in a vaccuum. ~Z
|
||||
|
||||
else
|
||||
|
||||
if(species && species.flags & IS_SYNTHETIC)
|
||||
bodytemperature += 1 * TEMPERATURE_DAMAGE_COEFFICIENT
|
||||
|
||||
if( !(COLD_RESISTANCE in mutations))
|
||||
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
|
||||
pressure_alert = -2
|
||||
@@ -671,7 +684,7 @@
|
||||
|
||||
proc/stabilize_temperature_from_calories()
|
||||
var/body_temperature_difference = 310.15 - bodytemperature
|
||||
if (abs(body_temperature_difference) < 0.01)
|
||||
if (abs(body_temperature_difference) < 0.5)
|
||||
return //fuck this precision
|
||||
switch(bodytemperature)
|
||||
if(-INFINITY to 260.15) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
|
||||
@@ -866,7 +879,15 @@
|
||||
*/
|
||||
|
||||
proc/handle_chemicals_in_body()
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
if(reagents && !(species.flags & IS_SYNTHETIC)) //Synths don't process reagents.
|
||||
var/alien = 0 //Not the best way to handle it, but neater than checking this for every single reagent proc.
|
||||
if(species && species.name == "Diona")
|
||||
alien = 1
|
||||
else if(species && species.name == "Vox")
|
||||
alien = 2
|
||||
reagents.metabolize(src,alien)
|
||||
|
||||
var/total_plasmaloss = 0
|
||||
for(var/obj/item/I in src)
|
||||
if(I.contaminated)
|
||||
@@ -885,12 +906,15 @@
|
||||
nutrition += light_amount
|
||||
traumatic_shock -= light_amount
|
||||
|
||||
if(nutrition > 500)
|
||||
nutrition = 500
|
||||
if(light_amount > 5) //if there's enough light, heal
|
||||
adjustBruteLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
if(species.flags & IS_PLANT)
|
||||
if(nutrition > 500)
|
||||
nutrition = 500
|
||||
if(light_amount >= 3) //if there's enough light, heal
|
||||
adjustBruteLoss(-(light_amount))
|
||||
adjustToxLoss(-(light_amount))
|
||||
adjustOxyLoss(-(light_amount))
|
||||
//TODO: heal wounds, heal broken limbs.
|
||||
|
||||
if(dna && dna.mutantrace == "shadow")
|
||||
var/light_amount = 0
|
||||
if(isturf(loc))
|
||||
@@ -955,7 +979,7 @@
|
||||
dizziness = max(0, dizziness - 3)
|
||||
jitteriness = max(0, jitteriness - 3)
|
||||
|
||||
handle_trace_chems()
|
||||
if(!(species.flags & IS_SYNTHETIC)) handle_trace_chems()
|
||||
|
||||
var/datum/organ/internal/liver/liver = internal_organs["liver"]
|
||||
liver.process()
|
||||
@@ -974,8 +998,8 @@
|
||||
else //ALIVE. LIGHTS ARE ON
|
||||
updatehealth() //TODO
|
||||
if(!in_stasis)
|
||||
handle_organs()
|
||||
handle_blood()
|
||||
handle_organs() //Optimized.
|
||||
handle_blood()
|
||||
|
||||
if(health <= config.health_threshold_dead || brain_op_stage == 4.0)
|
||||
death()
|
||||
@@ -1047,6 +1071,13 @@
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-1)
|
||||
|
||||
if(embedded_flag && !(life_tick % 10))
|
||||
var/list/E
|
||||
E = get_visible_implants(0)
|
||||
if(!E.len)
|
||||
embedded_flag = 0
|
||||
|
||||
|
||||
//Eyes
|
||||
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
|
||||
blinded = 1
|
||||
@@ -1079,30 +1110,39 @@
|
||||
|
||||
if(stuttering)
|
||||
stuttering = max(stuttering-1, 0)
|
||||
if (src.slurring)
|
||||
if (slurring)
|
||||
slurring = max(slurring-1, 0)
|
||||
if(silent)
|
||||
silent = max(silent-1, 0)
|
||||
|
||||
if(druggy)
|
||||
druggy = max(druggy-1, 0)
|
||||
|
||||
/*
|
||||
// Increase germ_level regularly
|
||||
if(prob(40))
|
||||
germ_level += 1
|
||||
// If you're dirty, your gloves will become dirty, too.
|
||||
if(gloves && germ_level > gloves.germ_level && prob(10))
|
||||
gloves.germ_level += 1
|
||||
*/
|
||||
return 1
|
||||
|
||||
proc/handle_regular_hud_updates()
|
||||
if(hud_updateflag)
|
||||
handle_hud_list()
|
||||
|
||||
|
||||
if(!client) return 0
|
||||
|
||||
if(hud_updateflag)
|
||||
handle_hud_list()
|
||||
|
||||
|
||||
for(var/image/hud in client.images)
|
||||
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
|
||||
client.images.Remove(hud)
|
||||
|
||||
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
|
||||
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg)
|
||||
|
||||
update_action_buttons()
|
||||
|
||||
@@ -1181,6 +1221,13 @@
|
||||
see_in_dark = 8
|
||||
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
if(healths) healths.icon_state = "health7" //DEAD healthmeter
|
||||
if(client)
|
||||
if(client.view != world.view)
|
||||
if(locate(/obj/item/weapon/gun/energy/sniperrifle, contents))
|
||||
var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in src
|
||||
if(s.zoom)
|
||||
s.zoom()
|
||||
|
||||
else
|
||||
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
|
||||
see_in_dark = species.darksight
|
||||
@@ -1232,10 +1279,13 @@
|
||||
var/obj/item/clothing/glasses/G = glasses
|
||||
if(istype(G))
|
||||
see_in_dark += G.darkness_view
|
||||
if(G.vision_flags)
|
||||
if(G.vision_flags) // MESONS
|
||||
sight |= G.vision_flags
|
||||
if(!druggy)
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
if(istype(G,/obj/item/clothing/glasses/night))
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
client.screen += global_hud.nvg
|
||||
|
||||
/* HUD shit goes here, as long as it doesn't modify sight flags */
|
||||
// The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
|
||||
@@ -1253,6 +1303,8 @@
|
||||
else if(!seer)
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
|
||||
|
||||
if(healths)
|
||||
if (analgesic)
|
||||
healths.icon_state = "health_health_numb"
|
||||
@@ -1262,7 +1314,7 @@
|
||||
if(2) healths.icon_state = "health7"
|
||||
else
|
||||
//switch(health - halloss)
|
||||
switch(100 - traumatic_shock)
|
||||
switch(100 - ((species && species.flags & NO_PAIN & !IS_SYNTHETIC) ? 0 : traumatic_shock))
|
||||
if(100 to INFINITY) healths.icon_state = "health0"
|
||||
if(80 to 100) healths.icon_state = "health1"
|
||||
if(60 to 80) healths.icon_state = "health2"
|
||||
@@ -1371,30 +1423,35 @@
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
V.cure(src)
|
||||
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.virus2.len)
|
||||
for (var/ID in B.virus2)
|
||||
var/datum/disease2/disease/V = B.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
for(var/obj/effect/decal/cleanable/O in view(1,src))
|
||||
if(istype(O,/obj/effect/decal/cleanable/blood))
|
||||
var/obj/effect/decal/cleanable/blood/B = O
|
||||
if(B.virus2.len)
|
||||
for (var/ID in B.virus2)
|
||||
var/datum/disease2/disease/V = B.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
|
||||
if(M.virus2.len)
|
||||
for (var/ID in M.virus2)
|
||||
var/datum/disease2/disease/V = M.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
else if(istype(O,/obj/effect/decal/cleanable/mucus))
|
||||
var/obj/effect/decal/cleanable/mucus/M = O
|
||||
if(M.virus2.len)
|
||||
for (var/ID in M.virus2)
|
||||
var/datum/disease2/disease/V = M.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
|
||||
CRASH("virus2 nulled before calling activate()")
|
||||
else
|
||||
V.activate(src)
|
||||
// activate may have deleted the virus
|
||||
if(!V) continue
|
||||
|
||||
// check if we're immune
|
||||
if(V.antigen & src.antibodies)
|
||||
V.dead = 1
|
||||
if(virus2.len)
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
|
||||
CRASH("virus2 nulled before calling activate()")
|
||||
else
|
||||
V.activate(src)
|
||||
// activate may have deleted the virus
|
||||
if(!V) continue
|
||||
|
||||
// check if we're immune
|
||||
if(V.antigen & src.antibodies)
|
||||
V.dead = 1
|
||||
|
||||
return
|
||||
|
||||
@@ -1422,7 +1479,7 @@
|
||||
handle_shock()
|
||||
..()
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(analgesic) return // analgesic avoids all traumatic shock temporarily
|
||||
if(analgesic || (species && species.flags & NO_PAIN)) return // analgesic avoids all traumatic shock temporarily
|
||||
|
||||
if(health < config.health_threshold_softcrit)// health 0 makes you immediately collapse
|
||||
shock_stage = max(shock_stage, 61)
|
||||
@@ -1471,8 +1528,11 @@
|
||||
Weaken(20)
|
||||
|
||||
proc/handle_pulse()
|
||||
|
||||
if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
|
||||
|
||||
if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse.
|
||||
|
||||
if(stat == DEAD)
|
||||
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
|
||||
|
||||
@@ -1507,6 +1567,149 @@
|
||||
|
||||
return temp
|
||||
|
||||
/*
|
||||
Called by life(), instead of having the individual hud items update icons each tick and check for status changes
|
||||
we only set those statuses and icons upon changes. Then those HUD items will simply add those pre-made images.
|
||||
This proc below is only called when those HUD elements need to change as determined by the mobs hud_updateflag.
|
||||
*/
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_hud_list()
|
||||
|
||||
if(hud_updateflag & 1 << HEALTH_HUD)
|
||||
var/image/holder = hud_list[HEALTH_HUD]
|
||||
if(stat == 2)
|
||||
holder.icon_state = "hudhealth-100" // X_X
|
||||
else
|
||||
holder.icon_state = "hud[RoundHealth(health)]"
|
||||
|
||||
hud_list[HEALTH_HUD] = holder
|
||||
|
||||
if(hud_updateflag & 1 << STATUS_HUD)
|
||||
var/foundVirus = 0
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(!D.hidden[SCANNER])
|
||||
foundVirus++
|
||||
for (var/ID in virus2)
|
||||
if (ID in virusDB)
|
||||
foundVirus = 1
|
||||
break
|
||||
|
||||
var/image/holder = hud_list[STATUS_HUD]
|
||||
var/image/holder2 = hud_list[STATUS_HUD_OOC]
|
||||
if(stat == 2)
|
||||
holder.icon_state = "huddead"
|
||||
holder2.icon_state = "huddead"
|
||||
else if(status_flags & XENO_HOST)
|
||||
holder.icon_state = "hudxeno"
|
||||
holder2.icon_state = "hudxeno"
|
||||
else if(foundVirus)
|
||||
holder.icon_state = "hudill"
|
||||
else if(has_brain_worms())
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(B.controlling)
|
||||
holder.icon_state = "hudbrainworm"
|
||||
else
|
||||
holder.icon_state = "hudhealthy"
|
||||
holder2.icon_state = "hudbrainworm"
|
||||
else
|
||||
holder.icon_state = "hudhealthy"
|
||||
if(virus2.len)
|
||||
holder2.icon_state = "hudill"
|
||||
else
|
||||
holder2.icon_state = "hudhealthy"
|
||||
|
||||
hud_list[STATUS_HUD] = holder
|
||||
hud_list[STATUS_HUD_OOC] = holder2
|
||||
|
||||
if(hud_updateflag & 1 << ID_HUD)
|
||||
var/image/holder = hud_list[ID_HUD]
|
||||
if(wear_id)
|
||||
var/obj/item/weapon/card/id/I = wear_id.GetID()
|
||||
if(I)
|
||||
holder.icon_state = "hud[ckey(I.GetJobName())]"
|
||||
else
|
||||
holder.icon_state = "hudunknown"
|
||||
else
|
||||
holder.icon_state = "hudunknown"
|
||||
|
||||
|
||||
hud_list[ID_HUD] = holder
|
||||
|
||||
if(hud_updateflag & 1 << WANTED_HUD)
|
||||
var/image/holder = hud_list[WANTED_HUD]
|
||||
holder.icon_state = "hudblank"
|
||||
var/perpname = name
|
||||
if(wear_id)
|
||||
var/obj/item/weapon/card/id/I = wear_id.GetID()
|
||||
if(I)
|
||||
perpname = I.registered_name
|
||||
|
||||
for(var/datum/data/record/E in data_core.general)
|
||||
if(E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.security)
|
||||
if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
|
||||
holder.icon_state = "hudwanted"
|
||||
break
|
||||
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated"))
|
||||
holder.icon_state = "hudprisoner"
|
||||
break
|
||||
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled"))
|
||||
holder.icon_state = "hudparolled"
|
||||
break
|
||||
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released"))
|
||||
holder.icon_state = "hudreleased"
|
||||
break
|
||||
hud_list[WANTED_HUD] = holder
|
||||
|
||||
if(hud_updateflag & 1 << IMPLOYAL_HUD || hud_updateflag & 1 << IMPCHEM_HUD || hud_updateflag & 1 << IMPTRACK_HUD)
|
||||
var/image/holder1 = hud_list[IMPTRACK_HUD]
|
||||
var/image/holder2 = hud_list[IMPLOYAL_HUD]
|
||||
var/image/holder3 = hud_list[IMPCHEM_HUD]
|
||||
|
||||
holder1.icon_state = "hudblank"
|
||||
holder2.icon_state = "hudblank"
|
||||
holder3.icon_state = "hudblank"
|
||||
|
||||
for(var/obj/item/weapon/implant/I in src)
|
||||
if(I.implanted)
|
||||
if(istype(I,/obj/item/weapon/implant/tracking))
|
||||
holder1.icon_state = "hud_imp_tracking"
|
||||
if(istype(I,/obj/item/weapon/implant/loyalty))
|
||||
holder2.icon_state = "hud_imp_loyal"
|
||||
if(istype(I,/obj/item/weapon/implant/chem))
|
||||
holder3.icon_state = "hud_imp_chem"
|
||||
|
||||
hud_list[IMPTRACK_HUD] = holder1
|
||||
hud_list[IMPLOYAL_HUD] = holder2
|
||||
hud_list[IMPCHEM_HUD] = holder3
|
||||
|
||||
if(hud_updateflag & 1 << SPECIALROLE_HUD)
|
||||
var/image/holder = hud_list[SPECIALROLE_HUD]
|
||||
holder.icon_state = "hudblank"
|
||||
if(mind)
|
||||
|
||||
switch(mind.special_role)
|
||||
if("traitor","Syndicate")
|
||||
holder.icon_state = "hudsyndicate"
|
||||
if("Revolutionary")
|
||||
holder.icon_state = "hudrevolutionary"
|
||||
if("Head Revolutionary")
|
||||
holder.icon_state = "hudheadrevolutionary"
|
||||
if("Cultist")
|
||||
holder.icon_state = "hudcultist"
|
||||
if("Changeling")
|
||||
holder.icon_state = "hudchangeling"
|
||||
if("Wizard","Fake Wizard")
|
||||
holder.icon_state = "hudwizard"
|
||||
if("Death Commando")
|
||||
holder.icon_state = "huddeathsquad"
|
||||
if("Ninja")
|
||||
holder.icon_state = "hudninja"
|
||||
|
||||
hud_list[SPECIALROLE_HUD] = holder
|
||||
hud_updateflag = 0
|
||||
|
||||
|
||||
#undef HUMAN_MAX_OXYLOSS
|
||||
#undef HUMAN_CRIT_MAX_OXYLOSS
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = ninjaspeak(temp_message[H])
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
message = list2text(temp_message, " ")
|
||||
message = replacetext(message, "o", "<22>")
|
||||
message = replacetext(message, "p", "<22>")
|
||||
message = replacetext(message, "l", "<22>")
|
||||
@@ -71,4 +71,3 @@
|
||||
|
||||
/mob/living/carbon/human/proc/GetSpecialVoice()
|
||||
return special_voice
|
||||
|
||||
|
||||
@@ -113,13 +113,14 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
#define HAIR_LAYER 14 //TODO: make part of head layer?
|
||||
#define FACEMASK_LAYER 15
|
||||
#define HEAD_LAYER 16
|
||||
#define HANDCUFF_LAYER 17
|
||||
#define LEGCUFF_LAYER 18
|
||||
#define L_HAND_LAYER 19
|
||||
#define R_HAND_LAYER 20
|
||||
#define TAIL_LAYER 21 //bs12 specific. this hack is probably gonna come back to haunt me
|
||||
#define TARGETED_LAYER 22 //BS12: Layer for the target overlay from weapon targeting system
|
||||
#define TOTAL_LAYERS 22
|
||||
#define COLLAR_LAYER 17
|
||||
#define HANDCUFF_LAYER 18
|
||||
#define LEGCUFF_LAYER 19
|
||||
#define TAIL_LAYER 20 //bs12 specific. this hack is probably gonna come back to haunt me
|
||||
#define L_HAND_LAYER 21
|
||||
#define R_HAND_LAYER 22
|
||||
#define TARGETED_LAYER 23 //BS12: Layer for the target overlay from weapon targeting system
|
||||
#define TOTAL_LAYERS 23
|
||||
//////////////////////////////////
|
||||
|
||||
/mob/living/carbon/human
|
||||
@@ -365,8 +366,18 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
var/add_image = 0
|
||||
var/g = "m"
|
||||
if(gender == FEMALE) g = "f"
|
||||
// DNA2 - Drawing underlays.
|
||||
for(var/datum/dna/gene/gene in dna_genes)
|
||||
if(!gene.block)
|
||||
continue
|
||||
if(gene.is_active(src))
|
||||
var/underlay=gene.OnDrawUnderlays(src,g,fat)
|
||||
if(underlay)
|
||||
standing.underlays += underlay
|
||||
add_image = 1
|
||||
for(var/mut in mutations)
|
||||
switch(mut)
|
||||
/*
|
||||
if(HULK)
|
||||
if(fat)
|
||||
standing.underlays += "hulk_[fat]_s"
|
||||
@@ -379,6 +390,7 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
if(TK)
|
||||
standing.underlays += "telekinesishead[fat]_s"
|
||||
add_image = 1
|
||||
*/
|
||||
if(LASER)
|
||||
standing.overlays += "lasereyes_s"
|
||||
add_image = 1
|
||||
@@ -470,7 +482,9 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
standing.icon = ((w_uniform.icon_override) ? w_uniform.icon_override : 'icons/mob/uniform.dmi')
|
||||
|
||||
if(w_uniform.blood_DNA)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood")
|
||||
bloodsies.color = w_uniform.blood_color
|
||||
standing.overlays += bloodsies
|
||||
|
||||
if(w_uniform:hastie) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE.
|
||||
var/tie_color = w_uniform:hastie.item_color
|
||||
@@ -502,6 +516,10 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
overlays_standing[ID_LAYER] = null
|
||||
else
|
||||
overlays_standing[ID_LAYER] = null
|
||||
|
||||
hud_updateflag |= 1 << ID_HUD
|
||||
hud_updateflag |= 1 << WANTED_HUD
|
||||
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/update_inv_gloves(var/update_icons=1)
|
||||
@@ -510,12 +528,16 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
if(!t_state) t_state = gloves.icon_state
|
||||
var/image/standing = image("icon" = ((gloves.icon_override) ? gloves.icon_override : 'icons/mob/hands.dmi'), "icon_state" = "[t_state]")
|
||||
if(gloves.blood_DNA)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
bloodsies.color = gloves.blood_color
|
||||
standing.overlays += bloodsies
|
||||
gloves.screen_loc = ui_gloves
|
||||
overlays_standing[GLOVES_LAYER] = standing
|
||||
else
|
||||
if(blood_DNA)
|
||||
overlays_standing[GLOVES_LAYER] = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
bloodsies.color = hand_blood_color
|
||||
overlays_standing[GLOVES_LAYER] = bloodsies
|
||||
else
|
||||
overlays_standing[GLOVES_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
@@ -542,10 +564,17 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
if(shoes)
|
||||
var/image/standing = image("icon" = ((shoes.icon_override) ? shoes.icon_override : 'icons/mob/feet.dmi'), "icon_state" = "[shoes.icon_state]")
|
||||
if(shoes.blood_DNA)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
|
||||
overlays_standing[SHOES_LAYER] = standing
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
|
||||
bloodsies.color = shoes.blood_color
|
||||
standing.overlays += bloodsies
|
||||
overlays_standing[SHOES_LAYER] = standing
|
||||
else
|
||||
overlays_standing[SHOES_LAYER] = null
|
||||
if(feet_blood_DNA)
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
|
||||
bloodsies.color = feet_blood_color
|
||||
overlays_standing[SHOES_LAYER] = bloodsies
|
||||
else
|
||||
overlays_standing[SHOES_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/update_inv_s_store(var/update_icons=1)
|
||||
@@ -568,7 +597,9 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
else
|
||||
standing = image("icon" = ((head.icon_override) ? head.icon_override : 'icons/mob/head.dmi'), "icon_state" = "[head.icon_state]")
|
||||
if(head.blood_DNA)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood")
|
||||
bloodsies.color = head.blood_color
|
||||
standing.overlays += bloodsies
|
||||
overlays_standing[HEAD_LAYER] = standing
|
||||
else
|
||||
overlays_standing[HEAD_LAYER] = null
|
||||
@@ -597,7 +628,9 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
|
||||
if(wear_suit.blood_DNA)
|
||||
var/obj/item/clothing/suit/S = wear_suit
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood")
|
||||
bloodsies.color = wear_suit.blood_color
|
||||
standing.overlays += bloodsies
|
||||
|
||||
overlays_standing[SUIT_LAYER] = standing
|
||||
|
||||
@@ -608,6 +641,8 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
|
||||
update_tail_showing(0)
|
||||
|
||||
update_collar(0)
|
||||
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/update_inv_pockets(var/update_icons=1)
|
||||
@@ -621,7 +656,9 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
wear_mask.screen_loc = ui_mask //TODO
|
||||
var/image/standing = image("icon" = ((wear_mask.icon_override) ? wear_mask.icon_override : 'icons/mob/mask.dmi'), "icon_state" = "[wear_mask.icon_state]")
|
||||
if( !istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA )
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood")
|
||||
bloodsies.color = wear_mask.blood_color
|
||||
standing.overlays += bloodsies
|
||||
overlays_standing[FACEMASK_LAYER] = standing
|
||||
else
|
||||
overlays_standing[FACEMASK_LAYER] = null
|
||||
@@ -700,6 +737,22 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
|
||||
|
||||
//Adds a collar overlay above the helmet layer if the suit has one
|
||||
// Suit needs an identically named sprite in icons/mob/collar.dmi
|
||||
/mob/living/carbon/human/proc/update_collar(var/update_icons=1)
|
||||
var/icon/C = new('icons/mob/collar.dmi')
|
||||
var/image/standing = null
|
||||
|
||||
if(wear_suit)
|
||||
if(wear_suit.icon_state in C.IconStates())
|
||||
standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
|
||||
|
||||
overlays_standing[COLLAR_LAYER] = standing
|
||||
|
||||
if(update_icons) update_icons()
|
||||
|
||||
|
||||
// Used mostly for creating head items
|
||||
/mob/living/carbon/human/proc/generate_head_icon()
|
||||
//gender no longer matters for the mouth, although there should probably be seperate base head icons.
|
||||
@@ -752,6 +805,7 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
#undef BACK_LAYER
|
||||
#undef HAIR_LAYER
|
||||
#undef HEAD_LAYER
|
||||
#undef COLLAR_LAYER
|
||||
#undef HANDCUFF_LAYER
|
||||
#undef LEGCUFF_LAYER
|
||||
#undef L_HAND_LAYER
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = ninjaspeak(temp_message[H])
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
message = list2text(temp_message, " ")
|
||||
message = replacetext(message, "o", "<22>")
|
||||
message = replacetext(message, "p", "<22>")
|
||||
message = replacetext(message, "l", "<22>")
|
||||
|
||||
@@ -836,9 +836,9 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
flags = FPRINT | TABLEPASS | ONESIZEFITSALL | STOPSPRESSUREDMAGE
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
canremove = 0
|
||||
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
@@ -890,7 +890,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
unacidable = 1
|
||||
flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/effect/golemrune
|
||||
|
||||
@@ -2,6 +2,46 @@
|
||||
Tiny babby plant critter plus procs.
|
||||
*/
|
||||
|
||||
//Helper object for picking dionaea (and other creatures) up.
|
||||
/obj/item/weapon/holder
|
||||
name = "holder"
|
||||
desc = "You shouldn't ever see this."
|
||||
|
||||
/obj/item/weapon/holder/diona
|
||||
|
||||
name = "diona nymph"
|
||||
desc = "It's a tiny plant critter."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "nymph"
|
||||
slot_flags = SLOT_HEAD
|
||||
origin_tech = "magnets=3;biotech=5"
|
||||
|
||||
/obj/item/weapon/holder/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/item/weapon/holder/Del()
|
||||
//Hopefully this will stop the icon from remaining on human mobs.
|
||||
if(istype(loc,/mob/living))
|
||||
var/mob/living/A = src.loc
|
||||
src.loc = null
|
||||
A.update_icons()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/holder/process()
|
||||
if(!loc) del(src)
|
||||
|
||||
if(istype(loc,/turf) || !(contents.len))
|
||||
for(var/mob/M in contents)
|
||||
M.loc = get_turf(src)
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
for(var/mob/M in src.contents)
|
||||
M.attackby(W,user)
|
||||
|
||||
//Mob defines.
|
||||
/mob/living/carbon/monkey/diona
|
||||
name = "diona nymph"
|
||||
voice_name = "diona nymph"
|
||||
@@ -10,6 +50,27 @@
|
||||
var/list/donors = list()
|
||||
var/ready_evolve = 0
|
||||
|
||||
/mob/living/carbon/monkey/diona/attack_hand(mob/living/carbon/human/M as mob)
|
||||
|
||||
//Let people pick the little buggers up.
|
||||
if(M.a_intent == "help")
|
||||
if(M.species && M.species.name == "Diona")
|
||||
M << "You feel your being twine with that of [src] as it merges with your biomass."
|
||||
src << "You feel your being twine with that of [M] as you merge with its biomass."
|
||||
src.verbs += /mob/living/carbon/monkey/diona/proc/split
|
||||
src.verbs -= /mob/living/carbon/monkey/diona/proc/merge
|
||||
src.loc = M
|
||||
else
|
||||
var/obj/item/weapon/holder/diona/D = new(loc)
|
||||
src.loc = D
|
||||
D.name = loc.name
|
||||
D.attack_hand(M)
|
||||
M << "You scoop up [src]."
|
||||
src << "[M] scoops you up."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/carbon/monkey/diona/New()
|
||||
|
||||
..()
|
||||
@@ -17,9 +78,59 @@
|
||||
dna.mutantrace = "plant"
|
||||
greaterform = "Diona"
|
||||
add_language("Rootspeak")
|
||||
src.verbs += /mob/living/carbon/monkey/diona/proc/merge
|
||||
|
||||
//Verbs after this point.
|
||||
|
||||
/mob/living/carbon/monkey/diona/proc/merge()
|
||||
|
||||
set category = "Diona"
|
||||
set name = "Merge with gestalt"
|
||||
set desc = "Merge with another diona."
|
||||
|
||||
if(istype(src.loc,/mob/living/carbon))
|
||||
src.verbs -= /mob/living/carbon/monkey/diona/proc/merge
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(1,src))
|
||||
|
||||
if(!(src.Adjacent(C)) || !(C.client)) continue
|
||||
|
||||
if(istype(C,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/D = C
|
||||
if(D.species && D.species.name == "Diona")
|
||||
choices += C
|
||||
|
||||
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
|
||||
|
||||
if(!M || !src || !(src.Adjacent(M))) return
|
||||
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
M << "You feel your being twine with that of [src] as it merges with your biomass."
|
||||
src << "You feel your being twine with that of [M] as you merge with its biomass."
|
||||
src.loc = M
|
||||
src.verbs += /mob/living/carbon/monkey/diona/proc/split
|
||||
src.verbs -= /mob/living/carbon/monkey/diona/proc/merge
|
||||
else
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/diona/proc/split()
|
||||
|
||||
set category = "Diona"
|
||||
set name = "Split from gestalt"
|
||||
set desc = "Split away from your gestalt as a lone nymph."
|
||||
|
||||
if(!(istype(src.loc,/mob/living/carbon)))
|
||||
src.verbs -= /mob/living/carbon/monkey/diona/proc/split
|
||||
return
|
||||
|
||||
src.loc << "You feel a pang of loss as [src] splits away from your biomass."
|
||||
src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground."
|
||||
src.loc = get_turf(src)
|
||||
src.verbs -= /mob/living/carbon/monkey/diona/proc/split
|
||||
src.verbs += /mob/living/carbon/monkey/diona/proc/merge
|
||||
|
||||
/mob/living/carbon/monkey/diona/verb/fertilize_plant()
|
||||
|
||||
set category = "Diona"
|
||||
@@ -65,7 +176,7 @@
|
||||
set desc = "Grow to a more complex form."
|
||||
|
||||
if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist)
|
||||
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
||||
src << alert("You are currently not whitelisted to play as a full diona.")
|
||||
return 0
|
||||
|
||||
if(donors.len < 5)
|
||||
@@ -76,15 +187,23 @@
|
||||
src << "You have not yet consumed enough to grow..."
|
||||
return
|
||||
|
||||
src.split()
|
||||
src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark and twigs!","\red You begin to shift and quiver, then erupt in a shower of shed bark and twigs, attaining your adult form!")
|
||||
var/mob/living/carbon/human/adult = new(loc)
|
||||
|
||||
var/mob/living/carbon/human/adult = new(get_turf(src.loc))
|
||||
adult.set_species("Diona")
|
||||
|
||||
if(istype(loc,/obj/item/weapon/holder/diona))
|
||||
var/obj/item/weapon/holder/diona/L = loc
|
||||
src.loc = L.loc
|
||||
del(L)
|
||||
|
||||
for(var/datum/language/L in languages)
|
||||
adult.add_language(L.name)
|
||||
adult.regenerate_icons()
|
||||
|
||||
adult.name = src.name
|
||||
adult.real_name = src.real_name
|
||||
adult.name = "diona ([rand(100,999)])"
|
||||
adult.real_name = adult.name
|
||||
adult.ckey = src.ckey
|
||||
|
||||
for (var/obj/item/W in src.contents)
|
||||
@@ -97,20 +216,26 @@
|
||||
set desc = "Take a blood sample from a suitable donor."
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(1,src))
|
||||
if(C.real_name != real_name)
|
||||
choices += C
|
||||
for(var/mob/living/carbon/human/H in oview(1,src))
|
||||
choices += H
|
||||
|
||||
var/mob/living/M = input(src,"Who do you wish to take a sample from?") in null|choices
|
||||
var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices
|
||||
|
||||
if(!M || !src) return
|
||||
|
||||
if(M.species.flags & NO_BLOOD)
|
||||
src << "\red That donor has no blood to take."
|
||||
return
|
||||
|
||||
if(donors.Find(M.real_name))
|
||||
src << "\red That donor offers you nothing new."
|
||||
return
|
||||
|
||||
src.visible_message("\red [src] flicks out a feeler and neatly steals a sample of [M]'s blood.","\red You flick out a feeler and neatly steal a sample of [M]'s blood.")
|
||||
donors += M.real_name
|
||||
for(var/datum/language/L in M.languages)
|
||||
languages += L
|
||||
|
||||
spawn(25)
|
||||
update_progression()
|
||||
|
||||
@@ -123,7 +248,7 @@
|
||||
ready_evolve = 1
|
||||
src << "\green You feel ready to move on to your next stage of growth."
|
||||
else if(donors.len == 3)
|
||||
universal_speak = 1
|
||||
src << "\green You feel your awareness expand, and realize you know how to speak to the meat-creatures around you."
|
||||
universal_understand = 1
|
||||
src << "\green You feel your awareness expand, and realize you know how to understand the creatures around you."
|
||||
else
|
||||
src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind."
|
||||
src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind."
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
message = text("\red <B>[] is trying to remove []'s internals</B>", source, target)
|
||||
else
|
||||
message = text("\red <B>[] is trying to set on []'s internals.</B>", source, target)
|
||||
if("pockets")
|
||||
message = text("\red <B>[] is trying to empty []'s pockets</B>",source, target)
|
||||
else
|
||||
for(var/mob/M in viewers(target, null))
|
||||
M.show_message(message, 1)
|
||||
@@ -233,4 +235,4 @@
|
||||
|
||||
W.layer = 20
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
@@ -13,21 +13,25 @@
|
||||
set invisibility = 0
|
||||
set background = 1
|
||||
if (monkeyizing) return
|
||||
if (update_muts)
|
||||
update_muts=0
|
||||
domutcheck(src,null,MUTCHK_FORCED)
|
||||
..()
|
||||
|
||||
var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE
|
||||
if(loc)
|
||||
environment = loc.return_air()
|
||||
|
||||
if (stat != DEAD) //still breathing
|
||||
//First, resolve location and get a breath
|
||||
if(air_master.current_cycle%4==2)
|
||||
//Only try to take a breath every 4 seconds, unless suffocating
|
||||
breathe()
|
||||
else //Still give containing object the chance to interact
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
if (stat != DEAD)
|
||||
if(!istype(src,/mob/living/carbon/monkey/diona)) //still breathing
|
||||
//First, resolve location and get a breath
|
||||
if(air_master.current_cycle%4==2)
|
||||
//Only try to take a breath every 4 seconds, unless suffocating
|
||||
breathe()
|
||||
else //Still give containing object the chance to interact
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
|
||||
|
||||
//Updates the number of stored chemicals for powers
|
||||
@@ -74,6 +78,8 @@
|
||||
|
||||
if(prob(1))
|
||||
emote(pick("scratch","jump","roll","tail"))
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/calculate_affecting_pressure(var/pressure)
|
||||
..()
|
||||
@@ -128,7 +134,6 @@
|
||||
heal_overall_damage(rads,rads)
|
||||
adjustOxyLoss(-(rads))
|
||||
adjustToxLoss(-(rads))
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
if (radiation > 100)
|
||||
@@ -142,7 +147,6 @@
|
||||
radiation--
|
||||
if(prob(25))
|
||||
adjustToxLoss(1)
|
||||
updatehealth()
|
||||
|
||||
if(50 to 74)
|
||||
radiation -= 2
|
||||
@@ -152,7 +156,6 @@
|
||||
Weaken(3)
|
||||
src << "\red You feel weak."
|
||||
emote("collapse")
|
||||
updatehealth()
|
||||
|
||||
if(75 to 100)
|
||||
radiation -= 3
|
||||
@@ -162,7 +165,6 @@
|
||||
randmutb(src)
|
||||
domutcheck(src,null)
|
||||
emote("gasp")
|
||||
updatehealth()
|
||||
|
||||
proc/handle_virus_updates()
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
@@ -172,30 +174,36 @@
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
V.cure(src)
|
||||
|
||||
for(var/obj/effect/decal/cleanable/O in view(1,src))
|
||||
if(istype(O,/obj/effect/decal/cleanable/blood))
|
||||
var/obj/effect/decal/cleanable/blood/B = O
|
||||
if(B.virus2.len)
|
||||
for (var/ID in B.virus2)
|
||||
var/datum/disease2/disease/V = B.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.virus2.len)
|
||||
for (var/ID in B.virus2)
|
||||
var/datum/disease2/disease/V = B.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
|
||||
if(M.virus2.len)
|
||||
for (var/ID in M.virus2)
|
||||
var/datum/disease2/disease/V = M.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
else if(istype(O,/obj/effect/decal/cleanable/mucus))
|
||||
var/obj/effect/decal/cleanable/mucus/M = O
|
||||
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
|
||||
CRASH("virus2 nulled before calling activate()")
|
||||
else
|
||||
V.activate(src)
|
||||
// activate may have deleted the virus
|
||||
if(!V) continue
|
||||
if(M.virus2.len)
|
||||
for (var/ID in M.virus2)
|
||||
var/datum/disease2/disease/V = M.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
// check if we're immune
|
||||
if(V.antigen & src.antibodies)
|
||||
V.dead = 1
|
||||
if(virus2.len)
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
|
||||
CRASH("virus2 nulled before calling activate()")
|
||||
else
|
||||
V.activate(src)
|
||||
// activate may have deleted the virus
|
||||
if(!V) continue
|
||||
|
||||
// check if we're immune
|
||||
if(V.antigen & src.antibodies)
|
||||
V.dead = 1
|
||||
|
||||
return
|
||||
|
||||
@@ -388,6 +396,10 @@
|
||||
proc/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
|
||||
if(abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.toxins < MOLES_PLASMA_VISIBLE)
|
||||
return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
|
||||
|
||||
var/environment_heat_capacity = environment.heat_capacity()
|
||||
if(istype(get_turf(src), /turf/space))
|
||||
var/turf/heat_turf = get_turf(src)
|
||||
@@ -437,7 +449,7 @@
|
||||
|
||||
proc/handle_chemicals_in_body()
|
||||
|
||||
if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea nymphs need light or they get sad.
|
||||
if(alien) //Diona nymphs are the only alien monkey currently.
|
||||
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
||||
if(isturf(loc)) //else, there's considered to be no light
|
||||
var/turf/T = loc
|
||||
@@ -452,11 +464,12 @@
|
||||
if(nutrition > 500)
|
||||
nutrition = 500
|
||||
if(light_amount > 2) //if there's enough light, heal
|
||||
heal_overall_damage(1,1)
|
||||
adjustBruteLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
if(reagents && reagents.reagent_list.len)
|
||||
reagents.metabolize(src,alien)
|
||||
|
||||
if (drowsyness)
|
||||
drowsyness--
|
||||
@@ -465,24 +478,23 @@
|
||||
sleeping += 1
|
||||
Paralyse(5)
|
||||
|
||||
confused = max(0, confused - 1)
|
||||
// decrement dizziness counter, clamped to 0
|
||||
if(confused)
|
||||
confused = max(0, confused - 1)
|
||||
|
||||
if(resting)
|
||||
dizziness = max(0, dizziness - 5)
|
||||
else
|
||||
dizziness = max(0, dizziness - 1)
|
||||
|
||||
updatehealth()
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
proc/handle_regular_status_updates()
|
||||
updatehealth()
|
||||
|
||||
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
|
||||
blinded = 1
|
||||
silent = 0
|
||||
else //ALIVE. LIGHTS ARE ON
|
||||
updatehealth()
|
||||
if(health < config.health_threshold_dead || brain_op_stage == 4.0)
|
||||
death()
|
||||
blinded = 1
|
||||
|
||||
@@ -10,28 +10,32 @@
|
||||
|
||||
var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
|
||||
var/greaterform = "Human" // Used when humanizing a monkey.
|
||||
var/uni_append = "12C4E2" // Small appearance modifier for different species.
|
||||
icon_state = "monkey1"
|
||||
//var/uni_append = "12C4E2" // Small appearance modifier for different species.
|
||||
var/list/uni_append = list(0x12C,0x4E2) // Same as above for DNA2.
|
||||
var/update_muts = 1 // Monkey gene must be set at start.
|
||||
var/alien = 0 //Used for reagent metabolism.
|
||||
|
||||
/mob/living/carbon/monkey/tajara
|
||||
name = "farwa"
|
||||
voice_name = "farwa"
|
||||
speak_emote = list("mews")
|
||||
icon_state = "tajkey1"
|
||||
uni_append = "0A0E00"
|
||||
uni_append = list(0x0A0,0xE00) // 0A0E00
|
||||
|
||||
/mob/living/carbon/monkey/skrell
|
||||
name = "neaera"
|
||||
voice_name = "neaera"
|
||||
speak_emote = list("squicks")
|
||||
icon_state = "skrellkey1"
|
||||
uni_append = "01CC92"
|
||||
uni_append = list(0x01C,0xC92) // 01CC92
|
||||
|
||||
/mob/living/carbon/monkey/unathi
|
||||
name = "stok"
|
||||
voice_name = "stok"
|
||||
speak_emote = list("hisses")
|
||||
icon_state = "stokkey1"
|
||||
uni_append = "044C5D"
|
||||
uni_append = list(0x044,0xC5D) // 044C5D
|
||||
|
||||
/mob/living/carbon/monkey/New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
@@ -50,15 +54,25 @@
|
||||
dna.ResetSE()
|
||||
dna.ResetUI()
|
||||
//dna.uni_identity = "00600200A00E0110148FC01300B009"
|
||||
//dna.SetUI(list(0x006,0x002,0x00A,0x00E,0x011,0x014,0x8FC,0x013,0x00B,0x009))
|
||||
//dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
|
||||
//dna.SetSE(list(0x433,0x591,0x567,0x561,0x31E,0x137,0x633,0x34D,0x1C3,0x690,0x120,0x321,0x64D,0x4FE,0x4CD,0x615,0x44B,0x6C0,0x3F2,0x51B,0x6C6,0x0A4,0x282,0x1D2,0x6BA,0x3B0,0xFD6))
|
||||
dna.unique_enzymes = md5(name)
|
||||
//////////blah
|
||||
var/gendervar
|
||||
if (gender == MALE)
|
||||
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
|
||||
else
|
||||
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
|
||||
dna.uni_identity += "[gendervar][uni_append]"
|
||||
|
||||
// We're a monkey
|
||||
dna.SetSEState(MONKEYBLOCK, 1)
|
||||
dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
|
||||
// Fix gender
|
||||
dna.SetUIState(DNA_UI_GENDER, gender != MALE, 1)
|
||||
|
||||
// Set the blocks to uni_append, if needed.
|
||||
if(uni_append.len>0)
|
||||
for(var/b=1;b<=uni_append.len;b++)
|
||||
dna.SetUIValue(DNA_UI_LENGTH-(uni_append.len-b),uni_append[b], 1)
|
||||
dna.UpdateUI()
|
||||
|
||||
update_muts=1
|
||||
|
||||
..()
|
||||
update_icons()
|
||||
return
|
||||
@@ -87,6 +101,7 @@
|
||||
/mob/living/carbon/monkey/diona/New()
|
||||
|
||||
..()
|
||||
alien = 1
|
||||
gender = NEUTER
|
||||
dna.mutantrace = "plant"
|
||||
greaterform = "Diona"
|
||||
|
||||
@@ -32,13 +32,36 @@
|
||||
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
|
||||
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
|
||||
|
||||
var/brute_resist // Physical damage reduction.
|
||||
var/burn_resist // Burn damage reduction.
|
||||
var/brute_mod = null // Physical damage reduction/malus.
|
||||
var/burn_mod = null // Burn damage reduction/malus.
|
||||
|
||||
var/flags = 0 // Various specific features.
|
||||
|
||||
var/list/abilities = list() // For species-derived or admin-given powers
|
||||
|
||||
var/blood_color = "#A10808" //Red.
|
||||
var/flesh_color = "#FFC896" //Pink.
|
||||
|
||||
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
|
||||
|
||||
if(flags & IS_SYNTHETIC)
|
||||
for(var/datum/organ/external/E in H.organs)
|
||||
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
|
||||
E.status |= ORGAN_ROBOT
|
||||
for(var/datum/organ/internal/I in H.internal_organs)
|
||||
I.robotic = 2
|
||||
return
|
||||
|
||||
/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
|
||||
if(flags & IS_SYNTHETIC)
|
||||
//H.make_jittery(200) //S-s-s-s-sytem f-f-ai-i-i-i-i-lure-ure-ure-ure
|
||||
H.h_style = ""
|
||||
spawn(100)
|
||||
//H.is_jittery = 0
|
||||
//H.jitteriness = 0
|
||||
H.update_hair()
|
||||
return
|
||||
|
||||
/datum/species/human
|
||||
name = "Human"
|
||||
language = "Sol Common"
|
||||
@@ -68,7 +91,9 @@
|
||||
heat_level_2 = 480 //Default 400
|
||||
heat_level_3 = 1100 //Default 1000
|
||||
|
||||
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
|
||||
|
||||
flesh_color = "#34AF10"
|
||||
|
||||
/datum/species/tajaran
|
||||
name = "Tajaran"
|
||||
@@ -90,7 +115,9 @@
|
||||
|
||||
primitive = /mob/living/carbon/monkey/tajara
|
||||
|
||||
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
|
||||
/datum/species/skrell
|
||||
name = "Skrell"
|
||||
@@ -99,7 +126,9 @@
|
||||
language = "Skrellian"
|
||||
primitive = /mob/living/carbon/monkey/skrell
|
||||
|
||||
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR
|
||||
|
||||
flesh_color = "#8CD7A3"
|
||||
|
||||
/datum/species/vox
|
||||
name = "Vox"
|
||||
@@ -117,11 +146,36 @@
|
||||
eyes = "vox_eyes_s"
|
||||
breath_type = "nitrogen"
|
||||
|
||||
flags = NO_SCAN
|
||||
flags = NO_SCAN | NO_BLOOD
|
||||
|
||||
blood_color = "#2299FC"
|
||||
flesh_color = "#808D11"
|
||||
|
||||
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
|
||||
var/datum/organ/external/affected = H.get_organ("head")
|
||||
|
||||
//To avoid duplicates.
|
||||
for(var/obj/item/weapon/implant/cortical/imp in H.contents)
|
||||
affected.implants -= imp
|
||||
del(imp)
|
||||
|
||||
var/obj/item/weapon/implant/cortical/I = new(H)
|
||||
I.imp_in = H
|
||||
I.implanted = 1
|
||||
affected.implants += I
|
||||
I.part = affected
|
||||
|
||||
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist ) ) )
|
||||
var/datum/game_mode/heist/M = ticker.mode
|
||||
M.cortical_stacks += I
|
||||
M.raiders[H.mind] = I
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/species/diona
|
||||
name = "Diona"
|
||||
icobase = 'icons/mob/human_races/r_plant.dmi'
|
||||
icobase = 'icons/mob/human_races/r_diona.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_plant.dmi'
|
||||
language = "Rootspeak"
|
||||
attack_verb = "slash"
|
||||
@@ -139,4 +193,54 @@
|
||||
heat_level_2 = 3000
|
||||
heat_level_3 = 4000
|
||||
|
||||
flags = WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT | RAD_ABSORB
|
||||
flags = IS_WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NO_SCAN | IS_PLANT | RAD_ABSORB | NO_BLOOD | IS_SLOW | NO_PAIN
|
||||
|
||||
blood_color = "#004400"
|
||||
flesh_color = "#907E4A"
|
||||
|
||||
/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
|
||||
H.gender = NEUTER
|
||||
|
||||
/datum/species/diona/handle_death(var/mob/living/carbon/human/H)
|
||||
|
||||
var/mob/living/carbon/monkey/diona/S = new(get_turf(H))
|
||||
|
||||
if(H.mind)
|
||||
H.mind.transfer_to(S)
|
||||
S.key = H
|
||||
|
||||
for(var/mob/living/carbon/monkey/diona/D in H.contents)
|
||||
if(D.client)
|
||||
D.loc = H.loc
|
||||
else
|
||||
del(D)
|
||||
|
||||
H.visible_message("\red[H] splits apart with a wet slithering noise!")
|
||||
|
||||
/datum/species/machine
|
||||
name = "Machine"
|
||||
icobase = 'icons/mob/human_races/r_machine.dmi'
|
||||
deform = 'icons/mob/human_races/r_machine.dmi'
|
||||
language = "Tradeband"
|
||||
punch_damage = 2
|
||||
|
||||
eyes = "blank_eyes"
|
||||
brute_mod = 0.5
|
||||
burn_mod = 1
|
||||
|
||||
warning_low_pressure = 50
|
||||
hazard_low_pressure = 10
|
||||
|
||||
cold_level_1 = 50
|
||||
cold_level_2 = -1
|
||||
cold_level_3 = -1
|
||||
|
||||
heat_level_1 = 2000
|
||||
heat_level_2 = 3000
|
||||
heat_level_3 = 4000
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC
|
||||
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#575757"
|
||||
|
||||
@@ -256,8 +256,17 @@
|
||||
buckled = initial(src.buckled)
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
|
||||
if (C.handcuffed && !initial(C.handcuffed))
|
||||
C.drop_from_inventory(C.handcuffed)
|
||||
C.handcuffed = initial(C.handcuffed)
|
||||
|
||||
if (C.legcuffed && !initial(C.legcuffed))
|
||||
C.drop_from_inventory(C.legcuffed)
|
||||
C.legcuffed = initial(C.legcuffed)
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
hud_updateflag |= 1 << STATUS_HUD
|
||||
|
||||
/mob/living/proc/rejuvenate()
|
||||
|
||||
// shut down various types of badness
|
||||
@@ -303,7 +312,9 @@
|
||||
|
||||
// make the icons look correct
|
||||
regenerate_icons()
|
||||
|
||||
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
hud_updateflag |= 1 << STATUS_HUD
|
||||
return
|
||||
|
||||
/mob/living/proc/UpdateDamageIcon()
|
||||
@@ -348,8 +359,8 @@
|
||||
return
|
||||
else
|
||||
if(Debug)
|
||||
diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]"
|
||||
diary <<"REPORT THIS"
|
||||
log_debug("pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]")
|
||||
log_debug("REPORT THIS")
|
||||
|
||||
/////
|
||||
if(pulling && pulling.anchored)
|
||||
@@ -434,6 +445,13 @@
|
||||
|
||||
var/mob/living/L = usr
|
||||
|
||||
//Getting out of someone's inventory.
|
||||
if(istype(src.loc,/obj/item/weapon/holder))
|
||||
var/obj/item/weapon/holder/H = src.loc
|
||||
src.loc = get_turf(src.loc)
|
||||
del(H)
|
||||
return
|
||||
|
||||
//Resisting control by an alien mind.
|
||||
if(istype(src.loc,/mob/living/simple_animal/borer))
|
||||
var/mob/living/simple_animal/borer/B = src.loc
|
||||
@@ -619,9 +637,8 @@
|
||||
for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink
|
||||
O.show_message("\red <B>[CM] manages to remove the handcuffs!</B>", 1)
|
||||
CM << "\blue You successfully remove \the [CM.handcuffed]."
|
||||
CM.handcuffed.loc = usr.loc
|
||||
CM.handcuffed = null
|
||||
CM.update_inv_handcuffed()
|
||||
CM.drop_from_inventory(CM.handcuffed)
|
||||
|
||||
else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time))
|
||||
CM.next_move = world.time + 100
|
||||
CM.last_special = world.time + 100
|
||||
@@ -657,7 +674,7 @@
|
||||
for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink
|
||||
O.show_message("\red <B>[CM] manages to remove the legcuffs!</B>", 1)
|
||||
CM << "\blue You successfully remove \the [CM.legcuffed]."
|
||||
CM.legcuffed.loc = usr.loc
|
||||
CM.drop_from_inventory(CM.legcuffed)
|
||||
CM.legcuffed = null
|
||||
CM.update_inv_legcuffed()
|
||||
|
||||
@@ -666,4 +683,96 @@
|
||||
set category = "IC"
|
||||
|
||||
resting = !resting
|
||||
src << "\blue You are now [resting ? "resting" : "getting up"]"
|
||||
src << "\blue You are now [resting ? "resting" : "getting up"]"
|
||||
|
||||
/mob/living/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null) // -- TLE -- Merged by Carn
|
||||
if(stat)
|
||||
src << "You must be conscious to do this!"
|
||||
return
|
||||
if(lying)
|
||||
src << "You can't vent crawl while you're stunned!"
|
||||
return
|
||||
|
||||
if(vent_found) // one was passed in, probably from vent/AltClick()
|
||||
if(vent_found.welded)
|
||||
src << "That vent is welded shut."
|
||||
return
|
||||
if(!vent_found.Adjacent(src))
|
||||
return // don't even acknowledge that
|
||||
else
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
|
||||
if(!v.welded)
|
||||
if(v.Adjacent(src))
|
||||
vent_found = v
|
||||
if(!vent_found)
|
||||
src << "You'll need a non-welded vent to crawl into!"
|
||||
return
|
||||
|
||||
if(!vent_found.network || !vent_found.network.normal_members.len)
|
||||
src << "This vent is not connected to anything."
|
||||
return
|
||||
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
|
||||
if(temp_vent.welded)
|
||||
continue
|
||||
if(temp_vent in loc)
|
||||
continue
|
||||
var/turf/T = get_turf(temp_vent)
|
||||
|
||||
if(!T || T.z != loc.z)
|
||||
continue
|
||||
|
||||
var/i = 1
|
||||
var/index = "[T.loc.name]\[[i]\]"
|
||||
while(index in vents)
|
||||
i++
|
||||
index = "[T.loc.name]\[[i]\]"
|
||||
vents[index] = temp_vent
|
||||
if(!vents.len)
|
||||
src << "\red There are no available vents to travel to, they could be welded."
|
||||
return
|
||||
|
||||
var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents)
|
||||
if(!selection) return
|
||||
|
||||
if(!vent_found.Adjacent(src))
|
||||
src << "Never mind, you left."
|
||||
return
|
||||
|
||||
for(var/obj/item/carried_item in contents)//If the monkey got on objects.
|
||||
if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger
|
||||
src << "\red You can't be carrying items or have items equipped when vent crawling!"
|
||||
return
|
||||
if(isslime(src))
|
||||
var/mob/living/carbon/slime/S = src
|
||||
if(S.Victim)
|
||||
src << "\red You'll have to let [S.Victim] go or finish eating \him first."
|
||||
return
|
||||
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection]
|
||||
if(!target_vent)
|
||||
return
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
|
||||
loc = target_vent
|
||||
|
||||
var/travel_time = round(get_dist(loc, target_vent.loc) / 2)
|
||||
|
||||
spawn(travel_time)
|
||||
|
||||
if(!target_vent) return
|
||||
for(var/mob/O in hearers(target_vent,null))
|
||||
O.show_message("You hear something squeezing through the ventilation ducts.",2)
|
||||
|
||||
sleep(travel_time)
|
||||
|
||||
if(!target_vent) return
|
||||
if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled.
|
||||
target_vent = vent_found //travel back. No additional time required.
|
||||
src << "\red The vent you were heading to appears to be welded."
|
||||
loc = target_vent.loc
|
||||
var/area/new_area = get_area(loc)
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
|
||||
@@ -83,7 +83,8 @@
|
||||
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a thrown [O], last touched by [M.name] ([assailant.ckey])</font>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was hit by a thrown [O], last touched by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
if(!istype(src,/mob/living/simple_animal/mouse))
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was hit by a thrown [O], last touched by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
|
||||
// Begin BS12 momentum-transfer code.
|
||||
|
||||
@@ -124,4 +125,4 @@
|
||||
|
||||
return 0
|
||||
|
||||
// End BS12 momentum-transfer code.
|
||||
// End BS12 momentum-transfer code.
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
var/maxHealth = 100 //Maximum health that should be possible.
|
||||
var/health = 100 //A mob's health
|
||||
|
||||
var/hud_updateflag = 0
|
||||
|
||||
//Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS
|
||||
var/bruteloss = 0.0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage)
|
||||
var/oxyloss = 0.0 //Oxygen depravation damage (no air in lungs)
|
||||
@@ -35,4 +37,4 @@
|
||||
|
||||
var/tod = null // Time of death
|
||||
var/update_slimes = 1
|
||||
var/silent = null //Can't talk. Value goes down every life proc.
|
||||
var/silent = null //Can't talk. Value goes down every life proc.
|
||||
|
||||
@@ -108,7 +108,7 @@ var/list/department_radio_keys = list(
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "\red You cannot speak in IC (muted)."
|
||||
return
|
||||
if (src.client.handle_spam_prevention(message,MUTE_IC))
|
||||
if (src.client.handle_spam_prevention(message, MUTE_IC))
|
||||
return
|
||||
|
||||
// Mute disability
|
||||
@@ -173,7 +173,7 @@ var/list/department_radio_keys = list(
|
||||
if(src.stunned > 2 || (traumatic_shock > 61 && prob(50)))
|
||||
message_mode = null //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
|
||||
|
||||
message = capitalize(message)
|
||||
message = capitalize(trim_left(message))
|
||||
|
||||
if (!message)
|
||||
return
|
||||
@@ -302,7 +302,7 @@ var/list/department_radio_keys = list(
|
||||
var/list/listening
|
||||
|
||||
listening = get_mobs_in_view(message_range, src)
|
||||
var/list/onscreen = get_mobs_in_view(7, src)
|
||||
var/list/onscreen = viewers()
|
||||
for(var/mob/M in player_list)
|
||||
if (!M.client)
|
||||
continue //skip monkeys and leavers
|
||||
@@ -384,19 +384,20 @@ var/list/department_radio_keys = list(
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] <span class='message'>[message_a]</span></span>"
|
||||
var/rendered_ghost = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] <span class='message'>[message_ghost]</span></span>"
|
||||
for (var/mob/M in heard_a)
|
||||
if(hascall(M,"show_message"))
|
||||
var/deaf_message = ""
|
||||
var/deaf_type = 1
|
||||
if(M != src)
|
||||
deaf_message = "<span class='name'>[name]</span>[alt_name] talks but you cannot hear them."
|
||||
else
|
||||
deaf_message = "<span class='notice'>You cannot hear yourself!</span>"
|
||||
deaf_type = 2 // Since you should be able to hear yourself without looking
|
||||
if (M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && M in onscreen)
|
||||
M:show_message(rendered_ghost, 2, deaf_message, deaf_type)
|
||||
else
|
||||
M:show_message(rendered, 2, deaf_message, deaf_type)
|
||||
M << speech_bubble
|
||||
if(M.client)
|
||||
if(hascall(M,"show_message"))
|
||||
var/deaf_message = ""
|
||||
var/deaf_type = 1
|
||||
if(M != src)
|
||||
deaf_message = "<span class='name'>[name]</span>[alt_name] talks but you cannot hear them."
|
||||
else
|
||||
deaf_message = "<span class='notice'>You cannot hear yourself!</span>"
|
||||
deaf_type = 2 // Since you should be able to hear yourself without looking
|
||||
if (M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && M in onscreen)
|
||||
M:show_message(rendered_ghost, 2, deaf_message, deaf_type)
|
||||
else
|
||||
M:show_message(rendered, 2, deaf_message, deaf_type)
|
||||
M << speech_bubble
|
||||
|
||||
if (length(heard_b))
|
||||
|
||||
|
||||
@@ -94,6 +94,7 @@ var/list/ai_list = list()
|
||||
/mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \
|
||||
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
|
||||
/mob/living/silicon/ai/proc/toggle_camera_light)
|
||||
|
||||
|
||||
if(!safety)//Only used by AIize() to successfully spawn an AI.
|
||||
if (!B)//If there is no player/brain inside.
|
||||
@@ -114,6 +115,21 @@ var/list/ai_list = list()
|
||||
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
|
||||
|
||||
job = "AI"
|
||||
|
||||
spawn(5)
|
||||
new /obj/machinery/ai_powersupply(src)
|
||||
|
||||
|
||||
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
|
||||
|
||||
ai_list += src
|
||||
..()
|
||||
return
|
||||
@@ -123,6 +139,37 @@ var/list/ai_list = list()
|
||||
..()
|
||||
|
||||
|
||||
/*
|
||||
The AI Power supply is a dummy object used for powering the AI since only machinery should be using power.
|
||||
The alternative was to rewrite a bunch of AI code instead here we are.
|
||||
*/
|
||||
/obj/machinery/ai_powersupply
|
||||
name="Power Supply"
|
||||
active_power_usage=1000
|
||||
use_power = 2
|
||||
power_channel = EQUIP
|
||||
var/mob/living/silicon/ai/powered_ai = null
|
||||
invisibility = 100
|
||||
|
||||
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
|
||||
powered_ai = ai
|
||||
if(isnull(powered_ai))
|
||||
Del()
|
||||
|
||||
loc = powered_ai.loc
|
||||
use_power(1) // Just incase we need to wake up the power system.
|
||||
|
||||
..()
|
||||
|
||||
/obj/machinery/ai_powersupply/process()
|
||||
if(!powered_ai || powered_ai.stat & DEAD)
|
||||
Del()
|
||||
if(!powered_ai.anchored)
|
||||
loc = powered_ai.loc
|
||||
use_power = 0
|
||||
if(powered_ai.anchored)
|
||||
use_power = 2
|
||||
|
||||
/mob/living/silicon/ai/verb/pick_icon()
|
||||
set category = "AI Commands"
|
||||
set name = "Set AI Core Display"
|
||||
@@ -338,9 +385,12 @@ var/list/ai_list = list()
|
||||
// src << text ("Switching Law [L]'s report status to []", lawcheck[L+1])
|
||||
checklaws()
|
||||
|
||||
//Uncomment this line of code if you are enabling the AI Vocal (VOX) announcements.
|
||||
/*
|
||||
if(href_list["say_word"])
|
||||
play_vox_word(href_list["say_word"], null, src)
|
||||
return
|
||||
*/
|
||||
|
||||
if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
|
||||
var/L = text2num(href_list["lawi"])
|
||||
@@ -662,10 +712,11 @@ var/list/ai_list = list()
|
||||
camera_light_on = !camera_light_on
|
||||
src << "Camera lights [camera_light_on ? "activated" : "deactivated"]."
|
||||
if(!camera_light_on)
|
||||
if(src.current)
|
||||
src.current.SetLuminosity(0)
|
||||
if(current)
|
||||
current.SetLuminosity(0)
|
||||
current = null
|
||||
else
|
||||
src.lightNearbyCamera()
|
||||
lightNearbyCamera()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -58,10 +58,20 @@
|
||||
src.see_in_dark = 8
|
||||
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
|
||||
//Congratulations! You've found a way for AI's to run without using power!
|
||||
//Todo: Without snowflaking up master_controller procs find a way to make AI use_power but only when APC's clear the area usage the tick prior
|
||||
// since mobs are in master_controller before machinery. We also have to do it in a manner where we don't reset the entire area's need to update
|
||||
// the power usage.
|
||||
//
|
||||
// We can probably create a new machine that resides inside of the AI contents that uses power using the idle_usage of 1000 and nothing else and
|
||||
// be fine.
|
||||
/*
|
||||
var/area/home = get_area(src)
|
||||
if(!home) return//something to do with malf fucking things up I guess. <-- aisat is gone. is this still necessary? ~Carn
|
||||
if(home.powered(EQUIP))
|
||||
home.use_power(1000, EQUIP)
|
||||
*/
|
||||
|
||||
if (src:aiRestorePowerRoutine==2)
|
||||
src << "Alert cancelled. Power has been restored without our assistance."
|
||||
@@ -168,4 +178,4 @@
|
||||
if(fire_res_on_core)
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getBruteLoss()
|
||||
else
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
|
||||
|
||||
@@ -14,6 +14,13 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
// These Verbs are commented out since we've disabled the AI vocal (VOX) announcements.
|
||||
// If you re-enable them there is 3 lines in ai.dm Topic() that you need to uncomment as well.
|
||||
// just search for VOX in there.
|
||||
|
||||
/*
|
||||
var/announcing_vox = 0 // Stores the time of the last announcement
|
||||
var/const/VOX_CHANNEL = 200
|
||||
var/const/VOX_DELAY = 100 // 10 seconds
|
||||
@@ -61,7 +68,7 @@ var/const/VOX_PATH = "sound/vox/"
|
||||
if(!message || announcing_vox > world.time)
|
||||
return
|
||||
|
||||
var/list/words = stringsplit(trim(message), " ")
|
||||
var/list/words = text2list(trim(message), " ")
|
||||
var/list/incorrect_words = list()
|
||||
|
||||
if(words.len > 30)
|
||||
@@ -127,4 +134,7 @@ var/const/VOX_PATH = "sound/vox/"
|
||||
for(var/file in vox_files)
|
||||
// src << "Downloading [file]"
|
||||
var/sound/S = sound("[VOX_PATH][file]")
|
||||
src << browse_rsc(S)
|
||||
src << browse_rsc(S)
|
||||
|
||||
|
||||
*/
|
||||
|
||||
@@ -80,6 +80,12 @@
|
||||
holder.icon_state = "hudxeno"
|
||||
else if(foundVirus)
|
||||
holder.icon_state = "hudill"
|
||||
else if(patient.has_brain_worms())
|
||||
var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
|
||||
if(B.controlling)
|
||||
holder.icon_state = "hudbrainworm"
|
||||
else
|
||||
holder.icon_state = "hudhealthy"
|
||||
else
|
||||
holder.icon_state = "hudhealthy"
|
||||
client.images += holder
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon_state = "shadow"
|
||||
|
||||
robot_talk_understand = 0
|
||||
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
|
||||
|
||||
var/network = "SS13"
|
||||
var/obj/machinery/camera/current = null
|
||||
@@ -268,4 +269,4 @@
|
||||
pai.key = src.key
|
||||
card.setPersonality(pai)
|
||||
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -643,5 +643,12 @@
|
||||
dat += "</li>"
|
||||
dat += "</ul>"
|
||||
dat += "<br><br>"
|
||||
dat += "Messages: <hr> [pda.tnote]"
|
||||
return dat
|
||||
for(var/index in pda.tnote)
|
||||
if(index["sent"])
|
||||
dat += addtext("<i><b>→ To <a href='byond://?src=\ref[src];software=pdamessage;target=",index["src"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
|
||||
else
|
||||
dat += addtext("<i><b>← From <a href='byond://?src=\ref[src];software=pdamessage;target=",index["target"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
|
||||
|
||||
|
||||
|
||||
return dat
|
||||
|
||||
@@ -124,11 +124,11 @@
|
||||
|
||||
/obj/item/broken_device
|
||||
name = "broken component"
|
||||
icon = 'icons/robot_component.dmi'
|
||||
icon = 'icons/obj/robot_component.dmi'
|
||||
icon_state = "broken"
|
||||
|
||||
/obj/item/robot_parts/robot_component
|
||||
icon = 'icons/robot_component.dmi'
|
||||
icon = 'icons/obj/robot_component.dmi'
|
||||
icon_state = "working"
|
||||
construction_time = 200
|
||||
construction_cost = list("metal"=5000)
|
||||
@@ -214,4 +214,4 @@
|
||||
if(H.emagged && prob(5))
|
||||
user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1)
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -126,6 +126,18 @@
|
||||
var/datum/robot_component/cell_component = components["power cell"]
|
||||
cell_component.wrapped = cell
|
||||
cell_component.installed = 1
|
||||
|
||||
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
|
||||
|
||||
|
||||
|
||||
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
|
||||
|
||||
@@ -155,7 +167,6 @@
|
||||
modtype = input("Please, select a module!", "Robot", null, null) in modules
|
||||
|
||||
var/module_sprites[0] //Used to store the associations between sprite names and sprite index.
|
||||
var/channels = list()
|
||||
|
||||
if(module)
|
||||
return
|
||||
@@ -177,7 +188,7 @@
|
||||
|
||||
if("Miner")
|
||||
module = new /obj/item/weapon/robot_module/miner(src)
|
||||
channels = list("Supply" = 1)
|
||||
module.channels = list("Supply" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
camera.network.Add("MINE")
|
||||
module_sprites["Basic"] = "Miner_old"
|
||||
@@ -186,7 +197,7 @@
|
||||
|
||||
if("Medical")
|
||||
module = new /obj/item/weapon/robot_module/medical(src)
|
||||
channels = list("Medical" = 1)
|
||||
module.channels = list("Medical" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
camera.network.Add("Medical")
|
||||
module_sprites["Basic"] = "Medbot"
|
||||
@@ -196,7 +207,7 @@
|
||||
|
||||
if("Security")
|
||||
module = new /obj/item/weapon/robot_module/security(src)
|
||||
channels = list("Security" = 1)
|
||||
module.channels = list("Security" = 1)
|
||||
module_sprites["Basic"] = "secborg"
|
||||
module_sprites["Red Knight"] = "Security"
|
||||
module_sprites["Black Knight"] = "securityrobot"
|
||||
@@ -204,7 +215,7 @@
|
||||
|
||||
if("Engineering")
|
||||
module = new /obj/item/weapon/robot_module/engineering(src)
|
||||
channels = list("Engineering" = 1)
|
||||
module.channels = list("Engineering" = 1)
|
||||
if(camera && "Robots" in camera.network)
|
||||
camera.network.Add("Engineering")
|
||||
module_sprites["Basic"] = "Engineering"
|
||||
@@ -220,7 +231,7 @@
|
||||
if("Combat")
|
||||
module = new /obj/item/weapon/robot_module/combat(src)
|
||||
module_sprites["Combat Android"] = "droid-combat"
|
||||
channels = list("Security" = 1)
|
||||
module.channels = list("Security" = 1)
|
||||
|
||||
//Custom_sprite check and entry
|
||||
if (custom_sprite == 1)
|
||||
@@ -234,7 +245,7 @@
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
choose_icon(6,module_sprites)
|
||||
radio.config(channels)
|
||||
radio.config(module.channels)
|
||||
|
||||
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
|
||||
if(prefix)
|
||||
@@ -275,8 +286,11 @@
|
||||
if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
|
||||
custom_sprite = 1
|
||||
icon = 'icons/mob/custom-synthetic.dmi'
|
||||
if(icon_state == "robot")
|
||||
icon_state = "[src.ckey]-Standard"
|
||||
|
||||
/mob/living/silicon/robot/verb/Namepick()
|
||||
set category = "Robot Commands"
|
||||
if(custom_name)
|
||||
return 0
|
||||
|
||||
@@ -705,8 +719,7 @@
|
||||
locked = 0
|
||||
else
|
||||
user << "You fail to emag the cover lock."
|
||||
if(prob(25))
|
||||
src << "Hack attempt detected."
|
||||
src << "Hack attempt detected."
|
||||
else
|
||||
user << "The cover is already unlocked."
|
||||
return
|
||||
@@ -723,7 +736,7 @@
|
||||
lawupdate = 0
|
||||
connected_ai = null
|
||||
user << "You emag [src]'s interface."
|
||||
// message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
|
||||
message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
|
||||
log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
|
||||
clear_supplied_laws()
|
||||
clear_inherent_laws()
|
||||
@@ -735,7 +748,7 @@
|
||||
sleep(5)
|
||||
src << "\red Initiating diagnostics..."
|
||||
sleep(20)
|
||||
src << "\red SynBorg v1.7 loaded."
|
||||
src << "\red SynBorg v1.7.1 loaded."
|
||||
sleep(5)
|
||||
src << "\red LAW SYNCHRONISATION ERROR"
|
||||
sleep(5)
|
||||
@@ -754,9 +767,8 @@
|
||||
src.module.rebuild()
|
||||
updateicon()
|
||||
else
|
||||
user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface."
|
||||
if(prob(25))
|
||||
src << "Hack attempt detected."
|
||||
user << "You fail to hack [src]'s interface."
|
||||
src << "Hack attempt detected."
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/borg/upgrade/))
|
||||
@@ -795,7 +807,7 @@
|
||||
if ("help")
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\blue [M] caresses [src]'s plating with its scythe like arm."), 1)
|
||||
O.show_message(text("\blue [M] caresses [src]'s plating with its scythe-like arm."), 1)
|
||||
|
||||
if ("grab")
|
||||
if (M == src)
|
||||
@@ -814,13 +826,6 @@
|
||||
if ("hurt")
|
||||
var/damage = rand(10, 20)
|
||||
if (prob(90))
|
||||
/*
|
||||
if (M.class == "combat")
|
||||
damage += 15
|
||||
if(prob(20))
|
||||
weakened = max(weakened,4)
|
||||
stunned = max(stunned,4)
|
||||
What is this?*/
|
||||
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
@@ -1186,7 +1191,7 @@
|
||||
if(cleaned_human.shoes)
|
||||
cleaned_human.shoes.clean_blood()
|
||||
cleaned_human.update_inv_shoes(0)
|
||||
cleaned_human.clean_blood()
|
||||
cleaned_human.clean_blood(1)
|
||||
cleaned_human << "\red [src] cleans your face!"
|
||||
return
|
||||
|
||||
@@ -1277,4 +1282,4 @@
|
||||
triesleft = 0
|
||||
return
|
||||
else
|
||||
src << "Your icon has been set. You now require a module reset to change it."
|
||||
src << "Your icon has been set. You now require a module reset to change it."
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
w_class = 100.0
|
||||
item_state = "electronic"
|
||||
flags = FPRINT|TABLEPASS | CONDUCT
|
||||
|
||||
var/channels = list()
|
||||
var/list/modules = list()
|
||||
var/obj/item/emag = null
|
||||
var/obj/item/borg/upgrade/jetpack = null
|
||||
@@ -44,7 +44,6 @@
|
||||
/obj/item/weapon/robot_module/standard
|
||||
name = "standard robot module"
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
src.modules += new /obj/item/weapon/melee/baton(src)
|
||||
@@ -55,12 +54,14 @@
|
||||
src.emag = new /obj/item/weapon/melee/energy/sword(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/standard/respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/obj/item/weapon/melee/baton/B = locate() in src.modules
|
||||
if(B.charges < 10)
|
||||
B.charges += 1
|
||||
|
||||
/obj/item/weapon/robot_module/medical
|
||||
name = "medical robot module"
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/hud/med(src)
|
||||
@@ -77,7 +78,16 @@
|
||||
src.emag.name = "Polyacid spray"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)//SYRINGE_BROKEN
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
if(src.emag)
|
||||
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
|
||||
PS.reagents.add_reagent("pacid", 2)
|
||||
|
||||
/obj/item/weapon/robot_module/engineering
|
||||
name = "engineering robot module"
|
||||
@@ -98,6 +108,7 @@
|
||||
src.modules += new /obj/item/device/multitool(src)
|
||||
src.modules += new /obj/item/device/t_scanner(src)
|
||||
src.modules += new /obj/item/device/analyzer(src)
|
||||
src.modules += new /obj/item/taperoll/engineering(src)
|
||||
|
||||
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
|
||||
M.amount = 50
|
||||
@@ -113,42 +124,58 @@
|
||||
|
||||
return
|
||||
|
||||
|
||||
respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/list/what = list (
|
||||
/obj/item/stack/sheet/metal,
|
||||
/obj/item/stack/sheet/rglass,
|
||||
/obj/item/weapon/cable_coil,
|
||||
)
|
||||
for (var/T in what)
|
||||
if (!(locate(T) in src.modules))
|
||||
src.modules -= null
|
||||
var/O = new T(src)
|
||||
src.modules += O
|
||||
O:amount = 1
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/engineering/respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/list/stacks = list (
|
||||
/obj/item/stack/sheet/metal,
|
||||
/obj/item/stack/sheet/rglass,
|
||||
/obj/item/weapon/cable_coil,
|
||||
)
|
||||
for(var/T in stacks)
|
||||
var/O = locate(T) in src.modules
|
||||
if(O)
|
||||
if(O:amount < 50)
|
||||
O:amount++
|
||||
else
|
||||
src.modules -= null
|
||||
O = new T(src)
|
||||
src.modules += O
|
||||
O:amount = 1
|
||||
return
|
||||
|
||||
/obj/item/weapon/robot_module/security
|
||||
name = "security robot module"
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/hud/sec(src)
|
||||
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/melee/baton(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src)
|
||||
src.modules += new /obj/item/taperoll/police(src)
|
||||
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/obj/item/device/flash/F = locate() in src.modules
|
||||
if(F.broken)
|
||||
F.broken = 0
|
||||
F.times_used = 0
|
||||
F.icon_state = "flash"
|
||||
else if(F.times_used)
|
||||
F.times_used--
|
||||
var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in src.modules
|
||||
if(T.power_supply.charge < T.power_supply.maxcharge)
|
||||
T.power_supply.give(T.charge_cost)
|
||||
T.update_icon()
|
||||
else
|
||||
T.charge_tick = 0
|
||||
var/obj/item/weapon/melee/baton/B = locate() in src.modules
|
||||
if(B.charges < 10)
|
||||
B.charges += 1
|
||||
|
||||
/obj/item/weapon/robot_module/janitor
|
||||
name = "janitorial robot module"
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
|
||||
@@ -161,15 +188,19 @@
|
||||
src.emag.name = "Lube spray"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/obj/item/device/lightreplacer/LR = locate() in src.modules
|
||||
LR.Charge(R)
|
||||
if(src.emag)
|
||||
var/obj/item/weapon/reagent_containers/spray/S = src.emag
|
||||
S.reagents.add_reagent("lube", 2)
|
||||
|
||||
/obj/item/weapon/robot_module/butler
|
||||
name = "service robot module"
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
|
||||
src.modules += new /obj/item/weapon/pen/robopen(src)
|
||||
|
||||
@@ -185,7 +216,7 @@
|
||||
|
||||
src.modules += new /obj/item/weapon/tray/robotray(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
|
||||
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
|
||||
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(50)
|
||||
src.emag.reagents = R
|
||||
@@ -194,12 +225,16 @@
|
||||
src.emag.name = "Mickey Finn's Special Brew"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R)
|
||||
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
|
||||
E.reagents.add_reagent("enzyme", 2)
|
||||
if(src.emag)
|
||||
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
|
||||
B.reagents.add_reagent("beer2", 2)
|
||||
|
||||
/obj/item/weapon/robot_module/miner
|
||||
name = "miner robot module"
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/meson(src)
|
||||
@@ -210,11 +245,9 @@
|
||||
// src.modules += new /obj/item/weapon/shovel(src) Uneeded due to buffed drill
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/syndicate
|
||||
name = "syndicate robot module"
|
||||
|
||||
|
||||
New()
|
||||
src.modules += new /obj/item/weapon/melee/energy/sword(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src)
|
||||
@@ -232,4 +265,4 @@
|
||||
src.modules += new /obj/item/borg/combat/mobility(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair?
|
||||
src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
var/list/alarms_to_show = list()
|
||||
var/list/alarms_to_clear = list()
|
||||
immune_to_ssd = 1
|
||||
|
||||
var/list/hud_list[9]
|
||||
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
|
||||
var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
|
||||
|
||||
@@ -191,4 +191,4 @@
|
||||
dat += data_core.get_manifest(1) // make it monochrome
|
||||
dat += "<br>"
|
||||
src << browse(dat, "window=airoster")
|
||||
onclose(src, "airoster")
|
||||
onclose(src, "airoster")
|
||||
|
||||
@@ -88,9 +88,10 @@
|
||||
|
||||
for(var/this_type in calmers)
|
||||
var/mob/living/simple_animal/check_effect = locate() in src.loc
|
||||
if(check_effect.type == this_type)
|
||||
calming = 1
|
||||
break
|
||||
if(istype(check_effect))
|
||||
if(check_effect.type == this_type)
|
||||
calming = 1
|
||||
break
|
||||
|
||||
if(calming)
|
||||
if(feral > 0)
|
||||
|
||||
@@ -16,6 +16,12 @@
|
||||
src << "You whisper silently, \"[message]\""
|
||||
B.host << "The captive mind of [src] whispers, \"[message]\""
|
||||
|
||||
for (var/mob/M in player_list)
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
M << "The captive mind of [src] whispers, \"[message]\""
|
||||
|
||||
/mob/living/captive_brain/emote(var/message)
|
||||
return
|
||||
|
||||
@@ -40,28 +46,53 @@
|
||||
wander = 0
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
var/used_dominate
|
||||
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
|
||||
var/mob/living/carbon/human/host // Human host for the brain worm.
|
||||
var/truename // Name used for brainworm-speak.
|
||||
var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
|
||||
var/controlling // Used in human death check.
|
||||
var/docile = 0 // Sugar can stop borers from acting.
|
||||
|
||||
/mob/living/simple_animal/borer/Life()
|
||||
|
||||
..()
|
||||
|
||||
|
||||
if(host)
|
||||
|
||||
if(!stat && !host.stat)
|
||||
|
||||
if(host.reagents.has_reagent("sugar"))
|
||||
if(!docile)
|
||||
if(controlling)
|
||||
host << "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility."
|
||||
else
|
||||
src << "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility."
|
||||
docile = 1
|
||||
else
|
||||
if(docile)
|
||||
if(controlling)
|
||||
host << "\blue You shake off your lethargy as the sugar leaves your host's blood."
|
||||
else
|
||||
src << "\blue You shake off your lethargy as the sugar leaves your host's blood."
|
||||
docile = 0
|
||||
|
||||
if(chemicals < 250)
|
||||
chemicals++
|
||||
if(controlling)
|
||||
|
||||
if(docile)
|
||||
host << "\blue You are feeling far too docile to continue controlling your host..."
|
||||
host.release_control()
|
||||
return
|
||||
|
||||
if(prob(5))
|
||||
host.adjustBrainLoss(rand(1,2))
|
||||
|
||||
if(prob(host.brainloss/20))
|
||||
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
|
||||
|
||||
//if(host.brainloss > 100)
|
||||
|
||||
/mob/living/simple_animal/borer/New()
|
||||
..()
|
||||
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
|
||||
@@ -104,6 +135,13 @@
|
||||
src << "You drop words into [host]'s mind: \"[message]\""
|
||||
host << "Your own thoughts speak: \"[message]\""
|
||||
|
||||
for (var/mob/M in player_list)
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
M << "[src.truename] whispers to [host], \"[message]\""
|
||||
|
||||
|
||||
/mob/living/simple_animal/borer/Stat()
|
||||
..()
|
||||
statpanel("Status")
|
||||
@@ -127,6 +165,46 @@
|
||||
if(M.mind && (istype(M, /mob/living/simple_animal/borer) || istype(M, /mob/dead/observer)))
|
||||
M << "<i>Cortical link, <b>[truename]:</b> [copytext(message, 2)]</i>"
|
||||
|
||||
/mob/living/simple_animal/borer/verb/dominate_victim()
|
||||
set category = "Alien"
|
||||
set name = "Dominate Victim"
|
||||
set desc = "Freeze the limbs of a potential host with supernatural fear."
|
||||
|
||||
if(world.time - used_dominate < 300)
|
||||
src << "You cannot use that ability again so soon."
|
||||
return
|
||||
|
||||
if(host)
|
||||
src << "You cannot do that from within a host body."
|
||||
return
|
||||
|
||||
if(src.stat)
|
||||
src << "You cannot do that in your current state."
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(3,src))
|
||||
if(C.stat != 2)
|
||||
choices += C
|
||||
|
||||
if(world.time - used_dominate < 300)
|
||||
src << "You cannot use that ability again so soon."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
|
||||
|
||||
if(!M || !src) return
|
||||
|
||||
if(M.has_brain_worms())
|
||||
src << "You cannot infest someone who is already infested!"
|
||||
return
|
||||
|
||||
src << "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread."
|
||||
M << "\red You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing."
|
||||
M.Weaken(3)
|
||||
|
||||
used_dominate = world.time
|
||||
|
||||
/mob/living/simple_animal/borer/verb/bond_brain()
|
||||
set category = "Alien"
|
||||
set name = "Assume Control"
|
||||
@@ -140,12 +218,20 @@
|
||||
src << "You cannot do that in your current state."
|
||||
return
|
||||
|
||||
if(!host.internal_organs_by_name["brain"]) //this should only run in admin-weirdness situations, but it's here non the less - RR
|
||||
src << "<span class='warning'>There is no brain here for us to command!</span>"
|
||||
return
|
||||
|
||||
if(docile)
|
||||
src << "\blue You are feeling far too docile to do that."
|
||||
return
|
||||
|
||||
src << "You begin delicately adjusting your connection to the host brain..."
|
||||
|
||||
spawn(300+(host.brainloss*5))
|
||||
|
||||
if(!host || !src || controlling) return
|
||||
|
||||
if(!host || !src || controlling)
|
||||
return
|
||||
else
|
||||
src << "\red <B>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</B>"
|
||||
host << "\red <B>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</B>"
|
||||
@@ -170,10 +256,14 @@
|
||||
if(stat)
|
||||
src << "You cannot secrete chemicals in your current state."
|
||||
|
||||
if(docile)
|
||||
src << "\blue You are feeling far too docile to do that."
|
||||
return
|
||||
|
||||
if(chemicals < 50)
|
||||
src << "You don't have enough chemicals!"
|
||||
|
||||
var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine")
|
||||
var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine","alkysine")
|
||||
|
||||
if(chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
|
||||
return
|
||||
@@ -194,6 +284,9 @@
|
||||
if(stat)
|
||||
src << "You cannot leave your host in your current state."
|
||||
|
||||
if(docile)
|
||||
src << "\blue You are feeling far too docile to do that."
|
||||
return
|
||||
|
||||
if(!host || !src) return
|
||||
|
||||
@@ -262,17 +355,25 @@ mob/living/simple_animal/borer/proc/detatch()
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(1,src))
|
||||
if(C.stat != 2)
|
||||
if(C.stat != 2 && src.Adjacent(C))
|
||||
choices += C
|
||||
|
||||
var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
|
||||
|
||||
if(!M || !src) return
|
||||
|
||||
if(!(src.Adjacent(M))) return
|
||||
|
||||
if(M.has_brain_worms())
|
||||
src << "You cannot infest someone who is already infested!"
|
||||
return
|
||||
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.check_head_coverage())
|
||||
src << "You cannot get through that host's protective gear."
|
||||
return
|
||||
|
||||
M << "Something slimy begins probing at the opening of your ear canal..."
|
||||
src << "You slither up [M] and begin probing at their ear canal..."
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
|
||||
/mob/living/simple_animal/construct
|
||||
name = "Construct"
|
||||
real_name = "Contruct"
|
||||
real_name = "Construct"
|
||||
desc = ""
|
||||
speak_emote = list("hisses")
|
||||
emote_hear = list("wails","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "punches the"
|
||||
response_harm = "punches"
|
||||
icon_dead = "shade_dead"
|
||||
speed = -1
|
||||
a_intent = "harm"
|
||||
@@ -24,18 +24,24 @@
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
faction = "cult"
|
||||
var/list/construct_spells = list()
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/Life()
|
||||
/mob/living/simple_animal/construct/New()
|
||||
..()
|
||||
if(stat == 2)
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] collapses in a shattered heap ")
|
||||
ghostize()
|
||||
del src
|
||||
return
|
||||
name = text("[initial(name)] ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
for(var/spell in construct_spells)
|
||||
spell_list += new spell(src)
|
||||
|
||||
/mob/living/simple_animal/construct/Die()
|
||||
..()
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] collapses in a shattered heap. ")
|
||||
ghostize()
|
||||
del src
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/construct/examine()
|
||||
set src in oview()
|
||||
@@ -54,45 +60,37 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/construct/Bump(atom/movable/AM as mob|obj, yes)
|
||||
spawn( 0 )
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(5))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!( istype(AM, /atom/movable) ))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/construct/builder))
|
||||
health += 5
|
||||
M.emote("mends some of \the <EM>[src]'s</EM> wounds")
|
||||
M.emote("mends some of \the <EM>[src]'s</EM> wounds.")
|
||||
else
|
||||
if(M.melee_damage_upper <= 0)
|
||||
M.emote("[M.friendly] \the <EM>[src]</EM>")
|
||||
@@ -103,23 +101,24 @@
|
||||
O.show_message("<span class='attack'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>", 1)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
|
||||
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
health -= damage
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
/mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
var/damage = O.force
|
||||
if (O.damtype == HALLOSS)
|
||||
damage = 0
|
||||
health -= damage
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
|
||||
M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
|
||||
|
||||
|
||||
@@ -136,7 +135,7 @@
|
||||
icon_living = "behemoth"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
response_harm = "harmlessly punches the"
|
||||
response_harm = "harmlessly punches"
|
||||
harm_intent_damage = 0
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
@@ -145,6 +144,7 @@
|
||||
wall_smash = 1
|
||||
attack_sound = 'sound/weapons/punch3.ogg'
|
||||
status_flags = 0
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
|
||||
|
||||
/mob/living/simple_animal/construct/armoured/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
@@ -152,22 +152,46 @@
|
||||
var/damage = O.force
|
||||
if (O.damtype == HALLOSS)
|
||||
damage = 0
|
||||
health -= damage
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
|
||||
M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
|
||||
else
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
|
||||
M.show_message("\red \b [O] bounces harmlessly off of [src]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P)
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
var/reflectchance = 80 - round(P.damage/3)
|
||||
if(prob(reflectchance))
|
||||
adjustBruteLoss(P.damage * 0.5)
|
||||
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/turf/curloc = get_turf(src)
|
||||
|
||||
// redirect the projectile
|
||||
P.original = locate(new_x, new_y, P.z)
|
||||
P.starting = curloc
|
||||
P.current = curloc
|
||||
P.firer = src
|
||||
P.yo = new_y - curloc.y
|
||||
P.xo = new_x - curloc.x
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
return (..(P))
|
||||
|
||||
|
||||
|
||||
@@ -190,6 +214,7 @@
|
||||
speed = -1
|
||||
see_in_dark = 7
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
|
||||
|
||||
|
||||
|
||||
@@ -214,6 +239,11 @@
|
||||
speed = 0
|
||||
wall_smash = 1
|
||||
attack_sound = 'sound/weapons/punch2.ogg'
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone,
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
|
||||
|
||||
|
||||
/////////////////////////////Behemoth/////////////////////////
|
||||
@@ -229,7 +259,7 @@
|
||||
maxHealth = 750
|
||||
health = 750
|
||||
speak_emote = list("rumbles")
|
||||
response_harm = "harmlessly punches the"
|
||||
response_harm = "harmlessly punches"
|
||||
harm_intent_damage = 0
|
||||
melee_damage_lower = 50
|
||||
melee_damage_upper = 50
|
||||
@@ -240,25 +270,25 @@
|
||||
var/energy = 0
|
||||
var/max_energy = 1000
|
||||
|
||||
/mob/living/simple_animal/constructbehemoth/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
/mob/living/simple_animal/construct/behemoth/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
if(O.force >= 11)
|
||||
var/damage = O.force
|
||||
if (O.damtype == HALLOSS)
|
||||
damage = 0
|
||||
health -= damage
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
|
||||
M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
|
||||
else
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
|
||||
M.show_message("\red \b [O] bounces harmlessly off of [src]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
|
||||
|
||||
|
||||
@@ -290,4 +320,4 @@
|
||||
if (cultist == usr) //just to be sure.
|
||||
return
|
||||
cultist.loc = usr.loc
|
||||
usr.visible_message("\red [cultist] appears in a flash of red light as [usr] glows with power")*/
|
||||
usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
|
||||
@@ -63,6 +63,6 @@
|
||||
//RUNTIME IS ALIVE! SQUEEEEEEEE~
|
||||
/mob/living/simple_animal/cat/Runtime
|
||||
name = "Runtime"
|
||||
desc = "Its fur has the look and feel of velvet, and it's tail quivers occasionally."
|
||||
desc = "Its fur has the look and feel of velvet, and its tail quivers occasionally."
|
||||
|
||||
|
||||
|
||||
@@ -69,58 +69,11 @@
|
||||
if(client)
|
||||
client.time_died_as_mouse = world.time
|
||||
|
||||
//copy paste from alien/larva, if that func is updated please update this one also
|
||||
/mob/living/simple_animal/mouse/verb/ventcrawl()
|
||||
set name = "Crawl through Vent"
|
||||
set desc = "Enter an air vent and crawl through the pipe system."
|
||||
set category = "Mouse"
|
||||
|
||||
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
|
||||
// return
|
||||
|
||||
if(src.stat != CONSCIOUS) return
|
||||
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
var/welded = 0
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
|
||||
if(!v.welded)
|
||||
vent_found = v
|
||||
break
|
||||
else
|
||||
welded = 1
|
||||
if(vent_found)
|
||||
if(vent_found.network&&vent_found.network.normal_members.len)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
|
||||
if(temp_vent.loc == loc)
|
||||
continue
|
||||
vents.Add(temp_vent)
|
||||
var/list/choices = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
|
||||
if(vent.loc.z != loc.z)
|
||||
continue
|
||||
var/atom/a = get_turf(vent)
|
||||
choices.Add(a.loc)
|
||||
var/turf/startloc = loc
|
||||
var/obj/selection = input("Select a destination.", "Duct System") in choices
|
||||
var/selection_position = choices.Find(selection)
|
||||
if(loc==startloc)
|
||||
var/obj/target_vent = vents[selection_position]
|
||||
if(target_vent)
|
||||
/*
|
||||
for(var/mob/O in oviewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
|
||||
*/
|
||||
loc = target_vent.loc
|
||||
else
|
||||
src << "\blue You need to remain still while entering a vent."
|
||||
else
|
||||
src << "\blue This vent is not connected to anything."
|
||||
else if(welded)
|
||||
src << "\red That vent is welded."
|
||||
else
|
||||
src << "\blue You must be standing on or beside an air vent to enter it."
|
||||
handle_ventcrawl()
|
||||
return
|
||||
|
||||
//copy paste from alien/larva, if that func is updated please update this one alsoghost
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
/mob/living/simple_animal/hostile/hivebot/Die()
|
||||
..()
|
||||
visible_message("<b>[src]</b> blows apart!")
|
||||
new /obj/effect/decal/cleanable/robot_debris(src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
@@ -344,14 +344,15 @@ var/list/slot_equipment_priority = list( \
|
||||
usr << "\blue <B>You must be dead to use this!</B>"
|
||||
return
|
||||
if (ticker.mode.name == "meteor" || ticker.mode.name == "epidemic") //BS12 EDIT
|
||||
usr << "\blue Respawn is disabled."
|
||||
usr << "\blue Respawn is disabled for this roundtype."
|
||||
return
|
||||
else
|
||||
var/deathtime = world.time - src.timeofdeath
|
||||
var/mob/dead/observer/G = src
|
||||
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
|
||||
usr << "\blue <B>Upon using the antagHUD you forfeighted the ability to join the round.</B>"
|
||||
return
|
||||
if(istype(src,/mob/dead/observer))
|
||||
var/mob/dead/observer/G = src
|
||||
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
|
||||
usr << "\blue <B>Upon using the antagHUD you forfeighted the ability to join the round.</B>"
|
||||
return
|
||||
var/deathtimeminutes = round(deathtime / 600)
|
||||
var/pluralcheck = "minute"
|
||||
if(deathtimeminutes == 0)
|
||||
@@ -362,7 +363,7 @@ var/list/slot_equipment_priority = list( \
|
||||
pluralcheck = " [deathtimeminutes] minutes and"
|
||||
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
|
||||
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
|
||||
|
||||
|
||||
if (deathtime < 18000)
|
||||
usr << "You must wait 30 minutes to respawn!"
|
||||
return
|
||||
@@ -753,6 +754,10 @@ note dizziness decrements automatically in the mob's Life() proc.
|
||||
else if( stunned )
|
||||
// lying = 0
|
||||
canmove = 0
|
||||
else if(captured)
|
||||
anchored = 1
|
||||
canmove = 0
|
||||
lying = 0
|
||||
else
|
||||
lying = !can_stand
|
||||
canmove = has_limbs
|
||||
@@ -890,7 +895,14 @@ note dizziness decrements automatically in the mob's Life() proc.
|
||||
/mob/proc/flash_weak_pain()
|
||||
flick("weak_pain",pain)
|
||||
|
||||
mob/verb/yank_out_object()
|
||||
/mob/proc/get_visible_implants(var/class = 0)
|
||||
var/list/visible_implants = list()
|
||||
for(var/obj/item/O in embedded)
|
||||
if(O.w_class > class)
|
||||
visible_implants += O
|
||||
return visible_implants
|
||||
|
||||
mob/proc/yank_out_object()
|
||||
set category = "Object"
|
||||
set name = "Yank out object"
|
||||
set desc = "Remove an embedded item at the cost of bleeding and pain."
|
||||
@@ -916,10 +928,7 @@ mob/verb/yank_out_object()
|
||||
if(S == U)
|
||||
self = 1 // Removing object from yourself.
|
||||
|
||||
for(var/obj/item/weapon/W in embedded)
|
||||
if(W.w_class >= 2)
|
||||
valid_objects += W
|
||||
|
||||
valid_objects = get_visible_implants(1)
|
||||
if(!valid_objects.len)
|
||||
if(self)
|
||||
src << "You have nothing stuck in your body that is large enough to remove."
|
||||
@@ -943,6 +952,28 @@ mob/verb/yank_out_object()
|
||||
visible_message("<span class='warning'><b>[src] rips [selection] out of their body.</b></span>","<span class='warning'><b>You rip [selection] out of your body.</b></span>")
|
||||
else
|
||||
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s body.</b></span>","<span class='warning'><b>[usr] rips [selection] out of your body.</b></span>")
|
||||
valid_objects = get_visible_implants(0)
|
||||
if(valid_objects.len == 1) //Yanking out last object - removing verb.
|
||||
src.verbs -= /mob/proc/yank_out_object
|
||||
|
||||
if(istype(src,/mob/living/carbon/human))
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/datum/organ/external/affected
|
||||
|
||||
for(var/datum/organ/external/organ in H.organs) //Grab the organ holding the implant.
|
||||
for(var/obj/item/weapon/O in organ.implants)
|
||||
if(O == selection)
|
||||
affected = organ
|
||||
|
||||
affected.implants -= selection
|
||||
H.shock_stage+=10
|
||||
H.bloody_hands(S)
|
||||
|
||||
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
|
||||
var/datum/wound/internal_bleeding/I = new (15)
|
||||
affected.wounds += I
|
||||
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
|
||||
|
||||
selection.loc = get_turf(src)
|
||||
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
var/list/languages = list() // For speaking/listening.
|
||||
var/list/abilities = list() // For species-derived or admin-given powers.
|
||||
var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null.
|
||||
var/emote_type = 1 // Define emote default type, 1 for seen emotes, 2 for heard emotes
|
||||
|
||||
var/name_archive //For admin things like possession
|
||||
|
||||
@@ -157,7 +158,7 @@
|
||||
var/voice_name = "unidentifiable voice"
|
||||
|
||||
var/faction = "neutral" //Used for checking whether hostile simple animals will attack you, possibly more stuff later
|
||||
|
||||
var/captured = 0 //Functionally, should give the same effect as being buckled into a chair when true.
|
||||
|
||||
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
|
||||
var/proc_holder_list[] = list()//Right now unused.
|
||||
@@ -217,3 +218,5 @@
|
||||
var/immune_to_ssd = 0
|
||||
|
||||
var/turf/listed_turf = null //the current turf being examined in the stat panel
|
||||
|
||||
var/list/active_genes=list()
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
affecting.loc = assailant.loc
|
||||
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has had their neck grabbed by [assailant.name] ([assailant.ckey])</font>"
|
||||
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Grabbed the neck of [affecting.name] ([affecting.ckey])</font>"
|
||||
log_attack("<font color='red'>[assailant.name] ([assailant.ckey]) grabbed the neck of [affecting.name] ([affecting.ckey])</font>")
|
||||
msg_admin_attack("[key_name(assailant)] grabbed the neck of [key_name(affecting)]")
|
||||
hud.icon_state = "disarm/kill"
|
||||
hud.name = "disarm/kill"
|
||||
else
|
||||
@@ -158,7 +158,7 @@
|
||||
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>")
|
||||
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])</font>"
|
||||
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>"
|
||||
log_attack("<font color='red'>[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>")
|
||||
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
|
||||
|
||||
assailant.next_move = world.time + 10
|
||||
affecting.losebreath += 1
|
||||
|
||||
@@ -186,6 +186,12 @@
|
||||
if(L.incorporeal_move)//Move though walls
|
||||
Process_Incorpmove(direct)
|
||||
return
|
||||
if(mob.client)
|
||||
if(mob.client.view != world.view)
|
||||
if(locate(/obj/item/weapon/gun/energy/sniperrifle, mob.contents)) // If mob moves while zoomed in with sniper rifle, unzoom them.
|
||||
var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in mob
|
||||
if(s.zoom)
|
||||
s.zoom()
|
||||
|
||||
if(Process_Grab()) return
|
||||
|
||||
@@ -447,4 +453,4 @@
|
||||
prob_slip = 0 // Changing this to zero to make it line up with the comment.
|
||||
|
||||
prob_slip = round(prob_slip)
|
||||
return(prob_slip)
|
||||
return(prob_slip)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
M.real_name = src.real_name
|
||||
|
||||
if(src.dna)
|
||||
M.dna = src.dna
|
||||
M.dna = src.dna.Clone()
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(M)
|
||||
|
||||
@@ -77,12 +77,8 @@
|
||||
if(ticker.hide_mode == 0)
|
||||
stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode
|
||||
|
||||
if((ticker.current_state == GAME_STATE_PREGAME) && going)
|
||||
stat("Time To Start:", ticker.pregame_timeleft)
|
||||
if((ticker.current_state == GAME_STATE_PREGAME) && !going)
|
||||
stat("Time To Start:", "DELAYED")
|
||||
|
||||
if(ticker.current_state == GAME_STATE_PREGAME)
|
||||
stat("Time To Start:", "[ticker.pregame_timeleft][going ? "" : " (DELAYED)"]")
|
||||
stat("Players: [totalPlayers]", "Players Ready: [totalPlayersReady]")
|
||||
totalPlayers = 0
|
||||
totalPlayersReady = 0
|
||||
@@ -114,7 +110,7 @@
|
||||
spawning = 1
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
|
||||
|
||||
|
||||
|
||||
observer.started_as_observer = 1
|
||||
close_spawn_windows()
|
||||
var/obj/O = locate("landmark*Observer-Start")
|
||||
@@ -287,6 +283,9 @@
|
||||
src << alert("[rank] is not available. Please try another.")
|
||||
return 0
|
||||
|
||||
spawning = 1
|
||||
close_spawn_windows()
|
||||
|
||||
job_master.AssignRole(src, rank, 1)
|
||||
|
||||
var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind
|
||||
@@ -357,10 +356,8 @@
|
||||
if(client.prefs.species)
|
||||
chosen_species = all_species[client.prefs.species]
|
||||
if(chosen_species)
|
||||
if(is_alien_whitelisted(src, client.prefs.species) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED) || (client.holder.rights & R_ADMIN) )// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
|
||||
if(is_alien_whitelisted(src, client.prefs.species) || !config.usealienwhitelist || !(chosen_species.flags & IS_WHITELISTED) || (client.holder.rights & R_ADMIN) )// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
|
||||
new_character.set_species(client.prefs.species)
|
||||
if(chosen_species.language)
|
||||
new_character.add_language(chosen_species.language)
|
||||
|
||||
var/datum/language/chosen_language
|
||||
if(client.prefs.language)
|
||||
@@ -392,7 +389,7 @@
|
||||
|
||||
if(client.prefs.disabilities)
|
||||
// Set defer to 1 if you add more crap here so it only recalculates struc_enzymes once. - N3X
|
||||
new_character.dna.SetSEState(GLASSESBLOCK,1,0)
|
||||
new_character.dna.SetSEState(GLASSESBLOCK,1,0)
|
||||
new_character.disabilities |= NEARSIGHTED
|
||||
|
||||
// And uncomment this, too.
|
||||
|
||||
@@ -184,6 +184,10 @@ datum/preferences
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
eyes_s.Blend(facial_s, ICON_OVERLAY)
|
||||
|
||||
var/icon/underwear_s = null
|
||||
if(underwear > 0 && underwear < 7 && current_species.flags & HAS_UNDERWEAR)
|
||||
underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[g]_s")
|
||||
|
||||
var/icon/clothes_s = null
|
||||
if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high'
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
|
||||
@@ -198,8 +202,8 @@ datum/preferences
|
||||
if(HOP)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "ianshirt"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -210,7 +214,8 @@ datum/preferences
|
||||
if(BARTENDER)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "tophat"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -223,6 +228,8 @@ datum/preferences
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "nymph"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -234,6 +241,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -244,6 +253,8 @@ datum/preferences
|
||||
if(JANITOR)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bio_janitor"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -254,6 +265,8 @@ datum/preferences
|
||||
if(LIBRARIAN)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hairflower"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -265,8 +278,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "poncho"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -278,6 +291,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "flat_cap"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -289,6 +304,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "bearpelt"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -300,7 +317,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY)
|
||||
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -311,6 +329,8 @@ datum/preferences
|
||||
if(CHAPLAIN)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "imperium_monk"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -343,8 +363,9 @@ datum/preferences
|
||||
if(RD)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "clipboard"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "petehat"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -356,6 +377,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "metroid"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -366,7 +389,10 @@ datum/preferences
|
||||
if(CHEMIST)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labgreen"), ICON_OVERLAY)
|
||||
else
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -377,8 +403,10 @@ datum/preferences
|
||||
if(CMO)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bio_cmo"), ICON_OVERLAY)
|
||||
else
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
|
||||
@@ -389,8 +417,10 @@ datum/preferences
|
||||
if(DOCTOR)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_lefthand.dmi', "firstaid"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "surgeon"), ICON_OVERLAY)
|
||||
else
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
|
||||
@@ -401,7 +431,10 @@ datum/preferences
|
||||
if(GENETICIST)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "monkeysuit"), ICON_OVERLAY)
|
||||
else
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -414,6 +447,8 @@ datum/preferences
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "plaguedoctor"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY)
|
||||
@@ -425,8 +460,9 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -440,10 +476,10 @@ datum/preferences
|
||||
if(CAPTAIN)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "caparmor"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "centcomcaptain"), ICON_OVERLAY)
|
||||
else
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -455,8 +491,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hosberet"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
|
||||
@@ -466,10 +502,11 @@ datum/preferences
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
|
||||
if(WARDEN)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "slippers_worn"), ICON_OVERLAY)
|
||||
else
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
|
||||
@@ -481,7 +518,8 @@ datum/preferences
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
@@ -494,8 +532,8 @@ datum/preferences
|
||||
if(OFFICER)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "officerberet"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
|
||||
@@ -508,8 +546,9 @@ datum/preferences
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "blueprints"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
|
||||
@@ -522,6 +561,8 @@ datum/preferences
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "hazard"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
|
||||
@@ -534,6 +575,8 @@ datum/preferences
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "firesuit"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
if(2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
@@ -545,6 +588,8 @@ datum/preferences
|
||||
if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "straight_jacket"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "cardborg_h"), ICON_OVERLAY)
|
||||
if(backbag == 2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
else if(backbag == 3 || backbag == 4)
|
||||
@@ -552,6 +597,8 @@ datum/preferences
|
||||
if(CYBORG)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "cardborg"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "cardborg_h"), ICON_OVERLAY)
|
||||
if(backbag == 2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
|
||||
else if(backbag == 3 || backbag == 4)
|
||||
@@ -561,10 +608,13 @@ datum/preferences
|
||||
preview_icon.Blend(new /icon('icons/mob/eyes.dmi', "glasses"), ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(eyes_s, ICON_OVERLAY)
|
||||
if(underwear_s)
|
||||
preview_icon.Blend(underwear_s, ICON_OVERLAY)
|
||||
if(clothes_s)
|
||||
preview_icon.Blend(clothes_s, ICON_OVERLAY)
|
||||
preview_icon_front = new(preview_icon, dir = SOUTH)
|
||||
preview_icon_side = new(preview_icon, dir = WEST)
|
||||
|
||||
del(eyes_s)
|
||||
del(clothes_s)
|
||||
del(underwear_s)
|
||||
del(clothes_s)
|
||||
|
||||
@@ -61,6 +61,10 @@
|
||||
name = "Cut Hair"
|
||||
icon_state = "hair_c"
|
||||
|
||||
flair
|
||||
name = "Flaired Hair"
|
||||
icon_state = "hair_flair"
|
||||
|
||||
long
|
||||
name = "Shoulder-length Hair"
|
||||
icon_state = "hair_b"
|
||||
@@ -303,10 +307,30 @@
|
||||
icon_state = "hair_e"
|
||||
gender = MALE // turnoff!
|
||||
|
||||
|
||||
bald
|
||||
name = "Bald"
|
||||
icon_state = "bald"
|
||||
|
||||
icp_screen_pink
|
||||
name = "pink IPC screen"
|
||||
icon_state = "ipc_pink"
|
||||
species_allowed = list("Machine")
|
||||
|
||||
icp_screen_red
|
||||
name = "red IPC screen"
|
||||
icon_state = "ipc_red"
|
||||
species_allowed = list("Machine")
|
||||
|
||||
icp_screen_green
|
||||
name = "green IPC screen"
|
||||
icon_state = "ipc_green"
|
||||
species_allowed = list("Machine")
|
||||
|
||||
icp_screen_blue
|
||||
name = "blue IPC screen"
|
||||
icon_state = "ipc_blue"
|
||||
species_allowed = list("Machine")
|
||||
|
||||
/*
|
||||
///////////////////////////////////
|
||||
/ =---------------------------= /
|
||||
@@ -324,7 +348,7 @@
|
||||
name = "Shaved"
|
||||
icon_state = "bald"
|
||||
gender = NEUTER
|
||||
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox")
|
||||
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Machine")
|
||||
|
||||
watson
|
||||
name = "Watson Mustache"
|
||||
@@ -420,7 +444,7 @@
|
||||
|
||||
una_frills_short
|
||||
name = "Short Unathi Frills"
|
||||
icon_state = "soghun_shortfrill"
|
||||
icon_state = "soghun_shortfrills"
|
||||
species_allowed = list("Unathi")
|
||||
do_colouration = 0
|
||||
|
||||
@@ -619,4 +643,4 @@
|
||||
name = "Default skrell skin"
|
||||
icon_state = "default"
|
||||
icon = 'icons/mob/human_races/r_skrell.dmi'
|
||||
species_allowed = list("Skrell")
|
||||
species_allowed = list("Skrell")
|
||||
@@ -25,7 +25,7 @@
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if(use_me)
|
||||
usr.emote("me",1,message)
|
||||
usr.emote("me",usr.emote_type,message)
|
||||
else
|
||||
usr.emote(message)
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
if(!src.client.holder)
|
||||
if(!dsay_allowed)
|
||||
src << "\red Deadchat is globally muted"
|
||||
return
|
||||
|
||||
if(client && !(client.prefs.toggles & CHAT_DEAD))
|
||||
usr << "\red You have deadchat muted."
|
||||
return
|
||||
@@ -98,30 +103,28 @@
|
||||
//tcomms code is still runtiming somewhere here
|
||||
var/ending = copytext(text, length(text))
|
||||
|
||||
var/speechverb = "<span class='say_quote'>"
|
||||
var/speech_verb = "says"
|
||||
var/speech_style = "body"
|
||||
|
||||
if (speaking)
|
||||
speechverb = "[speaking.speech_verb]</span>, \"<span class='[speaking.colour]'>"
|
||||
speech_verb = speaking.speech_verb
|
||||
speech_style = speaking.colour
|
||||
else if(speak_emote && speak_emote.len)
|
||||
speechverb = "[pick(speak_emote)], \""
|
||||
speech_verb = pick(speak_emote)
|
||||
else if (src.stuttering)
|
||||
speechverb = "stammers, \""
|
||||
speech_verb = "stammers"
|
||||
else if (src.slurring)
|
||||
speechverb = "slurrs, \""
|
||||
speech_verb = "slurrs"
|
||||
else if (ending == "?")
|
||||
speechverb = "asks, \""
|
||||
speech_verb = "asks"
|
||||
else if (ending == "!")
|
||||
speechverb = "exclaims, \""
|
||||
speech_verb = "exclaims"
|
||||
else if(isliving(src))
|
||||
var/mob/living/L = src
|
||||
if (L.getBrainLoss() >= 60)
|
||||
speechverb = "gibbers, \""
|
||||
else
|
||||
speechverb = "says, \""
|
||||
else
|
||||
speechverb = "says, \""
|
||||
speech_verb = "gibbers"
|
||||
|
||||
return "[speechverb][text]</span>\""
|
||||
return "<span class='say_quote'>[speech_verb],</span> \"<span class='[speech_style]'>[text]</span>\""
|
||||
|
||||
/mob/proc/emote(var/act, var/type, var/message)
|
||||
if(act == "me")
|
||||
|
||||
@@ -29,10 +29,9 @@
|
||||
|
||||
O = new species.primitive(loc)
|
||||
|
||||
O.dna = dna
|
||||
//O.dna.uni_identity = "000000000000000000DC00000660004DA0A0E00"
|
||||
//O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
|
||||
O.dna = dna.Clone()
|
||||
O.dna.SetSEState(MONKEYBLOCK,1)
|
||||
O.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
|
||||
O.loc = loc
|
||||
O.viruses = viruses
|
||||
O.a_intent = "hurt"
|
||||
@@ -166,7 +165,7 @@
|
||||
mind.transfer_to(O)
|
||||
if(O.mind.assigned_role == "Cyborg")
|
||||
O.mind.original = O
|
||||
else if(mind.special_role)
|
||||
else if(mind&&mind.special_role)
|
||||
O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
|
||||
else
|
||||
O.key = key
|
||||
|
||||
Reference in New Issue
Block a user