This commit is contained in:
Ghommie
2019-10-29 13:38:16 +01:00
1118 changed files with 9437 additions and 5695 deletions
@@ -54,6 +54,10 @@
name = "Redpanda"
icon_state = "redpanda"
/datum/sprite_accessory/mam_body_markings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
@@ -176,6 +176,10 @@
name = "Axolotl"
icon_state = "axolotl"
/datum/sprite_accessory/mam_ears/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/mam_ears/bear
name = "Bear"
icon_state = "bear"
@@ -194,6 +194,10 @@
name = "Mammal, Short ALT"
icon_state = "scanidalt"
/datum/sprite_accessory/mam_snouts/scanidalt2
name = "Mammal, Short ALT 2"
icon_state = "scanidalt2"
/datum/sprite_accessory/mam_snouts/wolf
name = "Mammal, Thick"
icon_state = "wolf"
@@ -306,6 +310,10 @@
name = "Mammal, Short ALT (Top)"
icon_state = "fscanidalt"
/datum/sprite_accessory/mam_snouts/fscanidalt2
name = "Mammal, Short ALT 2 (Top)"
icon_state = "fscanidalt2"
/datum/sprite_accessory/mam_snouts/fwolf
name = "Mammal, Thick (Top)"
icon_state = "fwolf"
@@ -114,6 +114,26 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/mam_tails/batl
name = "Bat (Long)"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
icon_state = "batl"
/datum/sprite_accessory/mam_tails_animated/batl
name = "Bat (Long)"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
icon_state = "batl"
/datum/sprite_accessory/mam_tails/bats
name = "Bat (Short)"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
icon_state = "bats"
/datum/sprite_accessory/mam_tails_animated/bats
name = "Bat (Short)"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
icon_state = "bats"
/datum/sprite_accessory/tails/human/bee
name = "Bee"
icon_state = "bee"
@@ -469,6 +489,22 @@
name = "Axolotl"
icon_state = "axolotl"
/datum/sprite_accessory/mam_tails/batl
name = "Bat (Long)"
icon_state = "batl"
/datum/sprite_accessory/mam_tails_animated/batl
name = "Bat (Long)"
icon_state = "batl"
/datum/sprite_accessory/mam_tails/bats
name = "Bat (Short)"
icon_state = "bats"
/datum/sprite_accessory/mam_tails_animated/bats
name = "Bat (Short)"
icon_state = "bats"
/datum/sprite_accessory/mam_tails/bee
name = "Bee"
icon_state = "bee"
@@ -28,74 +28,14 @@
locked = TRUE
// Decorative wings
/datum/sprite_accessory/deco_wings
icon = 'icons/mob/wings.dmi'
color_src = WINGCOLOR
/datum/sprite_accessory/deco_wings/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/deco_wings/monarch
name = "Monarch"
icon_state = "monarch"
/datum/sprite_accessory/deco_wings/luna
name = "Luna"
icon_state = "luna"
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/deco_wings/reddish
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/deco_wings/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/deco_wings/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/deco_wings/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/deco_wings/whitefly
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/deco_wings/punished
name = "Burnt Off"
icon_state = "punished"
locked = TRUE
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/deco_wings/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/deco_wings/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/deco_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/deco_wings/snow
name = "Snow"
icon_state = "snow"
/datum/sprite_accessory/deco_wings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/deco_wings/angel
name = "Angel"
@@ -105,6 +45,10 @@
center = TRUE
dimension_y = 34
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/deco_wings/bee
name = "Bee"
icon_state = "bee"
@@ -113,18 +57,73 @@
name = "Fairy"
icon_state = "fairy"
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/deco_wings/feathery
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/deco_wings/none
name = "None"
icon_state = "none"
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/deco_wings/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/deco_wings/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/deco_wings/luna
name = "Luna"
icon_state = "luna"
/datum/sprite_accessory/deco_wings/monarch
name = "Monarch"
icon_state = "monarch"
/datum/sprite_accessory/deco_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/deco_wings/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/deco_wings/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/deco_wings/punished
name = "Burnt Off"
icon_state = "punished"
/datum/sprite_accessory/deco_wings/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/deco_wings/reddish
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/deco_wings/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/deco_wings/snow
name = "Snow"
icon_state = "snow"
/datum/sprite_accessory/deco_wings/whitefly
name = "White Fly"
icon_state = "whitefly"
//INSECT WINGS
@@ -136,69 +135,9 @@
name = "None"
icon_state = "none"
/datum/sprite_accessory/insect_wings/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/insect_wings/monarch
name = "Monarch"
icon_state = "monarch"
/datum/sprite_accessory/insect_wings/luna
name = "Luna"
icon_state = "luna"
/datum/sprite_accessory/insect_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/insect_wings/reddish
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/insect_wings/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/insect_wings/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_wings/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/insect_wings/whitefly
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/insect_wings/punished
name = "Burnt Off"
icon_state = "punished"
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_wings/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_wings/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/insect_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/insect_wings/snow
name = "Snow"
icon_state = "snow"
/datum/sprite_accessory/insect_wings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/insect_wings/bee
name = "Bee"
@@ -208,10 +147,70 @@
name = "Fairy"
icon_state = "fairy"
/datum/sprite_accessory/insect_wings/bat
name = "Bat"
icon_state = "bat"
/datum/sprite_accessory/insect_wings/feathery
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/insect_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/insect_wings/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_wings/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/insect_wings/luna
name = "Luna"
icon_state = "luna"
/datum/sprite_accessory/insect_wings/monarch
name = "Monarch"
icon_state = "monarch"
/datum/sprite_accessory/insect_wings/moonfly
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/insect_wings/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/insect_wings/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_wings/punished
name = "Burnt Off"
icon_state = "punished"
/datum/sprite_accessory/insect_wings/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/insect_wings/reddish
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/insect_wings/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/insect_wings/snow
name = "Snow"
icon_state = "snow"
/datum/sprite_accessory/insect_wings/whitefly
name = "White Fly"
icon_state = "whitefly"
+1 -1
View File
@@ -40,7 +40,7 @@
if(iscyborg(user) && user.has_buckled_mobs())
var/mob/living/silicon/robot/R = user
GET_COMPONENT_FROM(riding_datum, /datum/component/riding, R)
var/datum/component/riding/riding_datum = R.GetComponent(/datum/component/riding)
if(riding_datum)
for(var/mob/M in R.buckled_mobs)
riding_datum.force_dismount(M)
+3
View File
@@ -468,3 +468,6 @@
bodyparts += BP
hand_bodyparts[i] = BP
..() //Don't redraw hands until we have organs for them
/mob/canReachInto(atom/user, atom/target, list/next, view_only, obj/item/tool)
return ..() && (user == src)
+94 -50
View File
@@ -2,6 +2,9 @@
BLOOD SYSTEM
****************************************************/
#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations.
/mob/living/carbon/human/proc/suppress_bloodloss(amount)
if(bleedsuppress)
return
@@ -30,6 +33,9 @@
bleed_rate = 0
return
if(bleed_rate <= 0)
bleed_rate = 0
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
@@ -80,6 +86,9 @@
var/obj/item/bodypart/BP = X
var/brutedamage = BP.brute_dam
if(BP.status == BODYPART_ROBOTIC) //for the moment, synth limbs won't bleed, but soon, my pretty.
continue
//We want an accurate reading of .len
listclearnulls(BP.embedded_objects)
temp_bleed += 0.5*BP.embedded_objects.len
@@ -87,7 +96,7 @@
if(brutedamage >= 20)
temp_bleed += (brutedamage * 0.013)
bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
bleed_rate = max(bleed_rate - 0.50, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
bleed(bleed_rate)
@@ -105,9 +114,11 @@
/mob/living/carbon/human/bleed(amt)
amt *= physiology.bleed_mod
if(!(NOBLOOD in dna.species.species_traits))
..()
.=..()
if(dna.species.exotic_blood && .) // Do we have exotic blood, and have we left any on the ground?
var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()]
if(istype(R) && isturf(loc))
R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER)
/mob/living/proc/restore_blood()
blood_volume = initial(blood_volume)
@@ -123,16 +134,16 @@
//Gets blood from mob to a container or other mob, preserving all data in it.
/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced)
if(!blood_volume || !AM.reagents)
return 0
return FALSE
if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced)
return 0
return FALSE
if(blood_volume < amount)
amount = blood_volume
var/blood_id = get_blood_id()
if(!blood_id)
return 0
return FALSE
blood_volume -= amount
@@ -141,29 +152,27 @@
if(iscarbon(AM))
var/mob/living/carbon/C = AM
if(blood_id == C.get_blood_id())//both mobs have the same blood substance
if(blood_id == "blood") //normal blood
if(blood_id == "blood" || blood_id == "jellyblood") //normal blood
if(blood_data["viruses"])
for(var/thing in blood_data["viruses"])
var/datum/disease/D = thing
if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)))
C.reagents.add_reagent("toxin", amount * 0.5)
return 1
//This used to inject oof ouch results, but since we add the reagent, and the reagent causes oof ouch on mob life... why double dip?
C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM)
return 1
return TRUE
AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature)
return 1
return TRUE
/mob/living/proc/get_blood_data(blood_id)
return
/mob/living/carbon/get_blood_data(blood_id)
if(blood_id == "blood") //actual blood reagent
if(blood_id == "blood" || blood_id == "jellyblood") //actual blood reagent
var/blood_data = list()
//set the blood data
blood_data["donor"] = src
@@ -174,6 +183,7 @@
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type)
if(disease_resistances && disease_resistances.len)
blood_data["resistances"] = disease_resistances.Copy()
var/list/temp_chem = list()
@@ -206,21 +216,6 @@
if(istype(ling))
blood_data["changeling_loudness"] = ling.loudfactor
return blood_data
if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff.
var/blood_data = list()
if(mind)
blood_data["mind"] = mind
else if(last_mind)
blood_data["mind"] = last_mind
if(ckey)
blood_data["ckey"] = ckey
else if(last_mind)
blood_data["ckey"] = ckey(last_mind.key)
blood_data["gender"] = gender
blood_data["real_name"] = real_name
return blood_data
//get the id of the substance this mob use as blood.
/mob/proc/get_blood_id()
@@ -234,12 +229,15 @@
if(!(HAS_TRAIT(src, TRAIT_NOCLONE)))
return "blood"
/mob/living/carbon/human/get_blood_id()
if(dna.species.exotic_blood)
/mob/living/carbon/get_blood_id()
if(isjellyperson(src))
return "jellyblood"
if(dna?.species?.exotic_blood)
return dna.species.exotic_blood
else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE)))
return
return "blood"
else
return "blood"
// This is has more potential uses, and is probably faster than the old proc.
/proc/get_safe_blood(bloodtype)
@@ -248,16 +246,21 @@
return
var/static/list/bloodtypes_safe = list(
"A-" = list("A-", "O-"),
"A+" = list("A-", "A+", "O-", "O+"),
"B-" = list("B-", "O-"),
"B+" = list("B-", "B+", "O-", "O+"),
"AB-" = list("A-", "B-", "O-", "AB-"),
"AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"),
"O-" = list("O-"),
"O+" = list("O-", "O+"),
"L" = list("L"),
"U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U")
"A-" = list("A-", "O-", "SY"),
"A+" = list("A-", "A+", "O-", "O+", "SY"),
"B-" = list("B-", "O-", "SY"),
"B+" = list("B-", "B+", "O-", "O+", "SY"),
"AB-" = list("A-", "B-", "O-", "AB-", "SY"),
"AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "SY"),
"O-" = list("O-","SY"),
"O+" = list("O-", "O+","SY"),
"L" = list("L","SY"),
"U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U","SY"),
"HF" = list("HF", "SY"),
"X*" = list("X*", "SY"),
"SY" = list("SY"),
"GEL" = list("GEL","SY"),
"BUG" = list("BUG", "SY")
)
var/safe = bloodtypes_safe[bloodtype]
@@ -266,7 +269,7 @@
//to add a splatter of blood or other mob liquid.
/mob/living/proc/add_splatter_floor(turf/T, small_drip)
if(get_blood_id() != "blood")
if(get_blood_id() == null)
return
if(!T)
T = get_turf(src)
@@ -280,24 +283,27 @@
drop.drips++
drop.add_overlay(pick(drop.random_icon_states))
drop.transfer_mob_blood_dna(src)
drop.update_icon()
return
else
temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter
temp_blood_DNA = list()
temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter
qdel(drop)//the drip is replaced by a bigger splatter
else
drop = new(T, get_static_viruses())
drop.transfer_mob_blood_dna(src)
drop.update_icon()
return
// Find a blood decal or create a new one.
var/obj/effect/decal/cleanable/blood/B = locate() in T
var/obj/effect/decal/cleanable/blood/splats/B = locate() in T
if(!B)
B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
if (B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
B = new /obj/effect/decal/cleanable/blood/splats(T, get_static_viruses())
if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
B.bloodiness += BLOOD_AMOUNT_PER_DECAL
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
B.add_blood_DNA(temp_blood_DNA)
B.blood_DNA |= temp_blood_DNA
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip)
if(!(NOBLOOD in dna.species.species_traits))
@@ -306,10 +312,10 @@
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip)
if(!T)
T = get_turf(src)
var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents
if(!B)
B = new(T)
B.add_blood_DNA(list("UNKNOWN DNA" = "X*"))
B.blood_DNA["UNKNOWN DNA"] = "X*"
/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip)
if(!T)
@@ -318,6 +324,44 @@
if(!B)
B = new(T)
/mob/living/proc/add_splash_floor(turf/T)
if(get_blood_id() == null)
return
if(!T)
T = get_turf(src)
var/list/temp_blood_DNA
// Find a blood decal or create a new one.
var/obj/effect/decal/cleanable/blood/B = locate() in T
if(!B)
B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
B.bloodiness += BLOOD_AMOUNT_PER_DECAL
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
src.transfer_blood_to(B, 10) //very heavy bleeding, should logically leave larger pools
if(temp_blood_DNA)
B.blood_DNA |= temp_blood_DNA
/mob/living/carbon/human/add_splash_floor(turf/T)
if(!(NOBLOOD in dna.species.species_traits))
..()
/mob/living/carbon/alien/add_splash_floor(turf/T)
if(!T)
T = get_turf(src)
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents
if(!B)
B = new(T)
B.blood_DNA["UNKNOWN DNA"] = "X*"
/mob/living/silicon/robot/add_splash_floor(turf/T)
if(!T)
T = get_turf(src)
var/obj/effect/decal/cleanable/oil/B = locate() in T.contents
if(!B)
B = new(T)
//This is a terrible way of handling it.
/mob/living/proc/ResetBloodVol()
if(ishuman(src))
+3 -3
View File
@@ -147,9 +147,9 @@
/mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B)
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
//Makes the mob have the color of the blood pool it came out of
var/newcolor = rgb(149, 10, 10)
if(istype(B, /obj/effect/decal/cleanable/xenoblood))
newcolor = rgb(43, 186, 0)
var/newcolor = BLOOD_COLOR_HUMAN
if(istype(B, /obj/effect/decal/cleanable/blood/xeno))
newcolor = BLOOD_COLOR_XENO
add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
// but only for a few seconds
spawn(30)
+6 -1
View File
@@ -10,7 +10,10 @@
/mob/living/brain/Initialize()
. = ..()
create_dna(src)
stored_dna.initialize_dna(random_blood_type())
if(stored_dna.blood_type)
stored_dna.initialize_dna(stored_dna.blood_type)
else
stored_dna.initialize_dna(random_blood_type())
if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned)
var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it.
OB.brainmob = src
@@ -21,6 +24,8 @@
if(!stored_dna.species)
var/rando_race = pick(GLOB.roundstart_races)
stored_dna.species = new rando_race()
if(stored_dna.species.exotic_bloodtype)
stored_dna.blood_type = stored_dna.species.exotic_bloodtype
/mob/living/brain/Destroy()
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
@@ -92,6 +92,17 @@ GLOBAL_VAR(posibrain_notify_cooldown)
if(posi_ask == "No" || QDELETED(src))
return
transfer_personality(user)
latejoin_remove()
/obj/item/mmi/posibrain/Destroy()
latejoin_remove()
return ..()
/obj/item/mmi/posibrain/proc/latejoin_remove()
GLOB.poi_list -= src
LAZYREMOVE(GLOB.mob_spawners[name], src)
if(!LAZYLEN(GLOB.mob_spawners[name]))
GLOB.mob_spawners -= name
/obj/item/mmi/posibrain/transfer_identity(mob/living/carbon/C)
name = "[initial(name)] ([C])"
@@ -163,6 +174,8 @@ GLOBAL_VAR(posibrain_notify_cooldown)
brainmob.container = src
if(autoping)
ping_ghosts("created", TRUE)
GLOB.poi_list |= src
LAZYADD(GLOB.mob_spawners[name], src)
/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user)
return
@@ -20,7 +20,7 @@
var/heat_protection = 0.5
var/leaping = 0
gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs
gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno
unique_name = 1
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
@@ -2,7 +2,7 @@
if(with_bodyparts)
new /obj/effect/gibspawner/xeno(drop_location())
else
new /obj/effect/gibspawner/xenobodypartless(drop_location())
new /obj/effect/gibspawner/xeno/bodypartless(drop_location())
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
@@ -10,7 +10,7 @@
if(with_bodyparts)
new /obj/effect/gibspawner/larva(drop_location())
else
new /obj/effect/gibspawner/larvabodypartless(drop_location())
new /obj/effect/gibspawner/larva/bodypartless(drop_location())
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
@@ -89,6 +89,8 @@
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)
if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL))
owner.blood_volume += 5
else
owner.adjustPlasma(plasma_rate * 0.1)
+2 -2
View File
@@ -903,7 +903,7 @@
/mob/living/carbon/do_after_coefficent()
. = ..()
GET_COMPONENT_FROM(mood, /datum/component/mood, src) //Currently, only carbons or higher use mood, move this once that changes.
var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes.
if(mood)
switch(mood.sanity) //Alters do_after delay based on how sane you are
if(SANITY_INSANE to SANITY_DISTURBED)
@@ -945,7 +945,7 @@
return TRUE
if(HAS_TRAIT(src, TRAIT_DUMB))
return TRUE
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood)
if(mood.sanity < SANITY_UNSTABLE)
return TRUE
@@ -287,7 +287,7 @@
"<span class='notice'>You give [H] a pat on the head to make [p_them()] feel better!</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
if (mood.sanity >= SANITY_GREAT)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M)
else if (mood.sanity >= SANITY_DISTURBED)
@@ -322,7 +322,7 @@
"<span class='notice'>You hug [src] to make [p_them()] feel better!</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
if (mood.sanity >= SANITY_GREAT)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M)
else if (mood.sanity >= SANITY_DISTURBED)
@@ -49,6 +49,7 @@
//Gets filled up in create_bodyparts()
var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
var/list/leg_bodyparts = list()
var/icon_render_key = ""
var/static/list/limb_icon_cache = list()
+14 -13
View File
@@ -1,8 +1,8 @@
/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE)
/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
var/hit_percent = (100-blocked)/100
if(hit_percent <= 0)
if(!forced && hit_percent <= 0)
return 0
var/obj/item/bodypart/BP = null
@@ -15,34 +15,35 @@
if(!BP)
BP = bodyparts[1]
var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
if(BP)
if(damage > 0 ? BP.receive_damage(damage * hit_percent, 0) : BP.heal_damage(abs(damage * hit_percent), 0))
if(damage > 0 ? BP.receive_damage(damage_amount) : BP.heal_damage(abs(damage_amount), 0))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage * hit_percent)
adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
if(BP)
if(damage > 0 ? BP.receive_damage(0, damage * hit_percent) : BP.heal_damage(0, abs(damage * hit_percent)))
if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount)))
update_damage_overlays()
else
adjustFireLoss(damage * hit_percent)
adjustFireLoss(damage_amount, forced = forced)
if(TOX)
adjustToxLoss(damage * hit_percent)
adjustToxLoss(damage_amount, forced = forced)
if(OXY)
adjustOxyLoss(damage * hit_percent)
adjustOxyLoss(damage_amount, forced = forced)
if(CLONE)
adjustCloneLoss(damage * hit_percent)
adjustCloneLoss(damage_amount, forced = forced)
if(STAMINA)
if(BP)
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent) : BP.heal_damage(0, 0, abs(damage * hit_percent)))
if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage_amount)))
update_damage_overlays()
else
adjustStaminaLoss(damage * hit_percent)
adjustStaminaLoss(damage_amount, forced = forced)
//citadel code
if(AROUSAL)
adjustArousalLoss(damage * hit_percent)
adjustArousalLoss(damage_amount, forced = forced)
return TRUE
@@ -85,7 +86,7 @@
if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
amount = -amount
if(amount > 0)
blood_volume -= 5*amount
blood_volume -= 3*amount // x5 is too much, x3 should be still penalizing enough.
else
blood_volume -= amount
return ..()
+1 -1
View File
@@ -93,7 +93,7 @@
msg += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]\n"
msg += common_trait_examine()
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood)
switch(mood.shown_mood)
if(-INFINITY to MOOD_LEVEL_SAD4)
@@ -1,5 +1,5 @@
/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
// depending on the species, it will run the corresponding apply_damage code there
return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src)
return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced)
+28 -3
View File
@@ -5,10 +5,35 @@
new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses())
if(isjellyperson(src))
if(with_bodyparts)
new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses())
else
new /obj/effect/gibspawner/slime/bodypartless(drop_location(), dna, get_static_viruses())
if(isipcperson(src))
if(with_bodyparts)
new /obj/effect/gibspawner/ipc(drop_location(), dna, get_static_viruses())
else
new /obj/effect/gibspawner/ipc/bodypartless(drop_location(), dna, get_static_viruses())
if(isxenoperson(src))
if(with_bodyparts)
new /obj/effect/gibspawner/xeno/xenoperson(drop_location(), dna, get_static_viruses())
else
new /obj/effect/gibspawner/xeno/xenoperson/bodypartless(drop_location(), dna, get_static_viruses())
if(islizard(src))
if(with_bodyparts)
new /obj/effect/gibspawner/lizard(drop_location(), dna, get_static_viruses())
else
new /obj/effect/gibspawner/lizard/bodypartless(drop_location(), dna, get_static_viruses())
else
new /obj/effect/gibspawner/humanbodypartless(drop_location(), dna, get_static_viruses())
if(with_bodyparts)
new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses())
else
new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses())
/mob/living/carbon/human/spawn_dust(just_ash = FALSE)
if(just_ash)
@@ -1,4 +1,4 @@
/mob/living/carbon/human/examine(mob/user) //User is the person being examined
/mob/living/carbon/human/examine(mob/user)
//this is very slightly better than it was because you can use it more places. still can't do \his[src] though.
var/t_He = p_they(TRUE)
var/t_His = p_their(TRUE)
@@ -45,7 +45,7 @@
if(wear_suit)
msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n"
//suit/armor storage
if(s_store)
if(s_store && !(SLOT_S_STORE in obscured))
msg += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name].\n"
//back
if(back)
@@ -56,11 +56,10 @@
if(!(I.item_flags & ABSTRACT))
msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
GET_COMPONENT(FR, /datum/component/forensics)
//gloves
if(gloves && !(SLOT_GLOVES in obscured))
msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n"
else if(FR && length(FR.blood_DNA))
else if(length(blood_DNA))
var/hand_number = get_num_arms(FALSE)
if(hand_number)
msg += "<span class='warning'>[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!</span>\n"
@@ -86,7 +85,7 @@
if(wear_mask && !(SLOT_WEAR_MASK in obscured))
msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n"
if (wear_neck && !(SLOT_NECK in obscured))
if(wear_neck && !(SLOT_NECK in obscured))
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
//eyes
@@ -152,7 +151,7 @@
var/temp = getBruteLoss() //no need to calculate each of these twice
msg += "<span class='warning'>"
msg += "<span class='warning'>" //Everything below gets this span
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/list/disabled = list()
@@ -297,7 +296,7 @@
msg += "[t_He] seem[p_s()] winded.\n"
if (getToxLoss() >= 10)
msg += "[t_He] seem[p_s()] sickly.\n"
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood.sanity <= SANITY_DISTURBED)
msg += "[t_He] seem[p_s()] distressed.\n"
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src)
+26 -10
View File
@@ -32,7 +32,7 @@
if(CONFIG_GET(flag/disable_stambuffer))
togglesprint()
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood)
/mob/living/carbon/human/ComponentInitialize()
@@ -689,16 +689,17 @@
if(..())
dropItemToGround(I)
/mob/living/carbon/human/proc/clean_blood(datum/source, strength)
if(strength < CLEAN_STRENGTH_BLOOD)
return
if(gloves)
if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
update_inv_gloves()
/mob/living/carbon/human/clean_blood()
var/mob/living/carbon/human/H = src
if(H.gloves)
if(H.gloves.clean_blood())
H.update_inv_gloves()
else
if(bloody_hands)
bloody_hands = 0
update_inv_gloves()
..() // Clear the Blood_DNA list
if(H.bloody_hands)
H.bloody_hands = 0
H.update_inv_gloves()
update_icons() //apply the now updated overlays to the mob
/mob/living/carbon/human/wash_cream()
if(creamed) //clean both to prevent a rare bug
@@ -1104,3 +1105,18 @@
/mob/living/carbon/human/species/zombie/krokodil_addict
race = /datum/species/krokodil_addict
/mob/living/carbon/human/species/mammal
race = /datum/species/mammal
/mob/living/carbon/human/species/insect
race = /datum/species/insect
/mob/living/carbon/human/species/xeno
race = /datum/species/xeno
/mob/living/carbon/human/species/ipc
race = /datum/species/ipc
/mob/living/carbon/human/species/roundstartslime
race = /datum/species/jelly/roundstartslime
@@ -51,6 +51,9 @@
var/bleed_rate = 0 //how much are we bleeding
var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
var/blood_state = BLOOD_STATE_NOT_BLOODY
var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
var/name_override //For temporary visible name changes
var/genital_override = FALSE //Force genitals on things incase of chems
@@ -127,3 +127,9 @@
return FALSE
return .
/*
/mob/living/carbon/human/transfer_blood_dna(list/blood_dna)
..()
if(blood_dna.len)
last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
last_blood_DNA = blood_dna[blood_dna.len]*/
@@ -56,20 +56,20 @@
//Bloody footprints
var/turf/T = get_turf(src)
if(S.bloody_shoes && S.bloody_shoes[S.blood_state])
for(var/obj/effect/decal/cleanable/blood/footprints/oldFP in T)
if (oldFP.blood_state == S.blood_state)
return
//No oldFP or they're all a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD)
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
FP.blood_state = S.blood_state
FP.entered_dirs |= dir
FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
FP.add_blood_DNA(S.return_blood_DNA())
FP.update_icon()
var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == bloodtype_to_color(S.last_bloodtype)))
return
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state]-BLOOD_LOSS_PER_STEP)
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
FP.blood_state = S.blood_state
FP.entered_dirs |= dir
FP.bloodiness = S.bloody_shoes[S.blood_state]
if(S.last_bloodtype)
FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype)
FP.update_icon()
update_inv_shoes()
//End bloody footprints
S.step_action()
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee.
+9 -9
View File
@@ -1,14 +1,14 @@
/mob/living/carbon/human/say_mod(input, message_mode)
verb_say = dna.species.say_mod
switch(slurring)
if(10 to 25)
return "jumbles"
if(25 to 50)
return "slurs"
if(50 to INFINITY)
return "garbles"
else
. = ..()
. = ..()
if(message_mode != MODE_CUSTOM_SAY && message_mode != MODE_WHISPER_CRIT)
switch(slurring)
if(10 to 25)
return "jumbles"
if(25 to 50)
return "slurs"
if(50 to INFINITY)
return "garbles"
/mob/living/carbon/human/GetVoice()
if(istype(wear_mask, /obj/item/clothing/mask/chameleon))
+36 -16
View File
@@ -339,7 +339,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
if(C.dna.species.exotic_bloodtype)
C.dna.blood_type = random_blood_type()
if(!new_species.exotic_bloodtype)
C.dna.blood_type = random_blood_type()
else
C.dna.blood_type = new_species.exotic_bloodtype
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
for(var/X in inherent_traits)
@@ -1024,6 +1027,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return "TAUR"
//END EDIT
/* TODO: Snowflake trail marks
// Impliments different trails for species depending on if they're wearing shoes.
/datum/species/proc/get_move_trail(var/mob/living/carbon/human/H)
if(H.lying)
return /obj/effect/decal/cleanable/blood/footprints/tracks/body
if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
var/obj/item/clothing/shoes/shoes = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) ? H.wear_suit : H.shoes // suits take priority over shoes
return shoes.move_trail
else
return move_trail */
/datum/species/proc/spec_life(mob/living/carbon/human/H)
if(HAS_TRAIT(H, TRAIT_NOBREATH))
@@ -1277,7 +1290,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
if(mood && mood.sanity > SANITY_DISTURBED)
hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
@@ -1435,7 +1448,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/grav_force = min(gravity - STANDARD_GRAVITY,3)
. += 1 + grav_force
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
if(mood && !flight) //How can depression slow you down if you can just fly away from your problems?
switch(mood.sanity)
if(SANITY_INSANE to SANITY_CRAZY)
@@ -1946,10 +1959,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
append_message = "loosening their grip on [target_held_item]"
log_combat(user, target, "shoved", append_message)
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
if(hit_percent <= 0)
if(!forced && hit_percent <= 0)
return 0
var/obj/item/bodypart/BP = null
@@ -1971,37 +1984,44 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
switch(damagetype)
if(BRUTE)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod
if(BP)
if(damage > 0 ? BP.receive_damage(damage * hit_percent * brutemod * H.physiology.brute_mod, 0) : BP.heal_damage(abs(damage * hit_percent * brutemod * H.physiology.brute_mod), 0))
if(damage > 0 ? BP.receive_damage(damage_amount, 0) : BP.heal_damage(abs(damage_amount), 0))
H.update_damage_overlays()
if(HAS_TRAIT(H, TRAIT_MASO))
H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod)
H.adjustArousalLoss(damage_amount, 0)
if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna())
H.mob_climax(forced_climax=TRUE)
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod)
H.adjustBruteLoss(damage_amount)
if(BURN)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
if(BP)
if(damage > 0 ? BP.receive_damage(0, damage * hit_percent * burnmod * H.physiology.burn_mod) : BP.heal_damage(0, abs(damage * hit_percent * burnmod * H.physiology.burn_mod)))
if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount)))
H.update_damage_overlays()
else
H.adjustFireLoss(damage * hit_percent * burnmod * H.physiology.burn_mod)
H.adjustFireLoss(damage_amount)
if(TOX)
H.adjustToxLoss(damage * hit_percent * H.physiology.tox_mod)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod
H.adjustToxLoss(damage_amount)
if(OXY)
H.adjustOxyLoss(damage * hit_percent * H.physiology.oxy_mod)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.oxy_mod
H.adjustOxyLoss(damage_amount)
if(CLONE)
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.clone_mod
H.adjustCloneLoss(damage_amount)
if(STAMINA)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod
if(BP)
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
H.update_stamina()
else
H.adjustStaminaLoss(damage * hit_percent * H.physiology.stamina_mod)
H.adjustStaminaLoss(damage_amount)
if(BRAIN)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage * hit_percent * H.physiology.brain_mod)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
if(AROUSAL) //Citadel edit - arousal
H.adjustArousalLoss(damage * hit_percent)
return 1
@@ -17,6 +17,7 @@
toxic_food = MEAT | RAW
mutanteyes = /obj/item/organ/eyes/insect
should_draw_citadel = TRUE
exotic_bloodtype = "BUG"
/datum/species/insect/on_species_gain(mob/living/carbon/C)
. = ..()
@@ -10,6 +10,7 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly
disliked_food = null
liked_food = GROSS
exotic_bloodtype = "BUG"
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "pestkiller")
@@ -65,7 +65,7 @@
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
exotic_bloodtype = "L"
exotic_bloodtype = "X*"
damage_overlay_type = "xeno"
liked_food = MEAT
@@ -634,9 +634,10 @@
id = "clockwork golem"
say_mod = "clicks"
limbs_id = "clockgolem"
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>Clockwork Golem</span><span class='bold alloy'>, you are faster than other types of golems. On death, you will break down into scrap.</span>"
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>Clockwork Golem</span><span class='bold alloy'>, you are faster than other types of golems, and are capable of using guns. On death, you will break down into scrap.</span>"
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
@@ -682,7 +683,7 @@
blacklisted = TRUE
dangerous_existence = TRUE
random_eligible = FALSE
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>Clockwork Golem Servant</span><span class='bold alloy'>, you are faster than other types of golems.</span>" //warcult golems leave a corpse
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>Clockwork Golem Servant</span><span class='bold alloy'>, you are faster than other types of golems, and are capable of using guns.</span>" //warcult golems leave a corpse
/datum/species/golem/cloth
name = "Cloth Golem"
@@ -12,8 +12,8 @@
default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
mutanttongue = /obj/item/organ/tongue/robot/ipc
exotic_blood = "oil"
mutant_heart = /obj/item/organ/heart/ipc
exotic_bloodtype = "HF"
var/datum/action/innate/monitor_change/screen
@@ -4,13 +4,15 @@
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,WINGCOLOR)
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR)
mutantlungs = /obj/item/organ/lungs/slime
mutant_heart = /obj/item/organ/heart/slime
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur", "deco_wings") //CIT CHANGE
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") //CIT CHANGE
inherent_traits = list(TRAIT_TOXINLOVER)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
exotic_blood = "slimejelly"
exotic_blood = "jellyblood"
exotic_bloodtype = "GEL"
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
var/datum/action/innate/slime_change/slime_change //CIT CHANGE
@@ -121,7 +123,7 @@
name = "Xenobiological Slime Entity"
id = "slime"
default_color = "00FFFF"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 150
@@ -396,7 +398,7 @@
id = "slimeperson"
limbs_id = "slime"
default_color = "00FFFF"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur")
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
@@ -45,7 +45,7 @@
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(20, amount)
/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
@@ -180,7 +180,7 @@ There are several things that need to be remembered:
inv.update_icon()
if(!gloves && bloody_hands)
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color())
if(get_num_arms() < 2)
if(has_left_hand())
bloody_overlay.icon_state = "bloodyhands_left"
@@ -270,6 +270,32 @@ There are several things that need to be remembered:
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES]
inv.update_icon()
/*
if(!shoes && bloody_feet)
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
if(dna.features["taur"] != "None")
if(dna.features["taur"] in GLOB.noodle_taurs)
bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "snekbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
if(get_num_legs() < 2)
if(has_left_leg())
bloody_overlay.icon_state = "snekbloodyfeet_left"
else if(has_right_leg())
bloody_overlay.icon_state = "snekbloodyfeet_right"
else if(dna.features["taur"] in GLOB.paw_taurs)
bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "pawbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
if(get_num_legs() < 2)
if(has_left_leg())
bloody_overlay.icon_state = "pawbloodyfeet_left"
else if(has_right_leg())
bloody_overlay.icon_state = "pawbloodyfeet_right"
else
if(get_num_legs() < 2)
if(has_left_leg())
bloody_overlay.icon_state = "bloodyfeet_left"
else if(has_right_leg())
bloody_overlay.icon_state = "bloodyfeet_right"
overlays_standing[GLOVES_LAYER] = bloody_overlay*/
if(shoes)
var/obj/item/clothing/shoes/S = shoes
@@ -97,8 +97,12 @@
/mob/living/carbon/update_damage_overlays()
remove_overlay(DAMAGE_LAYER)
var/dam_colors = "#E62525"
if(ishuman(src))
var/mob/living/carbon/human/H = src
dam_colors = bloodtype_to_color(H.dna.blood_type)
var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER)
var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER, color = dam_colors)
overlays_standing[DAMAGE_LAYER] = damage_overlay
for(var/X in bodyparts)
+8 -7
View File
@@ -8,23 +8,24 @@
Returns
standard 0 if fail
*/
/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
var/hit_percent = (100-blocked)/100
if(!damage || (hit_percent <= 0))
return 0
var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
adjustBruteLoss(damage * hit_percent)
adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
adjustFireLoss(damage * hit_percent)
adjustFireLoss(damage_amount, forced = forced)
if(TOX)
adjustToxLoss(damage * hit_percent)
adjustToxLoss(damage_amount, forced = forced)
if(OXY)
adjustOxyLoss(damage * hit_percent)
adjustOxyLoss(damage_amount, forced = forced)
if(CLONE)
adjustCloneLoss(damage * hit_percent)
adjustCloneLoss(damage_amount, forced = forced)
if(STAMINA)
adjustStaminaLoss(damage * hit_percent)
adjustStaminaLoss(damage_amount, forced = forced)
return 1
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
+1 -1
View File
@@ -512,7 +512,7 @@
fire_stacks = 0
confused = 0
update_canmove()
GET_COMPONENT(mood, /datum/component/mood)
var/datum/component/mood/mood = GetComponent(/datum/component/mood)
if (mood)
QDEL_LIST_ASSOC_VAL(mood.mood_events)
mood.sanity = SANITY_GREAT
+9 -9
View File
@@ -391,16 +391,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return 0
/mob/living/say_mod(input, message_mode)
if(message_mode == MODE_WHISPER)
. = verb_whisper
else if(message_mode == MODE_WHISPER_CRIT)
. = ..()
if(message_mode == MODE_WHISPER_CRIT)
. = "[verb_whisper] in [p_their()] last breath"
else if(stuttering)
. = "stammers"
else if(derpspeech)
. = "gibbers"
else
. = ..()
else if(message_mode != MODE_CUSTOM_SAY)
if(message_mode == MODE_WHISPER)
. = verb_whisper
else if(stuttering)
. = "stammers"
else if(derpspeech)
. = "gibbers"
/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
@@ -975,4 +975,635 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg',
"zombie" = 'sound/vox_fem/zombie.ogg',
"zone" = 'sound/vox_fem/zone.ogg',
"zulu" = 'sound/vox_fem/zulu.ogg'))
//for vim
// :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox\/\1',/g
GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'sound/vox/_comma.ogg',
"." = 'sound/vox/_period.ogg',
"a" = 'sound/vox/a.ogg',
"accelerating" = 'sound/vox/accelerating.ogg',
"accelerator" = 'sound/vox/accelerator.ogg',
"accepted" = 'sound/vox/accepted.ogg',
"access" = 'sound/vox/access.ogg',
"acknowledge" = 'sound/vox/acknowledge.ogg',
"acknowledged" = 'sound/vox/acknowledged.ogg',
"acquired" = 'sound/vox/acquired.ogg',
"acquisition" = 'sound/vox/acquisition.ogg',
"across" = 'sound/vox/across.ogg',
"activate" = 'sound/vox/activate.ogg',
"activated" = 'sound/vox/activated.ogg',
"activity" = 'sound/vox/activity.ogg',
"adios" = 'sound/vox/adios.ogg',
"administration" = 'sound/vox/administration.ogg',
"advanced" = 'sound/vox/advanced.ogg',
"after" = 'sound/vox/after.ogg',
"agent" = 'sound/vox/agent.ogg',
"alarm" = 'sound/vox/alarm.ogg',
"alert" = 'sound/vox/alert.ogg',
"alien" = 'sound/vox/alien.ogg',
"aligned" = 'sound/vox/aligned.ogg',
"all" = 'sound/vox/all.ogg',
"alpha" = 'sound/vox/alpha.ogg',
"am" = 'sound/vox/am.ogg',
"amigo" = 'sound/vox/amigo.ogg',
"ammunition" = 'sound/vox/ammunition.ogg',
"an" = 'sound/vox/an.ogg',
"and" = 'sound/vox/and.ogg',
"announcement" = 'sound/vox/announcement.ogg',
"anomalous" = 'sound/vox/anomalous.ogg',
"antenna" = 'sound/vox/antenna.ogg',
"any" = 'sound/vox/any.ogg',
"apprehend" = 'sound/vox/apprehend.ogg',
"approach" = 'sound/vox/approach.ogg',
"are" = 'sound/vox/are.ogg',
"area" = 'sound/vox/area.ogg',
"arm" = 'sound/vox/arm.ogg',
"armed" = 'sound/vox/armed.ogg',
"armor" = 'sound/vox/armor.ogg',
"armory" = 'sound/vox/armory.ogg',
"arrest" = 'sound/vox/arrest.ogg',
"ass" = 'sound/vox/ass.ogg',
"at" = 'sound/vox/at.ogg',
"atomic" = 'sound/vox/atomic.ogg',
"attention" = 'sound/vox/attention.ogg',
"authorize" = 'sound/vox/authorize.ogg',
"authorized" = 'sound/vox/authorized.ogg',
"automatic" = 'sound/vox/automatic.ogg',
"away" = 'sound/vox/away.ogg',
"b" = 'sound/vox/b.ogg',
"back" = 'sound/vox/back.ogg',
"backman" = 'sound/vox/backman.ogg',
"bad" = 'sound/vox/bad.ogg',
"bag" = 'sound/vox/bag.ogg',
"bailey" = 'sound/vox/bailey.ogg',
"barracks" = 'sound/vox/barracks.ogg',
"base" = 'sound/vox/base.ogg',
"bay" = 'sound/vox/bay.ogg',
"be" = 'sound/vox/be.ogg',
"been" = 'sound/vox/been.ogg',
"before" = 'sound/vox/before.ogg',
"beyond" = 'sound/vox/beyond.ogg',
"biohazard" = 'sound/vox/biohazard.ogg',
"biological" = 'sound/vox/biological.ogg',
"birdwell" = 'sound/vox/birdwell.ogg',
"bizwarn" = 'sound/vox/bizwarn.ogg',
"black" = 'sound/vox/black.ogg',
"blast" = 'sound/vox/blast.ogg',
"blocked" = 'sound/vox/blocked.ogg',
"bloop" = 'sound/vox/bloop.ogg',
"blue" = 'sound/vox/blue.ogg',
"bottom" = 'sound/vox/bottom.ogg',
"bravo" = 'sound/vox/bravo.ogg',
"breach" = 'sound/vox/breach.ogg',
"breached" = 'sound/vox/breached.ogg',
"break" = 'sound/vox/break.ogg',
"bridge" = 'sound/vox/bridge.ogg',
"bust" = 'sound/vox/bust.ogg',
"but" = 'sound/vox/but.ogg',
"button" = 'sound/vox/button.ogg',
"buzwarn" = 'sound/vox/buzwarn.ogg',
"bypass" = 'sound/vox/bypass.ogg',
"c" = 'sound/vox/c.ogg',
"cable" = 'sound/vox/cable.ogg',
"call" = 'sound/vox/call.ogg',
"called" = 'sound/vox/called.ogg',
"canal" = 'sound/vox/canal.ogg',
"cap" = 'sound/vox/cap.ogg',
"captain" = 'sound/vox/captain.ogg',
"capture" = 'sound/vox/capture.ogg',
"captured" = 'sound/vox/captured.ogg',
"ceiling" = 'sound/vox/ceiling.ogg',
"celsius" = 'sound/vox/celsius.ogg',
"center" = 'sound/vox/center.ogg',
"centi" = 'sound/vox/centi.ogg',
"central" = 'sound/vox/central.ogg',
"chamber" = 'sound/vox/chamber.ogg',
"charlie" = 'sound/vox/charlie.ogg',
"check" = 'sound/vox/check.ogg',
"checkpoint" = 'sound/vox/checkpoint.ogg',
"chemical" = 'sound/vox/chemical.ogg',
"cleanup" = 'sound/vox/cleanup.ogg',
"clear" = 'sound/vox/clear.ogg',
"clearance" = 'sound/vox/clearance.ogg',
"close" = 'sound/vox/close.ogg',
"clown" = 'sound/vox/clown.ogg',
"code" = 'sound/vox/code.ogg',
"coded" = 'sound/vox/coded.ogg',
"collider" = 'sound/vox/collider.ogg',
"command" = 'sound/vox/command.ogg',
"communication" = 'sound/vox/communication.ogg',
"complex" = 'sound/vox/complex.ogg',
"computer" = 'sound/vox/computer.ogg',
"condition" = 'sound/vox/condition.ogg',
"containment" = 'sound/vox/containment.ogg',
"contamination" = 'sound/vox/contamination.ogg',
"control" = 'sound/vox/control.ogg',
"coolant" = 'sound/vox/coolant.ogg',
"coomer" = 'sound/vox/coomer.ogg',
"core" = 'sound/vox/core.ogg',
"correct" = 'sound/vox/correct.ogg',
"corridor" = 'sound/vox/corridor.ogg',
"crew" = 'sound/vox/crew.ogg',
"cross" = 'sound/vox/cross.ogg',
"cryogenic" = 'sound/vox/cryogenic.ogg',
"d" = 'sound/vox/d.ogg',
"dadeda" = 'sound/vox/dadeda.ogg',
"damage" = 'sound/vox/damage.ogg',
"damaged" = 'sound/vox/damaged.ogg',
"danger" = 'sound/vox/danger.ogg',
"day" = 'sound/vox/day.ogg',
"deactivated" = 'sound/vox/deactivated.ogg',
"decompression" = 'sound/vox/decompression.ogg',
"decontamination" = 'sound/vox/decontamination.ogg',
"deeoo" = 'sound/vox/deeoo.ogg',
"defense" = 'sound/vox/defense.ogg',
"degrees" = 'sound/vox/degrees.ogg',
"delta" = 'sound/vox/delta.ogg',
"denied" = 'sound/vox/denied.ogg',
"deploy" = 'sound/vox/deploy.ogg',
"deployed" = 'sound/vox/deployed.ogg',
"destroy" = 'sound/vox/destroy.ogg',
"destroyed" = 'sound/vox/destroyed.ogg',
"detain" = 'sound/vox/detain.ogg',
"detected" = 'sound/vox/detected.ogg',
"detonation" = 'sound/vox/detonation.ogg',
"device" = 'sound/vox/device.ogg',
"did" = 'sound/vox/did.ogg',
"die" = 'sound/vox/die.ogg',
"dimensional" = 'sound/vox/dimensional.ogg',
"dirt" = 'sound/vox/dirt.ogg',
"disengaged" = 'sound/vox/disengaged.ogg',
"dish" = 'sound/vox/dish.ogg',
"disposal" = 'sound/vox/disposal.ogg',
"distance" = 'sound/vox/distance.ogg',
"distortion" = 'sound/vox/distortion.ogg',
"do" = 'sound/vox/do.ogg',
"doctor" = 'sound/vox/doctor.ogg',
"doop" = 'sound/vox/doop.ogg',
"door" = 'sound/vox/door.ogg',
"down" = 'sound/vox/down.ogg',
"dual" = 'sound/vox/dual.ogg',
"duct" = 'sound/vox/duct.ogg',
"e" = 'sound/vox/e.ogg',
"east" = 'sound/vox/east.ogg',
"echo" = 'sound/vox/echo.ogg',
"ed" = 'sound/vox/ed.ogg',
"effect" = 'sound/vox/effect.ogg',
"egress" = 'sound/vox/egress.ogg',
"eight" = 'sound/vox/eight.ogg',
"eighteen" = 'sound/vox/eighteen.ogg',
"eighty" = 'sound/vox/eighty.ogg',
"electric" = 'sound/vox/electric.ogg',
"electromagnetic" = 'sound/vox/electromagnetic.ogg',
"elevator" = 'sound/vox/elevator.ogg',
"eleven" = 'sound/vox/eleven.ogg',
"eliminate" = 'sound/vox/eliminate.ogg',
"emergency" = 'sound/vox/emergency.ogg',
"enemy" = 'sound/vox/enemy.ogg',
"energy" = 'sound/vox/energy.ogg',
"engage" = 'sound/vox/engage.ogg',
"engaged" = 'sound/vox/engaged.ogg',
"engine" = 'sound/vox/engine.ogg',
"enter" = 'sound/vox/enter.ogg',
"entry" = 'sound/vox/entry.ogg',
"environment" = 'sound/vox/environment.ogg',
"error" = 'sound/vox/error.ogg',
"escape" = 'sound/vox/escape.ogg',
"evacuate" = 'sound/vox/evacuate.ogg',
"exchange" = 'sound/vox/exchange.ogg',
"exit" = 'sound/vox/exit.ogg',
"expect" = 'sound/vox/expect.ogg',
"experiment" = 'sound/vox/experiment.ogg',
"experimental" = 'sound/vox/experimental.ogg',
"explode" = 'sound/vox/explode.ogg',
"explosion" = 'sound/vox/explosion.ogg',
"exposure" = 'sound/vox/exposure.ogg',
"exterminate" = 'sound/vox/exterminate.ogg',
"extinguish" = 'sound/vox/extinguish.ogg',
"extinguisher" = 'sound/vox/extinguisher.ogg',
"extreme" = 'sound/vox/extreme.ogg',
"f" = 'sound/vox/f.ogg',
"face" = 'sound/vox/face.ogg',
"facility" = 'sound/vox/facility.ogg',
"fahrenheit" = 'sound/vox/fahrenheit.ogg',
"failed" = 'sound/vox/failed.ogg',
"failure" = 'sound/vox/failure.ogg',
"farthest" = 'sound/vox/farthest.ogg',
"fast" = 'sound/vox/fast.ogg',
"feet" = 'sound/vox/feet.ogg',
"field" = 'sound/vox/field.ogg',
"fifteen" = 'sound/vox/fifteen.ogg',
"fifth" = 'sound/vox/fifth.ogg',
"fifty" = 'sound/vox/fifty.ogg',
"final" = 'sound/vox/final.ogg',
"fine" = 'sound/vox/fine.ogg',
"fire" = 'sound/vox/fire.ogg',
"first" = 'sound/vox/first.ogg',
"five" = 'sound/vox/five.ogg',
"flag" = 'sound/vox/flag.ogg',
"flooding" = 'sound/vox/flooding.ogg',
"floor" = 'sound/vox/floor.ogg',
"fool" = 'sound/vox/fool.ogg',
"for" = 'sound/vox/for.ogg',
"forbidden" = 'sound/vox/forbidden.ogg',
"force" = 'sound/vox/force.ogg',
"forms" = 'sound/vox/forms.ogg',
"found" = 'sound/vox/found.ogg',
"four" = 'sound/vox/four.ogg',
"fourteen" = 'sound/vox/fourteen.ogg',
"fourth" = 'sound/vox/fourth.ogg',
"fourty" = 'sound/vox/fourty.ogg',
"foxtrot" = 'sound/vox/foxtrot.ogg',
"freeman" = 'sound/vox/freeman.ogg',
"freezer" = 'sound/vox/freezer.ogg',
"from" = 'sound/vox/from.ogg',
"front" = 'sound/vox/front.ogg',
"fuel" = 'sound/vox/fuel.ogg',
"g" = 'sound/vox/g.ogg',
"gay" = 'sound/vox/gay.ogg',
"get" = 'sound/vox/get.ogg',
"go" = 'sound/vox/go.ogg',
"going" = 'sound/vox/going.ogg',
"good" = 'sound/vox/good.ogg',
"goodbye" = 'sound/vox/goodbye.ogg',
"gordon" = 'sound/vox/gordon.ogg',
"got" = 'sound/vox/got.ogg',
"government" = 'sound/vox/government.ogg',
"granted" = 'sound/vox/granted.ogg',
"great" = 'sound/vox/great.ogg',
"green" = 'sound/vox/green.ogg',
"grenade" = 'sound/vox/grenade.ogg',
"guard" = 'sound/vox/guard.ogg',
"gulf" = 'sound/vox/gulf.ogg',
"gun" = 'sound/vox/gun.ogg',
"guthrie" = 'sound/vox/guthrie.ogg',
"handling" = 'sound/vox/handling.ogg',
"hangar" = 'sound/vox/hangar.ogg',
"has" = 'sound/vox/has.ogg',
"have" = 'sound/vox/have.ogg',
"hazard" = 'sound/vox/hazard.ogg',
"head" = 'sound/vox/head.ogg',
"health" = 'sound/vox/health.ogg',
"heat" = 'sound/vox/heat.ogg',
"helicopter" = 'sound/vox/helicopter.ogg',
"helium" = 'sound/vox/helium.ogg',
"hello" = 'sound/vox/hello.ogg',
"help" = 'sound/vox/help.ogg',
"here" = 'sound/vox/here.ogg',
"hide" = 'sound/vox/hide.ogg',
"high" = 'sound/vox/high.ogg',
"highest" = 'sound/vox/highest.ogg',
"hit" = 'sound/vox/hit.ogg',
"holds" = 'sound/vox/holds.ogg',
"hole" = 'sound/vox/hole.ogg',
"hostile" = 'sound/vox/hostile.ogg',
"hot" = 'sound/vox/hot.ogg',
"hotel" = 'sound/vox/hotel.ogg',
"hour" = 'sound/vox/hour.ogg',
"hours" = 'sound/vox/hours.ogg',
"hundred" = 'sound/vox/hundred.ogg',
"hydro" = 'sound/vox/hydro.ogg',
"i" = 'sound/vox/i.ogg',
"idiot" = 'sound/vox/idiot.ogg',
"illegal" = 'sound/vox/illegal.ogg',
"immediate" = 'sound/vox/immediate.ogg',
"immediately" = 'sound/vox/immediately.ogg',
"in" = 'sound/vox/in.ogg',
"inches" = 'sound/vox/inches.ogg',
"india" = 'sound/vox/india.ogg',
"ing" = 'sound/vox/ing.ogg',
"inoperative" = 'sound/vox/inoperative.ogg',
"inside" = 'sound/vox/inside.ogg',
"inspection" = 'sound/vox/inspection.ogg',
"inspector" = 'sound/vox/inspector.ogg',
"interchange" = 'sound/vox/interchange.ogg',
"intruder" = 'sound/vox/intruder.ogg',
"invallid" = 'sound/vox/invallid.ogg',
"invasion" = 'sound/vox/invasion.ogg',
"is" = 'sound/vox/is.ogg',
"it" = 'sound/vox/it.ogg',
"johnson" = 'sound/vox/johnson.ogg',
"juliet" = 'sound/vox/juliet.ogg',
"key" = 'sound/vox/key.ogg',
"kill" = 'sound/vox/kill.ogg',
"kilo" = 'sound/vox/kilo.ogg',
"kit" = 'sound/vox/kit.ogg',
"lab" = 'sound/vox/lab.ogg',
"lambda" = 'sound/vox/lambda.ogg',
"laser" = 'sound/vox/laser.ogg',
"last" = 'sound/vox/last.ogg',
"launch" = 'sound/vox/launch.ogg',
"leak" = 'sound/vox/leak.ogg',
"leave" = 'sound/vox/leave.ogg',
"left" = 'sound/vox/left.ogg',
"legal" = 'sound/vox/legal.ogg',
"level" = 'sound/vox/level.ogg',
"lever" = 'sound/vox/lever.ogg',
"lie" = 'sound/vox/lie.ogg',
"lieutenant" = 'sound/vox/lieutenant.ogg',
"life" = 'sound/vox/life.ogg',
"light" = 'sound/vox/light.ogg',
"lima" = 'sound/vox/lima.ogg',
"liquid" = 'sound/vox/liquid.ogg',
"loading" = 'sound/vox/loading.ogg',
"locate" = 'sound/vox/locate.ogg',
"located" = 'sound/vox/located.ogg',
"location" = 'sound/vox/location.ogg',
"lock" = 'sound/vox/lock.ogg',
"locked" = 'sound/vox/locked.ogg',
"locker" = 'sound/vox/locker.ogg',
"lockout" = 'sound/vox/lockout.ogg',
"lower" = 'sound/vox/lower.ogg',
"lowest" = 'sound/vox/lowest.ogg',
"magnetic" = 'sound/vox/magnetic.ogg',
"main" = 'sound/vox/main.ogg',
"maintenance" = 'sound/vox/maintenance.ogg',
"malfunction" = 'sound/vox/malfunction.ogg',
"man" = 'sound/vox/man.ogg',
"mass" = 'sound/vox/mass.ogg',
"materials" = 'sound/vox/materials.ogg',
"maximum" = 'sound/vox/maximum.ogg',
"may" = 'sound/vox/may.ogg',
"med" = 'sound/vox/med.ogg',
"medical" = 'sound/vox/medical.ogg',
"men" = 'sound/vox/men.ogg',
"mercy" = 'sound/vox/mercy.ogg',
"mesa" = 'sound/vox/mesa.ogg',
"message" = 'sound/vox/message.ogg',
"meter" = 'sound/vox/meter.ogg',
"micro" = 'sound/vox/micro.ogg',
"middle" = 'sound/vox/middle.ogg',
"mike" = 'sound/vox/mike.ogg',
"miles" = 'sound/vox/miles.ogg',
"military" = 'sound/vox/military.ogg',
"milli" = 'sound/vox/milli.ogg',
"million" = 'sound/vox/million.ogg',
"minefield" = 'sound/vox/minefield.ogg',
"minimum" = 'sound/vox/minimum.ogg',
"minutes" = 'sound/vox/minutes.ogg',
"mister" = 'sound/vox/mister.ogg',
"mode" = 'sound/vox/mode.ogg',
"motor" = 'sound/vox/motor.ogg',
"motorpool" = 'sound/vox/motorpool.ogg',
"move" = 'sound/vox/move.ogg',
"must" = 'sound/vox/must.ogg',
"nearest" = 'sound/vox/nearest.ogg',
"nice" = 'sound/vox/nice.ogg',
"nine" = 'sound/vox/nine.ogg',
"nineteen" = 'sound/vox/nineteen.ogg',
"ninety" = 'sound/vox/ninety.ogg',
"no" = 'sound/vox/no.ogg',
"nominal" = 'sound/vox/nominal.ogg',
"north" = 'sound/vox/north.ogg',
"not" = 'sound/vox/not.ogg',
"november" = 'sound/vox/november.ogg',
"now" = 'sound/vox/now.ogg',
"number" = 'sound/vox/number.ogg',
"objective" = 'sound/vox/objective.ogg',
"observation" = 'sound/vox/observation.ogg',
"of" = 'sound/vox/of.ogg',
"officer" = 'sound/vox/officer.ogg',
"ok" = 'sound/vox/ok.ogg',
"on" = 'sound/vox/on.ogg',
"one" = 'sound/vox/one.ogg',
"open" = 'sound/vox/open.ogg',
"operating" = 'sound/vox/operating.ogg',
"operations" = 'sound/vox/operations.ogg',
"operative" = 'sound/vox/operative.ogg',
"option" = 'sound/vox/option.ogg',
"order" = 'sound/vox/order.ogg',
"organic" = 'sound/vox/organic.ogg',
"oscar" = 'sound/vox/oscar.ogg',
"out" = 'sound/vox/out.ogg',
"outside" = 'sound/vox/outside.ogg',
"over" = 'sound/vox/over.ogg',
"overload" = 'sound/vox/overload.ogg',
"override" = 'sound/vox/override.ogg',
"pacify" = 'sound/vox/pacify.ogg',
"pain" = 'sound/vox/pain.ogg',
"pal" = 'sound/vox/pal.ogg',
"panel" = 'sound/vox/panel.ogg',
"percent" = 'sound/vox/percent.ogg',
"perimeter" = 'sound/vox/perimeter.ogg',
"permitted" = 'sound/vox/permitted.ogg',
"personnel" = 'sound/vox/personnel.ogg',
"pipe" = 'sound/vox/pipe.ogg',
"plant" = 'sound/vox/plant.ogg',
"platform" = 'sound/vox/platform.ogg',
"please" = 'sound/vox/please.ogg',
"point" = 'sound/vox/point.ogg',
"portal" = 'sound/vox/portal.ogg',
"power" = 'sound/vox/power.ogg',
"presence" = 'sound/vox/presence.ogg',
"press" = 'sound/vox/press.ogg',
"primary" = 'sound/vox/primary.ogg',
"proceed" = 'sound/vox/proceed.ogg',
"processing" = 'sound/vox/processing.ogg',
"progress" = 'sound/vox/progress.ogg',
"proper" = 'sound/vox/proper.ogg',
"propulsion" = 'sound/vox/propulsion.ogg',
"prosecute" = 'sound/vox/prosecute.ogg',
"protective" = 'sound/vox/protective.ogg',
"push" = 'sound/vox/push.ogg',
"quantum" = 'sound/vox/quantum.ogg',
"quebec" = 'sound/vox/quebec.ogg',
"question" = 'sound/vox/question.ogg',
"questioning" = 'sound/vox/questioning.ogg',
"quick" = 'sound/vox/quick.ogg',
"quit" = 'sound/vox/quit.ogg',
"radiation" = 'sound/vox/radiation.ogg',
"radioactive" = 'sound/vox/radioactive.ogg',
"rads" = 'sound/vox/rads.ogg',
"rapid" = 'sound/vox/rapid.ogg',
"reach" = 'sound/vox/reach.ogg',
"reached" = 'sound/vox/reached.ogg',
"reactor" = 'sound/vox/reactor.ogg',
"red" = 'sound/vox/red.ogg',
"relay" = 'sound/vox/relay.ogg',
"released" = 'sound/vox/released.ogg',
"remaining" = 'sound/vox/remaining.ogg',
"renegade" = 'sound/vox/renegade.ogg',
"repair" = 'sound/vox/repair.ogg',
"report" = 'sound/vox/report.ogg',
"reports" = 'sound/vox/reports.ogg',
"required" = 'sound/vox/required.ogg',
"research" = 'sound/vox/research.ogg',
"reset" = 'sound/vox/reset.ogg',
"resevoir" = 'sound/vox/resevoir.ogg',
"resistance" = 'sound/vox/resistance.ogg',
"returned" = 'sound/vox/returned.ogg',
"right" = 'sound/vox/right.ogg',
"rocket" = 'sound/vox/rocket.ogg',
"roger" = 'sound/vox/roger.ogg',
"romeo" = 'sound/vox/romeo.ogg',
"room" = 'sound/vox/room.ogg',
"round" = 'sound/vox/round.ogg',
"run" = 'sound/vox/run.ogg',
"safe" = 'sound/vox/safe.ogg',
"safety" = 'sound/vox/safety.ogg',
"sargeant" = 'sound/vox/sargeant.ogg',
"satellite" = 'sound/vox/satellite.ogg',
"save" = 'sound/vox/save.ogg',
"science" = 'sound/vox/science.ogg',
"scores" = 'sound/vox/scores.ogg',
"scream" = 'sound/vox/scream.ogg',
"screen" = 'sound/vox/screen.ogg',
"search" = 'sound/vox/search.ogg',
"second" = 'sound/vox/second.ogg',
"secondary" = 'sound/vox/secondary.ogg',
"seconds" = 'sound/vox/seconds.ogg',
"sector" = 'sound/vox/sector.ogg',
"secure" = 'sound/vox/secure.ogg',
"secured" = 'sound/vox/secured.ogg',
"security" = 'sound/vox/security.ogg',
"select" = 'sound/vox/select.ogg',
"selected" = 'sound/vox/selected.ogg',
"service" = 'sound/vox/service.ogg',
"seven" = 'sound/vox/seven.ogg',
"seventeen" = 'sound/vox/seventeen.ogg',
"seventy" = 'sound/vox/seventy.ogg',
"severe" = 'sound/vox/severe.ogg',
"sewage" = 'sound/vox/sewage.ogg',
"sewer" = 'sound/vox/sewer.ogg',
"shield" = 'sound/vox/shield.ogg',
"shipment" = 'sound/vox/shipment.ogg',
"shock" = 'sound/vox/shock.ogg',
"shoot" = 'sound/vox/shoot.ogg',
"shower" = 'sound/vox/shower.ogg',
"shut" = 'sound/vox/shut.ogg',
"side" = 'sound/vox/side.ogg',
"sierra" = 'sound/vox/sierra.ogg',
"sight" = 'sound/vox/sight.ogg',
"silo" = 'sound/vox/silo.ogg',
"six" = 'sound/vox/six.ogg',
"sixteen" = 'sound/vox/sixteen.ogg',
"sixty" = 'sound/vox/sixty.ogg',
"slime" = 'sound/vox/slime.ogg',
"slow" = 'sound/vox/slow.ogg',
"soldier" = 'sound/vox/soldier.ogg',
"some" = 'sound/vox/some.ogg',
"someone" = 'sound/vox/someone.ogg',
"something" = 'sound/vox/something.ogg',
"son" = 'sound/vox/son.ogg',
"sorry" = 'sound/vox/sorry.ogg',
"south" = 'sound/vox/south.ogg',
"squad" = 'sound/vox/squad.ogg',
"square" = 'sound/vox/square.ogg',
"stairway" = 'sound/vox/stairway.ogg',
"status" = 'sound/vox/status.ogg',
"sterile" = 'sound/vox/sterile.ogg',
"sterilization" = 'sound/vox/sterilization.ogg',
"stolen" = 'sound/vox/stolen.ogg',
"storage" = 'sound/vox/storage.ogg',
"sub" = 'sound/vox/sub.ogg',
"subsurface" = 'sound/vox/subsurface.ogg',
"sudden" = 'sound/vox/sudden.ogg',
"suit" = 'sound/vox/suit.ogg',
"superconducting" = 'sound/vox/superconducting.ogg',
"supercooled" = 'sound/vox/supercooled.ogg',
"supply" = 'sound/vox/supply.ogg',
"surface" = 'sound/vox/surface.ogg',
"surrender" = 'sound/vox/surrender.ogg',
"surround" = 'sound/vox/surround.ogg',
"surrounded" = 'sound/vox/surrounded.ogg',
"switch" = 'sound/vox/switch.ogg',
"system" = 'sound/vox/system.ogg',
"systems" = 'sound/vox/systems.ogg',
"tactical" = 'sound/vox/tactical.ogg',
"take" = 'sound/vox/take.ogg',
"talk" = 'sound/vox/talk.ogg',
"tango" = 'sound/vox/tango.ogg',
"tank" = 'sound/vox/tank.ogg',
"target" = 'sound/vox/target.ogg',
"team" = 'sound/vox/team.ogg',
"temperature" = 'sound/vox/temperature.ogg',
"temporal" = 'sound/vox/temporal.ogg',
"ten" = 'sound/vox/ten.ogg',
"terminal" = 'sound/vox/terminal.ogg',
"terminated" = 'sound/vox/terminated.ogg',
"termination" = 'sound/vox/termination.ogg',
"test" = 'sound/vox/test.ogg',
"that" = 'sound/vox/that.ogg',
"the" = 'sound/vox/the.ogg',
"then" = 'sound/vox/then.ogg',
"there" = 'sound/vox/there.ogg',
"third" = 'sound/vox/third.ogg',
"thirteen" = 'sound/vox/thirteen.ogg',
"thirty" = 'sound/vox/thirty.ogg',
"this" = 'sound/vox/this.ogg',
"those" = 'sound/vox/those.ogg',
"thousand" = 'sound/vox/thousand.ogg',
"threat" = 'sound/vox/threat.ogg',
"three" = 'sound/vox/three.ogg',
"through" = 'sound/vox/through.ogg',
"time" = 'sound/vox/time.ogg',
"to" = 'sound/vox/to.ogg',
"top" = 'sound/vox/top.ogg',
"topside" = 'sound/vox/topside.ogg',
"touch" = 'sound/vox/touch.ogg',
"towards" = 'sound/vox/towards.ogg',
"track" = 'sound/vox/track.ogg',
"train" = 'sound/vox/train.ogg',
"transportation" = 'sound/vox/transportation.ogg',
"truck" = 'sound/vox/truck.ogg',
"tunnel" = 'sound/vox/tunnel.ogg',
"turn" = 'sound/vox/turn.ogg',
"turret" = 'sound/vox/turret.ogg',
"twelve" = 'sound/vox/twelve.ogg',
"twenty" = 'sound/vox/twenty.ogg',
"two" = 'sound/vox/two.ogg',
"unauthorized" = 'sound/vox/unauthorized.ogg',
"under" = 'sound/vox/under.ogg',
"uniform" = 'sound/vox/uniform.ogg',
"unlocked" = 'sound/vox/unlocked.ogg',
"until" = 'sound/vox/until.ogg',
"up" = 'sound/vox/up.ogg',
"upper" = 'sound/vox/upper.ogg',
"uranium" = 'sound/vox/uranium.ogg',
"us" = 'sound/vox/us.ogg',
"usa" = 'sound/vox/usa.ogg',
"use" = 'sound/vox/use.ogg',
"used" = 'sound/vox/used.ogg',
"user" = 'sound/vox/user.ogg',
"vacate" = 'sound/vox/vacate.ogg',
"valid" = 'sound/vox/valid.ogg',
"vapor" = 'sound/vox/vapor.ogg',
"vent" = 'sound/vox/vent.ogg',
"ventillation" = 'sound/vox/ventillation.ogg',
"victor" = 'sound/vox/victor.ogg',
"violated" = 'sound/vox/violated.ogg',
"violation" = 'sound/vox/violation.ogg',
"voltage" = 'sound/vox/voltage.ogg',
"vox_login" = 'sound/vox/vox_login.ogg',
"walk" = 'sound/vox/walk.ogg',
"wall" = 'sound/vox/wall.ogg',
"want" = 'sound/vox/want.ogg',
"wanted" = 'sound/vox/wanted.ogg',
"warm" = 'sound/vox/warm.ogg',
"warn" = 'sound/vox/warn.ogg',
"warning" = 'sound/vox/warning.ogg',
"waste" = 'sound/vox/waste.ogg',
"water" = 'sound/vox/water.ogg',
"we" = 'sound/vox/we.ogg',
"weapon" = 'sound/vox/weapon.ogg',
"west" = 'sound/vox/west.ogg',
"whiskey" = 'sound/vox/whiskey.ogg',
"white" = 'sound/vox/white.ogg',
"wilco" = 'sound/vox/wilco.ogg',
"will" = 'sound/vox/will.ogg',
"with" = 'sound/vox/with.ogg',
"without" = 'sound/vox/without.ogg',
"woop" = 'sound/vox/woop.ogg',
"xeno" = 'sound/vox/xeno.ogg',
"yankee" = 'sound/vox/yankee.ogg',
"yards" = 'sound/vox/yards.ogg',
"year" = 'sound/vox/year.ogg',
"yellow" = 'sound/vox/yellow.ogg',
"yes" = 'sound/vox/yes.ogg',
"you" = 'sound/vox/you.ogg',
"your" = 'sound/vox/your.ogg',
"yourself" = 'sound/vox/yourself.ogg',
"zero" = 'sound/vox/zero.ogg',
"zone" = 'sound/vox/zone.ogg',
"zulu" = 'sound/vox/zulu.ogg',))
#endif
@@ -1,16 +1,17 @@
/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
var/hit_percent = (100-blocked)/100
if(!damage || (hit_percent <= 0))
if(!damage || (!forced && hit_percent <= 0))
return 0
var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
adjustBruteLoss(damage * hit_percent)
adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
adjustFireLoss(damage * hit_percent)
adjustFireLoss(damage_amount, forced = forced)
if(OXY)
if(damage < 0) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal.
adjustOxyLoss(damage * hit_percent)
if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal.
adjustOxyLoss(damage_amount, forced = forced)
return 1
@@ -29,7 +30,7 @@
/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
return FALSE
/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1)//immune to stamina damage.
/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage.
return FALSE
/mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1)
@@ -81,8 +81,11 @@
/mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
return FALSE
/mob/living/silicon/pai/adjustStaminaLoss(amount)
take_holo_damage(amount & 0.25)
/mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE)
if(forced)
take_holo_damage(amount)
else
take_holo_damage(amount * 0.25)
/mob/living/silicon/pai/adjustOrganLoss(slot, amount, maximum = 500) //I kept this in, unlike tg
Knockdown(amount * 0.2)
@@ -1233,7 +1233,7 @@
/mob/living/silicon/robot/unbuckle_mob(mob/user, force=FALSE)
if(iscarbon(user))
GET_COMPONENT(riding_datum, /datum/component/riding)
var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding)
if(istype(riding_datum))
riding_datum.unequip_buckle_inhands(user)
riding_datum.restore_position(user)
@@ -311,6 +311,10 @@
/obj/item/multitool/cyborg,
/obj/item/t_scanner,
/obj/item/analyzer,
/obj/item/storage/part_replacer/cyborg,
/obj/item/holosign_creator/atmos,
/obj/item/weapon/gripper,
/obj/item/lightreplacer/cyborg,
/obj/item/geiger_counter/cyborg,
/obj/item/assembly/signaler/cyborg,
/obj/item/areaeditor/blueprints/cyborg,
@@ -362,6 +366,7 @@
/obj/item/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
/obj/item/extinguisher,
/obj/item/megaphone,
/obj/item/borg/projectile_dampen)
emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
ratvar_modules = list(
@@ -198,7 +198,6 @@
)
if(blood)
target_types += /obj/effect/decal/cleanable/xenoblood
target_types += /obj/effect/decal/cleanable/blood
target_types += /obj/effect/decal/cleanable/trail_holder
target_types += /obj/effect/decal/cleanable/insectguts
@@ -51,6 +51,7 @@
var/treatment_fire = "kelotane"
var/treatment_tox_avoid = "tricordrazine"
var/treatment_tox = "charcoal"
var/treatment_tox_toxlover = "toxin"
var/treatment_virus_avoid = null
var/treatment_virus = "spaceacillin"
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
@@ -381,8 +382,8 @@
if((!C.reagents.has_reagent(treatment_fire_avoid)) && (C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire)))
return TRUE
if((!C.reagents.has_reagent(treatment_tox_avoid)) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox)))
var/treatment_toxavoid = get_avoidchem_toxin(C)
if(((treatment_toxavoid && !C.reagents.has_reagent(treatment_toxavoid))) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(get_healchem_toxin(C))))
return TRUE
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
@@ -396,6 +397,12 @@
return FALSE
/mob/living/simple_animal/bot/medbot/proc/get_avoidchem_toxin(mob/M)
return HAS_TRAIT(M, TRAIT_TOXINLOVER)? null : treatment_tox_avoid
/mob/living/simple_animal/bot/medbot/proc/get_healchem_toxin(mob/M)
return HAS_TRAIT(M, TRAIT_TOXINLOVER)? treatment_tox_toxlover : treatment_tox
/mob/living/simple_animal/bot/medbot/UnarmedAttack(atom/A)
if(iscarbon(A))
var/mob/living/carbon/C = A
@@ -463,8 +470,10 @@
reagent_id = treatment_fire
if(!reagent_id && (C.getToxLoss() >= heal_threshold))
if(!C.reagents.has_reagent(treatment_tox) && !C.reagents.has_reagent(treatment_tox_avoid))
reagent_id = treatment_tox
var/toxin_heal_avoid = get_avoidchem_toxin(C)
var/toxin_healchem = get_healchem_toxin(C)
if(!C.reagents.has_reagent(toxin_healchem) && (toxin_heal_avoid && !C.reagents.has_reagent(toxin_heal_avoid)))
reagent_id = toxin_healchem
//If the patient is injured but doesn't have our special reagent in them then we should give it to them first
if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
@@ -476,7 +476,8 @@
if(isturf(next))
if(bloodiness)
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
B.add_blood_DNA(return_blood_DNA())
if(blood_DNA && blood_DNA.len)
B.blood_DNA |= blood_DNA.Copy()
var/newdir = get_dir(next, loc)
if(newdir == dir)
B.setDir(newdir)
@@ -489,7 +490,6 @@
B.setDir(newdir)
bloodiness--
var/oldloc = loc
var/moved = step_towards(src, next) // attempt to move
if(cell)
@@ -37,5 +37,5 @@
else if(damage_coeff[CLONE])
. = adjustHealth(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
/mob/living/simple_animal/adjustStaminaLoss(amount)
/mob/living/simple_animal/adjustStaminaLoss(amount, forced = FALSE)
return
@@ -33,7 +33,7 @@
/mob/living/simple_animal/drone/syndrone/Initialize()
. = ..()
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
hidden_uplink.telecrystals = 10
/mob/living/simple_animal/drone/syndrone/Login()
@@ -47,7 +47,7 @@
/mob/living/simple_animal/drone/syndrone/badass/Initialize()
. = ..()
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
hidden_uplink.telecrystals = 30
var/obj/item/implant/weapons_auth/W = new
W.implant(src)
@@ -168,7 +168,6 @@
/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload)
. = ..()
AddComponent(/datum/component/cleaning)
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(ismovableatom(target))
@@ -177,6 +176,7 @@
qdel(target)
return TRUE
var/atom/movable/M = target
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
M.clean_blood()
visible_message("[src] polishes \the [target].")
return TRUE
@@ -39,7 +39,7 @@
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/)
wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/)
var/obj/item/udder/gutlunch/udder = null
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
@@ -536,7 +536,7 @@
//ANIMAL RIDING
/mob/living/simple_animal/user_buckle_mob(mob/living/M, mob/user)
GET_COMPONENT(riding_datum, /datum/component/riding)
var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding)
if(riding_datum)
if(user.incapacitated())
return
@@ -547,7 +547,7 @@
return ..()
/mob/living/simple_animal/relaymove(mob/user, direction)
GET_COMPONENT(riding_datum, /datum/component/riding)
var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding)
if(tame && riding_datum)
riding_datum.handle_ride(user, direction)
+22 -2
View File
@@ -88,7 +88,7 @@
if(newletter==" ")
newletter="...huuuhhh..."
if(newletter==".")
newletter=" *BURP*."
newletter=" BURP!"
if(rand(1,100) <= strength*0.5)
if(rand(1,5) == 1)
newletter+="'"
@@ -487,6 +487,26 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/mob/proc/can_hear()
. = TRUE
/proc/bloodtype_to_color(var/type)
. = BLOOD_COLOR_HUMAN
switch(type)
if("U")//Universal blood; a bit orange
. = BLOOD_COLOR_UNIVERSAL
if("SY")//Synthetics blood; blue
. = BLOOD_COLOR_SYNTHETIC
if("L")//lizard, a bit pink/purple
. = BLOOD_COLOR_LIZARD
if("X*")//xeno blood; greenish yellow
. = BLOOD_COLOR_XENO
if("HF")// Oil/Hydraulic blood. something something why not. reee
. = BLOOD_COLOR_OIL
if("GEL")// slimepeople blood, rgb 0, 255, 144
. = BLOOD_COLOR_SLIME
if("BUG")// yellowish, like, y'know bug guts I guess.
. = BLOOD_COLOR_BUG
//add more stuff to the switch if you have more blood colors for different types
// the defines are in _DEFINES/misc.dm
//Examine text for traits shared by multiple types. I wish examine was less copypasted.
/mob/proc/common_trait_examine()
if(HAS_TRAIT(src, TRAIT_DISSECTED))
@@ -497,4 +517,4 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
dissectionmsg = " via Experimental Dissection"
else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Thorough Dissection"))
dissectionmsg = " via Thorough Dissection"
. += "<span class='notice'>This body has been dissected and analyzed[dissectionmsg].</span><br>"
. += "<span class='notice'>This body has been dissected and analyzed[dissectionmsg].</span><br>"