Adds the Aut'akh unathi (#5919)

* Base work for the unathi robot subspecies.

* Adds metabolism species, kidney vars, and the robot unathi organs.

* Moves some action buttons to organs, pretty much a bay port right now. Todo: the unathi and alien stuff should also go here.

* First autakh implant power.

* Fixes the organs action button this time.

* Finishes more implants, and interactions with flashs and vaurca.

* Prepare for great changes.

* Drops the real bomb, boss.

* He who fights with monsters.

* Far more work into augments and limb removing powers.

* Limb verbs should be good now.

* A LOT of work into the assited organ, allowing it to bleed and etc, as well adding a new chem that will stop bleeding in their case.

* Probably the last work on implants.

* Some extra touches.

* Some tweaks to the species.

* More fixes and adds kyre's sprites.

* More runtime fixes.

* Fixes the species name too.

* Fixes travis.

* Updates this file too to work with the new tools procs.

* Adds changelog

* Fixed changelog.

* Unathi hair and lore description.

* Some tweaks to this too.

* Locks away them for now, they will be released after we got all the events and etc done.

* Changes this chemical.

* Fixes an airlock runtime.

* Adds the non scan flag to the autakh, mostly due to some bizzare interactions with changelings and cloning.

* Organs removal changes; can't take out the organ if it is too damage.

* Restricts them back again.

* Robotic organs now have the proper icons and names.

* Adds sprites for their organs and some extra tweaks.

* Fixes this missing icon.

* emp should also now hurt assited organs.

* Tweaks more organ related things.

* Fixes the head not being properly set as well.

* Fixes their flags.

* fixes the flag for real this time.

* Poze's review.

* Changes the au'takh organ buttons to don't be animated.

* Helps with adminbus or something.

* Fowl's requested changes.

* Fixes a typo.

* Robotic limb's brute and burn mods are now controlled by the limb model.

* Fowl's changes once more.

* Stops some spam.

* More grammar.

* No eal.

