mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 23:48:28 +01:00
[Ready for code review] Moves alien verbs to spells (#20002)
* Moves alien verbs to spells * lol * Standardization, polish, making alien plasma huds more consistant * The very cursed way of handling touch spells * logging + more polish * snakecase + documentation * finishing touches * oops, ty henri Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * sprites from TGstation * sprites, again * oops * farie's review part 1 * farie's review p2, signals * Erics PR compat * farie's review 3 * that too * the shawnshank redemption * boink * removes larva transfer plasma * you want a sprite cranberry? * TM fix 1 * FUCK I BROKE LOGGING * bam * final touches --------- Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
This commit is contained in:
@@ -143,7 +143,6 @@
|
||||
martial_art.remove(current)
|
||||
else
|
||||
martial_art.teach(current)
|
||||
|
||||
if(active)
|
||||
new_character.key = key //now transfer the key to link the client to our new body
|
||||
SEND_SIGNAL(src, COMSIG_MIND_TRANSER_TO, new_character)
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/* This is the handler for alien spells
|
||||
This relies on a lot of different procs on the spell and carbon level, so if you are editing this, remember to check that the other procs aren't editied in a way that
|
||||
could change behavior.
|
||||
You're gonna see a lot of plasmavessel checks and alien checks, as a lot of things need to work a certain way when used by an alien, and a different way when used by a human.
|
||||
This was also the case with the verb implementation, it's just much more obvious now.
|
||||
*/
|
||||
/datum/spell_handler/alien
|
||||
/// Amount of plasma required to use this ability
|
||||
var/plasma_cost = 0
|
||||
|
||||
/datum/spell_handler/alien/can_cast(mob/living/carbon/user, charge_check, show_message, obj/effect/proc_holder/spell/spell)
|
||||
var/obj/item/organ/internal/alien/plasmavessel/vessel = user.get_int_organ(/obj/item/organ/internal/alien/plasmavessel)
|
||||
if(!vessel)
|
||||
return 0
|
||||
if(vessel.stored_plasma < plasma_cost)
|
||||
if(show_message)
|
||||
to_chat(user, "<span class='warning'>You require at least [plasma_cost] plasma to use this ability!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/spell_handler/alien/spend_spell_cost(mob/living/carbon/user, obj/effect/proc_holder/spell/spell)
|
||||
user.use_plasma_spell(plasma_cost, user)
|
||||
|
||||
/datum/spell_handler/alien/before_cast(list/targets, mob/living/carbon/user, obj/effect/proc_holder/spell/spell)
|
||||
to_chat(user, "<span class='boldnotice'>You have [user.get_plasma()] plasma left to use.</span>")
|
||||
user.update_plasma_display(user)
|
||||
|
||||
/datum/spell_handler/alien/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell)
|
||||
user.add_plasma(plasma_cost, user)
|
||||
to_chat(user, "<span class='boldnotice'>You have [user.get_plasma()] plasma left to use.</span>")
|
||||
user.update_plasma_display(user)
|
||||
|
||||
/mob/living/carbon/proc/get_plasma()
|
||||
var/obj/item/organ/internal/alien/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/alien/plasmavessel)
|
||||
if(!vessel)
|
||||
return 0
|
||||
return vessel.stored_plasma
|
||||
@@ -0,0 +1,45 @@
|
||||
/mob/living/carbon/proc/use_plasma_spell(amount, mob/living/carbon/user)
|
||||
var/obj/item/organ/internal/alien/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/alien/plasmavessel)
|
||||
if(amount > vessel.stored_plasma)
|
||||
return FALSE
|
||||
add_plasma(-amount)
|
||||
return TRUE
|
||||
|
||||
/* add_plasma just requires the plasma amount, so admins can easily varedit it and stuff
|
||||
Updates the spell's actions on use as well, so they know when they can or can't use their powers*/
|
||||
|
||||
/mob/living/carbon/proc/add_plasma(amount)
|
||||
var/obj/item/organ/internal/alien/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/alien/plasmavessel)
|
||||
if(!vessel)
|
||||
return
|
||||
vessel.stored_plasma += amount
|
||||
if(vessel.stored_plasma > vessel.max_plasma)
|
||||
vessel.stored_plasma = vessel.max_plasma
|
||||
update_plasma_display(src)
|
||||
for(var/datum/action/spell_action/action in actions)
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/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
|
||||
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
|
||||
/// How much plasma it costs to use this
|
||||
var/plasma_cost = 0
|
||||
|
||||
/// Every single alien spell uses a "spell name + plasmacost" format
|
||||
/obj/effect/proc_holder/spell/alien_spell/Initialize(mapload)
|
||||
. = ..()
|
||||
if(plasma_cost)
|
||||
name = "[name] ([plasma_cost])"
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/write_custom_logs(list/targets, mob/user)
|
||||
user.create_log(ATTACK_LOG, "Cast the spell [name]")
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/create_new_handler()
|
||||
var/datum/spell_handler/alien/handler = new
|
||||
handler.plasma_cost = plasma_cost
|
||||
return handler
|
||||
@@ -0,0 +1,53 @@
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell
|
||||
name = "Basetype Alien spell"
|
||||
desc = "You should not see this in game, if you do file a github report!"
|
||||
hand_path = "/obj/item/melee/touch_attack/alien"
|
||||
/// Extremely fast cooldown, only present so the cooldown system doesn't explode
|
||||
base_cooldown = 1
|
||||
action_background_icon_state = "bg_alien"
|
||||
clothes_req = FALSE
|
||||
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
|
||||
/// We want a special on remove message, so we got this variable to do so
|
||||
on_remove_message = FALSE
|
||||
/// How much plasma it costs to use this
|
||||
var/plasma_cost = 0
|
||||
action_icon_state = "gib"
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell/Initialize(mapload)
|
||||
. = ..()
|
||||
if(plasma_cost)
|
||||
name = "[name] ([plasma_cost])"
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell/Click(mob/user = usr)
|
||||
if(attached_hand)
|
||||
to_chat(user, "<span class='noticealien'>You withdraw your [src].</span>")
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell/cast(list/targets, mob/living/carbon/user)
|
||||
user.add_plasma(plasma_cost)
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell/write_custom_logs(list/targets, mob/user)
|
||||
user.create_log(ATTACK_LOG, "Cast the spell [name]")
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell/create_new_handler()
|
||||
var/datum/spell_handler/alien/H = new
|
||||
H.plasma_cost = plasma_cost
|
||||
return H
|
||||
|
||||
/obj/item/melee/touch_attack/alien
|
||||
name = "Basetype Alien touch_attack"
|
||||
desc = "You should not see this in game, if you do file a github report!"
|
||||
/// Alien spells don't have catchphrases
|
||||
catchphrase = null
|
||||
/// Beepsky shouldn't be arresting you over this
|
||||
needs_permit = FALSE
|
||||
|
||||
/obj/item/melee/touch_attack/alien/proc/plasma_check(plasma, mob/living/carbon/user)
|
||||
var/plasma_current = user.get_plasma()
|
||||
if(plasma_current < plasma)
|
||||
qdel(src)
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -0,0 +1,41 @@
|
||||
/obj/effect/proc_holder/spell/alien_spell/build_resin
|
||||
name = "Build Resin Structure"
|
||||
desc = "Allows you to create resin structures. Does not work while in space."
|
||||
plasma_cost = 55
|
||||
action_icon_state = "alien_resin"
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/build_resin/create_new_targeting()
|
||||
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/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(isspaceturf(turf_to_spawn_at))
|
||||
to_chat(user, "<span class='alertalien'>You cannot build the [choice] while in space!</span>")
|
||||
revert_cast(user)
|
||||
return
|
||||
var/obj/structure/alien/resin/resin_on_turf = locate() in turf_to_spawn_at
|
||||
if(resin_on_turf)
|
||||
to_chat(user, "<span class='danger'>There is already a resin construction here.</span>")
|
||||
revert_cast(user)
|
||||
return
|
||||
visible_message("<span class='alertalien'>[user] vomits up a thick purple substance and shapes it!</span>")
|
||||
switch(choice)
|
||||
if("Resin Wall (55)")
|
||||
new /obj/structure/alien/resin/wall(turf_to_spawn_at)
|
||||
if("Resin Nest (55)")
|
||||
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)
|
||||
@@ -0,0 +1,29 @@
|
||||
/obj/effect/proc_holder/spell/touch/alien_spell/corrosive_acid
|
||||
name = "Corrosive acid"
|
||||
desc = "Spit acid on someone in range, this acid melts through nearly anything and heavily damages anyone lacking proper safety equipment."
|
||||
hand_path = "/obj/item/melee/touch_attack/alien/corrosive_acid"
|
||||
action_icon_state = "alien_acid"
|
||||
plasma_cost = 200
|
||||
|
||||
/obj/item/melee/touch_attack/alien/corrosive_acid
|
||||
name = "Corrosive acid"
|
||||
desc = "A fistfull of death."
|
||||
icon_state = "alien_acid"
|
||||
|
||||
/obj/item/melee/touch_attack/alien/corrosive_acid/afterattack(atom/target, mob/living/carbon/user, proximity)
|
||||
if(target == user)
|
||||
to_chat(user, "<span class='noticealien'>You withdraw your readied acid.</span>")
|
||||
..()
|
||||
return
|
||||
if(!proximity || isalien(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) // Don't want xenos ditching out of cuffs
|
||||
return
|
||||
if(!plasma_check(200, user))
|
||||
to_chat(user, "<span class='noticealien'>You don't have enough plasma to perform this action!</span>")
|
||||
return
|
||||
if(target.acid_act(200, 100))
|
||||
visible_message("<span class='alertalien'>[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!</span>")
|
||||
add_attack_logs(user, target, "Applied corrosive acid") // Want this logged
|
||||
user.add_plasma(-200)
|
||||
else
|
||||
to_chat(user, "<span class='noticealien'>You cannot dissolve this object.</span>")
|
||||
..()
|
||||
@@ -0,0 +1,45 @@
|
||||
// Make this reflect amount grown, can't do that currently
|
||||
/obj/effect/proc_holder/spell/alien_spell/evolve_larva
|
||||
name = "Evolve."
|
||||
desc = "Evolve into a fully grown Alien."
|
||||
action_icon_state = "alien_evolve_larva"
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/evolve_larva/create_new_targeting()
|
||||
return new /datum/spell_targeting/self
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/evolve_larva/cast(list/targets, mob/living/carbon/alien/larva/user)
|
||||
if(user.stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
if(user.handcuffed || user.legcuffed)
|
||||
to_chat(user, "<span class='warning'>You cannot evolve when you are cuffed.</span>")
|
||||
return
|
||||
|
||||
if(user.amount_grown < user.max_grown)
|
||||
to_chat(user, "<span class='warning'>You are not fully grown.</span>")
|
||||
return
|
||||
//green is impossible to read, so i made these blue and changed the formatting slightly
|
||||
to_chat(user, "<span class='boldnotice'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
|
||||
to_chat(user, "<span class='notice'>There are three to choose from:</span>")
|
||||
to_chat(user, "<B>Hunters</B> <span class='notice'>are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.</span>")
|
||||
to_chat(user, "<B>Sentinels</B> <span class='notice'>are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.</span>")
|
||||
to_chat(user, "<B>Drones</B> <span class='notice'>are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.</span>")
|
||||
var/static/list/to_evolve = list("Hunter" = image(icon = 'icons/mob/alien.dmi', icon_state = "alienh_s"),
|
||||
"Sentinel" = image(icon = 'icons/mob/alien.dmi', icon_state = "aliend_s"),
|
||||
"Drone" = image(icon = 'icons/mob/alien.dmi', icon_state = "aliend_s"))
|
||||
var/new_xeno = show_radial_menu(user, user, to_evolve, src, radius = 40)
|
||||
var/turf/T = user.loc
|
||||
if(!new_xeno)
|
||||
return
|
||||
var/to_spawn
|
||||
switch(new_xeno)
|
||||
if("Hunter")
|
||||
to_spawn = new /mob/living/carbon/alien/humanoid/hunter(T)
|
||||
if("Sentinel")
|
||||
to_spawn = new /mob/living/carbon/alien/humanoid/sentinel(T)
|
||||
if("Drone")
|
||||
to_spawn = new /mob/living/carbon/alien/humanoid/drone(T)
|
||||
if(user.mind)
|
||||
user.mind.transfer_to(to_spawn)
|
||||
SSblackbox.record_feedback("tally", "alien_growth", 1, "[lowertext(new_xeno)]")
|
||||
qdel(user)
|
||||
@@ -0,0 +1,7 @@
|
||||
/obj/effect/proc_holder/spell/alien_spell/plant_weeds/eggs
|
||||
name = "Plant alien eggs"
|
||||
desc = "Allows you to plant alien eggs on your current turf, does not work while in space."
|
||||
plasma_cost = 75
|
||||
weed_type = /obj/structure/alien/egg
|
||||
weed_name = "alien egg"
|
||||
action_icon_state = "alien_egg"
|
||||
@@ -0,0 +1,36 @@
|
||||
/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
|
||||
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>"
|
||||
var/neurotoxin_type = /obj/item/projectile/bullet/neurotoxin
|
||||
action_icon_state = "alien_neurotoxin_0"
|
||||
active = FALSE
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/neurotoxin/create_new_targeting()
|
||||
return new /datum/spell_targeting/clicked_atom
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/neurotoxin/update_icon_state()
|
||||
if(!action)
|
||||
return
|
||||
action.button_icon_state = "alien_neurotoxin_[active]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/neurotoxin/cast(list/targets, mob/living/carbon/user)
|
||||
var/target = targets[1]
|
||||
var/turf/T = user.loc
|
||||
var/turf/U = get_step(user, user.dir) // A little aimbot is fine
|
||||
if(!istype(U) || !istype(T))
|
||||
return FALSE
|
||||
|
||||
var/obj/item/projectile/bullet/neurotoxin/neurotoxin = new neurotoxin_type(user.loc)
|
||||
neurotoxin.current = get_turf(user)
|
||||
neurotoxin.original = target
|
||||
neurotoxin.firer = user
|
||||
neurotoxin.preparePixelProjectile(target, get_turf(target), user)
|
||||
neurotoxin.fire()
|
||||
user.newtonian_move(get_dir(U, T))
|
||||
|
||||
return TRUE
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/effect/proc_holder/spell/alien_spell/plant_weeds
|
||||
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/weed_name = "alien weed node"
|
||||
action_icon_state = "alien_plant"
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/plant_weeds/create_new_targeting()
|
||||
return new /datum/spell_targeting/self
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/plant_weeds/cast(list/targets, mob/living/carbon/user)
|
||||
var/turf/T = user.loc
|
||||
if(locate(weed_type) in T)
|
||||
to_chat(user, "<span class='noticealien'>There's already an [weed_name] here.</span>")
|
||||
revert_cast()
|
||||
return
|
||||
|
||||
if(isspaceturf(T))
|
||||
to_chat(user, "<span class='noticealien'>You cannot plant [weed_name]s in space.</span>")
|
||||
revert_cast()
|
||||
return
|
||||
|
||||
user.visible_message("<span class='alertalien'>[user] has planted a [weed_name]!</span>")
|
||||
new weed_type(T)
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/effect/proc_holder/spell/alien_spell/evolve_queen
|
||||
name = "Evolve into an alien queen"
|
||||
desc = "Evolve into an alien queen."
|
||||
plasma_cost = 500
|
||||
action_icon_state = "alien_evolve_drone"
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/evolve_queen/create_new_targeting()
|
||||
return new /datum/spell_targeting/self
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/evolve_queen/cast(list/targets, mob/living/carbon/user)
|
||||
/// First we check if there is a living queen
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/living_queen in GLOB.alive_mob_list)
|
||||
if(living_queen.key || !living_queen.get_int_organ(/obj/item/organ/internal/brain)) // We do a once over to check the queen didn't end up going away into the magic land of semi-dead
|
||||
to_chat(user, "<span class='notice'>We already have an alive queen.</span>")
|
||||
revert_cast(user)
|
||||
return
|
||||
// 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)
|
||||
user.mind.transfer_to(new_xeno)
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
SSblackbox.record_feedback("tally", "alien_growth", 1, "queen")
|
||||
qdel(user)
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/effect/proc_holder/spell/alien_spell/regurgitate
|
||||
name = "Regurgitate"
|
||||
desc = "Empties the contents of your stomach onto the ground."
|
||||
action_icon_state = "alien_barf"
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/regurgitate/create_new_targeting()
|
||||
return new /datum/spell_targeting/self
|
||||
|
||||
/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
|
||||
M.forceMove(output_loc)
|
||||
visible_message("<span class='alertalien'><B>[user] hurls out the contents of [p_their()] stomach!</span>")
|
||||
return
|
||||
visible_message("<span class='alertalien'><B>[user] dry heaves!</span>")
|
||||
@@ -0,0 +1,28 @@
|
||||
/obj/effect/proc_holder/spell/touch/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/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>")
|
||||
..()
|
||||
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>")
|
||||
..()
|
||||
@@ -0,0 +1,28 @@
|
||||
/obj/effect/proc_holder/spell/alien_spell/whisper
|
||||
name = "Whisper"
|
||||
desc = "Whisper into a target's mind."
|
||||
plasma_cost = 10
|
||||
action_icon_state = "alien_whisper"
|
||||
var/target
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/whisper/create_new_targeting() // Yeah this is copy and pasted code from cryoken and it's good enough
|
||||
var/datum/spell_targeting/click/T = new()
|
||||
T.allowed_type = /mob/living
|
||||
T.click_radius = 0
|
||||
T.try_auto_target = FALSE
|
||||
T.selection_type = SPELL_SELECTION_RANGE
|
||||
T.include_user = TRUE
|
||||
return T
|
||||
|
||||
/obj/effect/proc_holder/spell/alien_spell/whisper/cast(list/targets, mob/living/carbon/user)
|
||||
var/mob/living/target = targets[1]
|
||||
|
||||
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
|
||||
if(!msg)
|
||||
revert_cast(user)
|
||||
return
|
||||
log_say("(AWHISPER to [key_name(target)]) [msg]", user)
|
||||
to_chat(target, "<span class='noticealien'>You hear a strange, alien voice in your head...<span class='noticealien'> [msg]")
|
||||
to_chat(user, "<span class='noticealien'>You said: [msg] to [target]</span>")
|
||||
for(var/mob/dead/observer/ghosts in GLOB.player_list)
|
||||
ghosts.show_message("<i>Alien message from <b>[user]</b> ([ghost_follow_link(user, ghost=ghosts)]) to <b>[target]</b> ([ghost_follow_link(target, ghost=ghosts)]): [msg]</i>")
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/effect/proc_holder/spell/touch
|
||||
var/hand_path = /obj/item/melee/touch_attack
|
||||
var/obj/item/melee/touch_attack/attached_hand = null
|
||||
var/on_remove_message = TRUE
|
||||
invocation_type = "none" //you scream on connecting, not summoning
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/create_new_targeting()
|
||||
@@ -11,15 +12,16 @@
|
||||
qdel(attached_hand)
|
||||
cooldown_handler.revert_cast()
|
||||
attached_hand = null
|
||||
to_chat(user, "<span class='notice'>You draw the power out of your hand.</span>")
|
||||
return 0
|
||||
if(on_remove_message)
|
||||
to_chat(user, "<span class='notice'>You draw the power out of your hand.</span>")
|
||||
return FALSE
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/touch/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/target in targets)
|
||||
if(!attached_hand)
|
||||
if(!ChargeHand(target))
|
||||
return 0
|
||||
return FALSE
|
||||
while(attached_hand) //hibernate untill the spell is actually used
|
||||
cooldown_handler.recharge_time++ // adds a tick onto the cooldown each tick
|
||||
sleep(1)
|
||||
@@ -27,6 +29,9 @@
|
||||
/obj/effect/proc_holder/spell/touch/proc/ChargeHand(mob/living/carbon/user)
|
||||
var/hand_handled = 1
|
||||
attached_hand = new hand_path(src)
|
||||
if(isalien(user))
|
||||
user.put_in_hands(attached_hand)
|
||||
return
|
||||
if(user.hand) //left active hand
|
||||
if(!user.equip_to_slot_if_possible(attached_hand, slot_l_hand, FALSE, TRUE))
|
||||
if(!user.equip_to_slot_if_possible(attached_hand, slot_r_hand, FALSE, TRUE))
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
..()
|
||||
|
||||
/obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity)
|
||||
user.say(catchphrase)
|
||||
if(catchphrase)
|
||||
user.say(catchphrase)
|
||||
playsound(get_turf(user), on_use_sound,50,1)
|
||||
attached_spell.attached_hand = null
|
||||
qdel(src)
|
||||
|
||||
@@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(meteors_ops, list(/obj/effect/meteor/goreops)) //Meaty Ops
|
||||
meteorgibs = /obj/effect/gibspawner/xeno
|
||||
|
||||
/obj/effect/meteor/meaty/xeno/Initialize(mapload, target)
|
||||
meteordrop += subtypesof(/obj/item/organ/internal/xenos)
|
||||
meteordrop += subtypesof(/obj/item/organ/internal/alien)
|
||||
return ..()
|
||||
|
||||
/obj/effect/meteor/meaty/xeno/ram_turf(turf/T)
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
|
||||
if(C.get_int_organ(/obj/item/organ/internal/alien/hivenode))
|
||||
if(world.time - C.last_bumped <= 60)
|
||||
return
|
||||
if(!C.handcuffed)
|
||||
@@ -492,7 +492,7 @@
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/structure/alien/egg/attack_hand(mob/living/user)
|
||||
if(user.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
|
||||
if(user.get_int_organ(/obj/item/organ/internal/alien/plasmavessel))
|
||||
switch(status)
|
||||
if(BURST)
|
||||
to_chat(user, "<span class='notice'>You clear the hatched egg.</span>")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore
|
||||
var/mob/living/M = buck
|
||||
|
||||
if(user.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
|
||||
if(user.get_int_organ(/obj/item/organ/internal/alien/plasmavessel))
|
||||
unbuckle_mob(M)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -49,11 +49,11 @@
|
||||
if (!ismob(M) || (get_dist(src, user) > 1) || (M.loc != loc) || user.incapacitated() || M.buckled)
|
||||
return
|
||||
|
||||
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
|
||||
if(M.get_int_organ(/obj/item/organ/internal/alien/hivenode))
|
||||
to_chat(user, "<span class='noticealien'>[M]'s linkage with the hive prevents you from securing them into [src]</span>")
|
||||
return
|
||||
|
||||
if(!user.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
|
||||
if(!user.get_int_organ(/obj/item/organ/internal/alien/hivenode))
|
||||
to_chat(user, "<span class='noticealien'>Your lack of linkage to the hive prevents you from buckling [M] into [src]</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
RETURN_TYPE(/list/obj/item/organ/internal)
|
||||
return list(
|
||||
/obj/item/organ/internal/brain/xeno,
|
||||
/obj/item/organ/internal/xenos/hivenode,
|
||||
/obj/item/organ/internal/alien/hivenode,
|
||||
/obj/item/organ/internal/ears
|
||||
)
|
||||
|
||||
@@ -220,14 +220,19 @@ Des: Removes all infected images from the alien.
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/canBeHandcuffed()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/alien/proc/updatePlasmaDisplay()
|
||||
if(hud_used) //clientless aliens
|
||||
hud_used.alien_plasma_display.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font face='Small Fonts' color='magenta'>[getPlasma()]</font></div>"
|
||||
hud_used.alien_plasma_display.maptext_x = -3
|
||||
/* Although this is on the carbon level, we only want this proc'ing for aliens that do have this hud. Only humanoid aliens do at the moment, so we have a check
|
||||
and carry the owner just to make sure*/
|
||||
/mob/living/carbon/proc/update_plasma_display(mob/owner)
|
||||
for(var/datum/action/spell_action/action in actions)
|
||||
action.UpdateButtonIcon()
|
||||
if(!hud_used || !isalien(owner)) //clientless aliens or non aliens
|
||||
return
|
||||
hud_used.alien_plasma_display.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font face='Small Fonts' color='magenta'>[get_plasma()]</font></div>"
|
||||
hud_used.alien_plasma_display.maptext_x = -3
|
||||
|
||||
/mob/living/carbon/alien/larva/updatePlasmaDisplay()
|
||||
/mob/living/carbon/alien/larva/update_plasma_display()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/can_use_vents()
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
|
||||
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
|
||||
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
|
||||
In all, this is a lot like the monkey code. /N
|
||||
In all, this is a lot like the monkey code.
|
||||
This code could certainly use with a touch of TLC, but it functions alright. Bit odd aliens attacking other aliens are like, full logged though
|
||||
*/
|
||||
/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M)
|
||||
if(isturf(loc) && istype(loc.loc, /area/start))
|
||||
to_chat(M, "No attacking people at spawn, you jackass.")
|
||||
return
|
||||
|
||||
switch(M.a_intent)
|
||||
if(INTENT_HELP)
|
||||
AdjustSleeping(-10 SECONDS)
|
||||
@@ -39,7 +39,7 @@ In all, this is a lot like the monkey code. /N
|
||||
|
||||
/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M)
|
||||
if(..()) //to allow surgery to return properly.
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
switch(M.a_intent)
|
||||
if(INTENT_HELP)
|
||||
@@ -53,8 +53,8 @@ In all, this is a lot like the monkey code. /N
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
if(INTENT_DISARM)
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
|
||||
. = ..()
|
||||
@@ -75,9 +75,9 @@ In all, this is a lot like the monkey code. /N
|
||||
adjustStaminaLoss(damage)
|
||||
|
||||
/mob/living/carbon/alien/acid_act(acidpwr, acid_volume)
|
||||
return 0 //aliens are immune to acid.
|
||||
return FALSE //aliens are immune to acid.
|
||||
|
||||
/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M)
|
||||
/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) // This is very RNG based, maybe come back to this later - GDN
|
||||
if(..()) //successful slime attack
|
||||
var/damage = rand(5, 35)
|
||||
if(M.is_adult)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/Toxins_pp = (breath.toxins / breath.total_moles()) * breath_pressure
|
||||
|
||||
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
|
||||
adjustPlasma(breath.toxins*250)
|
||||
add_plasma(breath.toxins * 250)
|
||||
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
|
||||
|
||||
toxins_used = breath.toxins
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/mob/living/carbon/alien/Login()
|
||||
..()
|
||||
AddInfectionImages()
|
||||
update_plasma_display(src)
|
||||
return
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
/*NOTES:
|
||||
These are general powers. Specific powers are stored under the appropriate alien creature type.
|
||||
*/
|
||||
|
||||
/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit.
|
||||
Doesn't work on other aliens/AI.*/
|
||||
|
||||
|
||||
/mob/living/carbon/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null.
|
||||
if(stat)
|
||||
to_chat(src, "<span class='noticealien'>You must be conscious to do this.</span>")
|
||||
return 0
|
||||
else if(X && getPlasma() < X)
|
||||
to_chat(src, "<span class='noticealien'>Not enough plasma stored.</span>")
|
||||
return 0
|
||||
else if(Y && (!isturf(src.loc) || isspaceturf(src.loc)))
|
||||
to_chat(src, "<span class='noticealien'>You can't place that here!</span>")
|
||||
return 0
|
||||
else return 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/verb/plant()
|
||||
set name = "Plant Weeds (50)"
|
||||
set desc = "Plants some alien weeds"
|
||||
set category = "Alien"
|
||||
|
||||
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
|
||||
to_chat(src, "<span class='noticealien'>There's already a weed node here.</span>")
|
||||
return
|
||||
|
||||
if(powerc(50,1))
|
||||
for(var/obj/structure/alien/resin in get_turf(src))
|
||||
to_chat(src, "<span class='danger'>There is already a resin construction here.</span>")
|
||||
return
|
||||
adjustPlasma(-50)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class='alertalien'>[src] has planted some alien weeds!</span>"), 1)
|
||||
for(var/obj/structure/alien/weeds/W in get_turf(src))
|
||||
qdel(W)
|
||||
new /obj/structure/alien/weeds/node(loc)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/verb/whisp(mob/M as mob in oview())
|
||||
set name = "Whisper (10)"
|
||||
set desc = "Whisper to someone"
|
||||
set category = "Alien"
|
||||
|
||||
if(powerc(10))
|
||||
adjustPlasma(-10)
|
||||
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
|
||||
if(msg)
|
||||
log_say("(AWHISPER to [key_name(M)]) [msg]", src)
|
||||
to_chat(M, "<span class='noticealien'>You hear a strange, alien voice in your head...<span class='noticealien'>[msg]")
|
||||
to_chat(src, "<span class='noticealien'>You said: [msg] to [M]</span>")
|
||||
for(var/mob/dead/observer/G in GLOB.player_list)
|
||||
G.show_message("<i>Alien message from <b>[src]</b> ([ghost_follow_link(src, ghost=G)]) to <b>[M]</b> ([ghost_follow_link(M, ghost=G)]): [msg]</i>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/verb/transfer_plasma(mob/living/carbon/alien/M as mob in oview())
|
||||
set name = "Transfer Plasma"
|
||||
set desc = "Transfer Plasma to another alien"
|
||||
set category = "Alien"
|
||||
|
||||
if(isalien(M))
|
||||
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
|
||||
if(amount)
|
||||
amount = abs(round(amount))
|
||||
if(powerc(amount))
|
||||
if(get_dist(src,M) <= 1)
|
||||
M.adjustPlasma(amount)
|
||||
adjustPlasma(-amount)
|
||||
to_chat(M, "<span class='noticealien'>[src] has transfered [amount] plasma to you.</span>")
|
||||
to_chat(src, {"<span class='noticealien'>You have trasferred [amount] plasma to [M]</span>"})
|
||||
else
|
||||
to_chat(src, "<span class='noticealien'>You need to be closer.</span>")
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/corrosive_acid(atom/target) //If they right click to corrode, an error will flash if its an invalid target./N
|
||||
set name = "Corrossive Acid (200)"
|
||||
set desc = "Drench an object in acid, destroying it over time."
|
||||
set category = "Alien"
|
||||
|
||||
if(powerc(200))
|
||||
if(target in oview(1))
|
||||
if(target.acid_act(200, 100))
|
||||
visible_message("<span class='alertalien'>[src] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!</span>")
|
||||
adjustPlasma(-200)
|
||||
else
|
||||
to_chat(src, "<span class='noticealien'>You cannot dissolve this object.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='noticealien'>[target] is too far away.</span>")
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/neurotoxin() // ok
|
||||
set name = "Spit Neurotoxin (50)"
|
||||
set desc = "Spits neurotoxin at someone, paralyzing them for a short time."
|
||||
set category = "Alien"
|
||||
var/obj/item/organ/internal/xenos/neurotoxin/organ = locate() in internal_organs
|
||||
|
||||
if(powerc(50) && !organ.neurotoxin_cooldown)
|
||||
adjustPlasma(-50)
|
||||
visible_message("<span class='danger'>[src] spits neurotoxin!</span>", "<span class='alertalien'>You spit neurotoxin.</span>")
|
||||
organ.neurotoxin_cooldown = TRUE
|
||||
addtimer(VARSET_CALLBACK(organ, neurotoxin_cooldown, FALSE), organ.neurotoxin_cooldown_time)
|
||||
|
||||
var/turf/T = loc
|
||||
var/turf/U = get_step(src, dir) // Get the tile infront of the move, based on their direction
|
||||
if(!isturf(U) || !isturf(T))
|
||||
return
|
||||
|
||||
var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(usr.loc)
|
||||
A.current = U
|
||||
A.firer = src
|
||||
A.firer_source_atom = src
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
A.fire()
|
||||
A.newtonian_move(get_dir(U, T))
|
||||
newtonian_move(get_dir(U, T))
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/resin() // -- TLE
|
||||
set name = "Secrete Resin"
|
||||
set desc = "Secrete tough malleable resin."
|
||||
set category = "Alien"
|
||||
|
||||
var/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/choice = show_radial_menu(src, src, resin_buildings, src, radius = 40)
|
||||
if(powerc(55, TRUE))
|
||||
var/built = FALSE
|
||||
if(locate(/obj/structure/alien/resin) in get_turf(src))
|
||||
to_chat(src, "<span class='danger'>There is already a resin construction here.</span>")
|
||||
return
|
||||
adjustPlasma(-55)
|
||||
|
||||
switch(choice)
|
||||
if("Resin Wall (55)")
|
||||
new /obj/structure/alien/resin/wall(loc)
|
||||
built = TRUE
|
||||
if("Resin Nest (55)")
|
||||
new /obj/structure/bed/nest(loc)
|
||||
built = TRUE
|
||||
if("Resin Door (80)")
|
||||
if(powerc(25, TRUE))
|
||||
var/obj/structure/alien/resin/door/door = new(loc)
|
||||
door.dir = dir
|
||||
adjustPlasma(-25)
|
||||
built = TRUE
|
||||
else
|
||||
to_chat(src, "<span class='noticealien'>Not enough plasma stored.</span>")
|
||||
adjustPlasma(55)
|
||||
if(built)
|
||||
visible_message("<span class='alertalien'>[src] vomits up a thick purple substance and shapes it!</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/verb/regurgitate()
|
||||
set name = "Regurgitate"
|
||||
set desc = "Empties the contents of your stomach"
|
||||
set category = "Alien"
|
||||
|
||||
if(powerc())
|
||||
if(LAZYLEN(stomach_contents))
|
||||
for(var/mob/M in src)
|
||||
LAZYREMOVE(stomach_contents, M)
|
||||
M.forceMove(drop_location())
|
||||
visible_message("<span class='alertalien'><B>[src] hurls out the contents of [p_their()] stomach!</span>")
|
||||
|
||||
/mob/living/carbon/proc/getPlasma()
|
||||
var/obj/item/organ/internal/xenos/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)
|
||||
if(!vessel) return 0
|
||||
return vessel.stored_plasma
|
||||
|
||||
|
||||
/mob/living/carbon/proc/adjustPlasma(amount)
|
||||
var/obj/item/organ/internal/xenos/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)
|
||||
if(!vessel) return
|
||||
vessel.stored_plasma = max(vessel.stored_plasma + amount,0)
|
||||
vessel.stored_plasma = min(vessel.stored_plasma, vessel.max_plasma) //upper limit of max_plasma, lower limit of 0
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/adjustPlasma(amount)
|
||||
. = ..()
|
||||
updatePlasmaDisplay()
|
||||
|
||||
/mob/living/carbon/proc/usePlasma(amount)
|
||||
if(getPlasma() >= amount)
|
||||
adjustPlasma(-amount)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
@@ -10,42 +10,17 @@
|
||||
if(src.name == "alien drone")
|
||||
src.name = "alien drone ([rand(1, 1000)])"
|
||||
src.real_name = src.name
|
||||
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_queen)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/drone/get_caste_organs()
|
||||
. = ..()
|
||||
. += list(
|
||||
/obj/item/organ/internal/xenos/plasmavessel/drone,
|
||||
/obj/item/organ/internal/xenos/acidgland,
|
||||
/obj/item/organ/internal/xenos/resinspinner,
|
||||
/obj/item/organ/internal/alien/plasmavessel/drone,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
)
|
||||
|
||||
|
||||
//Drones use the same base as generic humanoids.
|
||||
//Drone verbs
|
||||
|
||||
/mob/living/carbon/alien/humanoid/drone/verb/evolve() // -- TLE
|
||||
set name = "Evolve (500)"
|
||||
set desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
|
||||
set category = "Alien"
|
||||
|
||||
if(powerc(500))
|
||||
// Queen check
|
||||
var/no_queen = TRUE
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/Q in GLOB.alive_mob_list)
|
||||
if(!Q.key && Q.get_int_organ(/obj/item/organ/internal/brain/))
|
||||
continue
|
||||
no_queen = FALSE
|
||||
|
||||
if(no_queen)
|
||||
adjustPlasma(-500)
|
||||
to_chat(src, "<span class='noticealien'>You begin to evolve!</span>")
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class='alertalien'>[src] begins to twist and contort!</span>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(loc)
|
||||
mind.transfer_to(new_xeno)
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
SSblackbox.record_feedback("tally", "alien_growth", 1, "queen")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(src, "<span class='notice'>We already have an alive queen.</span>")
|
||||
return
|
||||
|
||||
@@ -14,14 +14,14 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/get_caste_organs()
|
||||
. = ..()
|
||||
. += /obj/item/organ/internal/xenos/plasmavessel/hunter
|
||||
. += /obj/item/organ/internal/alien/plasmavessel/hunter
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/handle_environment()
|
||||
if(m_intent == MOVE_INTENT_RUN || IS_HORIZONTAL(src))
|
||||
..()
|
||||
else
|
||||
adjustPlasma(-heal_rate)
|
||||
add_plasma(-heal_rate)
|
||||
|
||||
|
||||
//Hunter verbs
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
/mob/living/carbon/alien/humanoid/sentinel/get_caste_organs()
|
||||
. = ..()
|
||||
. += list(
|
||||
/obj/item/organ/internal/xenos/plasmavessel,
|
||||
/obj/item/organ/internal/xenos/acidgland,
|
||||
/obj/item/organ/internal/xenos/neurotoxin,
|
||||
/obj/item/organ/internal/alien/plasmavessel,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
)
|
||||
|
||||
@@ -51,25 +51,9 @@
|
||||
/mob/living/carbon/alien/humanoid/empress/get_caste_organs()
|
||||
. = ..()
|
||||
. += list(
|
||||
/obj/item/organ/internal/xenos/plasmavessel/queen,
|
||||
/obj/item/organ/internal/xenos/acidgland,
|
||||
/obj/item/organ/internal/xenos/eggsac,
|
||||
/obj/item/organ/internal/xenos/resinspinner,
|
||||
/obj/item/organ/internal/xenos/neurotoxin,
|
||||
/obj/item/organ/internal/alien/plasmavessel/queen,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/eggsac,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/empress/verb/lay_egg()
|
||||
set name = "Lay Egg (250)"
|
||||
set desc = "Lay an egg to produce huggers to impregnate prey with."
|
||||
set category = "Alien"
|
||||
|
||||
if(locate(/obj/structure/alien/egg) in get_turf(src))
|
||||
to_chat(src, "<span class='noticealien'>There's already an egg here.</span>")
|
||||
return
|
||||
|
||||
if(powerc(250,1))//Can't plant eggs on spess tiles. That's silly.
|
||||
adjustPlasma(-250)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class=notice'><B>[src] has laid an egg!</B></span>"), 1)
|
||||
new /obj/structure/alien/egg(loc)
|
||||
return
|
||||
|
||||
@@ -19,13 +19,14 @@
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/New()
|
||||
/mob/living/carbon/alien/humanoid/Initialize(mapload)
|
||||
if(name == "alien")
|
||||
name = text("alien ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
add_language("Xenomorph")
|
||||
add_language("Hivemind")
|
||||
..()
|
||||
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/regurgitate)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Process_Spacemove(check_drift = 0)
|
||||
|
||||
@@ -56,6 +56,6 @@
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>")
|
||||
|
||||
/mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!no_effect && !visual_effect_icon)
|
||||
if(!no_effect && !visual_effect_icon && !get_active_hand())
|
||||
visual_effect_icon = ATTACK_EFFECT_CLAW
|
||||
..()
|
||||
|
||||
@@ -12,6 +12,15 @@
|
||||
l_store = null
|
||||
update_inv_pockets()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/put_in_hands(obj/item/I)
|
||||
if(!I)
|
||||
return FALSE
|
||||
if(put_in_active_hand(I))
|
||||
return TRUE
|
||||
if(put_in_inactive_hand(I))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_ui(slot_id)
|
||||
var/obj/item/W = get_active_hand()
|
||||
if(W)
|
||||
|
||||
@@ -34,35 +34,17 @@
|
||||
/mob/living/carbon/alien/humanoid/queen/get_caste_organs()
|
||||
. = ..()
|
||||
. += list(
|
||||
/obj/item/organ/internal/xenos/plasmavessel/queen,
|
||||
/obj/item/organ/internal/xenos/acidgland,
|
||||
/obj/item/organ/internal/xenos/eggsac,
|
||||
/obj/item/organ/internal/xenos/resinspinner,
|
||||
/obj/item/organ/internal/xenos/neurotoxin,
|
||||
/obj/item/organ/internal/alien/plasmavessel/queen,
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/eggsac,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
)
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/can_inject(mob/user, error_msg, target_zone, penetrate_thick)
|
||||
return FALSE
|
||||
|
||||
//Queen verbs
|
||||
/mob/living/carbon/alien/humanoid/queen/verb/lay_egg()
|
||||
|
||||
set name = "Lay Egg (75)"
|
||||
set desc = "Lay an egg to produce huggers to impregnate prey with."
|
||||
set category = "Alien"
|
||||
if(locate(/obj/structure/alien/egg) in get_turf(src))
|
||||
to_chat(src, "<span class='noticealien'>There's already an egg here.</span>")
|
||||
return
|
||||
|
||||
if(powerc(75,1))//Can't plant eggs on spess tiles. That's silly.
|
||||
adjustPlasma(-75)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class='alertalien'>[src] has laid an egg!</span>"), 1)
|
||||
new /obj/structure/alien/egg(loc)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/large
|
||||
icon = 'icons/mob/alienlarge.dmi'
|
||||
icon_state = "queen_s"
|
||||
|
||||
@@ -24,18 +24,18 @@
|
||||
regenerate_icons()
|
||||
add_language("Xenomorph")
|
||||
add_language("Hivemind")
|
||||
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_larva)
|
||||
|
||||
/mob/living/carbon/alien/larva/get_caste_organs()
|
||||
. = ..()
|
||||
. += /obj/item/organ/internal/xenos/plasmavessel/larva
|
||||
. += /obj/item/organ/internal/alien/plasmavessel/larva
|
||||
|
||||
|
||||
//This needs to be fixed
|
||||
/mob/living/carbon/alien/larva/Stat()
|
||||
..()
|
||||
stat(null, "Progress: [amount_grown]/[max_grown]")
|
||||
|
||||
/mob/living/carbon/alien/larva/adjustPlasma(amount)
|
||||
/mob/living/carbon/alien/larva/add_plasma(amount)
|
||||
if(stat != DEAD && amount > 0)
|
||||
amount_grown = min(amount_grown + 1, max_grown)
|
||||
..(amount)
|
||||
@@ -43,30 +43,24 @@
|
||||
/mob/living/carbon/alien/larva/ex_act(severity)
|
||||
..()
|
||||
|
||||
var/b_loss = null
|
||||
var/f_loss = null
|
||||
var/brute_loss = null
|
||||
var/fire_loss = null
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
gib()
|
||||
return
|
||||
|
||||
if(2.0)
|
||||
|
||||
b_loss += 60
|
||||
|
||||
f_loss += 60
|
||||
|
||||
brute_loss += 60
|
||||
fire_loss += 60
|
||||
AdjustEarDamage(30, 120)
|
||||
|
||||
if(3.0)
|
||||
b_loss += 30
|
||||
brute_loss += 30
|
||||
if(prob(50))
|
||||
Paralyse(2 SECONDS)
|
||||
AdjustEarDamage(15, 60)
|
||||
|
||||
adjustBruteLoss(b_loss)
|
||||
adjustFireLoss(f_loss)
|
||||
|
||||
adjustBruteLoss(brute_loss)
|
||||
adjustFireLoss(fire_loss)
|
||||
updatehealth()
|
||||
|
||||
//can't equip anything
|
||||
@@ -74,7 +68,7 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/restrained()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/alien/larva/var/temperature_resistance = T0C+75
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/mob/living/carbon/alien/larva/verb/hide()
|
||||
set name = "Hide"
|
||||
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
|
||||
@@ -14,42 +13,3 @@
|
||||
layer = MOB_LAYER
|
||||
visible_message("[src] slowly peeks up from the ground...", "<span class=notice'>You have stopped hiding.</span>")
|
||||
|
||||
/mob/living/carbon/alien/larva/verb/evolve()
|
||||
set name = "Evolve"
|
||||
set desc = "Evolve into a fully grown Alien."
|
||||
set category = "Alien"
|
||||
|
||||
if(stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
if(handcuffed || legcuffed)
|
||||
to_chat(src, "<span class='warning'>You cannot evolve when you are cuffed.</span>")
|
||||
|
||||
if(amount_grown >= max_grown) //TODO ~Carn
|
||||
//green is impossible to read, so i made these blue and changed the formatting slightly
|
||||
to_chat(src, "<span class='boldnotice'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
|
||||
to_chat(src, "<span class='notice'>There are three to choose from:</span>")
|
||||
to_chat(src, "<B>Hunters</B> <span class='notice'>are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.</span>")
|
||||
to_chat(src, "<B>Sentinels</B> <span class='notice'>are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.</span>")
|
||||
to_chat(src, "<B>Drones</B> <span class='notice'>are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.</span>")
|
||||
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
|
||||
|
||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||
switch(alien_caste)
|
||||
if("Hunter")
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc)
|
||||
if("Sentinel")
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc)
|
||||
if("Drone")
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc)
|
||||
if(mind)
|
||||
mind.transfer_to(new_xeno)
|
||||
else
|
||||
new_xeno.key = key
|
||||
SSblackbox.record_feedback("tally", "alien_growth", 1, "[lowertext(alien_caste)]")
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You are not fully grown.</span>")
|
||||
return
|
||||
|
||||
@@ -1051,7 +1051,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
/mob/living/carbon/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
var/obj/item/organ/internal/xenos/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)
|
||||
var/obj/item/organ/internal/alien/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/alien/plasmavessel)
|
||||
if(vessel)
|
||||
stat(null, "Plasma Stored: [vessel.stored_plasma]/[vessel.max_plasma]")
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
if(R.id == "plasma" || R.id == "plasma_dust")
|
||||
H.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
H.adjustPlasma(20)
|
||||
H.add_plasma(20)
|
||||
H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
|
||||
return FALSE //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen.
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
holder.remove_reagent("epinephrine", 2)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjustPlasma(10)
|
||||
C.add_plasma(10)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/plasma/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume)//Splashing people with plasma is stronger than fuel!
|
||||
@@ -457,7 +457,7 @@
|
||||
update_flags |= M.adjustToxLoss(3, FALSE)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjustPlasma(20)
|
||||
C.add_plasma(20)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)//Splashing people with plasma dust is stronger than fuel!
|
||||
|
||||
@@ -1,49 +1,48 @@
|
||||
/obj/item/organ/internal/xenos
|
||||
/obj/item/organ/internal/alien
|
||||
origin_tech = "biotech=5"
|
||||
icon_state = "xgibmid2"
|
||||
var/list/alien_powers = list()
|
||||
tough = TRUE
|
||||
sterile = TRUE
|
||||
|
||||
///can be changed if xenos get an update..
|
||||
/obj/item/organ/internal/xenos/insert(mob/living/carbon/M, special = 0)
|
||||
/// This adds and removes alien spells upon addition, if a noncarbon tries to do this well... I blame adminbus
|
||||
/obj/item/organ/internal/alien/insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
for(var/P in alien_powers)
|
||||
M.verbs |= P
|
||||
for(var/powers_to_add in alien_powers)
|
||||
M.AddSpell(new powers_to_add)
|
||||
|
||||
/obj/item/organ/internal/xenos/remove(mob/living/carbon/M, special = 0)
|
||||
for(var/P in alien_powers)
|
||||
M.verbs -= P
|
||||
/obj/item/organ/internal/alien/remove(mob/living/carbon/M, special = 0)
|
||||
for(var/powers_to_remove in alien_powers)
|
||||
M.RemoveSpell(new powers_to_remove)
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/xenos/prepare_eat()
|
||||
/obj/item/organ/internal/alien/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.reagents.add_reagent("sacid", 10)
|
||||
return S
|
||||
|
||||
//XENOMORPH ORGANS
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel
|
||||
/obj/item/organ/internal/alien/plasmavessel
|
||||
name = "xeno plasma vessel"
|
||||
icon_state = "plasma"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
origin_tech = "biotech=5;plasmatech=4"
|
||||
parent_organ = "chest"
|
||||
slot = "plasmavessel"
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/plant, /mob/living/carbon/alien/humanoid/verb/transfer_plasma)
|
||||
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds, /obj/effect/proc_holder/spell/touch/alien_spell/transfer_plasma)
|
||||
|
||||
var/stored_plasma = 0
|
||||
var/max_plasma = 500
|
||||
var/heal_rate = 5
|
||||
var/plasma_rate = 10
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/prepare_eat()
|
||||
/obj/item/organ/internal/alien/plasmavessel/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.reagents.add_reagent("plasma", stored_plasma/10)
|
||||
return S
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/queen
|
||||
/obj/item/organ/internal/alien/plasmavessel/queen
|
||||
name = "bloated xeno plasma vessel"
|
||||
icon_state = "plasma_large"
|
||||
origin_tech = "biotech=6;plasmatech=4"
|
||||
@@ -51,112 +50,107 @@
|
||||
max_plasma = 500
|
||||
plasma_rate = 25
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/drone
|
||||
/obj/item/organ/internal/alien/plasmavessel/drone
|
||||
name = "large xeno plasma vessel"
|
||||
icon_state = "plasma_large"
|
||||
stored_plasma = 200
|
||||
max_plasma = 500
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/sentinel
|
||||
/obj/item/organ/internal/alien/plasmavessel/sentinel
|
||||
stored_plasma = 100
|
||||
max_plasma = 250
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/hunter
|
||||
/obj/item/organ/internal/alien/plasmavessel/hunter
|
||||
name = "small xeno plasma vessel"
|
||||
icon_state = "plasma_tiny"
|
||||
stored_plasma = 100
|
||||
max_plasma = 150
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/plant)
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds)
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/larva
|
||||
/obj/item/organ/internal/alien/plasmavessel/larva
|
||||
name = "tiny xeno plasma vessel"
|
||||
icon_state = "plasma_tiny"
|
||||
max_plasma = 100
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds)
|
||||
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/on_life()
|
||||
/obj/item/organ/internal/alien/plasmavessel/on_life()
|
||||
//If there are alien weeds on the ground then heal if needed or give some plasma
|
||||
if(locate(/obj/structure/alien/weeds) in owner.loc)
|
||||
if(owner.health >= owner.maxHealth)
|
||||
owner.adjustPlasma(plasma_rate)
|
||||
owner.add_plasma(plasma_rate)
|
||||
else
|
||||
var/heal_amt = heal_rate
|
||||
if(!isalien(owner))
|
||||
heal_amt *= 0.2
|
||||
owner.adjustPlasma(plasma_rate*0.5)
|
||||
owner.add_plasma((plasma_rate*0.5))
|
||||
owner.adjustBruteLoss(-heal_amt)
|
||||
owner.adjustFireLoss(-heal_amt)
|
||||
owner.adjustOxyLoss(-heal_amt)
|
||||
owner.adjustCloneLoss(-heal_amt)
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/insert(mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/alien/plasmavessel/insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
if(isalien(M))
|
||||
var/mob/living/carbon/alien/A = M
|
||||
A.updatePlasmaDisplay()
|
||||
M.update_plasma_display(M)
|
||||
|
||||
/obj/item/organ/internal/alien/plasmavessel/remove(mob/living/carbon/M, special = 0)
|
||||
. =..()
|
||||
if(isalien(M))
|
||||
var/mob/living/carbon/alien/A = M
|
||||
A.updatePlasmaDisplay()
|
||||
M.update_plasma_display(M)
|
||||
|
||||
|
||||
/obj/item/organ/internal/xenos/acidgland
|
||||
/obj/item/organ/internal/alien/acidgland
|
||||
name = "xeno acid gland"
|
||||
icon_state = "acid"
|
||||
parent_organ = "head"
|
||||
slot = "acid"
|
||||
origin_tech = "biotech=5;materials=2;combat=2"
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/proc/corrosive_acid)
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/corrosive_acid)
|
||||
|
||||
|
||||
/obj/item/organ/internal/xenos/hivenode
|
||||
/obj/item/organ/internal/alien/hivenode
|
||||
name = "xeno hive node"
|
||||
icon_state = "hivenode"
|
||||
parent_organ = "head"
|
||||
slot = "hivenode"
|
||||
origin_tech = "biotech=5;magnets=4;bluespace=3"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/whisp)
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/whisper)
|
||||
|
||||
/obj/item/organ/internal/xenos/hivenode/insert(mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/alien/hivenode/insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
M.faction |= "alien"
|
||||
M.add_language("Hivemind")
|
||||
M.add_language("Xenomorph")
|
||||
ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune")
|
||||
|
||||
/obj/item/organ/internal/xenos/hivenode/remove(mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/alien/hivenode/remove(mob/living/carbon/M, special = 0)
|
||||
M.faction -= "alien"
|
||||
M.remove_language("Hivemind")
|
||||
M.remove_language("Xenomorph")
|
||||
REMOVE_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune")
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/xenos/neurotoxin
|
||||
/obj/item/organ/internal/alien/neurotoxin
|
||||
name = "xeno neurotoxin gland"
|
||||
icon_state = "neurotox"
|
||||
parent_organ = "head"
|
||||
slot = "neurotox"
|
||||
origin_tech = "biotech=5;combat=5"
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/proc/neurotoxin)
|
||||
var/neurotoxin_cooldown = FALSE
|
||||
var/neurotoxin_cooldown_time = 5 SECONDS
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/neurotoxin)
|
||||
|
||||
/obj/item/organ/internal/xenos/resinspinner
|
||||
/obj/item/organ/internal/alien/resinspinner
|
||||
name = "xeno resin organ"//...there tiger....
|
||||
parent_organ = "mouth"
|
||||
icon_state = "liver-x"
|
||||
slot = "spinner"
|
||||
origin_tech = "biotech=5;materials=4"
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/proc/resin)
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/build_resin)
|
||||
|
||||
/obj/item/organ/internal/xenos/eggsac
|
||||
/obj/item/organ/internal/alien/eggsac
|
||||
name = "xeno egg sac"
|
||||
icon_state = "eggsac"
|
||||
parent_organ = "groin"
|
||||
slot = "eggsac"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
origin_tech = "biotech=6"
|
||||
alien_powers = list(/mob/living/carbon/alien/humanoid/queen/verb/lay_egg)
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds/eggs)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 137 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 156 KiB |
+13
-1
@@ -465,6 +465,7 @@
|
||||
#include "code\datums\ruins\space_ruins.dm"
|
||||
#include "code\datums\spell_cooldown\spell_charges.dm"
|
||||
#include "code\datums\spell_cooldown\spell_cooldown.dm"
|
||||
#include "code\datums\spell_handler\alien_spell_handler.dm"
|
||||
#include "code\datums\spell_handler\morph.dm"
|
||||
#include "code\datums\spell_handler\spell_handler.dm"
|
||||
#include "code\datums\spell_handler\vampire.dm"
|
||||
@@ -517,6 +518,18 @@
|
||||
#include "code\datums\spells\trigger.dm"
|
||||
#include "code\datums\spells\turf_teleport.dm"
|
||||
#include "code\datums\spells\wizard.dm"
|
||||
#include "code\datums\spells\alien_spells\basetype_alien_spell.dm"
|
||||
#include "code\datums\spells\alien_spells\basetype_alien_touch.dm"
|
||||
#include "code\datums\spells\alien_spells\build_resin_structure.dm"
|
||||
#include "code\datums\spells\alien_spells\corrosive_acid_spit.dm"
|
||||
#include "code\datums\spells\alien_spells\larva_evolve.dm"
|
||||
#include "code\datums\spells\alien_spells\lay_alien_eggs.dm"
|
||||
#include "code\datums\spells\alien_spells\neurotoxin_spit.dm"
|
||||
#include "code\datums\spells\alien_spells\plasma_weeds.dm"
|
||||
#include "code\datums\spells\alien_spells\queen_evolve.dm"
|
||||
#include "code\datums\spells\alien_spells\regurgitate.dm"
|
||||
#include "code\datums\spells\alien_spells\transfer_plasma.dm"
|
||||
#include "code\datums\spells\alien_spells\whisper.dm"
|
||||
#include "code\datums\status_effects\blob_burst.dm"
|
||||
#include "code\datums\status_effects\buffs.dm"
|
||||
#include "code\datums\status_effects\debuffs.dm"
|
||||
@@ -1940,7 +1953,6 @@
|
||||
#include "code\modules\mob\living\carbon\alien\alien_life.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\alien_login.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\alien_logout.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\humanoid\empress.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm"
|
||||
|
||||
Reference in New Issue
Block a user