mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-23 04:51:32 +01:00
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:
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user