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:
LordFowl
2016-12-28 02:23:26 +02:00
committed by skull132
parent 0c59930261
commit bc8871ac2b
65 changed files with 1248 additions and 158 deletions
+15
View File
@@ -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,
+1 -1
View File
@@ -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
+10 -4
View File
@@ -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")