* Skull's review.
This commit is contained in:
Alberyk
2019-01-23 19:27:44 +01:00
committed by Werner
parent b1742dd3f1
commit 76b743a986
280 changed files with 1651 additions and 874 deletions
+2 -2
View File
@@ -87,14 +87,14 @@
else
user << "<span class='warning'>Access denied.</span>"
return
else if(isscrewdriver(O))
else if(O.isscrewdriver())
if(!locked)
open = !open
user << "<span class='notice'>Maintenance panel is now [open ? "opened" : "closed"].</span>"
else
user << "<span class='notice'>You need to unlock the controls first.</span>"
return
else if(iswelder(O))
else if(O.iswelder())
if(health < maxHealth)
if(open)
health = min(maxHealth, health + 10)
+3 -3
View File
@@ -333,7 +333,7 @@
return 1
if(3)
if(iswelder(W))
if(W.iswelder())
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
build_step++
@@ -363,7 +363,7 @@
return 1
if(6)
if(iscoil(W))
if(W.iscoil())
var/obj/item/stack/cable_coil/C = W
if (C.get_amount() < 1)
user << "<span class='warning'>You need one coil of wire to wire [src].</span>"
@@ -388,7 +388,7 @@
return 1
if(8)
if(isscrewdriver(W))
if(W.isscrewdriver())
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
var/turf/T = get_turf(user)
user << "<span class='notice'>Now attaching the gun to the frame...</span>"
+1 -1
View File
@@ -673,7 +673,7 @@
/obj/item/weapon/secbot_assembly/attackby(var/obj/item/O, var/mob/user)
..()
if(iswelder(O) && !build_step)
if(O.iswelder() && !build_step)
var/obj/item/weapon/weldingtool/WT = O
if(WT.remove_fuel(0, user))
build_step = 1
+4 -1
View File
@@ -424,4 +424,7 @@
if(disabilities & PACIFIST)
return TRUE
if(CE_PACIFIED in chem_effects)
return TRUE
return TRUE
/mob/living/carbon/proc/get_metabolism(metabolism)
return metabolism
@@ -282,7 +282,7 @@
if(temp)
if(skipbody & temp.body_part)
continue
if(temp.status & ORGAN_ROBOT)
if(temp.status & ORGAN_ASSISTED)
if(!(temp.brute_dam + temp.burn_dam))
//wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]!</span>\n"
// No need to notify about robotic limbs if they're not damaged, really.
@@ -1591,3 +1591,6 @@
var/obj/item/organ/brain/B = internal_organs_by_name["brain"]
if(B && species && species.has_organ["brain"] && !isipc(src))
. = B.cure_all_traumas(cure_permanent, cure_type)
/mob/living/carbon/human/get_metabolism(metabolism)
return ..() * (species ? species.metabolism_mod : 1)
@@ -889,4 +889,96 @@
addtimer(CALLBACK(G, /mob/living/carbon/human.proc/set_species, O.dna.species), 0)
to_chat(src,"<span class='notice'>You blow life back in \the [O], returning its past owner to life!</span>")
qdel(O)
last_special = world.time + 200
last_special = world.time + 200
/mob/living/carbon/human/proc/detach_limb()
set category = "Abilities"
set name = "Detach Limb"
set desc = "Detach one of your robotic appendages."
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained())
to_chat(src,"<span class='warning'>You can not do that in your current state!</span>")
return
var/obj/item/organ/external/E = get_organ(zone_sel.selecting)
if(!E)
to_chat(src,"<span class='warning'>You are missing that limb.</span>")
return
if(!E.robotic)
to_chat(src,"<span class='warning'>You can only detach robotic limbs.</span>")
return
if(E.robotize_type != PROSTHETIC_AUTAKH)
to_chat(src,"<span class='warning'>Your body fails to interface with this alien technology.</span>")
return
if(E.is_stump() || (E.status & ORGAN_DESTROYED) || E.is_broken())
to_chat(src,"<span class='warning'>The limb is too damaged to be removed manually!</span>")
return
if(E.vital && !E.sabotaged)
to_chat(src,"<span class='warning'>Your safety system stops you from removing \the [E].</span>")
return
last_special = world.time + 20
E.removed(src)
E.forceMove(get_turf(src))
update_body()
updatehealth()
UpdateDamageIcon()
visible_message("<span class='notice'>\The [src] detaches \his [E]!</span>",
"<span class='notice'>You detach your [E]!</span>")
/mob/living/carbon/human/proc/attach_limb()
set category = "Abilities"
set name = "Attach Limb"
set desc = "Attach a robotic limb to your body."
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained())
to_chat(src,"<span class='warning'>You can not do that in your current state!</span>")
return
var/obj/item/organ/external/O = src.get_active_hand()
if(istype(O))
if(!O.robotic)
to_chat(src,"<span class='warning'>You are unable to interface with organic matter.</span>")
return
if(O.robotize_type != PROSTHETIC_AUTAKH)
to_chat(src,"<span class='warning'>Your body fails to interface with this alien technology.</span>")
return
var/obj/item/organ/external/E = get_organ(zone_sel.selecting)
if(E)
to_chat(src,"<span class='warning'>You are not missing that limb.</span>")
return
last_special = world.time + 20
src.drop_from_inventory(O)
O.replaced(src)
src.update_body()
src.updatehealth()
src.UpdateDamageIcon()
update_body()
updatehealth()
UpdateDamageIcon()
visible_message("<span class='notice'>\The [src] attaches \the [O] to \his body!</span>",
"<span class='notice'>You attach \the [O] to your body!</span>")
@@ -197,4 +197,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
. = ..(mapload, "Homunculus")
/mob/living/carbon/human/adamantine_golem/Initialize(mapload)
. = ..(mapload, "Adamantine Golem")
. = ..(mapload, "Adamantine Golem")
/mob/living/carbon/human/autakh/Initialize(mapload)
. = ..(mapload, "Aut'akh Unathi")
@@ -71,6 +71,7 @@
var/radiation_mod = 1 // Radiation modifier
var/flash_mod = 1 // Stun from blindness modifier.
var/fall_mod = 1 // Fall damage modifier, further modified by brute damage modifier
var/metabolism_mod = 1 // Reagent metabolism modifier
var/vision_flags = DEFAULT_SIGHT // Same flags as glasses.
var/inherent_eye_protection // If set, this species has this level of inherent eye protection.
var/eyes_are_impermeable = FALSE // If TRUE, this species' eyes are not damaged by phoron.
@@ -0,0 +1,122 @@
/datum/species/unathi/autakh
name = "Aut'akh Unathi"
short_name = "aut"
name_plural = "Aut'akh Unathi"
icobase = 'icons/mob/human_races/r_autakh.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
tail = "autakh"
tail_animation = null
slowdown = 0.5
brute_mod = 0.7
burn_mod = 1.2
toxins_mod = 0.8
fall_mod = 1.1
economic_modifier = 4
sprint_speed_factor = 2.6
sprint_cost_factor = 1.10
rarity_value = 4
metabolism_mod = 2
eyes_are_impermeable = TRUE
breakcuffs = list(MALE, FEMALE)
meat_type = /obj/item/stack/material/steel
remains_type = /obj/effect/decal/remains/robot
death_message = "gives one shrill beep before falling lifeless."
knockout_message = "encounters a hardware fault and suddenly reboots!"
halloss_message = "encounters a hardware fault and suddenly reboots."
halloss_message_self = "ERROR: Unrecoverable machine check exception.<BR>System halted, rebooting..."
blurb = "The Aut'akh are a religious commune of cybernetically-augmented Unathi. They mostly hail from Moghes, and are made up of castoffs, refugees and exiles \
from other clans who have settled in the icy north pole. Formed from survivors of the contact war, the Aut'akh take a radical view of the standard Unathi position that \
the body is just a shell; they believe that meat is animated by soul, while metal is powered by electricity, and thus replacing one's body with metal empowers the soul.<br><br> \
They are managed, but not ruled, by their god Oss, a silent deity who quietly facilitates the Aut'akh's prosperity behind the scenes. They are almost excessively friendly, \
seeing all the beings of the galaxy as potential Aut'akh or allies for the Aut'akh. They also hold a strong spiritual tradition, believing that highly charismatic or intelligent \
people or strong fighters are blessed with magic"
cold_level_1 = 250 //Default 260 - Lower is better
cold_level_2 = 210 //Default 200
cold_level_3 = 120 //Default 120
heat_level_1 = 380 //Default 360 - Higher is better
heat_level_2 = 420 //Default 400
heat_level_3 = 1000 //Default 1000
inherent_verbs = list(
/mob/living/proc/devour,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/detach_limb,
/mob/living/carbon/human/proc/attach_limb
)
has_organ = list(
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys/autakh,
"brain" = /obj/item/organ/brain,
"eyes" = /obj/item/organ/eyes/autakh,
"anchor" = /obj/item/organ/anchor,
"haemodynamic" = /obj/item/organ/haemodynamic,
"adrenal" = /obj/item/organ/adrenal
)
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/autakh),
"groin" = list("path" = /obj/item/organ/external/groin/autakh),
"head" = list("path" = /obj/item/organ/external/head/autakh),
"l_arm" = list("path" = /obj/item/organ/external/arm/autakh),
"r_arm" = list("path" = /obj/item/organ/external/arm/right/autakh),
"l_leg" = list("path" = /obj/item/organ/external/leg/autakh),
"r_leg" = list("path" = /obj/item/organ/external/leg/right/autakh),
"l_hand" = list("path" = /obj/item/organ/external/hand/autakh),
"r_hand" = list("path" = /obj/item/organ/external/hand/right/autakh),
"l_foot" = list("path" = /obj/item/organ/external/foot/autakh),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/autakh)
)
spawn_flags = IS_RESTRICTED
appearance_flags = HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flags = NO_CHUBBY | NO_SCAN
flesh_color = "#575757"
heat_discomfort_level = 290
heat_discomfort_strings = list(
"Your organs feel warm.",
"Your temperature sensors are reading high.",
"You feel warm enough to take a nap."
)
cold_discomfort_level = 285
cold_discomfort_strings = list(
"You feel chilly.",
"You read a cryogenic environment.",
"Your servos creak in the cold."
)
siemens_coefficient = 1.1
nutrition_loss_factor = 1.2
hydration_loss_factor = 1.2
light_range = 2
light_power = 0.5
/datum/species/unathi/autakh/get_light_color(mob/living/carbon/human/H)
if (!istype(H))
return null
var/obj/item/organ/eyes/eyes = H.get_eyes()
if (eyes)
var/eyegb = rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])
return eyegb
+3 -6
View File
@@ -324,12 +324,9 @@
for(var/obj/item/I in src)
if(I.action_button_name)
if(!I.action)
if(I.action_button_is_hands_free)
I.action = new/datum/action/item_action/hands_free
else
I.action = new/datum/action/item_action
I.action.name = I.action_button_name
I.action.target = I
I.action = new I.default_action_type
I.action.name = I.action_button_name
I.action.SetTarget(I)
I.action.Grant(src)
return
+2 -2
View File
@@ -611,7 +611,7 @@ var/list/ai_verbs_default = list(
if(personnel_list.len)
input = input("Select a crew member:") as null|anything in personnel_list
var/selection = personnel_list[input]
var/icon/character_icon
var/icon/character_icon
if(selection && istype(selection, /list))
var/mob/living/carbon/human/H = selection["mob"]
if (H.near_camera())
@@ -697,7 +697,7 @@ var/list/ai_verbs_default = list(
var/obj/item/weapon/aicard/card = W
card.grab_ai(src, user)
else if(iswrench(W))
else if(W.iswrench())
if(anchored)
user.visible_message("<span class='notice'>\The [user] starts to unbolt \the [src] from the plating...</span>")
if(!do_after(user,40))
@@ -182,7 +182,7 @@
user << "<span class='danger'>\The [src] is not compatible with \the [W].</span>"
return
else if (iscrowbar(W))
else if (W.iscrowbar())
user << "<span class='danger'>\The [src] is hermetically sealed. You can't open the case.</span>"
return
@@ -173,7 +173,8 @@
else
module_string += text("[O]: <A HREF=?src=\ref[src];act=\ref[O]>Activate</A><BR>")
if((istype(O,/obj/item/weapon) || istype(O,/obj/item/device)) && !(iscoil(O)))
var/obj/item/I = O
if((istype(I,/obj/item/weapon) || istype(I,/obj/item/device)) && !(I.iscoil()))
tools += module_string
else
resources += module_string
@@ -245,7 +245,7 @@
/mob/living/silicon/robot/Destroy()
if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside.
var/turf/T = get_turf(loc)//To hopefully prevent run time errors.
if(T)
if(T)
mmi.forceMove(T)
if(mmi.brainmob)
mind.transfer_to(mmi.brainmob)
@@ -588,7 +588,7 @@
user << "You remove \the [cell_component.wrapped]."
if (iswelder(W))
if (W.iswelder())
if (src == user)
user << "<span class='warning'>You lack the reach to be able to repair yourself.</span>"
return
@@ -612,7 +612,7 @@
user << "Need more welding fuel!"
return
else if(iscoil(W) && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
else if(W.iscoil() && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
if (!getFireLoss())
user << "Nothing to fix here!"
return
@@ -624,7 +624,7 @@
for(var/mob/O in viewers(user, null))
O.show_message(text("<span class='warning'>[user] has fixed some of the burnt wires on [src]!</span>"), 1)
else if (iscrowbar(W)) // crowbar means open or close the cover
else if (W.iscrowbar()) // crowbar means open or close the cover
if(opened)
if(cell)
user.visible_message("<span class='notice'>\The [user] begins clasping shut \the [src]'s maintenance hatch.</span>", "<span class='notice'>You begin closing up \the [src].</span>")
@@ -690,7 +690,7 @@
storage = null
else
user << "You install \the [W]"
storage = W
user.drop_from_inventory(W,src)
recalculate_synth_capacities()
@@ -716,18 +716,18 @@
C.electronics_damage = 0
updateicon()
else if (iswirecutter(W) || ismultitool(W))
else if (W.iswirecutter() || W.ismultitool())
if (wiresexposed)
wires.Interact(user)
else
user << "You can't reach the wiring."
else if(isscrewdriver(W) && opened && !cell) // haxing
else if(W.isscrewdriver() && opened && !cell) // haxing
wiresexposed = !wiresexposed
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]."
updateicon()
else if(isscrewdriver(W) && opened && cell) // radio
else if(W.isscrewdriver() && opened && cell) // radio
if(radio)
radio.attackby(W,user)//Push it to the radio to let it handle everything
else
@@ -91,7 +91,7 @@
src.update_icon()
return 1
if (iswelder(O))
if (O.iswelder())
var/obj/item/weapon/weldingtool/WT = O
if (WT.remove_fuel(0))
if(health < maxHealth)
+14 -2
View File
@@ -37,8 +37,20 @@
return 0
/proc/isunathi(A)
if(istype(A, /mob/living/carbon/human) && (A:get_species() == "Unathi"))
return 1
if(ishuman(A))
var/mob/living/carbon/human/H = A
switch(H.get_species())
if ("Unathi")
return 1
if("Aut'akh Unathi")
return 1
return 0
/proc/isautakh(A)
if(ishuman(A))
var/mob/living/carbon/human/H = A
if(H.get_species() == "Aut'akh Unathi")
return 1
return 0
/proc/istajara(A)