From 98af877b21c2cfdc85b999f253f9f9705df822d9 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Wed, 6 Sep 2017 13:37:43 -0700 Subject: [PATCH] Xenomorph Tweaks/Buffs. --- code/game/machinery/doors/airlock.dm | 37 +++++++++++++++++++ code/game/machinery/doors/blast_door.dm | 35 ++++++++++++++++++ code/game/machinery/doors/firedoor.dm | 31 ++++++++++++++++ code/game/objects/buckling.dm | 3 ++ .../mob/living/carbon/alien/larva/larva.dm | 1 + .../mob/living/carbon/alien/progression.dm | 3 ++ .../mob/living/carbon/human/human_powers.dm | 1 - .../carbon/human/species/species_attack.dm | 11 ++++++ .../human/species/xenomorphs/alien_powers.dm | 27 ++++++++++++-- .../human/species/xenomorphs/alien_species.dm | 25 ++++++++----- .../human/species/xenomorphs/xenomorphs.dm | 6 ++- .../mob/living/simple_animal/aliens/alien.dm | 8 +--- code/modules/projectiles/projectile/energy.dm | 20 +++++++++- code/modules/tables/tables.dm | 12 ++++++ 14 files changed, 195 insertions(+), 25 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 510be69b9f..acd7a446c1 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -61,6 +61,37 @@ return ..() +/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.locked || src.welded) + visible_message("\The [user] begins digging into \the [src] internals!") + src.do_animate("deny") + if(do_after(user,5 SECONDS,src)) + visible_message("\The [user] forces \the [src] open, sparks flying from its electronics!") + src.do_animate("spark") + playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + src.emag_act() + else if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 5 SECONDS,src)) + playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + src.do_animate("deny") + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + /obj/machinery/door/airlock/get_material() if(mineral) return get_material_by_name(mineral) @@ -680,6 +711,12 @@ About the new airlock wires panel: if(src.shock(user, 100)) return + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + if(src.p_open) user.set_machine(src) wires.Interact(user) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 94d336274e..bf40ad9fff 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -96,6 +96,17 @@ else src.force_close() +//Proc: attack_hand +//Description: Attacked with empty hand. Only to allow special attack_bys. +/obj/machinery/door/blast/attack_hand(mob/user as mob) + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + ..() + + // Proc: attackby() // Parameters: 2 (C - Item this object was clicked with, user - Mob which clicked this object) // Description: If we are clicked with crowbar, wielded fire axe, or armblade, try to manually open the door. @@ -162,6 +173,30 @@ take_damage(W.force*0.15) //If the item isn't a weapon, let's make this take longer than usual to break it down. return +// Proc: attack_alien() +// Parameters: Attacking Xeno mob. +// Description: Forces open the door after a delay. +/obj/machinery/door/blast/attack_alien(var/mob/user) //Familiar, right? Doors. + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 15 SECONDS,src)) + playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + visible_message("\The [user] forces \the [src] open!") + force_open(1) + else + visible_message("\The [user] begins forcing \the [src] closed!") + if(do_after(user, 5 SECONDS,src)) + playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + visible_message("\The [user] forces \the [src] closed!") + force_close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + // Proc: open() // Parameters: None // Description: Opens the door. Does necessary checks. Automatically closes if autoclose is true diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 8be3733c5c..8255358112 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -135,6 +135,12 @@ if(operating) return//Already doing something. + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + if(blocked) user << "\The [src] is welded solid!" return @@ -185,6 +191,31 @@ nextstate = FIREDOOR_CLOSED close() +/obj/machinery/door/firedoor/attack_alien(var/mob/user) //Familiar, right? Doors. + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.blocked) + visible_message("\The [user] begins digging into \the [src] internals!") + if(do_after(user,5 SECONDS,src)) + playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + src.blocked = 0 + update_icon() + open(1) + else if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 2 SECONDS,src)) + playsound(src.loc, 'sound/machines/airlock_creaking.ogg', 100, 1) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + /obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob) add_fingerprint(user) if(operating) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index c963a902bb..6bde1393c1 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -11,6 +11,9 @@ if(can_buckle && buckled_mob) user_unbuckle_mob(user) +/obj/proc/attack_alien(mob/user as mob) //For calling in the event of Xenomorph or other alien checks. + return + /obj/attack_robot(mob/living/user) if(Adjacent(user) && buckled_mob) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things. return attack_hand(user) //Process as if we're a normal person touching the object. diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 9b72fb658f..7870c710c7 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -7,6 +7,7 @@ language = "Hivemind" maxHealth = 25 health = 25 + faction = "xeno" /mob/living/carbon/alien/larva/New() ..() diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index f208e9c68b..832535d062 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -30,6 +30,9 @@ transfer_languages(src, adult) + if(src.faction != "neutral") + adult.faction = src.faction + if(mind) mind.transfer_to(adult) if (can_namepick_as_adult) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 03833cfab4..93ed52f24c 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -38,7 +38,6 @@ if(prob(75)) T.Weaken(rand(0.5,3)) else - src.Weaken(rand(2,4)) failed = 1 playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 018dbafa84..15bc491a1a 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -57,11 +57,22 @@ damage = 5 shredding = 1 +/datum/unarmed_attack/claws/strong/xeno + attack_verb = list("slashed", "gouged", "stabbed") + damage = 10 + +/datum/unarmed_attack/claws/strong/xeno/queen + attack_verb = list("slashed", "gouged", "stabbed", "gored") + damage = 15 + /datum/unarmed_attack/bite/strong attack_verb = list("mauled") damage = 8 shredding = 1 +/datum/unarmed_attack/bite/strong/xeno + damage = 10 + /datum/unarmed_attack/slime_glomp attack_verb = list("glomped") attack_noun = list("body") diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 221808ff2e..a10e498ffd 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -18,7 +18,7 @@ I.stored_plasma += amount I.stored_plasma = max(0,min(I.stored_plasma,I.max_plasma)) -/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ) +/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ) //Returns 1 if the ability is clear for usage. var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA] if(!istype(P)) @@ -161,11 +161,11 @@ return /mob/living/carbon/human/proc/neurotoxin(mob/target as mob in oview()) - set name = "Spit Neurotoxin (50)" + set name = "Spit Neurotoxin (40)" set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear." set category = "Abilities" - if(!check_alien_ability(50,0,O_ACID)) + if(!check_alien_ability(40,0,O_ACID)) return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) @@ -179,6 +179,25 @@ A.launch(target) return +/mob/living/carbon/human/proc/acidspit(mob/target as mob in oview()) + set name = "Spit Acid (50)" + set desc = "Spits a blob of acid at someone, burning them if they are not wearing protective gear." + set category = "Abilities" + + if(!check_alien_ability(50,0,O_ACID)) + return + + if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) + src << "You cannot spit acid in your current state." + return + + visible_message("[src] spits acid at [target]!", "You spit acid at [target].") + + var/obj/item/projectile/energy/acid/A = new(get_turf(src)) + A.firer = src + A.launch(target) + return + /mob/living/carbon/human/proc/resin() // -- TLE set name = "Secrete Resin (75)" set desc = "Secrete tough malleable resin." @@ -239,7 +258,7 @@ src.visible_message("\The [src] leaps at [T]!") src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src) - playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1) + playsound(src.loc, 'sound/voice/hiss5.ogg', 50, 1) sleep(5) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index e9a1ec1673..2f857023e5 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -5,7 +5,7 @@ default_language = "Xenomorph" language = "Hivemind" - unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) + unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno) hud_type = /datum/hud_data/alien rarity_value = 3 @@ -160,6 +160,7 @@ H.RemoveInfectionImages() ..() */ + /datum/species/xenos/drone name = "Xenomorph Drone" caste_name = "drone" @@ -172,13 +173,13 @@ deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi' has_organ = list( - O_HEART = /obj/item/organ/internal/heart, - O_BRAIN = /obj/item/organ/internal/brain/xeno, - O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/queen, - O_ACID = /obj/item/organ/internal/xenos/acidgland, - O_HIVE = /obj/item/organ/internal/xenos/hivenode, - O_RESIN = /obj/item/organ/internal/xenos/resinspinner, - O_NUTRIENT = /obj/item/organ/internal/diona/nutrients + O_HEART = /obj/item/organ/internal/heart, + O_BRAIN = /obj/item/organ/internal/brain/xeno, + O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/queen, + O_ACID = /obj/item/organ/internal/xenos/acidgland, + O_HIVE = /obj/item/organ/internal/xenos/hivenode, + O_RESIN = /obj/item/organ/internal/xenos/resinspinner, + O_NUTRIENT = /obj/item/organ/internal/diona/nutrients ) inherent_verbs = list( @@ -232,7 +233,7 @@ weeds_plasma_rate = 10 caste_name = "sentinel" slowdown = 0 - total_health = 125 + total_health = 200 tail = "xenos_sentinel_tail" icobase = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi' @@ -253,7 +254,8 @@ /mob/living/carbon/human/proc/regurgitate, /mob/living/carbon/human/proc/transfer_plasma, /mob/living/carbon/human/proc/corrosive_acid, - /mob/living/carbon/human/proc/neurotoxin + /mob/living/carbon/human/proc/neurotoxin, + /mob/living/carbon/human/proc/acidspit ) /datum/species/xenos/queen @@ -270,6 +272,8 @@ icobase = 'icons/mob/human_races/xenos/r_xenos_queen.dmi' deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi' + unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno/queen, /datum/unarmed_attack/bite/strong/xeno) + has_organ = list( O_HEART = /obj/item/organ/internal/heart, O_BRAIN = /obj/item/organ/internal/brain/xeno, @@ -290,6 +294,7 @@ /mob/living/carbon/human/proc/transfer_plasma, /mob/living/carbon/human/proc/corrosive_acid, /mob/living/carbon/human/proc/neurotoxin, + /mob/living/carbon/human/proc/acidspit, /mob/living/carbon/human/proc/resin ) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index 3fb6958427..c28324262f 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -9,18 +9,20 @@ proc/create_new_xenomorph(var/alien_caste,var/target) /mob/living/carbon/human/xdrone/New(var/new_loc) h_style = "Bald" + faction = "xeno" ..(new_loc, "Xenomorph Drone") /mob/living/carbon/human/xsentinel/New(var/new_loc) h_style = "Bald" + faction = "xeno" ..(new_loc, "Xenomorph Sentinel") - /mob/living/carbon/human/xhunter/New(var/new_loc) h_style = "Bald" + faction = "xeno" ..(new_loc, "Xenomorph Hunter") - /mob/living/carbon/human/xqueen/New(var/new_loc) h_style = "Bald" + faction = "xeno" ..(new_loc, "Xenomorph Queen") // I feel like we should generalize/condense down all the various icon-rendering antag procs. diff --git a/code/modules/mob/living/simple_animal/aliens/alien.dm b/code/modules/mob/living/simple_animal/aliens/alien.dm index 7748559017..40f3bb70df 100644 --- a/code/modules/mob/living/simple_animal/aliens/alien.dm +++ b/code/modules/mob/living/simple_animal/aliens/alien.dm @@ -62,7 +62,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 ranged = 1 - projectiletype = /obj/item/projectile/neurotox + projectiletype = /obj/item/projectile/energy/neurotoxin/toxic projectilesound = 'sound/weapons/pierce.ogg' @@ -77,7 +77,7 @@ melee_damage_upper = 15 ranged = 1 move_to_delay = 3 - projectiletype = /obj/item/projectile/neurotox + projectiletype = /obj/item/projectile/energy/neurotoxin/toxic projectilesound = 'sound/weapons/pierce.ogg' rapid = 1 status_flags = 0 @@ -92,10 +92,6 @@ maxHealth = 400 health = 400 -/obj/item/projectile/neurotox - damage = 30 - icon_state = "toxin" - /mob/living/simple_animal/hostile/alien/death() ..() visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index ebb786c60e..42be84f2ac 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -111,13 +111,29 @@ name = "largebolt" damage = 20 +/obj/item/projectile/energy/acid //Slightly up-gunned (Read: The thing does agony and checks bio resist) variant of the simple alien mob's projectile, for queens and sentinels. + name = "acidic spit" + icon_state = "neurotoxin" + damage = 30 + damage_type = BURN + agony = 10 + check_armour = "bio" /obj/item/projectile/energy/neurotoxin - name = "neuro" + name = "neurotoxic spit" icon_state = "neurotoxin" damage = 5 damage_type = TOX - weaken = 5 + agony = 80 + check_armour = "bio" + +/obj/item/projectile/energy/neurotoxin/toxic //New alien mob projectile to match the player-variant's projectiles. + name = "neurotoxic spit" + icon_state = "neurotoxin" + damage = 20 + damage_type = TOX + agony = 20 + check_armour = "bio" /obj/item/projectile/energy/phoron name = "phoron bolt" diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 30de715de6..03382bffb2 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -159,6 +159,18 @@ return ..() +/obj/structure/table/attack_hand(mob/user as mob) + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + ..() + +/obj/structure/table/attack_alien(mob/user as mob) + visible_message("\The [user] tears apart \the [src]!") + src.break_to_parts() + /obj/structure/table/MouseDrop_T(obj/item/stack/material/what) if(can_reinforce && isliving(usr) && (!usr.stat) && istype(what) && usr.get_active_hand() == what && Adjacent(usr)) reinforce_table(what, usr)