mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-16 13:12:22 +00:00
Axes carbon aliums, makes nymphs direct subtype of carbon (#8931)
* Axes carbon aliums, makes nymphs direct subtype of carbon * Keep type as diona
This commit is contained in:
@@ -47,7 +47,7 @@
|
||||
/**
|
||||
* Podman hook.
|
||||
* Called in podmen.dm when someone is brought back as a Diona.
|
||||
* Parameters: var/mob/living/carbon/alien/diona
|
||||
* Parameters: var/mob/living/carbon/diona
|
||||
*/
|
||||
/hook/harvest_podman
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
switch(href_list["simplemake"])
|
||||
if("observer") M.change_mob_type( /mob/observer/dead , null, null, delmob )
|
||||
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
|
||||
if("nymph") M.change_mob_type( /mob/living/carbon/alien/diona , null, null, delmob )
|
||||
if("nymph") M.change_mob_type( /mob/living/carbon/diona , null, null, delmob )
|
||||
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob, href_list["species"])
|
||||
if("slime") M.change_mob_type( /mob/living/simple_mob/slime/xenobio , null, null, delmob )
|
||||
if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob )
|
||||
|
||||
@@ -483,8 +483,8 @@ var/global/list/light_overlay_cache = list() //see get_worn_overlay() on helmets
|
||||
else
|
||||
D.wear_hat(src)
|
||||
success = 1
|
||||
else if(istype(user, /mob/living/carbon/alien/diona))
|
||||
var/mob/living/carbon/alien/diona/D = user
|
||||
else if(istype(user, /mob/living/carbon/diona))
|
||||
var/mob/living/carbon/diona/D = user
|
||||
if(D.hat)
|
||||
success = 2
|
||||
else
|
||||
|
||||
@@ -4405,7 +4405,7 @@
|
||||
/mob/living/simple_mob/adultslime
|
||||
composition_reagent = "slimejelly"
|
||||
|
||||
/mob/living/carbon/alien/diona
|
||||
/mob/living/carbon/diona
|
||||
composition_reagent = "nutriment"//Dionae are plants, so eating them doesn't give animal protein
|
||||
|
||||
/mob/living/simple_mob/slime
|
||||
|
||||
@@ -655,7 +655,7 @@
|
||||
if (isSynthetic())
|
||||
src.composition_reagent = "iron"
|
||||
else
|
||||
if(istype(src, /mob/living/carbon/human/diona) || istype(src, /mob/living/carbon/alien/diona))
|
||||
if(istype(src, /mob/living/carbon/human/diona) || istype(src, /mob/living/carbon/diona))
|
||||
src.composition_reagent = "nutriment" // diona are plants, not meat
|
||||
else
|
||||
src.composition_reagent = "protein"
|
||||
|
||||
@@ -109,6 +109,6 @@ var/global/list/ghost_traps
|
||||
/datum/ghosttrap/plant/welcome_candidate(var/mob/target)
|
||||
to_chat(target, "<span class='alium'><B>You awaken slowly, stirring into sluggish motion as the air caresses you.</B></span>")
|
||||
// This is a hack, replace with some kind of species blurb proc.
|
||||
if(istype(target,/mob/living/carbon/alien/diona))
|
||||
if(istype(target,/mob/living/carbon/diona))
|
||||
to_chat(target, "<B>You are \a [target], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.</B>")
|
||||
to_chat(target, "<B>Too much darkness will send you into shock and starve you, but light will help you heal.</B>")
|
||||
@@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(plant_mob_products, list(
|
||||
/mob/living/simple_mob/animal/passive/mouse = 1,
|
||||
/mob/living/simple_mob/animal/space/carp = 1,
|
||||
/mob/living/carbon/human/monkey = 1,
|
||||
/mob/living/carbon/alien/diona = 1
|
||||
/mob/living/carbon/diona = 1
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(plant_item_products, list(
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
display_name = "replicant pods"
|
||||
can_self_harvest = 1
|
||||
apply_color_to_mob = FALSE
|
||||
has_mob_product = /mob/living/carbon/alien/diona
|
||||
has_mob_product = /mob/living/carbon/diona
|
||||
|
||||
/datum/seed/diona/New()
|
||||
..()
|
||||
|
||||
@@ -150,8 +150,8 @@
|
||||
/obj/machinery/portable_atmospherics/hydroponics/attack_generic(var/mob/user)
|
||||
|
||||
// Why did I ever think this was a good idea. TODO: move this onto the nymph mob.
|
||||
if(istype(user,/mob/living/carbon/alien/diona))
|
||||
var/mob/living/carbon/alien/diona/nymph = user
|
||||
if(istype(user,/mob/living/carbon/diona))
|
||||
var/mob/living/carbon/diona/nymph = user
|
||||
|
||||
if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained())
|
||||
return
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
/mob/living/carbon/alien
|
||||
name = "alien"
|
||||
desc = "What IS that?"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "alien"
|
||||
pass_flags = PASSTABLE
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
mob_size = 4
|
||||
|
||||
inventory_panel_type = null // Disable inventory by default
|
||||
|
||||
var/adult_form
|
||||
var/dead_icon
|
||||
var/amount_grown = 0
|
||||
var/max_grown = 200
|
||||
var/time_of_birth
|
||||
var/language
|
||||
var/death_msg = "lets out a waning guttural screech, green blood bubbling from its maw."
|
||||
var/can_namepick_as_adult = 0
|
||||
var/adult_name
|
||||
var/instance_num
|
||||
|
||||
/mob/living/carbon/alien/Initialize()
|
||||
. = ..()
|
||||
|
||||
time_of_birth = world.time
|
||||
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
|
||||
instance_num = rand(1, 1000)
|
||||
name = "[initial(name)] ([instance_num])"
|
||||
real_name = name
|
||||
regenerate_icons()
|
||||
|
||||
if(language)
|
||||
add_language(language)
|
||||
|
||||
gender = NEUTER
|
||||
|
||||
/mob/living/carbon/alien/u_equip(obj/item/W as obj)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/Stat()
|
||||
..()
|
||||
stat(null, "Progress: [amount_grown]/[max_grown]")
|
||||
|
||||
/mob/living/carbon/alien/restrained()
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/alien/cannot_use_vents()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/get_default_language()
|
||||
if(default_language)
|
||||
return default_language
|
||||
return GLOB.all_languages["Skathari"]
|
||||
|
||||
/mob/living/carbon/alien/say_quote(var/message, var/datum/language/speaking = null)
|
||||
var/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
|
||||
else
|
||||
if(ending == "!")
|
||||
verb = "roars"
|
||||
else if(ending == "?")
|
||||
verb = "hisses curiously"
|
||||
return verb
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
//There has to be a better way to define this shit. ~ Z
|
||||
//can't equip anything
|
||||
/mob/living/carbon/alien/attack_ui(slot_id)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/attack_hand(mob/living/carbon/M as mob)
|
||||
|
||||
..()
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if (I_HELP)
|
||||
help_shake_act(M)
|
||||
|
||||
if (I_GRAB)
|
||||
if (M == src)
|
||||
return
|
||||
var/obj/item/grab/G = new /obj/item/grab( M, src )
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
grabbed_by += G
|
||||
G.affecting = src
|
||||
G.synch()
|
||||
|
||||
LAssailant = M
|
||||
|
||||
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<font color='red'>[] has grabbed [] passively!</font>", M, src), 1)
|
||||
|
||||
else
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (HULK in M.mutations)
|
||||
damage += 5
|
||||
spawn(0)
|
||||
Paralyse(1)
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
playsound(src, "punch", 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<font color='red'><B>[] has punched []!</B></font>", M, src), 1)
|
||||
if (damage > 4.9)
|
||||
Weaken(rand(10,15))
|
||||
for(var/mob/O in viewers(M, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<font color='red'><B>[] has weakened []!</B></font>", M, src), 1, "<font color='red'>You hear someone fall.</font>", 2)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<font color='red'><B>[] has attempted to punch []!</B></font>", M, src), 1)
|
||||
return
|
||||
@@ -1,33 +0,0 @@
|
||||
/mob/living/carbon/alien/ex_act(severity)
|
||||
|
||||
if(!blinded)
|
||||
flash_eyes()
|
||||
|
||||
var/b_loss = null
|
||||
var/f_loss = null
|
||||
switch (severity)
|
||||
if (1.0)
|
||||
b_loss += 500
|
||||
gib()
|
||||
return
|
||||
|
||||
if (2.0)
|
||||
|
||||
b_loss += 60
|
||||
|
||||
f_loss += 60
|
||||
|
||||
ear_damage += 30
|
||||
ear_deaf += 120
|
||||
|
||||
if(3.0)
|
||||
b_loss += 30
|
||||
if (prob(50))
|
||||
Paralyse(1)
|
||||
ear_damage += 15
|
||||
ear_deaf += 60
|
||||
|
||||
adjustBruteLoss(b_loss)
|
||||
adjustFireLoss(f_loss)
|
||||
|
||||
updatehealth()
|
||||
@@ -1,4 +0,0 @@
|
||||
/mob/living/carbon/alien/death(gibbed)
|
||||
if(!gibbed && dead_icon)
|
||||
icon_state = dead_icon
|
||||
return ..(gibbed,death_msg)
|
||||
@@ -1,76 +0,0 @@
|
||||
var/global/list/_nymph_default_emotes = list(
|
||||
/decl/emote/visible,
|
||||
/decl/emote/visible/scratch,
|
||||
/decl/emote/visible/drool,
|
||||
/decl/emote/visible/nod,
|
||||
/decl/emote/visible/sway,
|
||||
/decl/emote/visible/sulk,
|
||||
/decl/emote/visible/twitch,
|
||||
/decl/emote/visible/dance,
|
||||
/decl/emote/visible/roll,
|
||||
/decl/emote/visible/shake,
|
||||
/decl/emote/visible/jump,
|
||||
/decl/emote/visible/shiver,
|
||||
/decl/emote/visible/collapse,
|
||||
/decl/emote/visible/spin,
|
||||
/decl/emote/visible/sidestep,
|
||||
/decl/emote/audible/hiss,
|
||||
/decl/emote/audible,
|
||||
/decl/emote/audible/scretch,
|
||||
/decl/emote/audible/choke,
|
||||
/decl/emote/audible/gnarl,
|
||||
/decl/emote/audible/bug_hiss,
|
||||
/decl/emote/audible/bug_chitter,
|
||||
/decl/emote/audible/chirp
|
||||
)
|
||||
|
||||
/mob/living/carbon/alien/diona
|
||||
name = "diona nymph"
|
||||
voice_name = "diona nymph"
|
||||
adult_form = /mob/living/carbon/human
|
||||
can_namepick_as_adult = 1
|
||||
adult_name = "diona gestalt"
|
||||
speak_emote = list("chirrups")
|
||||
icon_state = "nymph"
|
||||
item_state = "nymph"
|
||||
language = LANGUAGE_ROOTLOCAL
|
||||
species_language = LANGUAGE_ROOTLOCAL
|
||||
only_species_language = 1
|
||||
death_msg = "expires with a pitiful chirrup..."
|
||||
universal_understand = 0
|
||||
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
|
||||
|
||||
can_pull_size = ITEMSIZE_SMALL
|
||||
can_pull_mobs = MOB_PULL_SMALLER
|
||||
|
||||
holder_type = /obj/item/holder/diona
|
||||
var/obj/item/hat
|
||||
|
||||
/mob/living/carbon/alien/diona/get_available_emotes()
|
||||
return global._nymph_default_emotes
|
||||
|
||||
/mob/living/carbon/alien/diona/Initialize()
|
||||
. = ..()
|
||||
species = GLOB.all_species[SPECIES_DIONA]
|
||||
add_language(LANGUAGE_ROOTGLOBAL)
|
||||
add_language(LANGUAGE_GALCOM)
|
||||
verbs += /mob/living/carbon/alien/diona/proc/merge
|
||||
|
||||
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
|
||||
W.loc = get_turf(src)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/wear_hat(var/obj/item/new_hat)
|
||||
if(hat)
|
||||
return
|
||||
hat = new_hat
|
||||
new_hat.loc = src
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/handle_npc(var/mob/living/carbon/alien/diona/D)
|
||||
if(D.stat != CONSCIOUS)
|
||||
return
|
||||
if(prob(33) && D.canmove && isturf(D.loc) && !D.pulledby) //won't move if being pulled
|
||||
step(D, pick(cardinal))
|
||||
if(prob(1))
|
||||
D.emote(pick("scratch","jump","chirp","roll"))
|
||||
@@ -1,23 +0,0 @@
|
||||
/mob/living/carbon/alien/diona/MouseDrop(var/atom/over_object)
|
||||
var/mob/living/carbon/human/H = over_object
|
||||
if(!istype(H) || !Adjacent(H))
|
||||
return ..()
|
||||
if(H.a_intent == "grab" && hat && !H.hands_are_full())
|
||||
hat.loc = get_turf(src)
|
||||
H.put_in_hands(hat)
|
||||
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
|
||||
hat = null
|
||||
updateicon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/alien/diona/attackby(var/obj/item/W, var/mob/user)
|
||||
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||
if(hat)
|
||||
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
|
||||
return
|
||||
user.unEquip(W)
|
||||
wear_hat(W)
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||
return
|
||||
return ..()
|
||||
@@ -1,19 +0,0 @@
|
||||
//Dionaea regenerate health and nutrition in light.
|
||||
/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment)
|
||||
|
||||
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
||||
if(isturf(loc)) //else, there's considered to be no light
|
||||
var/turf/T = loc
|
||||
light_amount = T.get_lumcount() * 5
|
||||
|
||||
adjust_nutrition(light_amount)
|
||||
|
||||
if(light_amount > 2) //if there's enough light, heal
|
||||
adjustBruteLoss(-1)
|
||||
adjustFireLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
|
||||
|
||||
if(!client)
|
||||
handle_npc(src)
|
||||
@@ -1,19 +0,0 @@
|
||||
/mob/living/carbon/alien/diona/confirm_evolution()
|
||||
|
||||
if(!is_alien_whitelisted(src, GLOB.all_species[SPECIES_DIONA]))
|
||||
alert(src, "You are currently not whitelisted to play as a full diona.")
|
||||
return null
|
||||
|
||||
if(amount_grown < max_grown)
|
||||
to_chat(src, "You are not yet ready for your growth...")
|
||||
return null
|
||||
|
||||
src.split()
|
||||
|
||||
if(istype(loc,/obj/item/holder/diona))
|
||||
var/obj/item/holder/diona/L = loc
|
||||
src.loc = L.loc
|
||||
qdel(L)
|
||||
|
||||
src.visible_message("<font color='red'>[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.</font>","<font color='red'>You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.</font>")
|
||||
return SPECIES_DIONA
|
||||
@@ -1,31 +0,0 @@
|
||||
var/global/list/_alien_default_emotes = list(
|
||||
/decl/emote/visible,
|
||||
/decl/emote/visible/scratch,
|
||||
/decl/emote/visible/drool,
|
||||
/decl/emote/visible/nod,
|
||||
/decl/emote/visible/sway,
|
||||
/decl/emote/visible/sulk,
|
||||
/decl/emote/visible/twitch,
|
||||
/decl/emote/visible/twitch_v,
|
||||
/decl/emote/visible/dance,
|
||||
/decl/emote/visible/roll,
|
||||
/decl/emote/visible/shake,
|
||||
/decl/emote/visible/jump,
|
||||
/decl/emote/visible/shiver,
|
||||
/decl/emote/visible/collapse,
|
||||
/decl/emote/visible/spin,
|
||||
/decl/emote/visible/sidestep,
|
||||
/decl/emote/audible/hiss,
|
||||
/decl/emote/audible,
|
||||
/decl/emote/audible/deathgasp_alien,
|
||||
/decl/emote/audible/whimper,
|
||||
/decl/emote/audible/gasp,
|
||||
/decl/emote/audible/scretch,
|
||||
/decl/emote/audible/choke,
|
||||
/decl/emote/audible/moan,
|
||||
/decl/emote/audible/gnarl,
|
||||
/decl/emote/audible/chirp
|
||||
)
|
||||
|
||||
/mob/living/carbon/alien/get_available_emotes()
|
||||
. = global._alien_default_emotes
|
||||
@@ -1,15 +0,0 @@
|
||||
/mob/living/carbon/alien/larva
|
||||
name = "skathari larva"
|
||||
real_name = "skathari larva"
|
||||
adult_form = /mob/living/carbon/human
|
||||
speak_emote = list("hisses")
|
||||
icon_state = "larva"
|
||||
language = "Hivemind"
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
faction = "xeno"
|
||||
|
||||
/mob/living/carbon/alien/larva/Initialize()
|
||||
. = ..()
|
||||
add_language("Skathari") //Bonus language.
|
||||
internal_organs |= new /obj/item/organ/internal/xenos/hivenode(src)
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
//Larvae regenerate health and nutrition from plasma and alien weeds.
|
||||
/mob/living/carbon/alien/larva/handle_environment(var/datum/gas_mixture/environment)
|
||||
|
||||
if(!environment) return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(environment.gas["phoron"] > 0 || (T && locate(/obj/effect/alien/weeds) in T.contents))
|
||||
update_progression()
|
||||
adjustBruteLoss(-1)
|
||||
adjustFireLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
@@ -1,12 +0,0 @@
|
||||
/mob/living/carbon/alien/larva/confirm_evolution()
|
||||
|
||||
to_chat(src, "<span class='notice'><b>You are growing into a full-fledged Skathari! It is time to choose a caste.</b></span>")
|
||||
to_chat(src, "<span class='notice'>There are three to choose from:</span>")
|
||||
to_chat(src, "<B>Soldiers</B> <span class='notice'> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Soldiers generate plasma slowly and have low reserves.</span>")
|
||||
to_chat(src, "<B>Guardians</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 soldiers.</span>")
|
||||
to_chat(src, "<B>Workers</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 queen.</span>")
|
||||
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Soldier","Guardian","Worker")
|
||||
return alien_caste ? "Skathari [alien_caste]" : null
|
||||
|
||||
/mob/living/carbon/alien/larva/show_evolution_blurb()
|
||||
return
|
||||
@@ -1,161 +0,0 @@
|
||||
// Alien larva are quite simple.
|
||||
/mob/living/carbon/alien/Life()
|
||||
|
||||
set invisibility = 0
|
||||
set background = 1
|
||||
|
||||
if (transforming) return
|
||||
if(!loc) return
|
||||
|
||||
..()
|
||||
|
||||
if (stat != DEAD) //still breathing
|
||||
// GROW!
|
||||
update_progression()
|
||||
|
||||
blinded = null
|
||||
|
||||
//Status updates, death etc.
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/handle_mutations_and_radiation()
|
||||
|
||||
// Currently both Dionaea and larvae like to eat radiation, so I'm defining the
|
||||
// rad absorbtion here. This will need to be changed if other baby aliens are added.
|
||||
|
||||
if(!radiation)
|
||||
return
|
||||
|
||||
var/rads = radiation/25
|
||||
radiation -= rads
|
||||
adjust_nutrition(rads)
|
||||
heal_overall_damage(rads,rads)
|
||||
adjustOxyLoss(-(rads))
|
||||
adjustToxLoss(-(rads))
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/handle_regular_status_updates()
|
||||
|
||||
if(status_flags & GODMODE) return 0
|
||||
|
||||
if(stat == DEAD)
|
||||
blinded = 1
|
||||
silent = 0
|
||||
else
|
||||
updatehealth()
|
||||
if(health <= 0)
|
||||
death()
|
||||
blinded = 1
|
||||
silent = 0
|
||||
return 1
|
||||
|
||||
if(paralysis && paralysis > 0)
|
||||
blinded = 1
|
||||
set_stat(UNCONSCIOUS)
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-3)
|
||||
|
||||
if(sleeping)
|
||||
adjustHalLoss(-3)
|
||||
if (mind)
|
||||
if(mind.active && client != null)
|
||||
AdjustSleeping(-1)
|
||||
blinded = 1
|
||||
set_stat(UNCONSCIOUS)
|
||||
else if(resting)
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-3)
|
||||
|
||||
else
|
||||
set_stat(CONSCIOUS)
|
||||
if(halloss > 0)
|
||||
adjustHalLoss(-1)
|
||||
|
||||
// Eyes and blindness.
|
||||
if(!has_eyes())
|
||||
SetBlinded(1)
|
||||
blinded = 1
|
||||
eye_blurry = 1
|
||||
else if(eye_blind)
|
||||
AdjustBlinded(-1)
|
||||
blinded = 1
|
||||
else if(eye_blurry)
|
||||
eye_blurry = max(eye_blurry-1, 0)
|
||||
|
||||
update_icons()
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2 || (XRAY in src.mutations))
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
else if (stat != 2)
|
||||
sight &= ~SEE_TURFS
|
||||
sight &= ~SEE_MOBS
|
||||
sight &= ~SEE_OBJS
|
||||
see_in_dark = 2
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if (healths)
|
||||
if (stat != 2)
|
||||
switch(health)
|
||||
if(100 to INFINITY)
|
||||
healths.icon_state = "health0"
|
||||
if(80 to 100)
|
||||
healths.icon_state = "health1"
|
||||
if(60 to 80)
|
||||
healths.icon_state = "health2"
|
||||
if(40 to 60)
|
||||
healths.icon_state = "health3"
|
||||
if(20 to 40)
|
||||
healths.icon_state = "health4"
|
||||
if(0 to 20)
|
||||
healths.icon_state = "health5"
|
||||
else
|
||||
healths.icon_state = "health6"
|
||||
else
|
||||
healths.icon_state = "health7"
|
||||
|
||||
if (client)
|
||||
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
|
||||
|
||||
if ( stat != 2)
|
||||
if ((blinded))
|
||||
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
|
||||
else
|
||||
clear_fullscreen("blind")
|
||||
set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1)
|
||||
set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry)
|
||||
set_fullscreen(druggy, "high", /obj/screen/fullscreen/high)
|
||||
if(machine)
|
||||
if(machine.check_eye(src) < 0)
|
||||
reset_view(null)
|
||||
else
|
||||
if(client && !client.adminobs)
|
||||
reset_view(null)
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment)
|
||||
// Both alien subtypes survive in vaccum and suffer in high temperatures,
|
||||
// so I'll just define this once, for both (see radiation comment above)
|
||||
if(!environment) return
|
||||
|
||||
if(environment.temperature > (T0C+66))
|
||||
adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing.
|
||||
throw_alert("alien_fire", /obj/screen/alert/alien_fire)
|
||||
if(prob(20))
|
||||
to_chat(src, "<font color='red'>You feel a searing heat!</font>")
|
||||
else
|
||||
clear_alert("alien_fire")
|
||||
|
||||
/mob/living/carbon/alien/handle_fire()
|
||||
if(..())
|
||||
return
|
||||
bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up!
|
||||
return
|
||||
@@ -1,65 +0,0 @@
|
||||
/mob/living/carbon/alien/verb/evolve()
|
||||
|
||||
set name = "Evolve"
|
||||
set desc = "Evolve into your adult form."
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
if(!adult_form)
|
||||
verbs -= /mob/living/carbon/alien/verb/evolve
|
||||
return
|
||||
|
||||
if(handcuffed || legcuffed)
|
||||
to_chat(src, "<font color='red'>You cannot evolve when you are cuffed.</font>")
|
||||
return
|
||||
|
||||
if(amount_grown < max_grown)
|
||||
to_chat(src, "<font color='red'>You are not fully grown.</font>")
|
||||
return
|
||||
|
||||
// confirm_evolution() handles choices and other specific requirements.
|
||||
var/new_species = confirm_evolution()
|
||||
if(!new_species || !adult_form )
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/adult = new adult_form(get_turf(src))
|
||||
adult.set_species(new_species)
|
||||
show_evolution_blurb()
|
||||
|
||||
transfer_languages(src, adult)
|
||||
|
||||
if(src.faction != "neutral")
|
||||
adult.faction = src.faction
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(adult)
|
||||
if (can_namepick_as_adult)
|
||||
var/newname = sanitize(input(adult, "You have become an adult. Choose a name for yourself.", "Adult Name") as null|text, MAX_NAME_LEN)
|
||||
|
||||
if(!newname)
|
||||
adult.fully_replace_character_name(name, "[src.adult_name] ([instance_num])")
|
||||
else
|
||||
adult.fully_replace_character_name(name, newname)
|
||||
else
|
||||
adult.key = src.key
|
||||
|
||||
for (var/obj/item/W in src.contents)
|
||||
src.drop_from_inventory(W)
|
||||
|
||||
for(var/datum/language/L in languages)
|
||||
adult.add_language(L.name)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/mob/living/carbon/alien/proc/update_progression()
|
||||
if(amount_grown < max_grown)
|
||||
amount_grown++
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/proc/confirm_evolution()
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/proc/show_evolution_blurb()
|
||||
return
|
||||
@@ -1,20 +0,0 @@
|
||||
/mob/living/carbon/alien/regenerate_icons()
|
||||
cut_overlays()
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/alien/update_icons()
|
||||
|
||||
var/state = 0
|
||||
if(amount_grown > max_grown*0.75)
|
||||
state = 2
|
||||
else if(amount_grown > max_grown*0.25)
|
||||
state = 1
|
||||
|
||||
if(stat == DEAD)
|
||||
icon_state = "[initial(icon_state)][state]_dead"
|
||||
else if (stunned)
|
||||
icon_state = "[initial(icon_state)][state]_stun"
|
||||
else if(lying || resting)
|
||||
icon_state = "[initial(icon_state)][state]_sleep"
|
||||
else
|
||||
icon_state = "[initial(icon_state)][state]"
|
||||
@@ -117,7 +117,6 @@
|
||||
return
|
||||
M.put_in_active_hand(G)
|
||||
G.synch()
|
||||
LAssailant = M
|
||||
|
||||
H.do_attack_animation(src)
|
||||
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
/mob/living/carbon/human/proc/diona_split_into_nymphs(var/number_of_resulting_nymphs)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
var/mob/living/carbon/alien/diona/S = new(T)
|
||||
var/mob/living/carbon/diona/S = new(T)
|
||||
S.set_dir(dir)
|
||||
transfer_languages(src, S)
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
|
||||
var/nymphs = 1
|
||||
|
||||
for(var/mob/living/carbon/alien/diona/D in src)
|
||||
for(var/mob/living/carbon/diona/D in src)
|
||||
nymphs++
|
||||
D.forceMove(T)
|
||||
transfer_languages(src, D, WHITELISTED|RESTRICTED)
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
if(nymphs < number_of_resulting_nymphs)
|
||||
for(var/i in nymphs to (number_of_resulting_nymphs - 1))
|
||||
var/mob/M = new /mob/living/carbon/alien/diona(T)
|
||||
var/mob/M = new /mob/living/carbon/diona(T)
|
||||
transfer_languages(src, M, WHITELISTED|RESTRICTED)
|
||||
M.set_dir(pick(NORTH, SOUTH, EAST, WEST))
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
//These only pertain to common. Languages are handled by mob/say_understands()
|
||||
if(!speaking)
|
||||
if(istype(other, /mob/living/carbon/alien/diona))
|
||||
if(istype(other, /mob/living/carbon/diona))
|
||||
if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
|
||||
return TRUE
|
||||
if(issilicon(other))
|
||||
|
||||
@@ -589,7 +589,7 @@
|
||||
)
|
||||
|
||||
/datum/species/diona/can_understand(var/mob/other)
|
||||
if(istype(other, /mob/living/carbon/alien/diona))
|
||||
if(istype(other, /mob/living/carbon/diona))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -605,7 +605,7 @@
|
||||
|
||||
/datum/species/diona/handle_death(var/mob/living/carbon/human/H)
|
||||
|
||||
var/mob/living/carbon/alien/diona/S = new(get_turf(H))
|
||||
var/mob/living/carbon/diona/S = new(get_turf(H))
|
||||
|
||||
if(H.mind)
|
||||
H.mind.transfer_to(S)
|
||||
@@ -624,7 +624,7 @@
|
||||
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/alien/diona/D in H.contents)
|
||||
for(var/mob/living/carbon/diona/D in H.contents)
|
||||
if(D.client)
|
||||
D.forceMove(get_turf(H))
|
||||
else
|
||||
|
||||
130
code/modules/mob/living/carbon/nymph/diona.dm
Normal file
130
code/modules/mob/living/carbon/nymph/diona.dm
Normal file
@@ -0,0 +1,130 @@
|
||||
var/global/list/_nymph_default_emotes = list(
|
||||
/decl/emote/visible,
|
||||
/decl/emote/visible/scratch,
|
||||
/decl/emote/visible/drool,
|
||||
/decl/emote/visible/nod,
|
||||
/decl/emote/visible/sway,
|
||||
/decl/emote/visible/sulk,
|
||||
/decl/emote/visible/twitch,
|
||||
/decl/emote/visible/dance,
|
||||
/decl/emote/visible/roll,
|
||||
/decl/emote/visible/shake,
|
||||
/decl/emote/visible/jump,
|
||||
/decl/emote/visible/shiver,
|
||||
/decl/emote/visible/collapse,
|
||||
/decl/emote/visible/spin,
|
||||
/decl/emote/visible/sidestep,
|
||||
/decl/emote/audible/hiss,
|
||||
/decl/emote/audible,
|
||||
/decl/emote/audible/scretch,
|
||||
/decl/emote/audible/choke,
|
||||
/decl/emote/audible/gnarl,
|
||||
/decl/emote/audible/bug_hiss,
|
||||
/decl/emote/audible/bug_chitter,
|
||||
/decl/emote/audible/chirp
|
||||
)
|
||||
|
||||
/mob/living/carbon/diona
|
||||
name = "diona nymph"
|
||||
voice_name = "diona nymph"
|
||||
speak_emote = list("chirrups")
|
||||
icon_state = "nymph"
|
||||
item_state = "nymph"
|
||||
species_language = LANGUAGE_ROOTLOCAL
|
||||
only_species_language = TRUE
|
||||
gender = NEUTER
|
||||
|
||||
can_pull_size = ITEMSIZE_SMALL
|
||||
can_pull_mobs = MOB_PULL_SMALLER
|
||||
|
||||
holder_type = /obj/item/holder/diona
|
||||
var/obj/item/hat
|
||||
|
||||
pass_flags = PASSTABLE
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
mob_size = 4
|
||||
|
||||
inventory_panel_type = null // Disable inventory by default
|
||||
|
||||
var/can_namepick_as_adult = TRUE
|
||||
var/adult_name = "diona gestalt"
|
||||
var/death_msg = "expires with a pitiful chirrup..."
|
||||
|
||||
var/amount_grown = 0
|
||||
var/max_grown = 200
|
||||
var/time_of_birth
|
||||
var/instance_num
|
||||
|
||||
|
||||
/mob/living/carbon/diona/get_available_emotes()
|
||||
return global._nymph_default_emotes
|
||||
|
||||
|
||||
/mob/living/carbon/diona/Initialize()
|
||||
. = ..()
|
||||
time_of_birth = world.time
|
||||
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
verbs += /mob/living/carbon/diona/proc/merge
|
||||
|
||||
instance_num = rand(1, 1000)
|
||||
name = "[initial(name)] ([instance_num])"
|
||||
real_name = name
|
||||
regenerate_icons()
|
||||
|
||||
species = GLOB.all_species[SPECIES_DIONA]
|
||||
add_language(LANGUAGE_ROOTGLOBAL)
|
||||
add_language(LANGUAGE_GALCOM)
|
||||
|
||||
|
||||
/mob/living/carbon/diona/put_in_hands(var/obj/item/W) // No hands.
|
||||
W.loc = get_turf(src)
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/diona/proc/wear_hat(var/obj/item/new_hat)
|
||||
if(hat)
|
||||
return
|
||||
hat = new_hat
|
||||
new_hat.loc = src
|
||||
update_icons()
|
||||
|
||||
|
||||
/mob/living/carbon/diona/proc/handle_npc(var/mob/living/carbon/diona/D)
|
||||
if(D.stat != CONSCIOUS)
|
||||
return
|
||||
if(prob(33) && D.canmove && isturf(D.loc) && !D.pulledby) //won't move if being pulled
|
||||
step(D, pick(cardinal))
|
||||
if(prob(1))
|
||||
D.emote(pick("scratch","jump","chirp","roll"))
|
||||
|
||||
|
||||
/mob/living/carbon/diona/u_equip(obj/item/W as obj)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/diona/Stat()
|
||||
..()
|
||||
stat(null, "Progress: [amount_grown]/[max_grown]")
|
||||
|
||||
|
||||
/mob/living/carbon/diona/get_default_language()
|
||||
if(default_language)
|
||||
return default_language
|
||||
return GLOB.all_languages["Skathari"]
|
||||
|
||||
|
||||
/mob/living/carbon/diona/say_quote(var/message, var/datum/language/speaking = null)
|
||||
var/verb = pick(speak_emote)
|
||||
var/ending = copytext(message, length(message))
|
||||
if(speaking && (speaking.name != "Galactic Common"))
|
||||
verb = speaking.get_spoken_verb(ending)
|
||||
else if(ending == "?")
|
||||
verb += " curiously"
|
||||
return verb
|
||||
|
||||
|
||||
/mob/living/carbon/diona/death(gibbed)
|
||||
return ..(gibbed,death_msg)
|
||||
103
code/modules/mob/living/carbon/nymph/diona_attacks.dm
Normal file
103
code/modules/mob/living/carbon/nymph/diona_attacks.dm
Normal file
@@ -0,0 +1,103 @@
|
||||
/mob/living/carbon/diona/MouseDrop(var/atom/over_object)
|
||||
var/mob/living/carbon/human/H = over_object
|
||||
if(!istype(H) || !Adjacent(H))
|
||||
return ..()
|
||||
if(H.a_intent == "grab" && hat && !H.hands_are_full())
|
||||
hat.loc = get_turf(src)
|
||||
H.put_in_hands(hat)
|
||||
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
|
||||
hat = null
|
||||
updateicon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/carbon/diona/attackby(var/obj/item/W, var/mob/user)
|
||||
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
|
||||
if(hat)
|
||||
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
|
||||
return
|
||||
user.unEquip(W)
|
||||
wear_hat(W)
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/carbon/diona/attack_ui(slot_id)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/diona/attack_hand(mob/living/carbon/M as mob)
|
||||
..()
|
||||
switch(M.a_intent)
|
||||
if(I_HELP)
|
||||
help_shake_act(M)
|
||||
|
||||
if(I_GRAB)
|
||||
if(M == src)
|
||||
return
|
||||
var/obj/item/grab/G = new /obj/item/grab(M, src)
|
||||
|
||||
M.put_in_active_hand(G)
|
||||
|
||||
grabbed_by += G
|
||||
G.affecting = src
|
||||
G.synch()
|
||||
|
||||
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
src.visible_message(
|
||||
SPAN_WARNING("[M] grabs \the [src] passively!"),
|
||||
SPAN_WARNING("You grab \the [src].")
|
||||
)
|
||||
|
||||
else
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(10))
|
||||
playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
src.visible_message(
|
||||
SPAN_DANGER("[M] attempts to punch \the [src], but missed!"),
|
||||
SPAN_DANGER("You failed to punch \the [src]!")
|
||||
)
|
||||
return
|
||||
|
||||
playsound(src, "punch", 25, 1, -1)
|
||||
if (damage > 4.9)
|
||||
Weaken(rand(10,15))
|
||||
src.visible_message(
|
||||
SPAN_DANGER("[M] punches \the [src]!"),
|
||||
SPAN_DANGER("You punch \the [src].")
|
||||
)
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/diona/ex_act(severity)
|
||||
if(!blinded)
|
||||
flash_eyes()
|
||||
|
||||
var/b_loss = 0
|
||||
var/f_loss = 0
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
b_loss = 500
|
||||
gib()
|
||||
return
|
||||
|
||||
if(2.0)
|
||||
b_loss = 60
|
||||
f_loss = 60
|
||||
ear_damage += 30
|
||||
ear_deaf += 120
|
||||
|
||||
if(3.0)
|
||||
b_loss = 30
|
||||
if(prob(50))
|
||||
Paralyse(1)
|
||||
ear_damage += 15
|
||||
ear_deaf += 60
|
||||
|
||||
adjustBruteLoss(b_loss)
|
||||
adjustFireLoss(f_loss)
|
||||
updatehealth()
|
||||
@@ -1,6 +1,5 @@
|
||||
//Verbs after this point.
|
||||
/mob/living/carbon/alien/diona/proc/merge()
|
||||
|
||||
/mob/living/carbon/diona/proc/merge()
|
||||
set category = "Abilities"
|
||||
set name = "Merge with gestalt"
|
||||
set desc = "Merge with another diona."
|
||||
@@ -9,7 +8,7 @@
|
||||
return
|
||||
|
||||
if(istype(src.loc,/mob/living/carbon))
|
||||
src.verbs -= /mob/living/carbon/alien/diona/proc/merge
|
||||
src.verbs -= /mob/living/carbon/diona/proc/merge
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
@@ -29,18 +28,19 @@
|
||||
else if(!do_merge(M))
|
||||
to_chat(src, "You fail to merge with \the [M]...")
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H)
|
||||
|
||||
/mob/living/carbon/diona/proc/do_merge(var/mob/living/carbon/human/H)
|
||||
if(!istype(H) || !src || !(src.Adjacent(H)))
|
||||
return 0
|
||||
to_chat(H, "You feel your being twine with that of \the [src] as it merges with your biomass.")
|
||||
to_chat(src, "You feel your being twine with that of \the [H] as you merge with its biomass.")
|
||||
loc = H
|
||||
verbs += /mob/living/carbon/alien/diona/proc/split
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/merge
|
||||
return 1
|
||||
verbs += /mob/living/carbon/diona/proc/split
|
||||
verbs -= /mob/living/carbon/diona/proc/merge
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/split()
|
||||
|
||||
/mob/living/carbon/diona/proc/split()
|
||||
set category = "Abilities"
|
||||
set name = "Split from gestalt"
|
||||
set desc = "Split away from your gestalt as a lone nymph."
|
||||
@@ -49,7 +49,7 @@
|
||||
return
|
||||
|
||||
if(!(istype(src.loc,/mob/living/carbon)))
|
||||
src.verbs -= /mob/living/carbon/alien/diona/proc/split
|
||||
src.verbs -= /mob/living/carbon/diona/proc/split
|
||||
return
|
||||
|
||||
to_chat(src.loc, "You feel a pang of loss as [src] splits away from your biomass.")
|
||||
@@ -58,8 +58,8 @@
|
||||
var/mob/living/M = src.loc
|
||||
|
||||
src.loc = get_turf(src)
|
||||
src.verbs -= /mob/living/carbon/alien/diona/proc/split
|
||||
src.verbs += /mob/living/carbon/alien/diona/proc/merge
|
||||
src.verbs -= /mob/living/carbon/diona/proc/split
|
||||
src.verbs += /mob/living/carbon/diona/proc/merge
|
||||
|
||||
if(istype(M))
|
||||
for(var/atom/A in M.contents)
|
||||
144
code/modules/mob/living/carbon/nymph/life.dm
Normal file
144
code/modules/mob/living/carbon/nymph/life.dm
Normal file
@@ -0,0 +1,144 @@
|
||||
//Dionaea regenerate health and nutrition in light.
|
||||
/mob/living/carbon/diona/handle_environment(datum/gas_mixture/environment)
|
||||
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
||||
if(isturf(loc)) //else, there's considered to be no light
|
||||
var/turf/T = loc
|
||||
light_amount = T.get_lumcount() * 5
|
||||
|
||||
adjust_nutrition(light_amount)
|
||||
|
||||
if(light_amount > 2) //if there's enough light, heal
|
||||
adjustBruteLoss(-1)
|
||||
adjustFireLoss(-1)
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
|
||||
if(!client)
|
||||
handle_npc(src)
|
||||
|
||||
|
||||
// Alien larva are quite simple.
|
||||
/mob/living/carbon/diona/Life()
|
||||
set invisibility = 0
|
||||
set background = 1
|
||||
if(transforming || !loc)
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
if (stat != DEAD)
|
||||
update_progression() // GROW!
|
||||
|
||||
blinded = 0
|
||||
update_icons()
|
||||
|
||||
|
||||
/mob/living/carbon/diona/handle_mutations_and_radiation()
|
||||
// Currently Dionaea like to eat radiation
|
||||
if(!radiation)
|
||||
return
|
||||
|
||||
var/rads = radiation/25
|
||||
radiation -= rads
|
||||
adjust_nutrition(rads)
|
||||
heal_overall_damage(rads,rads)
|
||||
adjustOxyLoss(-(rads))
|
||||
adjustToxLoss(-(rads))
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/diona/handle_regular_status_updates()
|
||||
if(stat == DEAD)
|
||||
SetBlinded(TRUE)
|
||||
silent = FALSE
|
||||
return TRUE
|
||||
|
||||
updatehealth()
|
||||
if(health <= 0)
|
||||
death()
|
||||
return handle_regular_status_updates()
|
||||
|
||||
if(paralysis > 0)
|
||||
SetBlinded(TRUE)
|
||||
set_stat(UNCONSCIOUS)
|
||||
adjustHalLoss(-3)
|
||||
|
||||
if(sleeping)
|
||||
adjustHalLoss(-3)
|
||||
if(mind && mind.active && client)
|
||||
AdjustSleeping(-1)
|
||||
SetBlinded(TRUE)
|
||||
set_stat(UNCONSCIOUS)
|
||||
else if(resting)
|
||||
adjustHalLoss(-3)
|
||||
else
|
||||
set_stat(CONSCIOUS)
|
||||
adjustHalLoss(-1)
|
||||
|
||||
// Eyes and blindness.
|
||||
if(!has_eyes())
|
||||
SetBlinded(TRUE)
|
||||
eye_blurry = TRUE
|
||||
else if(eye_blind)
|
||||
AdjustBlinded(-1)
|
||||
else if(eye_blurry)
|
||||
eye_blurry = max(eye_blurry-1, 0)
|
||||
|
||||
update_icons()
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/diona/handle_regular_hud_updates()
|
||||
if(stat == DEAD)
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
else
|
||||
sight &= ~SEE_TURFS
|
||||
sight &= ~SEE_MOBS
|
||||
sight &= ~SEE_OBJS
|
||||
see_in_dark = 2
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if(healths)
|
||||
if(stat == DEAD)
|
||||
healths.icon_state = "health7"
|
||||
else
|
||||
var/health_index = round((1 - health / maxHealth) * 5, 1)
|
||||
healths.icon_state = "health[health_index]"
|
||||
|
||||
if(client)
|
||||
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
|
||||
|
||||
if (stat != DEAD)
|
||||
if ((blinded))
|
||||
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
|
||||
else
|
||||
clear_fullscreen("blind")
|
||||
set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, TRUE)
|
||||
set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry)
|
||||
set_fullscreen(druggy, "high", /obj/screen/fullscreen/high)
|
||||
if(machine?.check_eye(src) < 0 || (client && !client.adminobs))
|
||||
reset_view(null)
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/diona/handle_environment(var/datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
|
||||
if(environment.temperature > (T0C+66))
|
||||
adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing.
|
||||
throw_alert("alien_fire", /obj/screen/alert/alien_fire)
|
||||
if(prob(20))
|
||||
to_chat(src,SPAN_DANGER( "You feel a searing heat!"))
|
||||
else
|
||||
clear_alert("alien_fire")
|
||||
|
||||
|
||||
/mob/living/carbon/diona/handle_fire()
|
||||
. = ..()
|
||||
if(!.) // True == Not on fire
|
||||
bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up!
|
||||
74
code/modules/mob/living/carbon/nymph/progression.dm
Normal file
74
code/modules/mob/living/carbon/nymph/progression.dm
Normal file
@@ -0,0 +1,74 @@
|
||||
/mob/living/carbon/diona/proc/confirm_evolution()
|
||||
if(!is_alien_whitelisted(src, GLOB.all_species[SPECIES_DIONA]))
|
||||
alert(src, "You are currently not whitelisted to play as a full diona.")
|
||||
return null
|
||||
|
||||
if(amount_grown < max_grown)
|
||||
to_chat(src, "You are not yet ready for your growth...")
|
||||
return null
|
||||
|
||||
src.split()
|
||||
|
||||
if(istype(loc,/obj/item/holder/diona))
|
||||
var/obj/item/holder/diona/L = loc
|
||||
src.loc = L.loc
|
||||
qdel(L)
|
||||
|
||||
src.visible_message(
|
||||
SPAN_WARNING("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea."),
|
||||
SPAN_WARNING("You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
|
||||
)
|
||||
return SPECIES_DIONA
|
||||
|
||||
|
||||
/mob/living/carbon/diona/verb/evolve()
|
||||
set name = "Evolve"
|
||||
set desc = "Evolve into your adult form."
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
if(handcuffed || legcuffed)
|
||||
to_chat(src, SPAN_WARNING("You cannot evolve when you are cuffed."))
|
||||
return
|
||||
|
||||
if(amount_grown < max_grown)
|
||||
to_chat(src, SPAN_WARNING("You are not fully grown."))
|
||||
return
|
||||
|
||||
// confirm_evolution() handles choices and other specific requirements.
|
||||
var/new_species = confirm_evolution()
|
||||
if(!new_species)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/adult = new /mob/living/carbon/human(get_turf(src))
|
||||
adult.set_species(new_species)
|
||||
|
||||
transfer_languages(src, adult)
|
||||
|
||||
if(src.faction != "neutral")
|
||||
adult.faction = src.faction
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(adult)
|
||||
if(can_namepick_as_adult)
|
||||
var/newname = sanitize(input(adult, "You have become an adult. Choose a name for yourself.", "Adult Name") as null|text, MAX_NAME_LEN)
|
||||
|
||||
if(!newname)
|
||||
adult.fully_replace_character_name(name, "[src.adult_name] ([instance_num])")
|
||||
else
|
||||
adult.fully_replace_character_name(name, newname)
|
||||
else
|
||||
adult.key = src.key
|
||||
|
||||
for (var/obj/item/W in src.contents)
|
||||
src.drop_from_inventory(W)
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
/mob/living/carbon/diona/proc/update_progression()
|
||||
if(amount_grown < max_grown)
|
||||
amount_grown++
|
||||
return
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/carbon/alien/diona/say_understands(var/mob/other, var/datum/language/speaking = null)
|
||||
/mob/living/carbon/diona/say_understands(var/mob/other, var/datum/language/speaking = null)
|
||||
if(ishuman(other) && !speaking)
|
||||
if(languages.len >= 2) // They have sucked down some blood.
|
||||
return TRUE
|
||||
@@ -1,5 +1,4 @@
|
||||
/mob/living/carbon/alien/diona/update_icons()
|
||||
|
||||
/mob/living/carbon/diona/update_icons()
|
||||
if(stat == DEAD)
|
||||
icon_state = "[initial(icon_state)]_dead"
|
||||
else if(lying || resting || stunned)
|
||||
@@ -10,3 +9,8 @@
|
||||
cut_overlays()
|
||||
if(hat)
|
||||
add_overlay(get_hat_icon(hat, 0, -8))
|
||||
|
||||
|
||||
/mob/living/carbon/diona/regenerate_icons()
|
||||
cut_overlays()
|
||||
update_icons()
|
||||
@@ -81,11 +81,7 @@
|
||||
to_chat(src, "<font color='blue'>You are not injured enough to succumb to death!</font>")
|
||||
|
||||
/mob/living/proc/updatehealth()
|
||||
if(status_flags & GODMODE)
|
||||
health = 100
|
||||
set_stat(CONSCIOUS)
|
||||
else
|
||||
health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss
|
||||
health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss
|
||||
|
||||
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
|
||||
//affects them once clothing is factored in. ~Errorage
|
||||
@@ -149,8 +145,6 @@
|
||||
|
||||
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
|
||||
/mob/living/proc/adjustBruteLoss(var/amount,var/include_robo)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
|
||||
if(amount > 0)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_damage_percent))
|
||||
@@ -169,7 +163,6 @@
|
||||
return oxyloss
|
||||
|
||||
/mob/living/proc/adjustOxyLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
|
||||
if(amount > 0)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
@@ -186,14 +179,12 @@
|
||||
updatehealth()
|
||||
|
||||
/mob/living/proc/setOxyLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
oxyloss = amount
|
||||
|
||||
/mob/living/proc/getToxLoss()
|
||||
return toxloss
|
||||
|
||||
/mob/living/proc/adjustToxLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
|
||||
if(amount > 0)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
@@ -210,7 +201,6 @@
|
||||
updatehealth()
|
||||
|
||||
/mob/living/proc/setToxLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
toxloss = amount
|
||||
|
||||
/mob/living/proc/getFireLoss()
|
||||
@@ -224,7 +214,6 @@
|
||||
|
||||
//'include_robo' only applies to healing, for legacy purposes, as all damage typically hurts both types of organs
|
||||
/mob/living/proc/adjustFireLoss(var/amount,var/include_robo)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(amount > 0)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_damage_percent))
|
||||
@@ -243,8 +232,6 @@
|
||||
return cloneloss
|
||||
|
||||
/mob/living/proc/adjustCloneLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
|
||||
if(amount > 0)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_damage_percent))
|
||||
@@ -260,25 +247,21 @@
|
||||
updatehealth()
|
||||
|
||||
/mob/living/proc/setCloneLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
cloneloss = amount
|
||||
|
||||
/mob/living/proc/getBrainLoss()
|
||||
return brainloss
|
||||
|
||||
/mob/living/proc/adjustBrainLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
brainloss = min(max(brainloss + amount, 0),(getMaxHealth()*2))
|
||||
|
||||
/mob/living/proc/setBrainLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
brainloss = amount
|
||||
|
||||
/mob/living/proc/getHalLoss()
|
||||
return halloss
|
||||
|
||||
/mob/living/proc/adjustHalLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(amount > 0)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_damage_percent))
|
||||
@@ -295,7 +278,6 @@
|
||||
updatehealth()
|
||||
|
||||
/mob/living/proc/setHalLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
halloss = amount
|
||||
|
||||
// Use this to get a mob's max health whenever possible. Reading maxHealth directly will give inaccurate results if any modifiers exist.
|
||||
|
||||
@@ -124,8 +124,6 @@ default behaviour is:
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
|
||||
now_pushing = 0
|
||||
. = ..()
|
||||
if (!istype(AM, /atom/movable) || AM.anchored)
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
|
||||
G.synch()
|
||||
G.affecting = src
|
||||
LAssailant = L
|
||||
|
||||
L.visible_message(SPAN_WARNING("\The [L] has grabbed [src] passively!"))
|
||||
L.do_attack_animation(src)
|
||||
|
||||
@@ -108,7 +108,6 @@
|
||||
|
||||
// G.synch()
|
||||
// G.affecting = victim
|
||||
// victim.LAssailant = src
|
||||
|
||||
// visible_message("<span class='warning'>\The [src] seizes \the [victim] aggressively!</span>")
|
||||
// do_attack_animation(victim)
|
||||
|
||||
@@ -528,11 +528,6 @@
|
||||
to_chat(src, "<span class='warning'>Somebody has a grip on them!</span>")
|
||||
return
|
||||
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = usr
|
||||
|
||||
else if(isobj(AM))
|
||||
var/obj/I = AM
|
||||
if(!can_pull_size || can_pull_size < I.w_class)
|
||||
|
||||
@@ -165,9 +165,6 @@
|
||||
statpanel("[P.panel]","",P)
|
||||
*/
|
||||
|
||||
//The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition)
|
||||
var/mob/living/carbon/LAssailant = null
|
||||
|
||||
//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button
|
||||
var/list/spell/spell_list = list()
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
return 0
|
||||
|
||||
spawn(1) // So it has time to be thrown about by the gib() proc.
|
||||
var/mob/living/carbon/alien/diona/D = new(target)
|
||||
var/mob/living/carbon/diona/D = new(target)
|
||||
var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
|
||||
P.request_player(D, "A diona nymph has split off from its gestalt. ")
|
||||
spawn(60)
|
||||
|
||||
@@ -542,7 +542,7 @@
|
||||
var/obj/item/holder/diona/N = tool
|
||||
var/obj/item/organ/internal/brain/cephalon/cephalon = new(target, 1)
|
||||
target.internal_organs_by_name["brain"] = cephalon
|
||||
var/mob/living/carbon/alien/diona/D = N.held_mob
|
||||
var/mob/living/carbon/diona/D = N.held_mob
|
||||
user.drop_from_inventory(tool)
|
||||
|
||||
if(D && D.mind)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"aa" = (/obj/effect/floor_decal/techfloor{dir = 1},/mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/emp,/turf/simulated/shuttle/floor/alienplating/external,/area/submap/DerelictEngine)
|
||||
"ab" = (/mob/living/simple_mob/humanoid/merc/melee/sword/poi{health = 15; maxHealth = 15},/turf/simulated/floor/tiled/techfloor,/area/submap/DerelictEngine)
|
||||
"am" = (/mob/living/carbon/alien/diona{adult_name = "Schmeinkie"; can_namepick_as_adult = 0; desc = "An overfed diona nymph that looks weirdly like scrumbulous, currently has a hollocollar tagged 'Schmeinkie' on it"; faction = "hivebot"; health = 150; maxHealth = 150; name = "Schmeinkie"; voice_name = "Schmeinkie"},/turf/simulated/floor/greengrid,/area/submap/DerelictEngine)
|
||||
"am" = (/mob/living/carbon/diona{adult_name = "Schmeinkie"; can_namepick_as_adult = 0; desc = "An overfed diona nymph that looks weirdly like scrumbulous, currently has a hollocollar tagged 'Schmeinkie' on it"; faction = "hivebot"; health = 150; maxHealth = 150; name = "Schmeinkie"; voice_name = "Schmeinkie"},/turf/simulated/floor/greengrid,/area/submap/DerelictEngine)
|
||||
"an" = (/obj/effect/floor_decal/techfloor/orange{dir = 10},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/submap/DerelictEngine)
|
||||
"ap" = (/mob/living/simple_mob/mechanical/hivebot/swarm,/turf/template_noop,/area/template_noop)
|
||||
"aG" = (/obj/effect/decal/cleanable/generic,/obj/structure/table/alien,/turf/simulated/shuttle/floor/alienplating/external,/area/submap/DerelictEngine)
|
||||
|
||||
25
polaris.dme
25
polaris.dme
@@ -2307,24 +2307,6 @@
|
||||
#include "code\modules\mob\living\carbon\shock.dm"
|
||||
#include "code\modules\mob\living\carbon\taste.dm"
|
||||
#include "code\modules\mob\living\carbon\viruses.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\alien.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\alien_attacks.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\alien_damage.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\death.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\emote.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\life.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\progression.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\update_icons.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\diona.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\life.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\progression.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\larva\larva.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\larva\life.dm"
|
||||
#include "code\modules\mob\living\carbon\alien\larva\progression.dm"
|
||||
#include "code\modules\mob\living\carbon\brain\brain.dm"
|
||||
#include "code\modules\mob\living\carbon\brain\death.dm"
|
||||
#include "code\modules\mob\living\carbon\brain\emote.dm"
|
||||
@@ -2387,6 +2369,13 @@
|
||||
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\diona.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\diona_attacks.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\diona_powers.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\life.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\progression.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\say_understands.dm"
|
||||
#include "code\modules\mob\living\carbon\nymph\update_icons.dm"
|
||||
#include "code\modules\mob\living\silicon\death.dm"
|
||||
#include "code\modules\mob\living\silicon\emote.dm"
|
||||
#include "code\modules\mob\living\silicon\laws.dm"
|
||||
|
||||
Reference in New Issue
Block a user