mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 02:24:11 +01:00
Reworks xenomorphs (#23054)
* reworks xenomorphs * part 2 electric boogaloo * more tweaks * more tweaks * lints * Update code/modules/mob/living/carbon/alien/alien_death.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/modules/surgery/organs/subtypes/xenos.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/datums/spells/alien_spells/transfer_plasma.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * reviews * sprite fix * high priority fix * reverts most alien nerfs --------- Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
This commit is contained in:
@@ -5,18 +5,16 @@
|
||||
bubble_icon = "alien"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
gender = NEUTER
|
||||
dna = null
|
||||
|
||||
var/nightvision = TRUE
|
||||
see_in_dark = 4
|
||||
|
||||
var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie
|
||||
var/has_fine_manipulation = FALSE
|
||||
var/move_delay_add = FALSE // movement delay to add
|
||||
var/move_delay_add = 0 // movement delay to add
|
||||
|
||||
status_flags = CANPARALYSE|CANPUSH
|
||||
var/heal_rate = 5
|
||||
var/large = FALSE
|
||||
var/loudspeaker = FALSE
|
||||
var/heat_protection = 0.5
|
||||
var/leaping = FALSE
|
||||
@@ -27,8 +25,6 @@
|
||||
/mob/living/carbon/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
create_reagents(1000)
|
||||
verbs += /mob/living/verb/mob_sleep
|
||||
verbs += /mob/living/verb/rest
|
||||
|
||||
for(var/organ_path in get_caste_organs())
|
||||
var/obj/item/organ/internal/organ = new organ_path()
|
||||
@@ -50,17 +46,17 @@
|
||||
return GLOB.all_languages["Xenomorph"]
|
||||
|
||||
/mob/living/carbon/alien/say_quote(message, datum/language/speaking = null)
|
||||
var/verb = "hisses"
|
||||
var/speech_verb = "hisses"
|
||||
var/ending = copytext(message, length(message))
|
||||
|
||||
if(speaking && (speaking.name != "Galactic Common")) //this is so adminbooze xenos speaking common have their custom verbs,
|
||||
verb = speaking.get_spoken_verb(ending) //and use normal verbs for their own languages and non-common languages
|
||||
speech_verb = speaking.get_spoken_verb(ending) //and use normal verbs for their own languages and non-common languages
|
||||
else
|
||||
if(ending=="!")
|
||||
verb = "roars"
|
||||
else if(ending=="?")
|
||||
verb = "hisses curiously"
|
||||
return verb
|
||||
if(ending == "!")
|
||||
speech_verb = "roars"
|
||||
else if(ending== "?")
|
||||
speech_verb = "hisses curiously"
|
||||
return speech_verb
|
||||
|
||||
|
||||
/mob/living/carbon/alien/adjustToxLoss(amount)
|
||||
@@ -68,7 +64,7 @@
|
||||
|
||||
/mob/living/carbon/alien/adjustFireLoss(amount) // Weak to Fire
|
||||
if(amount > 0)
|
||||
return ..(amount * 2)
|
||||
return ..(amount * 1.5)
|
||||
else
|
||||
return ..(amount)
|
||||
|
||||
@@ -77,17 +73,11 @@
|
||||
return 2
|
||||
|
||||
/mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment)
|
||||
|
||||
if(!environment)
|
||||
return
|
||||
|
||||
var/loc_temp = get_temperature(environment)
|
||||
|
||||
// to_chat(world, "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Fire protection: [heat_protection] - Location: [loc] - src: [src]")
|
||||
|
||||
// Aliens are now weak to fire.
|
||||
|
||||
//After then, it reacts to the surrounding atmosphere based on your thermal protection
|
||||
if(!on_fire) // If you're on fire, ignore local air temperature
|
||||
if(loc_temp > bodytemperature)
|
||||
//Place is hotter than we are
|
||||
@@ -121,8 +111,8 @@
|
||||
/mob/living/carbon/alien/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
stat(null, "Intent: [a_intent]")
|
||||
stat(null, "Move Mode: [m_intent]")
|
||||
stat("Intent: [a_intent]")
|
||||
stat("Move Mode: [m_intent]")
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
/mob/living/carbon/alien/SetStunned(amount, updating = TRUE, force = 0)
|
||||
@@ -141,24 +131,6 @@
|
||||
/mob/living/carbon/alien/setDNA()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/verb/nightvisiontoggle()
|
||||
set name = "Toggle Night Vision"
|
||||
set category = "Alien"
|
||||
|
||||
if(!nightvision)
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
nightvision = TRUE
|
||||
usr.hud_used.nightvisionicon.icon_state = "nightvision1"
|
||||
else if(nightvision)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
lighting_alpha = initial(lighting_alpha)
|
||||
nightvision = FALSE
|
||||
usr.hud_used.nightvisionicon.icon_state = "nightvision0"
|
||||
|
||||
update_sight()
|
||||
|
||||
|
||||
/mob/living/carbon/alien/assess_threat(mob/living/simple_animal/bot/secbot/judgebot, lasercolor)
|
||||
if(judgebot.emagged)
|
||||
return 10 //Everyone is a criminal!
|
||||
@@ -209,34 +181,31 @@
|
||||
/mob/living/carbon/alien/proc/deathrattle_message()
|
||||
return "<i><span class='alien'>The hivemind echoes: [name] has been slain!</span></i>"
|
||||
|
||||
/mob/living/carbon/alien/CanContractDisease(datum/disease/D)
|
||||
return FALSE
|
||||
|
||||
/*----------------------------------------
|
||||
Proc: AddInfectionImages()
|
||||
Des: Gives the client of the alien an image on each infected mob.
|
||||
----------------------------------------*/
|
||||
/mob/living/carbon/alien/proc/AddInfectionImages()
|
||||
if(client)
|
||||
for(var/mob/living/C in GLOB.mob_list)
|
||||
if(HAS_TRAIT(C, TRAIT_XENO_HOST))
|
||||
var/obj/item/organ/internal/body_egg/alien_embryo/A = C.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
|
||||
if(A)
|
||||
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
|
||||
client.images += I
|
||||
return
|
||||
|
||||
if(!client)
|
||||
return
|
||||
for(var/mob/living/C in GLOB.mob_list)
|
||||
if(HAS_TRAIT(C, TRAIT_XENO_HOST))
|
||||
var/obj/item/organ/internal/body_egg/alien_embryo/A = C.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
|
||||
if(!A)
|
||||
continue
|
||||
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
|
||||
client.images += I
|
||||
|
||||
/*----------------------------------------
|
||||
Proc: RemoveInfectionImages()
|
||||
Des: Removes all infected images from the alien.
|
||||
----------------------------------------*/
|
||||
/mob/living/carbon/alien/proc/RemoveInfectionImages()
|
||||
if(client)
|
||||
for(var/image/I in client.images)
|
||||
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||
qdel(I)
|
||||
return
|
||||
if(!client)
|
||||
return
|
||||
for(var/image/I in client.images)
|
||||
if(dd_hasprefix_case(I.icon_state, "infected"))
|
||||
qdel(I)
|
||||
|
||||
/mob/living/carbon/alien/canBeHandcuffed()
|
||||
return TRUE
|
||||
@@ -309,3 +278,8 @@ and carry the owner just to make sure*/
|
||||
medicine.reagents.reaction(src, reagent_application, fraction)
|
||||
medicine.reagents.trans_to(src, how_many_reagents)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/alien/update_stat(reason)
|
||||
if(health <= HEALTH_THRESHOLD_CRIT && stat == CONSCIOUS)
|
||||
KnockOut()
|
||||
return ..()
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = src
|
||||
|
||||
playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
|
||||
playsound(loc, 'sound/goonstation/effects/gib.ogg', 50, TRUE)
|
||||
|
||||
for(var/mob/M in stomach_contents) //Release eaten mobs when Beno is gibbed
|
||||
LAZYREMOVE(stomach_contents, M)
|
||||
@@ -21,6 +21,13 @@
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.KnockDown(5 SECONDS)
|
||||
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
if(isturf(loc))
|
||||
var/atom/movable/thing = I.remove(src)
|
||||
if(thing)
|
||||
thing.forceMove(get_turf(src))
|
||||
thing.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), rand(1, 3), 5)
|
||||
|
||||
flick("gibbed-a", animation)
|
||||
xgibs(loc)
|
||||
GLOB.dead_mob_list -= src
|
||||
|
||||
@@ -10,9 +10,6 @@ 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)
|
||||
@@ -82,9 +79,9 @@ This code could certainly use with a touch of TLC, but it functions alright. Bit
|
||||
|
||||
/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)
|
||||
var/damage = 10
|
||||
if(M.is_adult)
|
||||
damage = rand(10, 40)
|
||||
damage = 15
|
||||
adjustBruteLoss(damage)
|
||||
add_attack_logs(M, src, "Slime'd for [damage] damage")
|
||||
updatehealth("slime attack")
|
||||
|
||||
@@ -2,4 +2,3 @@
|
||||
..()
|
||||
AddInfectionImages()
|
||||
update_plasma_display(src)
|
||||
return
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
/mob/living/carbon/alien/humanoid/drone
|
||||
name = "alien drone"
|
||||
caste = "d"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
icon_state = "aliend_s"
|
||||
|
||||
/mob/living/carbon/alien/humanoid/drone/Initialize(mapload)
|
||||
. = ..()
|
||||
if(src.name == "alien drone")
|
||||
src.name = "alien drone ([rand(1, 1000)])"
|
||||
src.real_name = src.name
|
||||
name = "alien drone ([rand(1, 1000)])"
|
||||
real_name = name
|
||||
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_queen)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/drone/get_caste_organs()
|
||||
@@ -19,8 +18,3 @@
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
)
|
||||
|
||||
|
||||
//Drones use the same base as generic humanoids.
|
||||
//Drone verbs
|
||||
|
||||
|
||||
@@ -1,38 +1,35 @@
|
||||
/mob/living/carbon/alien/humanoid/hunter
|
||||
name = "alien hunter"
|
||||
caste = "h"
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
icon_state = "alienh_s"
|
||||
alien_movement_delay = -1 //hunters are faster than normal xenomorphs, and people
|
||||
alien_movement_delay = -0.5 //hunters are faster than normal xenomorphs, and people
|
||||
var/leap_on_click = FALSE
|
||||
/// Are we on leap cooldown?
|
||||
var/on_leap_cooldown = FALSE
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/Initialize(mapload)
|
||||
. = ..()
|
||||
if(name == "alien hunter")
|
||||
name = "alien hunter ([rand(1, 1000)])"
|
||||
name = "alien hunter ([rand(1, 1000)])"
|
||||
real_name = name
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/get_caste_organs()
|
||||
. = ..()
|
||||
. += /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
|
||||
add_plasma(-heal_rate)
|
||||
|
||||
|
||||
//Hunter verbs
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1)
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = TRUE)
|
||||
leap_on_click = !leap_on_click
|
||||
leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]"
|
||||
update_icons()
|
||||
if(message)
|
||||
to_chat(src, "<span class='noticealien'>You will now [leap_on_click ? "leap at":"slash at"] enemies!</span>")
|
||||
else
|
||||
return
|
||||
to_chat(src, "<span class='noticealien'>You will now [leap_on_click ? "leap at" : "slash at"] enemies!</span>")
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/ClickOn(atom/A, params)
|
||||
face_atom(A)
|
||||
@@ -44,64 +41,71 @@
|
||||
#define MAX_ALIEN_LEAP_DIST 7
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)
|
||||
if(pounce_cooldown > world.time)
|
||||
to_chat(src, "<span class='alertalien'>You are too fatigued to pounce right now!</span>")
|
||||
if(leaping || on_leap_cooldown)
|
||||
return
|
||||
|
||||
if(leaping) //Leap while you leap, so you can leap while you leap
|
||||
return
|
||||
|
||||
if(!has_gravity(src) || !has_gravity(A))
|
||||
to_chat(src, "<span class='alertalien'>It is unsafe to leap without gravity!</span>")
|
||||
//It's also extremely buggy visually, so it's balance+bugfix
|
||||
return
|
||||
if(IS_HORIZONTAL(src))
|
||||
return
|
||||
|
||||
else //Maybe uses plasma in the future, although that wouldn't make any sense...
|
||||
leaping = 1
|
||||
update_icons()
|
||||
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, spin = 0, diagonals_first = 1, callback = CALLBACK(src, PROC_REF(leap_end)))
|
||||
leaping = TRUE
|
||||
on_leap_cooldown = TRUE
|
||||
update_icons()
|
||||
Immobilize(15 SECONDS, TRUE)
|
||||
addtimer(VARSET_CALLBACK(src, on_leap_cooldown, FALSE), 3 SECONDS)
|
||||
throw_at(A, MAX_ALIEN_LEAP_DIST, 1.5, spin = 0, diagonals_first = 1, callback = CALLBACK(src, PROC_REF(leap_end)))
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
|
||||
leaping = 0
|
||||
leaping = FALSE
|
||||
SetImmobilized(0, TRUE)
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A)
|
||||
if(!leaping)
|
||||
return ..()
|
||||
|
||||
if(A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
var/blocked = 0
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK))
|
||||
blocked = 1
|
||||
if(!blocked)
|
||||
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.apply_effect(10 SECONDS, KNOCKDOWN, H.run_armor_check(null, MELEE))
|
||||
H.apply_damage(40, STAMINA)
|
||||
else
|
||||
L.Weaken(10 SECONDS)
|
||||
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
|
||||
step_towards(src,L)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
var/blocked = FALSE
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK))
|
||||
blocked = TRUE
|
||||
if(!blocked)
|
||||
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.apply_effect(10 SECONDS, KNOCKDOWN, H.run_armor_check(null, MELEE))
|
||||
H.apply_damage(40, STAMINA)
|
||||
else
|
||||
Weaken(4 SECONDS, TRUE)
|
||||
L.Weaken(5 SECONDS)
|
||||
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
|
||||
step_towards(src, L)
|
||||
else
|
||||
Weaken(2 SECONDS, TRUE)
|
||||
..()
|
||||
|
||||
toggle_leap(0)
|
||||
pounce_cooldown = world.time + pounce_cooldown_time
|
||||
else if(A.density && !A.CanPass(src))
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='alertalien'>[src] smashes into [A]!</span>")
|
||||
Weaken(4 SECONDS, TRUE)
|
||||
|
||||
if(leaping)
|
||||
leaping = 0
|
||||
update_icons()
|
||||
toggle_leap(FALSE)
|
||||
else if(A.density && !A.CanPass(src))
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='alertalien'>[src] smashes into [A]!</span>")
|
||||
Weaken(2 SECONDS, TRUE)
|
||||
playsound(get_turf(src), 'sound/effects/bang.ogg', 50, 0, 0) // owwie
|
||||
..()
|
||||
if(leaping)
|
||||
leaping = FALSE
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/update_icons()
|
||||
..()
|
||||
if(leap_on_click && !leaping)
|
||||
icon_state = "alien[caste]_pounce"
|
||||
if(leaping)
|
||||
if(alt_icon == initial(alt_icon))
|
||||
var/old_icon = icon
|
||||
icon = alt_icon
|
||||
alt_icon = old_icon
|
||||
icon_state = "alien[caste]_leap"
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/mob/living/carbon/alien/humanoid/float(on)
|
||||
if(leaping)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/mob/living/carbon/alien/humanoid/sentinel
|
||||
name = "alien sentinel"
|
||||
caste = "s"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
maxHealth = 175
|
||||
health = 175
|
||||
icon_state = "aliens_s"
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/large
|
||||
@@ -12,13 +12,6 @@
|
||||
pixel_x = -16
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
large = 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/praetorian
|
||||
name = "alien praetorian"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
large = 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/large/update_icons()
|
||||
overlays.Cut()
|
||||
@@ -34,8 +27,7 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/Initialize(mapload)
|
||||
. = ..()
|
||||
if(name == "alien sentinel")
|
||||
name = "alien sentinel ([rand(1, 1000)])"
|
||||
name = "alien sentinel ([rand(1, 1000)])"
|
||||
real_name = name
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/get_caste_organs()
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
loudspeaker = TRUE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
bubble_icon = "alienroyal"
|
||||
large = 1
|
||||
ventcrawler = VENTCRAWLER_NONE
|
||||
move_resist = MOVE_FORCE_STRONG //Yes, big benos is huge and heavy
|
||||
alien_disarm_damage = 60 //Empress do higher disarm stamina damage than normal aliens
|
||||
@@ -37,16 +36,7 @@
|
||||
/mob/living/carbon/alien/humanoid/empress/Initialize(mapload)
|
||||
. = ..()
|
||||
//there should only be one queen
|
||||
for(var/mob/living/carbon/alien/humanoid/empress/E in GLOB.alive_mob_list)
|
||||
if(E == src)
|
||||
continue
|
||||
if(E.stat == DEAD)
|
||||
continue
|
||||
if(E.client)
|
||||
name = "alien grand princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it.
|
||||
break
|
||||
|
||||
real_name = name
|
||||
ADD_TRAIT(src, TRAIT_FORCE_DOORS, UNIQUE_TRAIT_SOURCE(src))
|
||||
|
||||
/mob/living/carbon/alien/humanoid/empress/get_caste_organs()
|
||||
. = ..()
|
||||
|
||||
@@ -7,10 +7,6 @@
|
||||
var/obj/item/l_store = null
|
||||
var/caste = ""
|
||||
var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files.
|
||||
var/next_attack = 0
|
||||
var/pounce_cooldown = 0
|
||||
var/pounce_cooldown_time = 30
|
||||
var/leap_on_click = 0
|
||||
var/custom_pixel_x_offset = 0 //for admin fuckery.
|
||||
var/custom_pixel_y_offset = 0
|
||||
var/alien_disarm_damage = 30 //Aliens deal a good amount of stamina damage on disarm intent
|
||||
@@ -32,13 +28,14 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Process_Spacemove(check_drift = 0)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/alien/humanoid/emp_act(severity)
|
||||
if(r_store) r_store.emp_act(severity)
|
||||
if(l_store) l_store.emp_act(severity)
|
||||
if(r_store)
|
||||
r_store.emp_act(severity)
|
||||
if(l_store)
|
||||
l_store.emp_act(severity)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/ex_act(severity)
|
||||
@@ -70,9 +67,8 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/restrained()
|
||||
if(handcuffed)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/alien/humanoid/movement_delay() //Aliens have a varied movespeed
|
||||
. = ..()
|
||||
@@ -101,9 +97,6 @@
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/canBeHandcuffed()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I)
|
||||
playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free
|
||||
..(I, cuff_break = 1)
|
||||
|
||||
@@ -4,14 +4,11 @@
|
||||
to_chat(user, "<span class='warning'>You don't want to hurt [src]!</span>")
|
||||
return FALSE
|
||||
..(user, TRUE)
|
||||
adjustBruteLoss(15)
|
||||
adjustBruteLoss(10)
|
||||
var/hitverb = "punched"
|
||||
if(mob_size < MOB_SIZE_LARGE)
|
||||
Paralyse(2 SECONDS)
|
||||
spawn(0)
|
||||
step_away(src, user, 15)
|
||||
sleep(1)
|
||||
step_away(src, user, 15)
|
||||
Stun(2 SECONDS)
|
||||
throw_at(get_edge_target_turf(user, get_dir(user, src)), 3, 7)
|
||||
hitverb = "slammed"
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[user] has [hitverb] [src]!</span>", "<span class='userdanger'>[user] has [hitverb] [src]!</span>")
|
||||
|
||||
@@ -28,8 +28,6 @@
|
||||
else if(stat == UNCONSCIOUS || IsWeakened())
|
||||
icon_state = "alien[caste]_unconscious"
|
||||
pixel_y = 0
|
||||
else if(leap_on_click)
|
||||
icon_state = "alien[caste]_pounce"
|
||||
|
||||
else if(IS_HORIZONTAL(src))
|
||||
icon_state = "alien[caste]_sleep"
|
||||
@@ -38,21 +36,12 @@
|
||||
else
|
||||
icon_state = "alien[caste]_s"
|
||||
|
||||
if(leaping)
|
||||
if(alt_icon == initial(alt_icon))
|
||||
var/old_icon = icon
|
||||
icon = alt_icon
|
||||
alt_icon = old_icon
|
||||
icon_state = "alien[caste]_leap"
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
else
|
||||
if(alt_icon != initial(alt_icon))
|
||||
var/old_icon = icon
|
||||
icon = alt_icon
|
||||
alt_icon = old_icon
|
||||
pixel_x = get_standard_pixel_x_offset()
|
||||
pixel_y = get_standard_pixel_y_offset()
|
||||
if(alt_icon != initial(alt_icon))
|
||||
var/old_icon = icon
|
||||
icon = alt_icon
|
||||
alt_icon = old_icon
|
||||
pixel_x = get_standard_pixel_x_offset()
|
||||
pixel_y = get_standard_pixel_y_offset()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/regenerate_icons()
|
||||
..()
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
/mob/living/carbon/alien/humanoid/queen
|
||||
name = "alien queen"
|
||||
caste = "q"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
icon_state = "alienq_s"
|
||||
status_flags = CANPARALYSE
|
||||
loudspeaker = TRUE
|
||||
heal_rate = 5
|
||||
large = 1
|
||||
ventcrawler = VENTCRAWLER_NONE
|
||||
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
|
||||
move_resist = MOVE_FORCE_STRONG //Yes, queenos is huge and heavy
|
||||
@@ -17,19 +15,8 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/Initialize(mapload)
|
||||
. = ..()
|
||||
//there should only be one queen
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/Q in GLOB.alive_mob_list)
|
||||
if(Q == src)
|
||||
ADD_TRAIT(Q, TRAIT_FORCE_DOORS, VAMPIRE_TRAIT)
|
||||
continue
|
||||
if(Q.stat == DEAD)
|
||||
ADD_TRAIT(Q, TRAIT_FORCE_DOORS, VAMPIRE_TRAIT)
|
||||
continue
|
||||
if(Q.client)
|
||||
name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it.
|
||||
break
|
||||
|
||||
real_name = src.name
|
||||
ADD_TRAIT(src, TRAIT_FORCE_DOORS, UNIQUE_TRAIT_SOURCE(src))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/tail_lash)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/get_caste_organs()
|
||||
. = ..()
|
||||
@@ -38,8 +25,7 @@
|
||||
/obj/item/organ/internal/alien/acidgland,
|
||||
/obj/item/organ/internal/alien/eggsac,
|
||||
/obj/item/organ/internal/alien/resinspinner,
|
||||
/obj/item/organ/internal/alien/neurotoxin,
|
||||
)
|
||||
/obj/item/organ/internal/alien/neurotoxin)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/deathrattle_message()
|
||||
return "<i><span class='alien reallybig'>A shock reverberates through the hive; [name] has been slain!</span></i>"
|
||||
@@ -51,7 +37,6 @@
|
||||
icon = 'icons/mob/alienlarge.dmi'
|
||||
icon_state = "queen_s"
|
||||
pixel_x = -16
|
||||
large = 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/large/update_icons()
|
||||
overlays.Cut()
|
||||
|
||||
@@ -12,15 +12,14 @@
|
||||
var/temperature_resistance = T0C+75
|
||||
var/amount_grown = 0
|
||||
var/max_grown = 200
|
||||
var/time_of_birth
|
||||
death_message = "lets out a waning high-pitched cry."
|
||||
death_sound = null
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/larva/Initialize(mapload)
|
||||
. = ..()
|
||||
if(name == "alien larva")
|
||||
name = "alien larva ([rand(1, 1000)])"
|
||||
|
||||
name = "alien larva ([rand(1, 1000)])"
|
||||
real_name = name
|
||||
regenerate_icons()
|
||||
add_language("Xenomorph")
|
||||
@@ -42,7 +41,7 @@
|
||||
|
||||
/mob/living/carbon/alien/larva/Stat()
|
||||
..()
|
||||
stat(null, "Progress: [amount_grown]/[max_grown]")
|
||||
stat("Progress: [amount_grown]/[max_grown]")
|
||||
|
||||
/mob/living/carbon/alien/larva/add_plasma(amount)
|
||||
if(stat != DEAD && amount > 0)
|
||||
@@ -82,7 +81,6 @@
|
||||
// new damage icon system
|
||||
// now constructs damage icon for each organ from mask * damage field
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/show_inv(mob/user as mob)
|
||||
return
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
//can't unequip since it can't equip anything
|
||||
//can't unequip since it can't equip anything // why the fuck is this it's own file
|
||||
/mob/living/carbon/alien/larva/unEquip(obj/item/I, force, silent = FALSE)
|
||||
return
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
/mob/living/carbon/alien/larva/Life(seconds, times_fired)
|
||||
set invisibility = 0
|
||||
if(notransform)
|
||||
return
|
||||
if(..()) //not dead and not in stasis
|
||||
// GROW!
|
||||
if(amount_grown < max_grown)
|
||||
@@ -19,10 +17,8 @@
|
||||
if(IsParalyzed() || IsSleeping() || getOxyLoss() > 50 || (health <= HEALTH_THRESHOLD_CRIT && check_death_method()))
|
||||
if(stat == CONSCIOUS)
|
||||
KnockOut()
|
||||
create_debug_log("fell unconscious, trigger reason: [reason]")
|
||||
else
|
||||
if(stat == UNCONSCIOUS)
|
||||
WakeUp()
|
||||
create_debug_log("woke up, trigger reason: [reason]")
|
||||
update_damage_hud()
|
||||
update_health_hud()
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/mob/living/carbon/alien/larva/regenerate_icons()
|
||||
overlays = list()
|
||||
update_icons()
|
||||
|
||||
@@ -1080,7 +1080,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
if(statpanel("Status"))
|
||||
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]")
|
||||
stat("Plasma Stored: [vessel.stored_plasma]/[vessel.max_plasma]")
|
||||
|
||||
/mob/living/carbon/get_all_slots()
|
||||
return list(l_hand,
|
||||
|
||||
@@ -666,12 +666,10 @@ emp_act
|
||||
visible_message("<span class='warning'>[src] is not affected by [M]'s disarm attempt!</span>")
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
return FALSE
|
||||
var/obj/item/I = get_active_hand()
|
||||
if(I)
|
||||
unEquip(I)
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_selected))
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
|
||||
apply_effect(10 SECONDS, KNOCKDOWN, run_armor_check(affecting, MELEE))
|
||||
M.changeNext_move(1.6 SECONDS)
|
||||
apply_damage(M.alien_disarm_damage, STAMINA)
|
||||
add_attack_logs(M, src, "Alien tackled")
|
||||
visible_message("<span class='danger'>[M] has tackled down [src]!</span>", "<span class='hear'>You hear aggressive shuffling!</span>")
|
||||
|
||||
@@ -144,7 +144,8 @@
|
||||
|
||||
|
||||
if(locate(/obj/item/grab, mob))
|
||||
delay += 7
|
||||
if(!isalienhunter(mob)) // i hate grab code
|
||||
delay += 7
|
||||
|
||||
if(istype(living_mob))
|
||||
var/newdir = NONE
|
||||
|
||||
@@ -275,8 +275,21 @@
|
||||
if(isalien(target))
|
||||
knockdown = 0
|
||||
nodamage = TRUE
|
||||
if(isrobot(target))
|
||||
stun = 10 SECONDS
|
||||
. = ..() // Execute the rest of the code.
|
||||
|
||||
/obj/item/projectile/bullet/anti_alien_toxin
|
||||
name = "neurotoxin spit"
|
||||
icon_state = "neurotoxin"
|
||||
damage = 15 // FRENDLY FIRE FRENDLY FIRE
|
||||
damage_type = BURN
|
||||
|
||||
/obj/item/projectile/bullet/anti_alien_toxin/on_hit(atom/target, blocked = 0)
|
||||
if(isalien(target))
|
||||
stun = 10 SECONDS
|
||||
. = ..()
|
||||
|
||||
/obj/item/projectile/bullet/cap
|
||||
name = "cap"
|
||||
damage = 0
|
||||
|
||||
@@ -206,6 +206,10 @@
|
||||
msg += "<span class='good'>[S.rarity]</span>: New species discovered: \"[capitalize(S.species)]\". Excellent work.<br>"
|
||||
service_credits += S.rarity / 2 // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later
|
||||
credits_to_deposit += S.rarity / 2
|
||||
|
||||
if(istype(thing, /obj/item/organ/internal/alien))
|
||||
var/obj/item/organ/internal/alien/organ = thing
|
||||
credits_to_deposit += organ.cargo_profit
|
||||
qdel(MA)
|
||||
SSeconomy.sold_atoms += "."
|
||||
|
||||
|
||||
@@ -38,16 +38,20 @@
|
||||
if(isnull(dna)) // someone didn't set this right...
|
||||
stack_trace("[src] at [loc] did not contain a dna datum at time of removal.")
|
||||
dna = H.dna.Clone()
|
||||
name = "\the [dna.real_name]'s [initial(src.name)]"
|
||||
if(dna.real_name)
|
||||
name = "\the [dna.real_name]'s [initial(name)]"
|
||||
brainmob.name = dna.real_name
|
||||
brainmob.real_name = dna.real_name
|
||||
else
|
||||
name = "\the [H.real_name]'s [initial(name)]"
|
||||
brainmob.name = H.real_name
|
||||
brainmob.real_name = H.real_name
|
||||
brainmob.dna = dna.Clone() // Silly baycode, what you do
|
||||
// brainmob.dna = H.dna.Clone() Putting in and taking out a brain doesn't make it a carbon copy of the original brain of the body you put it in
|
||||
brainmob.name = dna.real_name
|
||||
brainmob.real_name = dna.real_name
|
||||
brainmob.timeofhostdeath = H.timeofdeath
|
||||
if(H.mind)
|
||||
H.mind.transfer_to(brainmob)
|
||||
|
||||
to_chat(brainmob, "<span class='notice'>You feel slightly disoriented. That's normal when you're just a [initial(src.name)].</span>")
|
||||
to_chat(brainmob, "<span class='notice'>You feel slightly disoriented. That's normal when you're just a [initial(name)].</span>")
|
||||
|
||||
/obj/item/organ/internal/brain/examine(mob/user) // -- TLE
|
||||
. = ..()
|
||||
|
||||
@@ -2,20 +2,51 @@
|
||||
origin_tech = "biotech=5"
|
||||
icon_state = "xgibmid2"
|
||||
var/list/alien_powers = list()
|
||||
var/list/human_powers = list()
|
||||
tough = TRUE
|
||||
sterile = TRUE
|
||||
/// Amount of credits that will be received by selling this in the cargo shuttle
|
||||
var/cargo_profit = 250
|
||||
/// Has this organ been hijacked? Can hijack via a hemostat
|
||||
var/hijacked = FALSE
|
||||
|
||||
/// 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/powers_to_add in alien_powers)
|
||||
M.AddSpell(new powers_to_add)
|
||||
if(!hijacked)
|
||||
for(var/powers_to_add in alien_powers)
|
||||
M.AddSpell(new powers_to_add)
|
||||
else
|
||||
for(var/powers_to_add in human_powers)
|
||||
M.AddSpell(new powers_to_add)
|
||||
|
||||
/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)
|
||||
if(!hijacked)
|
||||
for(var/powers_to_remove in alien_powers)
|
||||
M.RemoveSpell(new powers_to_remove)
|
||||
else
|
||||
for(var/powers_to_add in human_powers)
|
||||
M.AddSpell(new powers_to_add)
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/alien/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Can be sold on the cargo shuttle for [cargo_profit] credits.</span>"
|
||||
if(hijacked)
|
||||
. += "<span class='notice'>This organ is hijacked, use a Hemostat on it to revert it to it's original function.</span>"
|
||||
else
|
||||
. += "<span class='notice'>You can hijack the latent functions of this organ by using a Hemostat on it.</span>"
|
||||
|
||||
/obj/item/organ/internal/alien/attackby(obj/item/hemostat/item, mob/user, params)
|
||||
if(istype(item))
|
||||
if(!hijacked)
|
||||
to_chat(user, "<span class='notice'>You slice off the control node of this organ. This organ will now be effective against aliens.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You reattach the control node of this organ. This organ will now be effective against those who attack the hive.</span>")
|
||||
hijacked = !hijacked
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/internal/alien/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.reagents.add_reagent("sacid", 10)
|
||||
@@ -28,18 +59,18 @@
|
||||
icon_state = "plasma"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
origin_tech = "biotech=5;plasmatech=4"
|
||||
parent_organ = "chest"
|
||||
slot = "plasmavessel"
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds, /obj/effect/proc_holder/spell/touch/alien_spell/transfer_plasma)
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds, /obj/effect/proc_holder/spell/alien_spell/transfer_plasma)
|
||||
human_powers = list(/obj/effect/proc_holder/spell/alien_spell/syphon_plasma)
|
||||
|
||||
var/stored_plasma = 0
|
||||
var/max_plasma = 500
|
||||
var/stored_plasma = 100
|
||||
var/max_plasma = 300
|
||||
var/heal_rate = 5
|
||||
var/plasma_rate = 10
|
||||
|
||||
/obj/item/organ/internal/alien/plasmavessel/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.reagents.add_reagent("plasma", stored_plasma/10)
|
||||
S.reagents.add_reagent("plasma", stored_plasma / 10)
|
||||
return S
|
||||
|
||||
/obj/item/organ/internal/alien/plasmavessel/queen
|
||||
@@ -47,14 +78,12 @@
|
||||
icon_state = "plasma_large"
|
||||
origin_tech = "biotech=6;plasmatech=4"
|
||||
stored_plasma = 200
|
||||
max_plasma = 500
|
||||
plasma_rate = 25
|
||||
|
||||
/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/alien/plasmavessel/sentinel
|
||||
stored_plasma = 100
|
||||
@@ -63,16 +92,15 @@
|
||||
/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(/obj/effect/proc_holder/spell/alien_spell/plant_weeds)
|
||||
stored_plasma = 50
|
||||
max_plasma = 100
|
||||
|
||||
/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)
|
||||
|
||||
stored_plasma = 25
|
||||
max_plasma = 50
|
||||
cargo_profit = 150
|
||||
|
||||
/obj/item/organ/internal/alien/plasmavessel/on_life()
|
||||
//If there are alien weeds on the ground then heal if needed or give some plasma
|
||||
@@ -83,7 +111,7 @@
|
||||
var/heal_amt = heal_rate
|
||||
if(!isalien(owner))
|
||||
heal_amt *= 0.2
|
||||
owner.add_plasma((plasma_rate*0.5))
|
||||
owner.add_plasma((plasma_rate / 2))
|
||||
owner.adjustBruteLoss(-heal_amt)
|
||||
owner.adjustFireLoss(-heal_amt)
|
||||
owner.adjustOxyLoss(-heal_amt)
|
||||
@@ -97,20 +125,17 @@
|
||||
. =..()
|
||||
M.update_plasma_display(M)
|
||||
|
||||
|
||||
/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(/obj/effect/proc_holder/spell/touch/alien_spell/corrosive_acid)
|
||||
|
||||
human_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/burning_touch)
|
||||
|
||||
/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
|
||||
@@ -133,24 +158,25 @@
|
||||
/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(/obj/effect/proc_holder/spell/alien_spell/neurotoxin)
|
||||
human_powers = list(/obj/effect/proc_holder/spell/alien_spell/neurotoxin/death_to_xenos)
|
||||
|
||||
/obj/item/organ/internal/alien/resinspinner
|
||||
name = "xeno resin organ"//...there tiger....
|
||||
parent_organ = "mouth"
|
||||
name = "xeno resin organ"
|
||||
icon_state = "liver-x"
|
||||
slot = "spinner"
|
||||
origin_tech = "biotech=5;materials=4"
|
||||
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/build_resin)
|
||||
human_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/consume_resin)
|
||||
|
||||
/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(/obj/effect/proc_holder/spell/alien_spell/plant_weeds/eggs)
|
||||
human_powers = list(/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers)
|
||||
cargo_profit = 1000
|
||||
|
||||
Reference in New Issue
Block a user