Merge pull request #1760 from Markolie/ipcmasterrace

IPC overhaul
This commit is contained in:
TheDZD
2015-08-19 11:57:04 -04:00
90 changed files with 2074 additions and 1208 deletions
+7
View File
@@ -246,6 +246,13 @@
key = "5"
flags = RESTRICTED | WHITELISTED
syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0")
/datum/language/machine/get_random_name()
if(prob(70))
name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
else
name = pick(ai_names)
return name
/datum/language/kidan
name = "Chittin"
@@ -169,9 +169,9 @@ var/const/MAX_ACTIVE_TIME = 400
if(ishuman(target))
var/mob/living/carbon/human/H = target
if((H.species.flags & IS_SYNTHETIC))
if(!H.check_has_mouth())
return
if(!sterile)
//target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
target.visible_message("<span class='danger'>[src] falls limp after violating [target]'s face!</span>", \
@@ -5,7 +5,7 @@
canmove = 0
icon = null
invisibility = 101
if(!(species.flags & IS_SYNTHETIC))
if(!isSynthetic())
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
@@ -27,7 +27,7 @@
// Override the current limb status and don't cause an explosion
E.droplimb(DROPLIMB_EDGE)
if(!(species.flags & IS_SYNTHETIC))
if(!isSynthetic())
flick("gibbed-h", animation)
hgibs(loc, viruses, dna)
else
@@ -283,7 +283,7 @@
if(temp && !temp.is_stump())
if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
if(!(species.flags & IS_SYNTHETIC))
if(!isSynthetic())
wound_flavor_text["[temp.limb_name]"] = "<span class='warning'>[t_He] has a robotic [temp.name]!</span>\n"
continue
else
+36 -15
View File
@@ -1130,26 +1130,47 @@
return
/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone)
. = 1 // Default to returning true.
if(user && !target_zone)
target_zone = user.zone_sel.selecting
// If targeting the head, see if the head item is thin enough.
// If targeting anything else, see if the wear suit is thin enough.
if(above_neck(target_zone))
if(head && head.flags & THICKMATERIAL)
. = 0
. = 1
if(!target_zone)
if(!user)
target_zone = pick("chest","chest","chest","left leg","right leg","left arm", "right arm", "head")
else
target_zone = user.zone_sel.selecting
var/obj/item/organ/external/affecting = get_organ(target_zone)
var/fail_msg
if(!affecting)
. = 0
fail_msg = "They are missing that limb."
else if (affecting.status & ORGAN_ROBOT)
. = 0
fail_msg = "That limb is robotic."
else
if(wear_suit && wear_suit.flags & THICKMATERIAL)
. = 0
switch(target_zone)
if("head")
if(head && head.flags & THICKMATERIAL)
. = 0
else
if(wear_suit && wear_suit.flags & THICKMATERIAL)
. = 0
if(!. && error_msg && user)
// Might need re-wording.
user << "<span class='alert'>There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"].</span>"
if(!fail_msg)
fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
user << "<span class='alert'>[fail_msg]</span>"
/mob/living/carbon/human/proc/check_has_mouth()
// Todo, check stomach organ when implemented.
var/obj/item/organ/external/head/H = get_organ("head")
if(!H || !H.can_intake_reagents)
return 0
return 1
/mob/living/carbon/human/proc/vomit(hairball=0)
if(stat==2)return
if(stat==DEAD)return
if(species.flags & IS_SYNTHETIC)
return //Machines don't throw up.
if(!check_has_mouth())
return
if(!lastpuke)
lastpuke = 1
@@ -63,13 +63,17 @@
help_shake_act(M)
add_logs(src, M, "shaked")
return 1
// if(M.health < -75) return 0
if(!H.check_has_mouth())
H << "<span class='danger'>You don't have a mouth, you cannot perform CPR!</span>"
return
if(!check_has_mouth())
H << "<span class='danger'>They don't have a mouth, you cannot perform CPR!</span>"
return
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH) && !M.wear_mask.mask_adjusted))
M << "<span class='boldnotice'>Remove your mask!</span>"
M << "<span class='warning'>Remove your mask!</span>"
return 0
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted))
M << "<span class='boldnotice'>Remove his mask!</span>"
M << "<span class='warning'>Remove his mask!</span>"
return 0
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human()
@@ -11,13 +11,8 @@
total_burn += O.burn_dam
health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
//TODO: fix husking
if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) && (!(species.flags & IS_SYNTHETIC)))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
ChangeToHusk()
if (species.flags & IS_SYNTHETIC)
var/obj/item/organ/external/head/H = organs_by_name["head"]
if(H)
if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) //need to get them 25% away from death point before reviving synthetics
update_revive()
if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
update_revive()
return
@@ -31,17 +26,45 @@
tod = 0
timeofdeath = 0
/mob/living/carbon/human/adjustBrainLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.take_damage(amount)
sponge.damage = min(max(sponge.damage, 0),(maxHealth*2))
brainloss = sponge.damage
else
brainloss = 200
else
brainloss = 0
/mob/living/carbon/human/setBrainLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.damage = min(max(amount, 0),(maxHealth*2))
brainloss = sponge.damage
else
brainloss = 200
else
brainloss = 0
/mob/living/carbon/human/getBrainLoss()
var/res = brainloss
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(!sponge)
return
if (sponge.is_bruised())
res += 20
if (sponge.is_broken())
res += 50
res = min(res,maxHealth*2)
return res
if(status_flags & GODMODE) return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
brainloss = min(sponge.damage,maxHealth*2)
else
brainloss = 200
else
brainloss = 0
return brainloss
//These procs fetch a cumulative total damage from all organs
/mob/living/carbon/human/getBruteLoss()
@@ -114,13 +137,12 @@
/mob/living/carbon/human/Paralyse(amount)
..()
/mob/living/carbon/human/adjustCloneLoss(var/amount)
if(species.flags & IS_SYNTHETIC)
return
..()
if(species.flags & (NO_SCAN))
cloneloss = 0
return
var/heal_prob = max(0, 80 - getCloneLoss())
var/mut_prob = min(80, getCloneLoss()+10)
@@ -151,6 +173,41 @@
O.unmutate()
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
hud_updateflag |= 1 << HEALTH_HUD
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/getOxyLoss()
if(species.flags & NO_BREATHE)
oxyloss = 0
return ..()
/mob/living/carbon/human/adjustOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
oxyloss = 0
else
..()
/mob/living/carbon/human/setOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
oxyloss = 0
else
..()
/mob/living/carbon/human/getToxLoss()
if(species.flags & NO_POISON)
toxloss = 0
return ..()
/mob/living/carbon/human/adjustToxLoss(var/amount)
if(species.flags & NO_POISON)
toxloss = 0
else
..()
/mob/living/carbon/human/setToxLoss(var/amount)
if(species.flags & NO_POISON)
toxloss = 0
else
..()
////////////////////////////////////////////
@@ -35,13 +35,13 @@ emp_act
if(check_shields(P.damage, "the [P.name]", P))
P.on_hit(src, 100, def_zone)
return 2
var/obj/item/organ/external/organ = get_organ(check_zone(def_zone))
if(isnull(organ))
return
//Shrapnel
if (P.damage_type == BRUTE)
var/obj/item/organ/external/organ = get_organ(check_zone(def_zone))
if(!organ)
return
var/armor = getarmor_organ(organ, "bullet")
if((P.embed && prob(20 + max(P.damage - armor, -10))))
var/obj/item/weapon/shard/shrapnel/SP = new()
@@ -50,9 +50,7 @@ emp_act
(SP.loc) = organ
organ.embed(SP)
var/mob/living/carbon/human/M = src
var/obj/item/organ/external/affected = M.get_organ(def_zone)
affected.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data
organ.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data
return (..(P , def_zone))
@@ -204,11 +202,6 @@ emp_act
for(var/obj/O in src)
if(!O) continue
O.emp_act(severity)
for(var/obj/item/organ/external/O in organs)
if(O.status & ORGAN_DESTROYED) continue
O.emp_act(severity)
for(var/obj/item/organ/I in O.internal_organs)
I.emp_act(severity)
..()
/mob/living/carbon/human/emag_act(user as mob, var/obj/item/organ/external/affecting)
@@ -72,11 +72,9 @@
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E)
stance_damage += 2
else if (E.status & ORGAN_DESTROYED)
stance_damage += 2 // let it fail even if just foot&leg
else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable())
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)) || E.is_malfunctioning())
stance_damage += 2 // let it fail even if just foot&leg. Also malfunctioning happens sporadically so it should impact more when it procs
else if (E.is_broken() || !E.is_usable())
stance_damage += 1
// Canes and crutches help you stand (if the latter is ever added)
@@ -56,7 +56,7 @@
/mob/living/carbon/human/proc/has_organ(name)
var/obj/item/organ/external/O = organs_by_name[name]
return (O && !(O.status & ORGAN_DESTROYED) )
return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump())
/mob/living/carbon/human/proc/has_organ_for_slot(slot)
switch(slot)
+32 -19
View File
@@ -245,10 +245,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
adjustCloneLoss(0.1)
/mob/living/carbon/human/proc/handle_mutations_and_radiation()
if(species.flags & IS_SYNTHETIC) //Robots don't suffer from mutations or radloss.
return
if(getFireLoss())
if((RESIST_HEAT in mutations) || (prob(1)))
heal_organ_damage(0,1)
@@ -847,7 +843,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(species && species.flags & NO_INTORGANS) return
if(!(species.flags & IS_SYNTHETIC)) handle_trace_chems()
handle_trace_chems()
updatehealth()
@@ -904,7 +900,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(!reagents.has_reagent("epinephrine"))
adjustOxyLoss(1)*/
if(hallucination && !(species.flags & IS_SYNTHETIC))
if(hallucination && !(species.flags & NO_DNA_RAD))
spawn handle_hallucinations()
if(hallucination<=2)
@@ -967,18 +963,35 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(!E.len)
embedded_flag = 0
//Eyes
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
blinded = 1
else if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster
eye_blurry = max(eye_blurry-3, 0)
// blinded = 1 //now handled under /handle_regular_hud_updates()
else if(eye_blurry) //blurry eyes heal slowly
eye_blurry = max(eye_blurry-1, 0)
//Vision
var/obj/item/organ/vision
if(species.vision_organ)
vision = internal_organs_by_name[species.vision_organ]
if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means.
eye_blind = 0
blinded = 0
eye_blurry = 0
else if(!vision || vision.is_broken()) // Vision organs cut out or broken? Permablind.
eye_blind = 1
blinded = 1
eye_blurry = 1
else
//blindness
if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) // Blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
blinded = 1
else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster
eye_blurry = max(eye_blurry-3, 0)
blinded = 1
//blurry sight
if(vision.is_bruised()) // Vision organs impaired? Permablurry.
eye_blurry = 1
if(eye_blurry) // Blurry eyes heal slowly
eye_blurry = max(eye_blurry-1, 0)
//Ears
if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
@@ -1569,7 +1582,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
/mob/living/carbon/human/proc/handle_decay()
var/decaytime = world.time - timeofdeath
if(species.flags & IS_SYNTHETIC)
if(isSynthetic())
return
if(reagents.has_reagent("formaldehyde")) //embalming fluid stops decay
@@ -1,5 +1,6 @@
/datum/species/wryn
name = "Wryn"
name_plural = "Wryn"
icobase = 'icons/mob/human_races/r_wryn.dmi'
deform = 'icons/mob/human_races/r_wryn.dmi'
language = "Wryn Hivemind"
@@ -76,6 +77,7 @@
/datum/species/nucleation
name = "Nucleation"
name_plural = "Nucleations"
icobase = 'icons/mob/human_races/r_nucleation.dmi'
unarmed_type = /datum/unarmed_attack/punch
blurb = "A sub-race of unforunates who have been exposed to too much supermatter radiation. As a result, \
@@ -1,5 +1,6 @@
/datum/species/golem
name = "Golem"
name_plural = "Golems"
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_golem.dmi'
@@ -1,5 +1,6 @@
/datum/species/monkey
name = "Monkey"
name_plural = "Monkeys"
blurb = "Ook."
icobase = 'icons/mob/human_races/monkeys/r_monkey.dmi'
@@ -52,7 +53,8 @@ datum/species/monkey/get_random_name(var/gender)
/datum/species/monkey/tajaran
name = "Farwa"
name_plural = "Farwa"
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
@@ -66,6 +68,7 @@ datum/species/monkey/get_random_name(var/gender)
/datum/species/monkey/vulpkanin
name = "Wolpin"
name_plural = "Wolpin"
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
@@ -80,6 +83,7 @@ datum/species/monkey/get_random_name(var/gender)
/datum/species/monkey/skrell
name = "Neara"
name_plural = "Neara"
icobase = 'icons/mob/human_races/monkeys/r_neara.dmi'
deform = 'icons/mob/human_races/monkeys/r_neara.dmi'
@@ -96,6 +100,7 @@ datum/species/monkey/get_random_name(var/gender)
/datum/species/monkey/unathi
name = "Stok"
name_plural = "Stok"
icobase = 'icons/mob/human_races/monkeys/r_stok.dmi'
deform = 'icons/mob/human_races/monkeys/r_stok.dmi'
@@ -1,5 +1,6 @@
/datum/species/plasmaman // /vg/
name = "Plasmaman"
name_plural = "Plasmamen"
icobase = 'icons/mob/human_races/r_plasmaman_sb.dmi'
deform = 'icons/mob/human_races/r_plasmaman_pb.dmi' // TODO: Need deform.
//language = "Clatter"
@@ -1,6 +1,7 @@
/datum/species/shadow
name = "Shadow"
name_plural = "Shadows"
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
@@ -4,6 +4,7 @@
/datum/species
var/name // Species name.
var/name_plural // Pluralized name (since "[name]s" is not always valid)
var/path // Species path
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
@@ -37,7 +38,7 @@
var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second
var/passive_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second
var/reagent_tag //Used for metabolizing reagents.
var/darksight = 2
@@ -78,6 +79,7 @@
var/icon/icon_template
var/is_small
var/show_ssd = 1
var/virus_immune
// Language/culture vars.
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
@@ -95,8 +97,8 @@
"brain" = /obj/item/organ/brain,
"appendix" = /obj/item/organ/appendix,
"eyes" = /obj/item/organ/eyes
)
)
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/list/has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
"groin" = list("path" = /obj/item/organ/external/groin),
@@ -112,6 +114,10 @@
)
/datum/species/New()
//If the species has eyes, they are the default vision organ
if(!vision_organ && has_organ["eyes"])
vision_organ = "eyes"
unarmed = new unarmed_type()
/datum/species/proc/get_random_name(var/gender)
@@ -150,14 +156,6 @@
for(var/obj/item/organ/external/O in H.organs)
O.owner = H
if(flags & IS_SYNTHETIC)
for(var/obj/item/organ/external/E in H.organs)
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
E.robotize()
for(var/obj/item/organ/I in H.internal_organs)
I.robotize()
/datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
//var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now)
@@ -1,5 +1,6 @@
/datum/species/human
name = "Human"
name_plural = "Humans"
icobase = 'icons/mob/human_races/r_human.dmi'
deform = 'icons/mob/human_races/r_def_human.dmi'
primitive_form = "Monkey"
@@ -19,6 +20,7 @@
/datum/species/unathi
name = "Unathi"
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
path = /mob/living/carbon/human/unathi
@@ -59,6 +61,7 @@
/datum/species/tajaran
name = "Tajaran"
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
path = /mob/living/carbon/human/tajaran
@@ -99,6 +102,7 @@
/datum/species/vulpkanin
name = "Vulpkanin"
name_plural = "Vulpakanin"
icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
deform = 'icons/mob/human_races/r_vulpkanin.dmi'
path = /mob/living/carbon/human/vulpkanin
@@ -129,6 +133,7 @@
/datum/species/skrell
name = "Skrell"
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
path = /mob/living/carbon/human/skrell
@@ -153,6 +158,7 @@
/datum/species/vox
name = "Vox"
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi'
path = /mob/living/carbon/human/vox
@@ -213,6 +219,7 @@
/datum/species/vox/armalis
name = "Vox Armalis"
name_plural = "Vox Armalis"
icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi'
path = /mob/living/carbon/human/voxarmalis
@@ -260,6 +267,7 @@
/datum/species/kidan
name = "Kidan"
name_plural = "Kidan"
icobase = 'icons/mob/human_races/r_kidan.dmi'
deform = 'icons/mob/human_races/r_def_kidan.dmi'
path = /mob/living/carbon/human/kidan
@@ -278,6 +286,7 @@
/datum/species/slime
name = "Slime People"
name_plural = "Slime People"
default_language = "Galactic Common"
language = "Bubblish"
icobase = 'icons/mob/human_races/r_slime.dmi'
@@ -299,6 +308,7 @@
/datum/species/grey
name = "Grey"
name_plural = "Greys"
icobase = 'icons/mob/human_races/r_grey.dmi'
deform = 'icons/mob/human_races/r_def_grey.dmi'
default_language = "Galactic Common"
@@ -332,6 +342,7 @@
/datum/species/diona
name = "Diona"
name_plural = "Dionaea"
icobase = 'icons/mob/human_races/r_diona.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
path = /mob/living/carbon/human/diona
@@ -421,17 +432,25 @@
else
del(D)
H.visible_message("\red[H] splits apart with a wet slithering noise!") */
H.visible_message("<span class='danger">[H] splits apart with a wet slithering noise!"</span>) */
/datum/species/machine
name = "Machine"
name_plural = "Machines"
blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \
robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \
to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \
generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \
inhuman in outlook and perspective."
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
path = /mob/living/carbon/human/machine
default_language = "Galactic Common"
language = "Trinary"
unarmed_type = /datum/unarmed_attack/punch
eyes = "blank_eyes"
brute_mod = 1.5
burn_mod = 1.5
@@ -445,24 +464,38 @@
heat_level_3 = 600
heat_level_3_breathe = 600
synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_INTORGANS
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
virus_immune = 1
reagent_tag = PROCESS_SYN
has_organ = list(
"brain" = /obj/item/organ/mmi_holder/posibrain,
"cell" = /obj/item/organ/cell,
"optics" = /obj/item/organ/optical_sensor
)
vision_organ = "optics"
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/ipc),
"groin" = list("path" = /obj/item/organ/external/groin/ipc),
"head" = list("path" = /obj/item/organ/external/head/ipc),
"l_arm" = list("path" = /obj/item/organ/external/arm/ipc),
"r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc),
"l_leg" = list("path" = /obj/item/organ/external/leg/ipc),
"r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc),
"l_hand" = list("path" = /obj/item/organ/external/hand/ipc),
"r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc),
"l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
)
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
H.emote("deathgasp")
for(var/organ_name in H.organs_by_name)
if (organ_name == "head") // do the head last as that's when the user will be transfered to the posibrain
continue
var/obj/item/organ/external/O = H.organs_by_name[organ_name]
if(O && (O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them!
O.droplimb(1)
var/obj/item/organ/external/O = H.organs_by_name["head"]
if(O) O.droplimb(1)
H.h_style = ""
spawn(100)
if(H) H.update_hair()
@@ -369,7 +369,7 @@ var/global/list/damage_icon_parts = list()
else
//warning("Invalid f_style for [species.name]: [f_style]")
if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(species.flags & IS_SYNTHETIC)))
if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
if(hair_style && hair_style.species_allowed)
if(src.species.name in hair_style.species_allowed)
+1 -1
View File
@@ -75,7 +75,7 @@
/mob/living/carbon/human/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
if((species.flags & IS_SYNTHETIC) && (effecttype == IRRADIATE))
if((species.flags & NO_DNA_RAD) && (effecttype == IRRADIATE))
return
return ..()
@@ -184,74 +184,74 @@
/obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
user << text("\red You try to analyze the floor's vitals!")
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1)
user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1)
user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("\blue Body Temperature: ???", 1)
user.visible_message("<span class='warning'>[user] has analyzed the floor's vitals!</span>", "<span class='warning'>You try to analyze the floor's vitals!</span>")
user << "<span class='notice'>Analyzing Results for The floor:\n\t Overall Status: Healthy</span>"
user << "<span class='notice'>\t Damage Specifics: [0]-[0]-[0]-[0]</span>"
user << "<span class='notice'>Key: Suffocation/Toxin/Burns/Brute</span>"
user << "<span class='notice'>Body Temperature: ???</span>"
return
if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
user << "\red You don't have the dexterity to do this!"
return
if(!istype(M, /mob/living/silicon/robot) && !(ishuman(M) && (M:species.flags & IS_SYNTHETIC)))
user << "\red You can't analyze non-robotic things!"
return
user.visible_message("<span class='notice'> [user] has analyzed [M]'s components.","<span class='notice'> You have analyzed [M]'s components.")
var/BU = M.getFireLoss() > 50 ? "<b>[M.getFireLoss()]</b>" : M.getFireLoss()
var/BR = M.getBruteLoss() > 50 ? "<b>[M.getBruteLoss()]</b>" : M.getBruteLoss()
var/TX = M.getToxLoss() > 50 ? "<b>[M.getToxLoss()]</b>" : M.getToxLoss()
user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
if (ishuman(M) && (M:species.flags & IS_SYNTHETIC))
user.show_message("\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>/<font color='green'>Residue</font>", 1)
user.show_message("\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font> - <font color='green'>[TX]</font>")
var/scan_type
if(istype(M, /mob/living/silicon/robot))
scan_type = "robot"
else if(istype(M, /mob/living/carbon/human))
scan_type = "prosthetics"
else
user.show_message("\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>", 1)
user.show_message("\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
if(M.tod && M.stat == DEAD)
user.show_message("\blue Time of Disable: [M.tod]")
user << "<span class='warning'>You can't analyze non-robotic things!</span>"
return
if (istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/H = M
var/list/damaged = H.get_damaged_components(1,1,1)
user.show_message("\blue Localized Damage:",1)
if(length(damaged)>0)
for(var/datum/robot_component/org in damaged)
user.show_message(text("\blue \t []: [][] - [] - [] - []", \
capitalize(org.name), \
(org.installed == -1) ? "<font color='red'><b>DESTROYED</b></font> " :"",\
(org.electronics_damage > 0) ? "<font color='#FFA500'>[org.electronics_damage]</font>" :0, \
(org.brute_damage > 0) ? "<font color='red'>[org.brute_damage]</font>" :0, \
(org.toggled) ? "Toggled ON" : "<font color='red'>Toggled OFF</font>",\
(org.powered) ? "Power ON" : "<font color='red'>Power OFF</font>"),1)
else
user.show_message("\blue \t Components are OK.",1)
if(H.emagged && prob(5))
user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1)
user.visible_message("<span class='notice'>[user] has analyzed [M]'s components.</span>","<span class='notice'>You have analyzed [M]'s components.</span>")
switch(scan_type)
if("robot")
var/BU = M.getFireLoss() > 50 ? "<b>[M.getFireLoss()]</b>" : M.getFireLoss()
var/BR = M.getBruteLoss() > 50 ? "<b>[M.getBruteLoss()]</b>" : M.getBruteLoss()
user << "<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]</span>"
user << "\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>"
user << "\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>"
if(M.tod && M.stat == DEAD)
user << "<span class='notice'>Time of Disable: [M.tod]</span>"
var/mob/living/silicon/robot/H = M
var/list/damaged = H.get_damaged_components(1,1,1)
user << "<span class='notice'>Localized Damage:</span>"
if(length(damaged)>0)
for(var/datum/robot_component/org in damaged)
user.show_message(text("<span class='notice'>\t []: [][] - [] - [] - []</span>", \
capitalize(org.name), \
(org.installed == -1) ? "<font color='red'><b>DESTROYED</b></font> " :"",\
(org.electronics_damage > 0) ? "<font color='#FFA500'>[org.electronics_damage]</font>" :0, \
(org.brute_damage > 0) ? "<font color='red'>[org.brute_damage]</font>" :0, \
(org.toggled) ? "Toggled ON" : "<font color='red'>Toggled OFF</font>",\
(org.powered) ? "Power ON" : "<font color='red'>Power OFF</font>"),1)
else
user << "<span class='notice'>\t Components are OK.</span>"
if(H.emagged && prob(5))
user << "<span class='warning'>\t ERROR: INTERNAL SYSTEMS COMPROMISED</span>"
if (ishuman(M) && (M:species.flags & IS_SYNTHETIC))
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
user.show_message("\blue Localized Damage, Brute/Electronics:",1)
if(length(damaged)>0)
for(var/obj/item/organ/external/org in damaged)
user.show_message(text("\blue \t []: [] - []", \
capitalize(org.name), \
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
else
user.show_message("\blue \t Components are OK.",1)
if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
user.show_message("\red Subject posibrain is unresponsive. System shutdown imminent.")
else if (M.getBrainLoss() >= 60)
user.show_message("\red Severe posibrain damage detected. Heavy corrosion present.")
else if (M.getBrainLoss() >= 10)
user.show_message("\red Significant posibrain damage detected. Moderate corrosion present.")
user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)", 1)
if("prosthetics")
var/mob/living/carbon/human/H = M
user << "<span class='notice'>Analyzing Results for \the [H]:</span>"
user << "Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>"
user << "<span class='notice'>External prosthetics:</span>"
var/organ_found
if(H.internal_organs.len)
for(var/obj/item/organ/external/E in H.organs)
if(!(E.status & ORGAN_ROBOT))
continue
organ_found = 1
user << "[E.name]: <font color='red'>[round(E.brute_dam)]</font> <font color='#FFA500'>[round(E.burn_dam)]</font>"
if(!organ_found)
user << "<span class='warning'>No prosthetics located.</span>"
user << "<hr>"
user << "<span class='notice'>Internal prosthetics:</span>"
organ_found = null
if(H.internal_organs.len)
for(var/obj/item/organ/O in H.internal_organs)
if(!(O.status & ORGAN_ROBOT))
continue
organ_found = 1
user << "[capitalize(O.name)]: <font color='red'>[O.damage]</font>"
if(!organ_found)
user << "<span class='warning'>No prosthetics located.</span>"
src.add_fingerprint(user)
return
+11 -17
View File
@@ -542,13 +542,6 @@ var/list/robot_verbs_default = list(
return
now_pushing = 0
..()
if (istype(AM, /obj/machinery/recharge_station))
var/obj/machinery/recharge_station/F = AM
if(F.panel_open)
usr << "\blue <b>Close the maintenance panel first.</b>"
return
else
F.move_inside()
if (!istype(AM, /atom/movable))
return
if (!now_pushing)
@@ -587,34 +580,35 @@ var/list/robot_verbs_default = list(
return
if (istype(W, /obj/item/weapon/weldingtool))
if(W == module_active) return
if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent == "help")
if(W == module_active)
return
if (!getBruteLoss())
user << "Nothing to fix here!"
user << "<span class='notice'>Nothing to fix!</span>"
return
var/obj/item/weapon/weldingtool/WT = W
user.changeNext_move(CLICK_CD_MELEE)
if (WT.remove_fuel(0))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1)
user.visible_message("<span class='alert'>\The [user] patches some dents on \the [src] with \the [WT].</span>")
else
user << "Need more welding fuel!"
user << "<span class='warning'>Need more welding fuel!</span>"
return
else if(istype(W, /obj/item/stack/cable_coil) && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == "help" && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
if (!getFireLoss())
user << "Nothing to fix here!"
user << "<span class='notice'>Nothing to fix!</span>"
return
var/obj/item/stack/cable_coil/coil = W
adjustFireLoss(-30)
updatehealth()
add_fingerprint(user)
coil.use(1)
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [user] has fixed some of the burnt wires on [src]!"), 1)
user.visible_message("<span class='alert'>\The [user] fixes some of the burnt wires on \the [src] with \the [coil].</span>")
else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover
if(opened)
+10 -14
View File
@@ -96,7 +96,7 @@
if(prob(5))
host.adjustBrainLoss(rand(1,2))
if(prob(host.brainloss/20))
if(prob(host.getBrainLoss()/20))
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
/mob/living/simple_animal/borer/New(var/by_gamemode=0)
@@ -148,7 +148,7 @@
var/list/choices = list()
for(var/mob/living/carbon/C in view(3,src))
if(C.stat != 2)
if(C.stat != DEAD)
choices += C
if(world.time - used_dominate < 300)
@@ -188,7 +188,7 @@
src << "You begin delicately adjusting your connection to the host brain..."
spawn(300+(host.brainloss*5))
spawn(300+(host.getBrainLoss()*5))
if(!host || !src || controlling)
return
@@ -387,11 +387,14 @@ mob/living/simple_animal/borer/proc/detatch()
return
var/list/choices = list()
for(var/mob/living/carbon/C in view(1,src))
if(C.stat != 2 && src.Adjacent(C))
choices += C
for(var/mob/living/carbon/human/H in view(1,src))
var/obj/item/organ/external/head/head = H.get_organ("head")
if(head.status & ORGAN_ROBOT)
continue
if(H.stat != DEAD && src.Adjacent(H) && !H.has_brain_worms())
choices += H
var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
var/mob/living/carbon/human/M = input(src,"Who do you wish to infest?") in null|choices
if(!M || !src) return
@@ -400,13 +403,6 @@ mob/living/simple_animal/borer/proc/detatch()
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
*/
src << "You slither up [M] and begin probing at their ear canal..."
@@ -90,7 +90,7 @@
icon_dead = "Syndicat_dead"
icon_resting = "Syndicat_rest"
gender = FEMALE
flags = IS_SYNTHETIC|NO_BREATHE
flags = NO_BREATHE
faction = list("syndicate")
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
@@ -31,5 +31,5 @@
icon_living = "Syndifox"
icon_dead = "Syndifox_dead"
icon_resting = "Syndifox_rest"
flags = IS_SYNTHETIC|NO_BREATHE
flags = NO_BREATHE
faction = list("syndicate")
@@ -180,7 +180,7 @@
if(Environment)
if( abs(Environment.temperature - bodytemperature) > 40 && !(flags & IS_SYNTHETIC))
if( abs(Environment.temperature - bodytemperature) > 40 && !(flags & NO_BREATHE))
bodytemperature += ((Environment.temperature - bodytemperature) / 5)
if(min_oxy)
@@ -213,7 +213,7 @@
if(max_co2)
if(Environment.carbon_dioxide > max_co2)
atmos_suitable = 0
if(flags & NO_BREATHE || flags & IS_SYNTHETIC)
if(flags & NO_BREATHE)
atmos_suitable = 1
//Atmos effect
+10
View File
@@ -96,6 +96,16 @@ proc/isembryo(A)
if(istype(A, /mob/living/silicon/ai))
return 1
return 0
/mob/proc/isSynthetic()
return 0
/mob/living/carbon/human/isSynthetic()
// If they are 100% robotic, they count as synthetic.
for(var/obj/item/organ/external/E in organs)
if(!(E.status & ORGAN_ROBOT))
return 0
return 1
/proc/isAIEye(A)
if(istype(A, /mob/aiEye))