[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:
GDN
2023-02-12 21:34:11 +01:00
committed by GitHub
co-authored by Henri215
parent 98d7440f75
commit aa56d75f93
41 changed files with 548 additions and 403 deletions
-1
View File
@@ -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>")
+8 -3
View File
@@ -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))
+2 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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!
+37 -43
View File
@@ -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
View File
@@ -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"