mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 14:39:58 +01:00
Royal Xeno Expansion
- Queens are now GIANT. - Queens are now under the /royal type - Added Praetorian caste. - Buffed queen health to 400 - Royals now resist all but the strongest space winds - Drones now must evolve into Praetorian before becoming queen. - Queens without a Praetorian may now promote one. - Royal Xenos now are not stunned by hulks or mechs. - Hulks no longer push back royals, but still deal more damage.
This commit is contained in:
@@ -121,8 +121,9 @@ var/global/floorIsLava = 0
|
||||
body += "<A href='?_src_=holder;simplemake=observer;mob=\ref[M]'>Observer</A> | "
|
||||
body += "\[ Alien: <A href='?_src_=holder;simplemake=drone;mob=\ref[M]'>Drone</A>, "
|
||||
body += "<A href='?_src_=holder;simplemake=hunter;mob=\ref[M]'>Hunter</A>, "
|
||||
body += "<A href='?_src_=holder;simplemake=queen;mob=\ref[M]'>Queen</A>, "
|
||||
body += "<A href='?_src_=holder;simplemake=sentinel;mob=\ref[M]'>Sentinel</A>, "
|
||||
body += "<A href='?_src_=holder;simplemake=praetorian;mob=\ref[M]'>Praetorian</A>, "
|
||||
body += "<A href='?_src_=holder;simplemake=queen;mob=\ref[M]'>Queen</A>, "
|
||||
body += "<A href='?_src_=holder;simplemake=larva;mob=\ref[M]'>Larva</A> \] "
|
||||
body += "<A href='?_src_=holder;simplemake=human;mob=\ref[M]'>Human</A> "
|
||||
body += "\[ slime: <A href='?_src_=holder;simplemake=slime;mob=\ref[M]'>Baby</A>, "
|
||||
@@ -516,7 +517,7 @@ var/global/floorIsLava = 0
|
||||
usr << "<font color='red'>Error: Start Now: Game is in startup, please wait until it has finished.</font>"
|
||||
else
|
||||
usr << "<font color='red'>Error: Start Now: Game has already started.</font>"
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
/datum/admins/proc/toggleenter()
|
||||
|
||||
@@ -381,7 +381,8 @@
|
||||
if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob )
|
||||
if("drone") M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob )
|
||||
if("hunter") M.change_mob_type( /mob/living/carbon/alien/humanoid/hunter , null, null, delmob )
|
||||
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen , null, null, delmob )
|
||||
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/royal/queen , null, null, delmob )
|
||||
if("praetorian") M.change_mob_type( /mob/living/carbon/alien/humanoid/royal/praetorian , null, null, delmob )
|
||||
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob )
|
||||
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
|
||||
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob )
|
||||
|
||||
@@ -208,11 +208,12 @@
|
||||
usr << "<font color='red'>Error: create_xeno(): no suitable candidates.</font>"
|
||||
if(!istext(ckey)) return 0
|
||||
|
||||
var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Hunter","Sentinel","Drone","Larva")
|
||||
var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva")
|
||||
var/obj/effect/landmark/spawn_here = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)
|
||||
var/mob/living/carbon/alien/new_xeno
|
||||
switch(alien_caste)
|
||||
if("Queen") new_xeno = new /mob/living/carbon/alien/humanoid/queen(spawn_here)
|
||||
if("Queen") new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(spawn_here)
|
||||
if("Praetorian") new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(spawn_here)
|
||||
if("Hunter") new_xeno = new /mob/living/carbon/alien/humanoid/hunter(spawn_here)
|
||||
if("Sentinel") new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(spawn_here)
|
||||
if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(spawn_here)
|
||||
@@ -262,7 +263,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if("Hunter") new_xeno = new /mob/living/carbon/alien/humanoid/hunter(T)
|
||||
if("Sentinel") new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(T)
|
||||
if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(T)
|
||||
if("Queen") new_xeno = new /mob/living/carbon/alien/humanoid/queen(T)
|
||||
if("Praetorian") new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(T)
|
||||
if("Queen") new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(T)
|
||||
else//If we don't know what special role they have, for whatever reason, or they're a larva.
|
||||
create_xeno(G_found.ckey)
|
||||
return
|
||||
|
||||
@@ -19,25 +19,20 @@
|
||||
. += 1
|
||||
|
||||
/obj/effect/proc_holder/alien/evolve
|
||||
name = "Evolve"
|
||||
desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
|
||||
name = "Evolve to Praetorian"
|
||||
desc = "Praetorian"
|
||||
plasma_cost = 500
|
||||
|
||||
action_icon_state = "alien_evolve_drone"
|
||||
|
||||
/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/user)
|
||||
var/no_queen = 1
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
|
||||
if(!Q.key || !Q.getorgan(/obj/item/organ/internal/brain))
|
||||
continue
|
||||
no_queen = 0
|
||||
if(no_queen)
|
||||
if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal/))
|
||||
user << "<span class='noticealien'>You begin to evolve!</span>"
|
||||
user.visible_message("<span class='alertalien'>[user] begins to twist and contort!</span>")
|
||||
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (user.loc)
|
||||
var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc)
|
||||
user.mind.transfer_to(new_xeno)
|
||||
qdel(user)
|
||||
return 1
|
||||
else
|
||||
user << "<span class='notice'>We already have an alive queen.</span>"
|
||||
user << "<span class='notice'>We already have a living royal!</span>"
|
||||
return 0
|
||||
@@ -0,0 +1,64 @@
|
||||
/mob/living/carbon/alien/humanoid/royal/praetorian
|
||||
name = "alien praetorian"
|
||||
caste = "p"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
icon_state = "alienp"
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/praetorian/New()
|
||||
|
||||
real_name = name
|
||||
|
||||
internal_organs += new /obj/item/organ/internal/alien/plasmavessel/large
|
||||
internal_organs += new /obj/item/organ/internal/alien/resinspinner
|
||||
internal_organs += new /obj/item/organ/internal/alien/acid
|
||||
internal_organs += new /obj/item/organ/internal/alien/neurotoxin
|
||||
AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve())
|
||||
..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/praetorian/handle_hud_icons_health()
|
||||
if (healths)
|
||||
if(stat != DEAD)
|
||||
switch(health)
|
||||
if(250 to INFINITY)
|
||||
healths.icon_state = "health0"
|
||||
if(200 to 250)
|
||||
healths.icon_state = "health1"
|
||||
if(150 to 200)
|
||||
healths.icon_state = "health2"
|
||||
if(100 to 150)
|
||||
healths.icon_state = "health3"
|
||||
if(50 to 100)
|
||||
healths.icon_state = "health4"
|
||||
if(0 to 50)
|
||||
healths.icon_state = "health5"
|
||||
else
|
||||
healths.icon_state = "health6"
|
||||
else
|
||||
healths.icon_state = "health7"
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/praetorian/movement_delay()
|
||||
. = ..()
|
||||
. += 1
|
||||
|
||||
/obj/effect/proc_holder/alien/royal/praetorian/evolve
|
||||
name = "Evolve"
|
||||
desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
|
||||
plasma_cost = 500
|
||||
|
||||
action_icon_state = "alien_evolve_praetorian"
|
||||
|
||||
/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/user)
|
||||
if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal/queen))
|
||||
user << "<span class='noticealien'>You begin to evolve!</span>"
|
||||
user.visible_message("<span class='alertalien'>[user] begins to twist and contort!</span>")
|
||||
var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc)
|
||||
user.mind.transfer_to(new_xeno)
|
||||
qdel(user)
|
||||
return 1
|
||||
else
|
||||
user << "<span class='notice'>We already have an alive queen.</span>"
|
||||
return 0
|
||||
@@ -32,10 +32,16 @@
|
||||
if(user.a_intent == "harm")
|
||||
..(user, 1)
|
||||
adjustBruteLoss(14 + rand(1,9))
|
||||
Paralyse(1)
|
||||
step_away(src,user,15)
|
||||
sleep(1)
|
||||
step_away(src,user,15)
|
||||
var/hitverb = "punched"
|
||||
if(mob_size < MOB_SIZE_LARGE)
|
||||
Paralyse(1)
|
||||
step_away(src,user,15)
|
||||
sleep(1)
|
||||
step_away(src,user,15)
|
||||
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>")
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M)
|
||||
@@ -140,4 +146,14 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/get_permeability_protection()
|
||||
return 0.8
|
||||
return 0.8
|
||||
|
||||
//For alien evolution/promotion procs. Checks for
|
||||
proc/alien_type_present(var/alienpath)
|
||||
for(var/mob/living/carbon/alien/humanoid/A in living_mob_list)
|
||||
if(!istype(A, alienpath))
|
||||
continue
|
||||
if(!A.key || A.stat == DEAD) //Only living aliens with a ckey are valid.
|
||||
continue
|
||||
return 1
|
||||
return 0
|
||||
@@ -1,17 +1,25 @@
|
||||
/mob/living/carbon/alien/humanoid/queen
|
||||
name = "alien queen"
|
||||
caste = "q"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
icon_state = "alienq_s"
|
||||
status_flags = CANPARALYSE
|
||||
/mob/living/carbon/alien/humanoid/royal
|
||||
//Common stuffs for Praetorian and Queen
|
||||
icon = 'icons/mob/alienqueen.dmi'
|
||||
status_flags = 0
|
||||
ventcrawler = 0 //pull over that ass too fat
|
||||
unique_name = 0
|
||||
pixel_x = -16
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
layer = 6
|
||||
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen
|
||||
name = "alien queen"
|
||||
caste = "q"
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
icon_state = "alienq"
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/New()
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/New()
|
||||
//there should only be one queen
|
||||
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
|
||||
for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in living_mob_list)
|
||||
if(Q == src) continue
|
||||
if(Q.stat == DEAD) continue
|
||||
if(Q.client)
|
||||
@@ -25,31 +33,31 @@
|
||||
internal_organs += new /obj/item/organ/internal/alien/acid
|
||||
internal_organs += new /obj/item/organ/internal/alien/neurotoxin
|
||||
internal_organs += new /obj/item/organ/internal/alien/eggsac
|
||||
|
||||
AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote())
|
||||
..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/handle_hud_icons_health()
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/handle_hud_icons_health()
|
||||
if (src.healths)
|
||||
if (src.stat != 2)
|
||||
switch(health)
|
||||
if(250 to INFINITY)
|
||||
if(400 to INFINITY)
|
||||
src.healths.icon_state = "health0"
|
||||
if(200 to 250)
|
||||
if(320 to 400)
|
||||
src.healths.icon_state = "health1"
|
||||
if(150 to 200)
|
||||
if(240 to 320)
|
||||
src.healths.icon_state = "health2"
|
||||
if(100 to 150)
|
||||
if(160 to 240)
|
||||
src.healths.icon_state = "health3"
|
||||
if(50 to 100)
|
||||
if(80 to 160)
|
||||
src.healths.icon_state = "health4"
|
||||
if(0 to 50)
|
||||
if(0 to 80)
|
||||
src.healths.icon_state = "health5"
|
||||
else
|
||||
src.healths.icon_state = "health6"
|
||||
else
|
||||
src.healths.icon_state = "health7"
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/movement_delay()
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/movement_delay()
|
||||
. = ..()
|
||||
. += 5
|
||||
|
||||
@@ -70,8 +78,67 @@
|
||||
new /obj/structure/alien/egg(user.loc)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/large
|
||||
icon = 'icons/mob/alienqueen.dmi'
|
||||
icon_state = "queen_s"
|
||||
pixel_x = -16
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
//Button to let queen choose her praetorian.
|
||||
/obj/effect/proc_holder/alien/royal/queen/promote
|
||||
name = "Create Royal Parasite"
|
||||
desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian."
|
||||
plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite.
|
||||
|
||||
action_icon_state = "alien_queen_promote"
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/alien/royal/queen/promote/fire(mob/living/carbon/alien/user)
|
||||
var/obj/item/queenpromote/prom
|
||||
if(alien_type_present(/mob/living/carbon/alien/humanoid/royal/praetorian/))
|
||||
user << "<span class='noticealien'>You already have a Praetorian!</span>"
|
||||
return 0
|
||||
else
|
||||
for(prom in user)
|
||||
user << "<span class='noticealien'>You discard [prom].</span>"
|
||||
qdel(prom)
|
||||
return 0
|
||||
|
||||
prom = new (user.loc)
|
||||
if(!user.put_in_active_hand(prom, 1))
|
||||
user << "<span class='warning'>You must empty your hands before preparing the parasite.</span>"
|
||||
return 0
|
||||
else //Just in case telling the player only once is not enough!
|
||||
user << "<span class='noticealien'>Use the royal parasite on one of your children to promote her to Praetorian!</span>"
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/queenpromote
|
||||
name = "\improper royal parasite"
|
||||
desc = "Inject this into one of your grown children to promote her to a Praetorian!"
|
||||
icon_state = "alien_medal"
|
||||
flags = ABSTRACT|NODROP
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
|
||||
/obj/item/queenpromote/attack(mob/living/M, mob/living/user)
|
||||
if(!isalienadult(M) || istype(M, /mob/living/carbon/alien/humanoid/royal))
|
||||
user << "<span class='noticealien'>You may only use this with your adult, non-royal children!</span>"
|
||||
return
|
||||
if(alien_type_present(/mob/living/carbon/alien/humanoid/royal/praetorian/))
|
||||
user << "<span class='noticealien'>You already have a Praetorian!</span>"
|
||||
return
|
||||
|
||||
var/mob/living/carbon/alien/humanoid/A = M
|
||||
if(A.stat == CONSCIOUS && A.mind && A.key)
|
||||
if(!A.usePlasma(500))
|
||||
user << "<span class='noticealien'>You must have 500 plasma stored to use this!</span>"
|
||||
return
|
||||
|
||||
A << "<span class='noticealien'>The queen has granted you a promotion to Praetorian!</span>"
|
||||
user.visible_message("<span class='alertalien'>[A] begins to expand, twist and contort!</span>")
|
||||
var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new (A.loc)
|
||||
A.mind.transfer_to(new_prae)
|
||||
qdel(A)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>This child must be alert and responsive to become a Praetorian!</span>"
|
||||
|
||||
/obj/item/queenpromote/attack_self(mob/user)
|
||||
user << "<span class='noticealien'>You discard [src].</span>"
|
||||
qdel(src)
|
||||
@@ -21,6 +21,8 @@
|
||||
icon_state = "alien[caste]_sleep"
|
||||
else if(m_intent == "run")
|
||||
icon_state = "alien[caste]_running"
|
||||
else if(mob_size == MOB_SIZE_LARGE)
|
||||
icon_state = "alien[caste]"
|
||||
else
|
||||
icon_state = "alien[caste]_s"
|
||||
|
||||
@@ -50,29 +52,4 @@
|
||||
if(lying > 0)
|
||||
lying = 90 //Anything else looks retarded
|
||||
..()
|
||||
update_icons()
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/large/update_icons()
|
||||
update_hud() //TODO: remove the need for this to be here
|
||||
overlays.Cut()
|
||||
if(stat == DEAD)
|
||||
icon_state = "queen_dead"
|
||||
else if((stat == UNCONSCIOUS && !sleeping) || weakened)
|
||||
icon_state = "queen_l"
|
||||
else if(sleeping || lying || resting)
|
||||
icon_state = "queen_sleep"
|
||||
else
|
||||
icon_state = "queen_s"
|
||||
for(var/image/I in overlays_standing)
|
||||
overlays += I
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/large/update_inv_l_hand()
|
||||
remove_overlay(L_HAND_LAYER)
|
||||
if(handcuffed)
|
||||
drop_l_hand()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/large/update_inv_r_hand()
|
||||
remove_overlay(R_HAND_LAYER)
|
||||
if(handcuffed)
|
||||
drop_r_hand()
|
||||
update_icons()
|
||||
@@ -14,7 +14,7 @@
|
||||
if((!S.stat && S.hivecheck()) || (S in dead_mob_list))
|
||||
S << rendered
|
||||
|
||||
/mob/living/carbon/alien/humanoid/queen/alien_talk(message, shown_name = name)
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/alien_talk(message, shown_name = name)
|
||||
shown_name = "<FONT size = 3>[shown_name]</FONT>"
|
||||
..(message, shown_name)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user