Reworks xenomorphs (#23054)

* reworks xenomorphs

* part 2 electric boogaloo

* more tweaks

* more tweaks

* lints

* Update code/modules/mob/living/carbon/alien/alien_death.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/modules/surgery/organs/subtypes/xenos.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/datums/spells/alien_spells/transfer_plasma.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* reviews

* sprite fix

* high priority fix

* reverts most alien nerfs

---------

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
This commit is contained in:
GDN
2024-02-24 18:13:31 +00:00
committed by GitHub
co-authored by Henri215
parent f1059317c3
commit 5ebefe9fa1
51 changed files with 608 additions and 320 deletions
+8 -4
View File
@@ -14,8 +14,9 @@
var/origin_oldloc = null
var/static_beam = FALSE
var/beam_type = /obj/effect/ebeam //must be subtype
var/beamcolor
/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam,beam_sleep_time=3)
/datum/beam/New(beam_origin, beam_target,beam_icon = 'icons/effects/beam.dmi', beam_icon_state = "b_beam", time = 50, maxdistance = 10, btype = /obj/effect/ebeam, beam_sleep_time = 3, beam_color)
endtime = world.time+time
origin = beam_origin
origin_oldloc = get_turf(origin)
@@ -29,6 +30,7 @@
icon = beam_icon
icon_state = beam_icon_state
beam_type = btype
beamcolor = beam_color
/datum/beam/proc/Start()
Draw()
@@ -77,10 +79,12 @@
//cropped by a transparent box of length-N pixel size
if(N+32>length)
var/icon/II = new(icon, icon_state)
II.DrawBox(null,1,(length-N),32,32)
II.DrawBox(null, 1, (length-N), 32, 32)
X.icon = II
else
X.icon = base_icon
if(beamcolor)
X.color = beamcolor
X.transform = rot_matrix
//Calculate pixel offsets (If necessary)
@@ -163,7 +167,7 @@
var/armor = L.run_armor_check(limb_to_hit, LASER)
L.apply_damage(damage, BURN, limb_to_hit, armor)
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3)
var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time)
/atom/proc/Beam(atom/BeamTarget, icon_state="b_beam", icon='icons/effects/beam.dmi', time = 5 SECONDS, maxdistance = 10, beam_type = /obj/effect/ebeam, beam_sleep_time = 3, beam_color)
var/datum/beam/newbeam = new(src, BeamTarget, icon, icon_state, time, maxdistance, beam_type, beam_sleep_time, beam_color)
INVOKE_ASYNC(newbeam, TYPE_PROC_REF(/datum/beam, Start))
return newbeam
@@ -20,8 +20,7 @@ Updates the spell's actions on use as well, so they know when they can or can't
/obj/effect/proc_holder/spell/alien_spell
action_background_icon_state = "bg_alien"
clothes_req = FALSE
/// Extremely fast cooldown, only present so the cooldown system doesn't explode
base_cooldown = 1
base_cooldown = 0
create_attack_logs = FALSE
/// Every alien spell creates only logs, no attack messages on someone placing weeds, but you DO get attack messages on neurotoxin and corrosive acid
create_custom_logs = TRUE
@@ -8,14 +8,18 @@
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/alien_spell/build_resin/cast(list/targets, mob/living/carbon/user)
var/static/list/resin_buildings = list("Resin Wall (55)" = image(icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi', icon_state = "resin_wall-0"),
"Resin Nest (55)" = image(icon = 'icons/mob/alien.dmi', icon_state = "nest"),
"Resin door (80)" = image(icon = 'icons/obj/smooth_structures/alien/resin_door.dmi', icon_state = "resin"))
var/static/list/resin_buildings = list("Resin Wall" = image(icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi', icon_state = "resin_wall-0"),
"Resin Nest" = image(icon = 'icons/mob/alien.dmi', icon_state = "nest"),
"Resin Door" = image(icon = 'icons/obj/smooth_structures/alien/resin_door.dmi', icon_state = "resin"),
"Revival Nest" = image(icon = 'icons/mob/alien.dmi', icon_state = "placeholder_rejuv_nest"))
var/choice = show_radial_menu(user, user, resin_buildings, src, radius = 40)
var/turf/turf_to_spawn_at = user.loc
if(!choice)
revert_cast(user)
return
if(!do_mob(user, user, 3 SECONDS))
revert_cast()
return
if(isspaceturf(turf_to_spawn_at))
to_chat(user, "<span class='alertalien'>You cannot build the [choice] while in space!</span>")
revert_cast(user)
@@ -27,15 +31,52 @@
return
visible_message("<span class='alertalien'>[user] vomits up a thick purple substance and shapes it!</span>")
switch(choice)
if("Resin Wall (55)")
if("Resin Wall")
new /obj/structure/alien/resin/wall(turf_to_spawn_at)
if("Resin Nest (55)")
if("Resin Nest")
new /obj/structure/bed/nest(turf_to_spawn_at)
if("Resin door (80)")
var/plasma_current = user.get_plasma()
if(plasma_current >= 25)
new /obj/structure/alien/resin/door(turf_to_spawn_at)
user.add_plasma(-25)
return
to_chat(user, "<span class='danger'>You don't have enough plasma to place a door down.</span>")
revert_cast(user)
if("Resin Door")
new /obj/structure/alien/resin/door(turf_to_spawn_at)
if("Revival Nest")
new /obj/structure/bed/revival_nest(turf_to_spawn_at)
/obj/effect/proc_holder/spell/touch/alien_spell/consume_resin
name = "Consume resin structures"
desc = "Allows you to rip and tear straight through resin structures."
action_icon_state = "alien_resin"
hand_path = "/obj/item/melee/touch_attack/alien/consume_resin"
plasma_cost = 10
base_cooldown = 5 SECONDS
/obj/item/melee/touch_attack/alien/consume_resin
name = "Resin consumption"
desc = "The hunger..."
icon_state = "alien_acid"
/obj/item/melee/touch_attack/alien/consume_resin/afterattack(atom/target, mob/living/carbon/user, proximity)
if(target == user)
to_chat(user, "<span class='noticealien'>You stop trying to consume resin.</span>")
..()
return
if(!proximity || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
return
if(istype(target, /obj/structure/alien/weeds))
qdel(target)
if(istype(target, /obj/structure/alien/weeds/node))
user.add_plasma(50)
user.visible_message("<span class='alertalien'>[user] rips and tears into [target] with their teeth!</span>", "<span class='alertalien'>You viciously rip apart and consume [target]!</span>")
return
if(!plasma_check(10, user))
to_chat(user, "<span class='noticealien'>You don't have enough plasma to perform this action!</span>")
return
var/static/list/resin_objects = list(/obj/structure/alien/resin, /obj/structure/alien/egg, /obj/structure/bed/nest, /obj/structure/bed/revival_nest)
for(var/resin_type in resin_objects)
if(!istype(target, resin_type))
continue
user.visible_message("<span class='alertalien'>[user] rips and tears into [target] with their teeth!</span>")
if(!do_after(user, 3 SECONDS, target = target))
return
to_chat(user, "<span class='alertalien'>You viciously rip apart and consume [target]!</span>")
user.add_plasma(-10)
qdel(target)
..()
@@ -4,6 +4,7 @@
hand_path = "/obj/item/melee/touch_attack/alien/corrosive_acid"
action_icon_state = "alien_acid"
plasma_cost = 200
base_cooldown = 15 SECONDS
/obj/item/melee/touch_attack/alien/corrosive_acid
name = "Corrosive acid"
@@ -30,3 +31,45 @@
else
to_chat(user, "<span class='noticealien'>You cannot dissolve this object.</span>")
..()
/obj/effect/proc_holder/spell/touch/alien_spell/burning_touch
name = "Blazing touch"
desc = "Boil acid within your hand to burn through anything you touch with it, deals a lot of damage to aliens and destroys resin structures instantly."
hand_path = "/obj/item/melee/touch_attack/alien/burning_touch"
action_icon_state = "alien_acid"
plasma_cost = 100
base_cooldown = 10 SECONDS
/obj/item/melee/touch_attack/alien/burning_touch
name = "Blazing touch"
desc = "The air warps around your hand, somehow the heat doesn't hurt."
icon_state = "alien_acid"
/obj/item/melee/touch_attack/alien/burning_touch/afterattack(atom/target, mob/living/carbon/user, proximity)
if(target == user)
to_chat(user, "<span class='noticealien'>You cool down your boiled aid.</span>")
..()
return
if(!proximity || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
return
if(!plasma_check(100, user))
to_chat(user, "<span class='noticealien'>You don't have enough plasma to perform this action!</span>")
return
if(isliving(target))
var/mob/living/guy_to_burn = target
add_attack_logs(user, target, "Applied blazing touch") // Want this logged
guy_to_burn.adjustFireLoss(60)
guy_to_burn.adjust_fire_stacks(3)
guy_to_burn.IgniteMob()
user.visible_message("<span class='alertalien'>[user] touches [target] and a fireball erupts on contact!</span>")
user.add_plasma(-100)
..()
else
var/static/list/resin_objects = list(/obj/structure/alien/resin, /obj/structure/alien/egg, /obj/structure/bed/nest, /obj/structure/bed/revival_nest)
for(var/resin_type in resin_objects)
if(!istype(target, resin_type))
continue
user.visible_message("<span class='alertalien'>[user] touches [target] and burns right through it!</span>")
user.add_plasma(-100)
qdel(target)
..()
@@ -5,3 +5,35 @@
weed_type = /obj/structure/alien/egg
weed_name = "alien egg"
action_icon_state = "alien_egg"
requires_do_after = FALSE
/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers
name = "Combust facehuggers and eggs"
desc = "Take over the programming of facehuggers and eggs, sending out a shockwave which causes them to combust."
plasma_cost = 25
action_icon_state = "alien_egg"
base_cooldown = 3 SECONDS
/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers/create_new_targeting()
return new /datum/spell_targeting/clicked_atom
/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers/cast(list/targets, mob/living/carbon/user)
var/obj/target = targets[1]
var/turf/T = user.loc
if(!istype(T) || !istype(target))
revert_cast()
return FALSE
if(!istype(target, /obj/item/clothing/mask/facehugger) && !istype(target, /obj/structure/alien/egg))
revert_cast()
return FALSE
target.color = "#c72623"
addtimer(CALLBACK(src, PROC_REF(blow_it_up), target, user), 3 SECONDS)
to_chat(user, "<span class='noticealien'>[target] will explode in 3 seconds!</span>")
return TRUE
/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers/proc/blow_it_up(obj/target, mob/user)
add_attack_logs(user, target, "Caused it to explode")
explosion(get_turf(target), 0, 2, 3, 3, cause = user)
to_chat(user, "<span class='noticealien'>[target] has detonated!</span>")
@@ -1,7 +1,7 @@
/obj/effect/proc_holder/spell/alien_spell/neurotoxin
name = "Neurotoxin spit"
desc = "This ability allows you to fire some neurotoxin. Knocks down anyone you hit, applies a small amount of stamina damage as well."
base_cooldown = 5 SECONDS
base_cooldown = 3 SECONDS
plasma_cost = 50
selection_activated_message = "<span class='notice'><B>Your prepare some neurotoxin!</B></span>"
selection_deactivated_message = "<span class='notice'><B>You swallow your prepared neurotoxin.</B></span>"
@@ -34,3 +34,9 @@
user.newtonian_move(get_dir(U, T))
return TRUE
/obj/effect/proc_holder/spell/alien_spell/neurotoxin/death_to_xenos
name = "Neurotoxin spit"
desc = "This ability allows you to fire some neurotoxin. Knocks aliens down."
neurotoxin_type = /obj/item/projectile/bullet/anti_alien_toxin
base_cooldown = 2 SECONDS
@@ -2,9 +2,10 @@
name = "Plant weeds"
desc = "Allows you to plant some alien weeds on the floor below you. Does not work while in space."
plasma_cost = 50
var/weed_type = /obj/structure/alien/weeds/node
var/atom/weed_type = /obj/structure/alien/weeds/node
var/weed_name = "alien weed node"
action_icon_state = "alien_plant"
var/requires_do_after = TRUE
/obj/effect/proc_holder/spell/alien_spell/plant_weeds/create_new_targeting()
return new /datum/spell_targeting/self
@@ -26,5 +27,10 @@
revert_cast()
return
user.visible_message("<span class='warning'>Vines burst from the back of [user], quickly scurring to the ground and swarm onto [user.loc].</span>", "<span class='warning'>You begin infesting [user.loc] with [initial(weed_type.name)].</span>")
if(requires_do_after && !do_mob(user, user, 2 SECONDS))
revert_cast()
return
user.visible_message("<span class='alertalien'>[user] has planted \a [weed_name]!</span>")
new weed_type(T)
@@ -1,7 +1,7 @@
/obj/effect/proc_holder/spell/alien_spell/evolve_queen
name = "Evolve into an alien queen"
desc = "Evolve into an alien queen."
plasma_cost = 500
plasma_cost = 300
action_icon_state = "alien_evolve_drone"
/obj/effect/proc_holder/spell/alien_spell/evolve_queen/create_new_targeting()
@@ -17,8 +17,7 @@
// If there is no queen, that means we can evolve
to_chat(user, "<span class='noticealien'>You begin to evolve!</span>")
user.visible_message("<span class='alertalien'>[user] begins to twist and contort!</span>")
var/turf/userloc = user.loc
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(userloc)
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(get_turf(user))
user.mind.transfer_to(new_xeno)
new_xeno.mind.name = new_xeno.name
SSblackbox.record_feedback("tally", "alien_growth", 1, "queen")
@@ -9,6 +9,9 @@
/obj/effect/proc_holder/spell/alien_spell/regurgitate/cast(list/targets, mob/living/carbon/user)
for(var/mob/M in user.stomach_contents)
var/turf/output_loc = user.loc
if(!istype(output_loc))
return
user.stomach_contents -= M
M.forceMove(output_loc)
visible_message("<span class='alertalien'><B>[user] hurls out the contents of [p_their()] stomach!</span>")
return
@@ -0,0 +1,23 @@
/obj/effect/proc_holder/spell/alien_spell/tail_lash
name = "Tail lash"
desc = "Knocks down anyone around you."
action_icon_state = "tailsweep"
base_cooldown = 10 SECONDS
/obj/effect/proc_holder/spell/alien_spell/tail_lash/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/alien_spell/tail_lash/cast(list/targets, mob/user)
var/turf/T = user.loc
var/cast_resolved = FALSE
if(!istype(T))
revert_cast()
return
for(var/mob/living/to_knock_down in orange(1, user))
if(to_knock_down.KnockDown(10 SECONDS))
cast_resolved = TRUE
to_knock_down.visible_message("<span class='noticealien'>[user] sweeps [to_knock_down] off their feet!</span>")
if(!cast_resolved)
revert_cast()
return cast_resolved
@@ -1,28 +1,55 @@
/obj/effect/proc_holder/spell/touch/alien_spell/transfer_plasma
/obj/effect/proc_holder/spell/alien_spell/transfer_plasma
name = "Transfer Plasma"
desc = "Transfers 50 plasma to a nearby alien"
hand_path = "/obj/item/melee/touch_attack/alien/transfer_plasma"
action_icon_state = "alien_transfer"
plasma_cost = 50
/obj/item/melee/touch_attack/alien/transfer_plasma
name = "plasma transfer"
desc = "Transfers 50 plasma to another alien."
icon_state = "alien_transfer"
/obj/effect/proc_holder/spell/alien_spell/transfer_plasma/create_new_targeting()
return new /datum/spell_targeting/clicked_atom
/obj/item/melee/touch_attack/alien/transfer_plasma/afterattack(atom/target, mob/living/carbon/user, proximity)
if(target == user)
to_chat(user, "<span class='noticealien'>You withdraw your readied plasma.</span>")
..()
/obj/effect/proc_holder/spell/alien_spell/transfer_plasma/cast(list/targets, mob/living/carbon/user)
var/mob/living/carbon/alien/target = targets[1]
var/turf/T = user.loc
if(!istype(T) || !istype(target))
revert_cast()
return FALSE
user.Beam(target, icon_state = "sendbeam", time = 2 SECONDS, beam_color = "#f180bd")
target.add_plasma(50)
to_chat(user, "<span class='noticealien'>You have transfered 50 plasma to [target].</span>")
to_chat(target, "<span class='noticealien'>[user] has transfered 50 plasma to you!</span>")
return TRUE
/obj/effect/proc_holder/spell/alien_spell/syphon_plasma
name = "Syphon plasma"
desc = "Syphons 150 plasma from a nearby alien."
action_icon_state = "alien_transfer"
plasma_cost = 0
base_cooldown = 10 SECONDS
/obj/effect/proc_holder/spell/alien_spell/syphon_plasma/create_new_targeting()
return new /datum/spell_targeting/clicked_atom
/obj/effect/proc_holder/spell/alien_spell/syphon_plasma/cast(list/targets, mob/living/carbon/user)
var/mob/living/carbon/alien/target = targets[1]
var/turf/T = user.loc
if(!istype(T) || !istype(target))
revert_cast()
return FALSE
user.Beam(target, icon_state = "drainbeam", time = 2 SECONDS, beam_color = "#f180bd")
var/obj/item/organ/internal/alien/plasmavessel/vessel = target.get_int_organ(/obj/item/organ/internal/alien/plasmavessel)
if(!vessel)
return
if(!proximity || !isalien(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
return
if(!plasma_check(50, user))
to_chat(user, "<span class='noticealien'>You don't have enough plasma to perform this action!</span>")
return
user.add_plasma(-50)
var/mob/living/carbon/transfering_to = target
transfering_to.add_plasma(50)
to_chat(user, "<span class='noticealien'>You have transfered 50 plasma to [transfering_to].</span>")
to_chat(transfering_to, "<span class='noticealien'>[user] has transfered 50 plasma to you!</span>")
..()
var/plasma_syphoned
if(vessel.stored_plasma < 150)
user.add_plasma(vessel.stored_plasma)
plasma_syphoned = vessel.stored_plasma
vessel.stored_plasma = 0
else
user.add_plasma(150)
plasma_syphoned = 50
vessel.stored_plasma = vessel.stored_plasma - 150
to_chat(user, "<span class='noticealien'>You have syphoned [plasma_syphoned] plasma from [target].</span>")
to_chat(target, "<span class='noticealien'>[user] has syphoned [plasma_syphoned] from you!</span>")
return TRUE