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:
GunHog
2015-09-29 18:58:40 -05:00
parent 01d2c4943b
commit 0a2be62d55
15 changed files with 201 additions and 73 deletions
+3 -2
View File
@@ -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()
+2 -1
View File
@@ -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 )
+5 -3
View File
@@ -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()
+1 -1
View File
@@ -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)