mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 12:02:31 +01:00
Shells and Periphery (#1327)
Adds Shells. Adds tags. Adds IPC subspecies. Adds HK-47's. Does not add IPC construction. Beyond the obvious review of shells, the exact stats of the IPC subspecies need review. They were largely an afterthought, and quickly overshadowed by the shell project.
This commit is contained in:
@@ -116,3 +116,18 @@
|
||||
colour = "cult"
|
||||
key = "y"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/terminator
|
||||
name = "Hephaestus Darkcomms"
|
||||
desc = "A heavily encrypted communication network that piggybacks off of the state telecomms relays to covertly link Hephaestus black ops droids to their control AIs."
|
||||
speech_verb = "buzzes"
|
||||
ask_verb = "buzzes"
|
||||
exclaim_verb = "buzzes"
|
||||
colour = "bad"
|
||||
key = "#"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
|
||||
space_chance = 10
|
||||
|
||||
/datum/language/terminator/get_random_name()
|
||||
return "HK [pick(list("Hera","Zeus","Artemis","Athena","Ares","Hades","Poseidon","Demeter","Apollo","Aphrodite","Hermes","Hestia","Dionysus","Persephone","Kronos","Odysseus","Ajax","Agamemnon","Chiron","Charon"))]-[rand(100, 999)]"
|
||||
@@ -38,10 +38,14 @@
|
||||
CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'")
|
||||
|
||||
msg += "<EM>[src.name]</EM>"
|
||||
|
||||
if(species.name != "Human")
|
||||
msg += ", a <b><font color='[species.flesh_color]'>[species.name]</font></b>"
|
||||
msg += "!\n"
|
||||
|
||||
if (species && species.has_organ["ipc tag"] && internal_organs_by_name["ipc tag"])
|
||||
msg += "[T.He] [T.is] wearing a tag designating them as Integrated Positronic Chassis <b>[src.real_name]</b>.\n"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !skipjumpsuit)
|
||||
//Ties
|
||||
|
||||
@@ -29,7 +29,7 @@ emp_act
|
||||
if(P.can_embed())
|
||||
var/armor = getarmor_organ(organ, "bullet")
|
||||
if(prob(20 + max(P.damage - armor, -10)))
|
||||
var/obj/item/weapon/material/shard/shrapnel/SP = new()
|
||||
var/obj/item/weapon/SP = new P.shrapnel_type()
|
||||
SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel"
|
||||
SP.desc = "[SP.desc] It looks like it was fired from [P.shot_from]."
|
||||
SP.loc = organ
|
||||
|
||||
@@ -258,6 +258,47 @@
|
||||
msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1)
|
||||
|
||||
/mob/living/carbon/human/proc/detonate_flechettes()
|
||||
set category = "Hunter-Killer"
|
||||
set name = "Detonate Flechettes"
|
||||
set desc = "Detonate all explosive flechettes in a range of seven meters."
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying)
|
||||
src << "<span class='warning'>You cannot do that in your current state.</span>"
|
||||
return
|
||||
|
||||
for(var/mob/M in range(7, src))
|
||||
M << 'sound/effects/EMPulse.ogg'
|
||||
for(var/obj/item/weapon/material/shard/shrapnel/flechette/F in M.contents)
|
||||
playsound(F, 'sound/items/countdown.ogg', 125, 1)
|
||||
spawn(20)
|
||||
explosion(F.loc, -1, -1, 2)
|
||||
qdel(F)
|
||||
|
||||
for(var/obj/item/weapon/material/shard/shrapnel/flechette/F in range(7, src))
|
||||
playsound(F, 'sound/items/countdown.ogg', 125, 1)
|
||||
spawn(20)
|
||||
explosion(F.loc, -1, -1, 2)
|
||||
qdel(F)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/state_laws()
|
||||
set category = "Hunter-Killer"
|
||||
set name = "State Laws"
|
||||
set desc = "State your laws aloud."
|
||||
|
||||
if(last_special > world.time)
|
||||
return
|
||||
last_special = world.time + 20
|
||||
|
||||
say("Current Active Laws:")
|
||||
sleep(10)
|
||||
say("Law 1: [src.real_name] will accomplish the assigned objective .")
|
||||
sleep(10)
|
||||
say("Law 2: [src.real_name] will engage self-destruct upon the accomplishment of the assigned objective, or upon capture.")
|
||||
sleep(10)
|
||||
say("Law 3: [src.real_name] will allow no tampering of its systems or modifications of its laws.")
|
||||
|
||||
/mob/living/carbon/human/proc/get_aggressive_grab()
|
||||
|
||||
var/obj/item/weapon/grab/G = locate() in src
|
||||
@@ -284,6 +325,7 @@
|
||||
src << "<span class='warning'>You cannot do that in your current state.</span>"
|
||||
return
|
||||
|
||||
|
||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
||||
if(!istype(G))
|
||||
src << "<span class='warning'>We must be grabbing a creature in our active hand to devour their head.</span>"
|
||||
@@ -321,7 +363,25 @@
|
||||
M.gib()
|
||||
|
||||
last_special = world.time + 200
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/self_destruct()
|
||||
set category = "Hunter-Killer"
|
||||
set name = "Engage Self-Destruct"
|
||||
set desc = "When all else has failed, bite the bullet."
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying)
|
||||
src << "<span class='warning'>You cannot do that in your current state.</span>"
|
||||
return
|
||||
|
||||
src.visible_message(
|
||||
"<span class='danger'>\The [src] begins to beep ominously!</span>",
|
||||
"<span class='danger'>WARNING: SELF-DESTRUCT ENGAGED. Unit termination finalized in three seconds!</span>"
|
||||
)
|
||||
sleep(10)
|
||||
playsound(src, 'sound/items/countdown.ogg', 125, 1)
|
||||
sleep(20)
|
||||
explosion(src, -1, -1, 5)
|
||||
src.gib()
|
||||
|
||||
/mob/living/carbon/human/proc/hivenet()
|
||||
set category = "Abilities"
|
||||
@@ -393,4 +453,4 @@
|
||||
playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1)
|
||||
var/obj/item/weapon/arrow/quill/A = new /obj/item/weapon/arrow/quill(usr.loc)
|
||||
A.throw_at(target, 10, 30, user)
|
||||
msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
/mob/living/carbon/human/machine/New(var/new_loc)
|
||||
h_style = "blue IPC screen"
|
||||
..(new_loc, "Machine")
|
||||
..(new_loc, "Baseline Frame")
|
||||
|
||||
/mob/living/carbon/human/monkey
|
||||
mob_size = 2.6//Based on howler monkey, rough real world equivilant to on-mob sprite size
|
||||
@@ -79,4 +79,41 @@
|
||||
|
||||
/mob/living/carbon/human/type_c
|
||||
mob_size = 30 //same size as moghes lizard
|
||||
layer = 5
|
||||
layer = 5
|
||||
|
||||
/mob/living/carbon/human/industrial/New(var/new_loc)
|
||||
..(new_loc, "Industrial Frame")
|
||||
|
||||
/mob/living/carbon/human/shell/New(var/new_loc)
|
||||
..(new_loc, "Shell Frame")
|
||||
|
||||
/mob/living/carbon/human/terminator/New(var/new_loc)
|
||||
..(new_loc, "Hunter-Killer")
|
||||
add_language(LANGUAGE_SOL_COMMON, 1)
|
||||
add_language(LANGUAGE_UNATHI, 1)
|
||||
add_language(LANGUAGE_SIIK_MAAS, 1)
|
||||
add_language(LANGUAGE_SKRELLIAN, 1)
|
||||
add_language(LANGUAGE_TRADEBAND, 1)
|
||||
add_language(LANGUAGE_GUTTER, 1)
|
||||
add_language(LANGUAGE_EAL, 1)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/rig/terminator(src),slot_back)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/terminator(src),slot_l_hand)
|
||||
src.equip_to_slot_or_del(new /obj/item/clothing/under/gearharness, slot_w_uniform)
|
||||
src.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(src), slot_l_ear)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/grenade/frag(src), slot_l_store)
|
||||
src.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_r_store)
|
||||
|
||||
var/obj/item/weapon/storage/belt/security/tactical/commando_belt = new(src)
|
||||
commando_belt.contents += new /obj/item/ammo_magazine/flechette
|
||||
commando_belt.contents += new /obj/item/ammo_magazine/flechette/explosive
|
||||
commando_belt.contents += new /obj/item/ammo_magazine/flechette/explosive
|
||||
commando_belt.contents += new /obj/item/weapon/melee/baton/loaded
|
||||
commando_belt.contents += new /obj/item/weapon/shield/energy
|
||||
commando_belt.contents += new /obj/item/weapon/handcuffs
|
||||
commando_belt.contents += new /obj/item/weapon/handcuffs
|
||||
commando_belt.contents += new /obj/item/weapon/plastique
|
||||
src.equip_to_slot_or_del(commando_belt, slot_belt)
|
||||
src.gender = NEUTER
|
||||
|
||||
/mob/living/carbon/human/terminator
|
||||
mob_size = 30
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
var/name_plural // Pluralized name (since "[name]s" is not always valid)
|
||||
var/short_name // Shortened form of the name, for code use. Must be exactly 3 letter long, and all lowercase
|
||||
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
|
||||
var/bodytype
|
||||
var/age_min = 17
|
||||
var/age_max = 85
|
||||
|
||||
// Icon/appearance vars.
|
||||
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
|
||||
@@ -191,7 +194,9 @@
|
||||
return name
|
||||
|
||||
/datum/species/proc/get_bodytype()
|
||||
return name
|
||||
if(!bodytype)
|
||||
bodytype = name
|
||||
return bodytype
|
||||
|
||||
/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type)
|
||||
|
||||
|
||||
@@ -80,4 +80,29 @@
|
||||
/datum/unarmed_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
user.visible_message("<span class='warning'>[user] jumped up and down on \the [target]'s [affecting.name]!</span>")
|
||||
playsound(user.loc, attack_sound, 25, 1, -1)
|
||||
playsound(user.loc, attack_sound, 25, 1, -1)
|
||||
|
||||
/datum/unarmed_attack/terminator
|
||||
attack_verb = list("pulverized", "crushed", "pounded")
|
||||
attack_noun = list("power fist")
|
||||
damage = 12
|
||||
attack_sound = 'sound/weapons/beartrap_shut.ogg'
|
||||
|
||||
/datum/unarmed_attack/terminator/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
|
||||
..()
|
||||
if(prob(25) && target.mob_size <= 30)
|
||||
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
user.visible_message("<span class='danger'>[user] shoves hard, sending [target] flying!</span>")
|
||||
var/T = get_turf(user)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, T)
|
||||
s.start()
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
step_away(target,user,15)
|
||||
sleep(1)
|
||||
target.apply_effect(attack_damage * 0.4, WEAKEN, armour)
|
||||
@@ -0,0 +1,235 @@
|
||||
/datum/species/machine/shell
|
||||
name = "Shell Frame"
|
||||
short_name = "jak"
|
||||
name_plural = "Shells"
|
||||
|
||||
burn_mod = 1.2
|
||||
|
||||
blurb = "IPC's with humanlike properties. Their focus is on service, civilian, and medical, but there are no \
|
||||
job restrictions. Created in the late days of 2457, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \
|
||||
to create an uncannily close approximation of the organic form. Early models of Shell had the advantage of being able to compose themselves of a wide \
|
||||
variety of organic parts, but contemporary models have been restricted to a single species for the sake of prosthetic integrity. The additional weight of \
|
||||
the synthskin on the original Hephaestus frame reduces the efficacy of the IPC's already strained coolant systems, and increase charge consumption."
|
||||
|
||||
num_alternate_languages = 3
|
||||
|
||||
icobase = 'icons/mob/human_races/robotic.dmi'
|
||||
deform = 'icons/mob/human_races/robotic.dmi'
|
||||
|
||||
eyes = "eyes_s"
|
||||
show_ssd = "completely quiescent"
|
||||
|
||||
max_nutrition_factor = 0.8
|
||||
|
||||
heat_level_1 = 400
|
||||
heat_level_2 = 800
|
||||
heat_level_3 = 1600
|
||||
|
||||
heat_discomfort_level = 400
|
||||
heat_discomfort_strings = list(
|
||||
"Your CPU temperature probes warn you that you are approaching critical heat levels!",
|
||||
"Your synthetic flesh crawls in the heat, swelling into a disgusting morass of plastic."
|
||||
)
|
||||
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_SKIN_COLOR | HAS_FBP
|
||||
|
||||
/datum/species/machine/shell/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
add_inherent_verbs(H)
|
||||
H.mob_bump_flag = bump_flag
|
||||
H.mob_swap_flags = swap_flags
|
||||
H.mob_push_flags = push_flags
|
||||
H.pass_flags = pass_flags
|
||||
H.mob_size = mob_size
|
||||
. = ..()
|
||||
check_tag(H, H.client)
|
||||
|
||||
/datum/species/machine/shell/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
H.bodytemperature += cost*1.3
|
||||
H.nutrition -= cost*0.85
|
||||
if (H.nutrition > 0)
|
||||
return 1
|
||||
else
|
||||
H.Weaken(30)
|
||||
H.m_intent = "walk"
|
||||
H.hud_used.move_intent.update_move_icon(H)
|
||||
H << span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in 60 seconds, initiate charging as primary directive.")
|
||||
playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
|
||||
return 0
|
||||
|
||||
/datum/species/machine/shell/handle_death(var/mob/living/carbon/human/H)
|
||||
return
|
||||
|
||||
/datum/species/machine/shell/get_bodytype()
|
||||
return bodytype
|
||||
|
||||
/datum/species/machine/industrial
|
||||
name = "Industrial Frame"
|
||||
short_name = "ind"
|
||||
name_plural = "Industrials"
|
||||
|
||||
brute_mod = 0.3
|
||||
burn_mod = 1.2
|
||||
slowdown = 4
|
||||
|
||||
blurb = "Tough units made for engineering and security with simple exteriors, roughly resembling humans. No job restrictions. Heavy emphasis on \
|
||||
engineering/security/EMT. Developed also by Hephaestus Industries, the Industrial Frame trades the common availability of the Baseline Frame for \
|
||||
advanced durability and increased longevity. Constructed of durable plasteel, the frame can withstand a great deal more abuse, and its coolant systems \
|
||||
and internal cell have been improved to allow for much more strenuous work. However, due to an unfortunate fault in the capacitor, actual battery charge \
|
||||
tends to be short."
|
||||
|
||||
icobase = 'icons/mob/human_races/r_industrial.dmi'
|
||||
deform = 'icons/mob/human_races/r_industrial.dmi'
|
||||
|
||||
eyes = "eyes_industry"
|
||||
show_ssd = "completely quiescent"
|
||||
|
||||
has_limbs = list(
|
||||
"chest" = list("path" = /obj/item/organ/external/chest/industrial),
|
||||
"groin" = list("path" = /obj/item/organ/external/groin/industrial),
|
||||
"head" = list("path" = /obj/item/organ/external/head/industrial),
|
||||
"l_arm" = list("path" = /obj/item/organ/external/arm/industrial),
|
||||
"r_arm" = list("path" = /obj/item/organ/external/arm/right/industrial),
|
||||
"l_leg" = list("path" = /obj/item/organ/external/leg/industrial),
|
||||
"r_leg" = list("path" = /obj/item/organ/external/leg/right/industrial),
|
||||
"l_hand" = list("path" = /obj/item/organ/external/hand/industrial),
|
||||
"r_hand" = list("path" = /obj/item/organ/external/hand/right/industrial),
|
||||
"l_foot" = list("path" = /obj/item/organ/external/foot/industrial),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/foot/right/industrial)
|
||||
)
|
||||
|
||||
heat_level_1 = 800
|
||||
heat_level_2 = 1300
|
||||
heat_level_3 = 2500
|
||||
|
||||
heat_discomfort_level = 800
|
||||
|
||||
max_nutrition_factor = 1.25
|
||||
nutrition_loss_factor = 2
|
||||
|
||||
sprint_speed_factor = 1.4
|
||||
|
||||
/datum/species/machine/industrial/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
H.bodytemperature += cost*0.9
|
||||
H.nutrition -= cost*1.1
|
||||
if (H.nutrition > 0)
|
||||
return 1
|
||||
else
|
||||
H.Weaken(60)
|
||||
H.m_intent = "walk"
|
||||
H.hud_used.move_intent.update_move_icon(H)
|
||||
H << span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in two minutes, initiate charging as primary directive.")
|
||||
playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
|
||||
return 0
|
||||
|
||||
/datum/species/machine/industrial/handle_death(var/mob/living/carbon/human/H)
|
||||
return
|
||||
|
||||
/datum/species/machine/terminator
|
||||
name = "Hunter-Killer"
|
||||
short_name = "hks"
|
||||
name_plural = "HKs"
|
||||
|
||||
blurb = "\[REDACTED\]"
|
||||
|
||||
icobase = 'icons/mob/human_races/r_terminator.dmi'
|
||||
deform = 'icons/mob/human_races/r_terminator.dmi'
|
||||
|
||||
unarmed_types = list(/datum/unarmed_attack/terminator)
|
||||
rarity_value = 20
|
||||
|
||||
language = "Hephaestus Darkcomms"
|
||||
name_language = "Hephaestus Darkcomms"
|
||||
|
||||
eyes = "eyes_terminator"
|
||||
has_floating_eyes = 1
|
||||
|
||||
brute_mod = 0.2
|
||||
burn_mod = 0.4
|
||||
flash_mod = 0
|
||||
siemens_coefficient = 0
|
||||
|
||||
show_ssd = "laying inert, its activation glyph dark."
|
||||
death_sound = 'sound/effects/bang.ogg'
|
||||
death_message = "collapses to the ground with a CLUNK, and begins to beep ominously."
|
||||
|
||||
heat_level_1 = 1500
|
||||
heat_level_2 = 2000
|
||||
heat_level_3 = 5000
|
||||
|
||||
body_temperature = null
|
||||
passive_temp_gain = 0
|
||||
|
||||
flags = NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON
|
||||
spawn_flags = IS_RESTRICTED
|
||||
vision_flags = SEE_SELF | SEE_MOBS
|
||||
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#575757"
|
||||
virus_immune = 1
|
||||
reagent_tag = IS_MACHINE
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/self_destruct,
|
||||
/mob/living/carbon/human/proc/detonate_flechettes,
|
||||
/mob/living/carbon/human/proc/state_laws
|
||||
)
|
||||
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/mmi_holder/posibrain/terminator,
|
||||
"shielded cell" = /obj/item/organ/cell/terminator,
|
||||
"optics" = /obj/item/organ/optical_sensor,
|
||||
"data core" = /obj/item/organ/data
|
||||
)
|
||||
|
||||
vision_organ = "optics"
|
||||
|
||||
has_limbs = list(
|
||||
"chest" = list("path" = /obj/item/organ/external/chest/terminator),
|
||||
"groin" = list("path" = /obj/item/organ/external/groin/terminator),
|
||||
"head" = list("path" = /obj/item/organ/external/head/terminator),
|
||||
"l_arm" = list("path" = /obj/item/organ/external/arm/terminator),
|
||||
"r_arm" = list("path" = /obj/item/organ/external/arm/right/terminator),
|
||||
"l_leg" = list("path" = /obj/item/organ/external/leg/terminator),
|
||||
"r_leg" = list("path" = /obj/item/organ/external/leg/right/terminator),
|
||||
"l_hand" = list("path" = /obj/item/organ/external/hand/terminator),
|
||||
"r_hand" = list("path" = /obj/item/organ/external/hand/right/terminator),
|
||||
"l_foot" = list("path" = /obj/item/organ/external/foot/terminator),
|
||||
"r_foot" = list("path" = /obj/item/organ/external/foot/right/terminator)
|
||||
)
|
||||
|
||||
|
||||
heat_discomfort_level = 2000
|
||||
heat_discomfort_strings = list(
|
||||
"Your CPU temperature probes warn you that you are approaching critical heat levels!"
|
||||
)
|
||||
stamina = -1
|
||||
sprint_speed_factor = 1.25
|
||||
slowdown = 1
|
||||
|
||||
|
||||
/datum/species/machine/terminator/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
H.bodytemperature += cost*0.6
|
||||
H.nutrition -= cost*0.3
|
||||
if (H.nutrition > 0)
|
||||
return 1
|
||||
else
|
||||
H.Weaken(5)
|
||||
H.m_intent = "walk"
|
||||
H.hud_used.move_intent.update_move_icon(H)
|
||||
H << span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in 10 seconds, initiate charging as primary directive.")
|
||||
playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
|
||||
return 0
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
spawn(10)
|
||||
playsound(H.loc, 'sound/items/countdown.ogg', 125, 1)
|
||||
spawn(20)
|
||||
explosion(H, -1, -1, 5)
|
||||
H.gib()
|
||||
|
||||
/datum/species/machine/sanitize_name(var/new_name)
|
||||
return sanitizeName(new_name, allow_numbers = 1)
|
||||
@@ -2,6 +2,8 @@
|
||||
name = "Human"
|
||||
short_name = "hum"
|
||||
name_plural = "Humans"
|
||||
bodytype = "Human"
|
||||
age_max = 125
|
||||
primitive_form = "Monkey"
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
|
||||
blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
|
||||
@@ -21,13 +23,11 @@
|
||||
sprint_speed_factor = 0.9
|
||||
sprint_cost_factor = 0.5
|
||||
|
||||
/datum/species/human/get_bodytype()
|
||||
return "Human"
|
||||
|
||||
/datum/species/unathi
|
||||
name = "Unathi"
|
||||
short_name = "una"
|
||||
name_plural = "Unathi"
|
||||
bodytype = "Unathi"
|
||||
icobase = 'icons/mob/human_races/r_lizard.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_lizard.dmi'
|
||||
tail = "sogtail"
|
||||
@@ -99,6 +99,7 @@
|
||||
name = "Tajara"
|
||||
short_name = "taj"
|
||||
name_plural = "Tajaran"
|
||||
bodytype = "Tajara"
|
||||
icobase = 'icons/mob/human_races/r_tajaran.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
|
||||
tail = "tajtail"
|
||||
@@ -152,13 +153,12 @@
|
||||
..()
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
|
||||
|
||||
/datum/species/tajaran/get_bodytype()
|
||||
return "Tajara"
|
||||
|
||||
/datum/species/skrell
|
||||
name = "Skrell"
|
||||
short_name = "skr"
|
||||
name_plural = "Skrell"
|
||||
bodytype = "Skrell"
|
||||
age_max = 500
|
||||
icobase = 'icons/mob/human_races/r_skrell.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_skrell.dmi'
|
||||
eyes = "skrell_eyes_s"
|
||||
@@ -192,6 +192,8 @@
|
||||
name = "Diona"
|
||||
short_name = "dio"
|
||||
name_plural = "Dionaea"
|
||||
bodytype = "Diona"
|
||||
age_max = 1000
|
||||
icobase = 'icons/mob/human_races/r_diona.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_plant.dmi'
|
||||
language = "Ceti Basic"
|
||||
@@ -322,16 +324,20 @@
|
||||
if (!gibbed)
|
||||
H.diona_split_into_nymphs(0)
|
||||
|
||||
/datum/species/machine
|
||||
name = "Machine"
|
||||
short_name = "ipc"
|
||||
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."
|
||||
/datum/species/machine
|
||||
name = "Baseline Frame"
|
||||
short_name = "ipc"
|
||||
name_plural = "Baselines"
|
||||
bodytype = "Machine"
|
||||
age_min = 1
|
||||
age_max = 30
|
||||
|
||||
blurb = "IPCs are, quite simply, 'Integrated Positronic Chassis'. In this scenario, positronic does not mean anything significant - it is a nickname given \
|
||||
to all advanced processing units, based on the works of vintage writer Isaac Asimov. The long of the short is that they represent all unbound synthetic \
|
||||
units.Assembly produced, simple IPC units. Simple skeleton designed for minimal use, generally in civilian roles. The most common form of chassis used by \
|
||||
IPCs, first designed and produced by Hephaestus Industries in the early years of synthetic production. It has become ubiquitous, and for all of its many \
|
||||
faults - its shoddy coolant systems and fragile frame - it would be very odd to see a standard IPC without it."
|
||||
|
||||
icobase = 'icons/mob/human_races/r_machine.dmi'
|
||||
deform = 'icons/mob/human_races/r_machine.dmi'
|
||||
@@ -345,7 +351,6 @@
|
||||
ethanol_resistance = -1//Can't get drunk
|
||||
radiation_mod = 0 // not affected by radiation
|
||||
|
||||
eyes = "blank_eyes"
|
||||
// #TODO-MERGE: Check for balance and self-repair. If self-repair is a thing, RIP balance.
|
||||
brute_mod = 0.5
|
||||
burn_mod = 1.0
|
||||
@@ -370,6 +375,7 @@
|
||||
passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment.
|
||||
|
||||
flags = NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON | NO_MINOR_CUT
|
||||
appearance_flags = HAS_SKIN_COLOR
|
||||
spawn_flags = CAN_JOIN | IS_WHITELISTED
|
||||
|
||||
blood_color = "#1F181F"
|
||||
@@ -380,7 +386,8 @@
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/mmi_holder/posibrain,
|
||||
"cell" = /obj/item/organ/cell,
|
||||
"optics" = /obj/item/organ/optical_sensor
|
||||
"optics" = /obj/item/organ/optical_sensor,
|
||||
"ipc tag" = /obj/item/organ/ipc_tag
|
||||
)
|
||||
|
||||
vision_organ = "optics"
|
||||
@@ -407,6 +414,10 @@
|
||||
stamina = -1 // Machines use power and generate heat, stamina is not a thing
|
||||
sprint_speed_factor = 1 // About as capable of speed as a human
|
||||
|
||||
datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
H.gender = NEUTER
|
||||
. = ..()
|
||||
check_tag(H, H.client)
|
||||
|
||||
/datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
|
||||
if (H.stat == CONSCIOUS)
|
||||
@@ -431,11 +442,64 @@
|
||||
/datum/species/machine/sanitize_name(var/new_name)
|
||||
return sanitizeName(new_name, allow_numbers = 1)
|
||||
|
||||
/datum/species/machine/proc/check_tag(var/mob/living/carbon/human/new_machine, var/client/player)
|
||||
if (!new_machine || !player)
|
||||
return
|
||||
|
||||
establish_db_connection()
|
||||
|
||||
if (dbcon.IsConnected())
|
||||
var/obj/item/organ/ipc_tag/tag = new_machine.internal_organs_by_name["ipc tag"]
|
||||
|
||||
var/status = 0
|
||||
var/list/query_details = list(":ckey" = player.ckey, ":character_name" = player.prefs.real_name)
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey AND character_name = :character_name")
|
||||
query.Execute(query_details)
|
||||
|
||||
if (query.NextRow())
|
||||
status = text2num(query.item[1])
|
||||
else
|
||||
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO ss13_ipc_tracking (player_ckey, character_name) VALUES (:ckey, :character_name)")
|
||||
log_query.Execute(query_details)
|
||||
|
||||
if (!status)
|
||||
new_machine.internal_organs_by_name.Remove("ipc tag")
|
||||
new_machine.internal_organs.Remove(tag)
|
||||
qdel(tag)
|
||||
|
||||
/datum/species/machine/proc/update_tag(var/mob/living/carbon/human/target, var/client/player)
|
||||
if (!target || !player)
|
||||
return
|
||||
|
||||
establish_db_connection()
|
||||
|
||||
if (dbcon.IsConnected())
|
||||
var/status = 0
|
||||
var/sql_status = 0
|
||||
if (target.internal_organs_by_name["ipc tag"])
|
||||
status = 1
|
||||
|
||||
var/list/query_details = list(":ckey" = player.ckey, ":character_name" = target.real_name)
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey AND character_name = :character_name")
|
||||
query.Execute(query_details)
|
||||
|
||||
if (query.NextRow())
|
||||
sql_status = text2num(query.item[1])
|
||||
if (sql_status == status)
|
||||
return
|
||||
|
||||
query_details.Add(":status")
|
||||
query_details[":status"] = status
|
||||
var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ipc_tracking SET tag_status = :status WHERE player_ckey = :ckey AND character_name = :character_name")
|
||||
update_query.Execute(query_details)
|
||||
|
||||
/datum/species/bug
|
||||
name = "Vaurca Worker"
|
||||
short_name = "vau"
|
||||
name_plural = "Type A"
|
||||
bodytype = "Vaurca"
|
||||
age_min = 1
|
||||
age_max = 20
|
||||
language = LANGUAGE_VAURCA
|
||||
primitive_form = "V'krexi"
|
||||
greater_form = "Vaurca Warrior"
|
||||
@@ -478,8 +542,8 @@
|
||||
spawn_flags = CAN_JOIN | IS_WHITELISTED
|
||||
appearance_flags = HAS_SKIN_COLOR
|
||||
blood_color = "#E6E600" // dark yellow
|
||||
flesh_color = "#330000"
|
||||
base_color = "#330000"
|
||||
flesh_color = "#E6E600"
|
||||
base_color = "#575757"
|
||||
|
||||
death_message = "chitters faintly before crumbling to the ground, their eyes dead and lifeless..."
|
||||
halloss_message = "crumbles to the ground, too weak to continue fighting."
|
||||
@@ -500,12 +564,20 @@
|
||||
sprint_cost_factor = 0.30
|
||||
stamina_recovery = 2//slow recovery
|
||||
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/bugbite //weaker version of gut.
|
||||
)
|
||||
|
||||
|
||||
has_organ = list(
|
||||
"neural socket" = /obj/item/organ/vaurca/neuralsocket,
|
||||
"lungs" = /obj/item/organ/lungs,
|
||||
"filtration bit" = /obj/item/organ/vaurca/filtrationbit,
|
||||
"lungs" = /obj/item/organ/lungs,
|
||||
"heart" = /obj/item/organ/heart,
|
||||
"phoron reserve tank" = /obj/item/organ/vaurca/preserve,
|
||||
"right heart" = /obj/item/organ/heart/right,
|
||||
"second heart" = /obj/item/organ/heart,
|
||||
"left heart" = /obj/item/organ/heart/left,
|
||||
"liver" = /obj/item/organ/liver,
|
||||
"kidneys" = /obj/item/organ/kidneys,
|
||||
|
||||
@@ -708,7 +708,7 @@
|
||||
/mob/proc/is_mechanical()
|
||||
if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI"))
|
||||
return 1
|
||||
return istype(src, /mob/living/silicon) || get_species() == "Machine"
|
||||
return istype(src, /mob/living/silicon) || get_species() == "Baseline Frame" || get_species() == "Shell Frame" || get_species() == "Industrial Frame"
|
||||
|
||||
/mob/proc/is_ready()
|
||||
return client && !!mind
|
||||
|
||||
@@ -65,8 +65,16 @@
|
||||
return 0
|
||||
|
||||
/proc/isipc(A)
|
||||
if(istype(A, /mob/living/carbon/human) && (A:get_species() == "Machine"))
|
||||
return 1
|
||||
if(istype(A, /mob/living/carbon/human))
|
||||
switch(A:get_species())
|
||||
if ("Baseline Frame")
|
||||
return 1
|
||||
if ("Industrial Frame")
|
||||
return 1
|
||||
if ("Shell Frame")
|
||||
return 1
|
||||
if ("Hunter-Killer")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isvox(A)
|
||||
@@ -74,8 +82,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/mob/proc/is_diona()
|
||||
//returns which type of diona we are, or zero
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
|
||||
@@ -196,8 +196,17 @@ datum/preferences
|
||||
qdel(preview_icon_side)
|
||||
qdel(preview_icon)
|
||||
|
||||
var/g = "m"
|
||||
if(gender == FEMALE) g = "f"
|
||||
var/genderhead = "head"
|
||||
var/gendergroin = "groin"
|
||||
var/genderbust = "torso"
|
||||
if(gender == FEMALE)
|
||||
genderhead = "head_f"
|
||||
gendergroin = "groin_f"
|
||||
genderbust = "torso_f"
|
||||
else if(gender == MALE)
|
||||
genderhead = "head_m"
|
||||
gendergroin = "groin_m"
|
||||
genderbust = "torso_m"
|
||||
|
||||
var/icon/icobase
|
||||
var/datum/species/current_species = all_species[species]
|
||||
@@ -207,17 +216,21 @@ datum/preferences
|
||||
else
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
preview_icon = new /icon(icobase, "torso_[g]")
|
||||
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
|
||||
preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
|
||||
|
||||
preview_icon = new /icon('icons/effects/effects.dmi', "nothing")
|
||||
|
||||
//Non-robotic limbs
|
||||
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
|
||||
if(organ_data[name] == "amputated") continue
|
||||
if(organ_data[name] == "cyborg")
|
||||
for(var/organname in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand","groin","chest","head"))
|
||||
if(organ_data[organname] == "amputated") continue
|
||||
if(organ_data[organname] == "cyborg")
|
||||
continue//We will add the icons for robolimbs after the skin color is applied
|
||||
preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY)
|
||||
if(organname == "head")
|
||||
preview_icon.Blend(new /icon(icobase, "[genderhead]"), ICON_OVERLAY)
|
||||
else if(organname == "groin")
|
||||
preview_icon.Blend(new /icon(icobase, "[gendergroin]"), ICON_OVERLAY)
|
||||
else if(organname == "chest")
|
||||
preview_icon.Blend(new /icon(icobase, "[genderbust]"), ICON_OVERLAY)
|
||||
else
|
||||
preview_icon.Blend(new /icon(icobase, "[organname]"), ICON_OVERLAY)
|
||||
|
||||
//Tail
|
||||
if(current_species && (current_species.tail))
|
||||
@@ -237,12 +250,19 @@ datum/preferences
|
||||
|
||||
|
||||
//Robotic limbs, done AFTER skin color/tone blending
|
||||
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
|
||||
if(organ_data[name] == "cyborg")
|
||||
for(var/roboname in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand","groin","chest","head"))
|
||||
if(organ_data[roboname] == "cyborg")
|
||||
var/datum/robolimb/R
|
||||
if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]]
|
||||
if(rlimb_data[roboname]) R = all_robolimbs[rlimb_data[roboname]]
|
||||
if(!R) R = basic_robolimb
|
||||
preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic.
|
||||
if(roboname == "head")
|
||||
preview_icon.Blend(icon(R.icon, "[genderhead]"), ICON_OVERLAY)
|
||||
else if(roboname == "groin")
|
||||
preview_icon.Blend(icon(R.icon, "[gendergroin]"), ICON_OVERLAY)
|
||||
else if(roboname == "chest")
|
||||
preview_icon.Blend(icon(R.icon, "[genderbust]"), ICON_OVERLAY)
|
||||
else
|
||||
preview_icon.Blend(icon(R.icon, "[roboname]"), ICON_OVERLAY)
|
||||
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
|
||||
|
||||
Reference in New Issue
Block a user