mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-20 20:37:34 +01:00
Unapologetic Diona Buffs (#8090)
Biomass is now less strong. Diona have gotten a ton of minor code improvements, using their abilities should now be a little sane. Diona nymphs don't have to be whitelisted to grow until a full diona now. Administrative action will be taken if this right is abused. Diona gestalts can now use their biomass / arms to create biomass structures. Removed nymphs' ability to open biomass walls. It was buggy.
This commit is contained in:
@@ -397,7 +397,12 @@ var/list/name_to_material
|
||||
icon_colour = null
|
||||
stack_type = null
|
||||
icon_base = "biomass"
|
||||
integrity = 600
|
||||
integrity = 100
|
||||
// below is same as wood
|
||||
melting_point = T0C + 300
|
||||
ignition_point = T0C + 288
|
||||
golem = "Wood Golem"
|
||||
hitsound = 'sound/effects/woodhit.ogg'
|
||||
|
||||
/material/diona/place_dismantled_product()
|
||||
return
|
||||
|
||||
@@ -59,21 +59,6 @@ var/list/holder_mob_icon_cache = list()
|
||||
for(var/mob/M in contents)
|
||||
M.show_inv(usr)
|
||||
|
||||
//Mob specific holders.
|
||||
/obj/item/holder/diona
|
||||
icon = 'icons/mob/diona.dmi'
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
|
||||
slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER
|
||||
|
||||
/obj/item/holder/drone
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
|
||||
|
||||
/obj/item/holder/rat
|
||||
w_class = 1
|
||||
|
||||
/obj/item/holder/borer
|
||||
origin_tech = list(TECH_BIO = 6)
|
||||
|
||||
/obj/item/holder/process()
|
||||
if (!contained)
|
||||
qdel(src)
|
||||
@@ -370,7 +355,7 @@ var/list/holder_mob_icon_cache = list()
|
||||
icon_state = "nymph"
|
||||
icon_state_dead = "nymph_dead"
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
|
||||
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
|
||||
slot_flags = SLOT_HEAD | SLOT_EARS | SLOT_HOLSTER
|
||||
w_class = 2
|
||||
|
||||
/obj/item/holder/drone
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if(istype(M) && M.a_intent == I_HELP && !(src.stat & DEAD))
|
||||
if(M.species && M.species.name == "Diona" && do_merge(M))
|
||||
/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M)
|
||||
if(istype(M) && M.a_intent == I_HELP && !stat)
|
||||
if(M.is_diona() && do_merge(M))
|
||||
return
|
||||
M.visible_message("<span class='notice'>[M] pets the [src]</span>")
|
||||
M.visible_message(span("notice", "[M] pets \the [src]."))
|
||||
return
|
||||
else if (src.stat & DEAD)
|
||||
get_scooped(M)
|
||||
else if (stat == DEAD)
|
||||
get_scooped(M) // GET SCOOPED - geeves
|
||||
..()
|
||||
|
||||
//#TODO-MERGE: Test nymph hats
|
||||
@@ -16,33 +16,31 @@
|
||||
if(H.a_intent == I_HELP)
|
||||
if(H.species && H.species.name == "Diona" && do_merge(H))
|
||||
return
|
||||
get_scooped(H)
|
||||
get_scooped(H) // GET SCOOPED - geeves
|
||||
return
|
||||
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
|
||||
else if(H.a_intent == I_GRAB && hat && !(H.l_hand && H.r_hand))
|
||||
hat.forceMove(get_turf(src))
|
||||
H.put_in_hands(hat)
|
||||
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
|
||||
H.visible_message(span("warning", "\The [H] removes \the [src]'s [hat]."))
|
||||
hat = null
|
||||
update_icons()
|
||||
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(user.a_intent == I_HELP && istype(W, /obj/item/clothing/head))
|
||||
if(hat)
|
||||
to_chat(user, "<span class='warning'>\The [src] is already wearing \the [hat].</span>")
|
||||
to_chat(user, span("warning", "\The [src] is already wearing \the [hat]."))
|
||||
return
|
||||
user.unEquip(W)
|
||||
wear_hat(W)
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [W] on \the [src].</span>")
|
||||
user.visible_message(span("notice", "\The [user] puts \the [W] on \the [src]."))
|
||||
return
|
||||
else if(istype(W, /obj/item/reagent_containers) || istype(W, /obj/item/stack/medical) || istype(W,/obj/item/gripper/))
|
||||
..(W, user)
|
||||
return
|
||||
|
||||
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
|
||||
if(istype(W, /obj/item/material/knife) || istype(W, /obj/item/material/kitchen/utensil/knife ))
|
||||
if(istype(W, /obj/item/material/knife) || istype(W, /obj/item/material/kitchen/utensil/knife))
|
||||
harvest(user)
|
||||
return
|
||||
|
||||
..(W, user)
|
||||
..(W, user)
|
||||
@@ -1,6 +1,5 @@
|
||||
|
||||
#define evolve_nutrition 4000//when a nymph gathers this much nutrition, it can evolve into a gestalt
|
||||
|
||||
#define evolve_nutrition 4000 //when a nymph gathers this much nutrition, it can evolve into a gestalt
|
||||
|
||||
//Diona time variables, these differ slightly between a gestalt and a nymph. All values are times in seconds
|
||||
/mob/living/carbon/alien/diona
|
||||
@@ -8,9 +7,9 @@
|
||||
language = null
|
||||
mob_size = 4
|
||||
density = 0
|
||||
mouth_size = 2//how large of a creature it can swallow at once, and how big of a bite it can take out of larger things
|
||||
eat_types = 0//This is a bitfield which must be initialised in New(). The valid values for it are in devour.dm
|
||||
composition_reagent = "nutriment"//Dionae are plants, so eating them doesn't give animal protein
|
||||
mouth_size = 2 //how large of a creature it can swallow at once, and how big of a bite it can take out of larger things
|
||||
eat_types = 0 //This is a bitfield which must be initialised in New(). The valid values for it are in devour.dm
|
||||
composition_reagent = "nutriment" //Dionae are plants, so eating them doesn't give animal protein
|
||||
name = "diona nymph"
|
||||
voice_name = "diona nymph"
|
||||
adult_form = /mob/living/carbon/human
|
||||
@@ -18,8 +17,8 @@
|
||||
icon = 'icons/mob/diona.dmi'
|
||||
icon_state = "nymph"
|
||||
death_msg = "expires with a pitiful chirrup..."
|
||||
universal_understand = 0
|
||||
universal_speak = 0
|
||||
universal_understand = FALSE
|
||||
universal_speak = FALSE
|
||||
holder_type = /obj/item/holder/diona
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/meat/dionanymph
|
||||
meat_amount = 2
|
||||
@@ -39,11 +38,11 @@
|
||||
var/dark_survival = 216 // How long this diona can survive in darkness after energy is gone, before it dies
|
||||
var/datum/dionastats/DS
|
||||
var/mob/living/carbon/gestalt = null // If set, then this nymph is inside a gestalt
|
||||
var/kept_clean = 0
|
||||
var/kept_clean = FALSE
|
||||
|
||||
var/mob/living/carbon/alien/diona/master_nymph //nymph who owns this nymph if split. AI diona nymphs will follow this nymph, and these nymphs can be controlled by the master.
|
||||
var/list/mob/living/carbon/alien/diona/birds_of_feather = list() //list of all related nymphs
|
||||
var/echo = 0 //if it's an echo nymph, which has unique properties
|
||||
var/echo = FALSE //if it's an echo nymph, which has unique properties
|
||||
var/detached = FALSE
|
||||
|
||||
var/datum/reagents/metabolism/ingested
|
||||
@@ -68,7 +67,7 @@
|
||||
master_nymph = null
|
||||
birds_of_feather.Cut()
|
||||
|
||||
kept_clean = 1
|
||||
kept_clean = TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/alien/diona/flowery/Initialize(var/mapload)
|
||||
@@ -77,13 +76,13 @@
|
||||
/mob/living/carbon/alien/diona/movement_delay()
|
||||
. = ..()
|
||||
switch(m_intent)
|
||||
if ("walk")
|
||||
if("walk")
|
||||
. += 3
|
||||
if ("run")
|
||||
if("run")
|
||||
species.handle_sprint_cost(src,.+config.walk_speed)
|
||||
|
||||
/mob/living/carbon/alien/diona/ex_act(severity)
|
||||
if (life_tick < 4)
|
||||
if(life_tick < 4)
|
||||
//If a nymph was just born, then it already took damage from the ex_act on its gestalt
|
||||
//So we ignore any farther damage for a couple ticks after its born, to prevent it getting hit twice by the same blast
|
||||
return
|
||||
@@ -98,7 +97,7 @@
|
||||
set_species("Diona")
|
||||
setup_dionastats()
|
||||
eat_types |= TYPE_ORGANIC
|
||||
nutrition = 0//We dont start with biomass
|
||||
nutrition = 0 //We dont start with biomass
|
||||
update_verbs()
|
||||
sampled_DNA = list()
|
||||
language_progress = list()
|
||||
@@ -119,26 +118,24 @@
|
||||
else if (light <= 3)
|
||||
to_chat(usr, span("notice", "This light is comfortable and warm, Quite adequate for our needs."))
|
||||
else
|
||||
to_chat(usr, span("notice", "This warm radiance is bliss. Here we are safe and energised! Stay a while.."))
|
||||
to_chat(usr, span("notice", "This warm radiance is bliss. Here we are safe and energised! Stay a while..."))
|
||||
|
||||
/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM)
|
||||
//TODO: Collapse these checks into one proc (see pai and drone)
|
||||
if(istype(AM,/obj/item))
|
||||
var/obj/item/O = AM
|
||||
if(O.w_class > 2)
|
||||
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
|
||||
to_chat(src, span("warning", "You are too small to pull that."))
|
||||
return
|
||||
else
|
||||
..()
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You are too small to pull that.</span>")
|
||||
to_chat(src, span("warning", "You are too small to pull that."))
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
|
||||
W.forceMove(get_turf(src))
|
||||
return 1
|
||||
|
||||
|
||||
return TRUE
|
||||
|
||||
//Functions duplicated from humans, albeit slightly modified
|
||||
/mob/living/carbon/alien/diona/proc/set_species(var/new_species)
|
||||
@@ -156,8 +153,7 @@
|
||||
new_species = "Human"
|
||||
|
||||
if(species)
|
||||
|
||||
if(species.name && species.name == new_species)
|
||||
if(species.name == new_species)
|
||||
return
|
||||
if(species.language)
|
||||
remove_language(species.language)
|
||||
@@ -175,28 +171,20 @@
|
||||
holder_type = species.holder_type
|
||||
|
||||
icon_state = lowertext(species.name)
|
||||
|
||||
species.handle_post_spawn(src)
|
||||
|
||||
maxHealth = species.total_health
|
||||
|
||||
|
||||
spawn(0)
|
||||
regenerate_icons()
|
||||
make_blood()
|
||||
regenerate_icons()
|
||||
make_blood()
|
||||
|
||||
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
|
||||
if(client && client.screen)
|
||||
if(client?.screen)
|
||||
client.screen.len = null
|
||||
if(hud_used)
|
||||
qdel(hud_used)
|
||||
hud_used = new /datum/hud(src)
|
||||
|
||||
|
||||
if(species)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return !!species
|
||||
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/make_blood()
|
||||
@@ -227,23 +215,23 @@
|
||||
B.color = B.data["blood_colour"]
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/setup_dionastats()
|
||||
var/MLS = (1.5 / 2.1)//Maximum energy lost per second, in total darkness
|
||||
var/MLS = (1.5 / 2.1) //Maximum energy lost per second, in total darkness
|
||||
DS = new/datum/dionastats()
|
||||
DS.max_energy = energy_duration * MLS
|
||||
DS.stored_energy = (DS.max_energy / 2)
|
||||
DS.max_health = maxHealth
|
||||
DS.pain_factor = (50 / dark_consciousness) / MLS
|
||||
DS.trauma_factor = (DS.max_health / dark_survival) / MLS
|
||||
DS.dionatype = 1//Nymph
|
||||
DS.dionatype = DIONA_NYMPH
|
||||
|
||||
//This is called periodically to register or remove this nymph's status as a bad organ of the gestalt
|
||||
//This is used to notify the gestalt when it needs repaired
|
||||
/mob/living/carbon/alien/diona/proc/check_status_as_organ()
|
||||
if (istype(gestalt, /mob/living/carbon/human) && !QDELETED(gestalt))
|
||||
if(ishuman(gestalt) && !QDELETED(gestalt))
|
||||
var/mob/living/carbon/human/H = gestalt
|
||||
if(!H.bad_internal_organs)
|
||||
return
|
||||
if (health < maxHealth)
|
||||
if(health < maxHealth)
|
||||
if (!(src in H.bad_internal_organs))
|
||||
H.bad_internal_organs.Add(src)
|
||||
else
|
||||
@@ -252,55 +240,41 @@
|
||||
|
||||
//This function makes sure the nymph has the correct split/merge verbs, depending on whether or not its part of a gestalt
|
||||
/mob/living/carbon/alien/diona/proc/update_verbs()
|
||||
if (gestalt && !detached)
|
||||
if (!(/mob/living/carbon/alien/diona/proc/split in verbs))
|
||||
verbs.Add(/mob/living/carbon/alien/diona/proc/split)
|
||||
|
||||
verbs.Remove(/mob/living/proc/ventcrawl)
|
||||
verbs.Remove(/mob/living/proc/hide)
|
||||
verbs.Remove(/mob/living/carbon/alien/diona/proc/grow)
|
||||
verbs.Remove(/mob/living/carbon/alien/diona/proc/merge)
|
||||
verbs.Remove(/mob/living/carbon/proc/absorb_nymph)
|
||||
verbs.Remove(/mob/living/carbon/alien/diona/proc/sample)
|
||||
if(gestalt && !detached)
|
||||
verbs -= /mob/living/proc/ventcrawl
|
||||
verbs -= /mob/living/proc/hide
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/grow
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/merge
|
||||
verbs -= /mob/living/carbon/proc/absorb_nymph
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/sample
|
||||
verbs |= /mob/living/carbon/alien/diona/proc/split
|
||||
else
|
||||
if (!(/mob/living/carbon/alien/diona/proc/merge in verbs) && !detached)
|
||||
verbs.Add(/mob/living/carbon/alien/diona/proc/merge)
|
||||
verbs |= /mob/living/carbon/alien/diona/proc/merge
|
||||
verbs |= /mob/living/carbon/proc/absorb_nymph
|
||||
verbs |= /mob/living/carbon/alien/diona/proc/grow
|
||||
verbs |= /mob/living/proc/ventcrawl
|
||||
verbs |= /mob/living/proc/hide
|
||||
verbs |= /mob/living/carbon/alien/diona/proc/sample
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/split // we want to remove this one
|
||||
|
||||
if (!(/mob/living/carbon/proc/absorb_nymph in verbs))
|
||||
verbs.Add(/mob/living/carbon/proc/absorb_nymph)
|
||||
|
||||
if (!(/mob/living/carbon/alien/diona/proc/grow in verbs))
|
||||
verbs.Add(/mob/living/carbon/alien/diona/proc/grow)
|
||||
|
||||
if (!(/mob/living/proc/ventcrawl in verbs))
|
||||
verbs.Add(/mob/living/proc/ventcrawl)
|
||||
|
||||
if (!(/mob/living/proc/hide in verbs))
|
||||
verbs.Add(/mob/living/proc/hide)
|
||||
|
||||
if (!(/mob/living/carbon/alien/diona/proc/sample in verbs))
|
||||
verbs.Add(/mob/living/carbon/alien/diona/proc/sample)
|
||||
|
||||
verbs.Remove(/mob/living/carbon/alien/diona/proc/split)
|
||||
|
||||
verbs.Remove(/mob/living/carbon/alien/verb/evolve)//We don't want the old alien evolve verb
|
||||
verbs -= /mob/living/carbon/alien/verb/evolve //We don't want the old alien evolve verb
|
||||
|
||||
|
||||
/mob/living/carbon/alien/diona/Stat()
|
||||
..()
|
||||
if (statpanel("Status"))
|
||||
if(statpanel("Status"))
|
||||
stat(null, text("Biomass: [nutrition]/[evolve_nutrition]"))
|
||||
if (nutrition > evolve_nutrition)
|
||||
if(nutrition > evolve_nutrition)
|
||||
stat(null, text("You have enough biomass to grow!"))
|
||||
|
||||
//Overriding this function from /mob/living/carbon/alien/life.dm
|
||||
/mob/living/carbon/alien/diona/handle_regular_status_updates()
|
||||
|
||||
if(status_flags & GODMODE) return 0
|
||||
if(status_flags & GODMODE)
|
||||
return FALSE
|
||||
|
||||
if(stat == DEAD)
|
||||
blinded = 1
|
||||
silent = 0
|
||||
blinded = TRUE
|
||||
silent = FALSE
|
||||
else
|
||||
updatehealth()
|
||||
handle_stunned()
|
||||
@@ -308,38 +282,37 @@
|
||||
if(health <= 0)
|
||||
cleanupTransfer()
|
||||
death()
|
||||
blinded = 1
|
||||
silent = 0
|
||||
return 1
|
||||
blinded = TRUE
|
||||
silent = FALSE
|
||||
return TRUE
|
||||
|
||||
if(getHalLoss() > 50)
|
||||
paralysis = 8
|
||||
|
||||
|
||||
if(paralysis && paralysis > 0)
|
||||
handle_paralysed()
|
||||
blinded = 1
|
||||
blinded = TRUE
|
||||
stat = UNCONSCIOUS
|
||||
|
||||
if(sleeping)
|
||||
if (mind)
|
||||
if(mind.active && client != null)
|
||||
if(mind)
|
||||
if(mind.active && client)
|
||||
sleeping = max(sleeping-1, 0)
|
||||
blinded = 1
|
||||
blinded = TRUE
|
||||
stat = UNCONSCIOUS
|
||||
else if(resting)
|
||||
|
||||
// insert dial up tone
|
||||
else
|
||||
stat = CONSCIOUS
|
||||
|
||||
// Eyes and blindness.
|
||||
if(!has_eyes())
|
||||
eye_blind = 1
|
||||
blinded = 1
|
||||
eye_blurry = 1
|
||||
eye_blind = TRUE
|
||||
blinded = TRUE
|
||||
eye_blurry = TRUE
|
||||
else if(eye_blind)
|
||||
eye_blind = max(eye_blind-1,0)
|
||||
blinded = 1
|
||||
blinded = TRUE
|
||||
else if(eye_blurry)
|
||||
eye_blurry = max(eye_blurry-1, 0)
|
||||
|
||||
@@ -352,10 +325,10 @@
|
||||
|
||||
update_icons()
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/alien/diona/Destroy()
|
||||
walk_to(src,0)
|
||||
walk_to(src, 0)
|
||||
cleanupTransfer()
|
||||
. = ..()
|
||||
|
||||
@@ -371,23 +344,23 @@
|
||||
var/mob/living/carbon/alien/diona/D = A
|
||||
if(D.master_nymph == src) //if the nymph is subservient to you
|
||||
mind.transfer_to(D)
|
||||
D.stunned = 0//Switching mind seems to temporarily stun mobs
|
||||
D.stunned = 0 // Switching mind seems to temporarily stun mobs
|
||||
for(var/mob/living/carbon/alien/diona/DIO in src.birds_of_feather) //its me!
|
||||
DIO.master_nymph = D
|
||||
return 1
|
||||
return TRUE
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/harvest(var/mob/user)
|
||||
var/actual_meat_amount = max(1,(meat_amount*0.75))
|
||||
if(meat_type && actual_meat_amount>0 && (stat == DEAD))
|
||||
for(var/i=0;i<actual_meat_amount;i++)
|
||||
var/actual_meat_amount = max(1, (meat_amount*0.75))
|
||||
if(meat_type && actual_meat_amount > 0 && (stat == DEAD))
|
||||
for(var/i = 0; i < actual_meat_amount; i++)
|
||||
var/obj/item/meat = new meat_type(get_turf(src))
|
||||
if (meat.name == "meat")
|
||||
if(meat.name == "meat")
|
||||
meat.name = "[src.name] [meat.name]"
|
||||
if(issmall(src))
|
||||
user.visible_message("<span class='danger'>[user] chops up \the [src]!</span>")
|
||||
user.visible_message(span("warning", "[user] chops up \the [src]!"))
|
||||
new/obj/effect/decal/cleanable/blood/splatter(get_turf(src))
|
||||
qdel(src)
|
||||
else
|
||||
user.visible_message("<span class='danger'>[user] butchers \the [src] messily!</span>")
|
||||
gib()
|
||||
user.visible_message(span("warning", "[user] butchers \the [src] messily!"))
|
||||
gib()
|
||||
|
||||
@@ -1,29 +1,22 @@
|
||||
//Verbs after this point.
|
||||
|
||||
|
||||
//Merge:
|
||||
//Joins yourself into an existing gestalt, becoming just a small part of it
|
||||
//The nymph player moves inside the gestalt and no longer has control of movement or actions
|
||||
/mob/living/carbon/alien/diona/proc/merge()
|
||||
|
||||
set category = "Abilities"
|
||||
set name = "Merge with gestalt"
|
||||
set desc = "Merge yourself into a larger gestalt, you will no longer retain control."
|
||||
|
||||
if(stat == DEAD || paralysis || weakened || stunned || restrained())
|
||||
return
|
||||
if(use_check_and_message(usr))
|
||||
return FALSE
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(1,src))
|
||||
for(var/mob/living/carbon/human/H in view(1, src))
|
||||
if(!Adjacent(H) || !H.client)
|
||||
continue
|
||||
if(is_diona(H) == DIONA_WORKER)
|
||||
choices += H
|
||||
|
||||
if(!(src.Adjacent(C)) || !(C.client)) continue
|
||||
|
||||
if(istype(C,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(H.species && H.species.name == "Diona" && H.client)
|
||||
choices += H
|
||||
|
||||
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
|
||||
var/mob/living/M = input(src, "Who do you wish to merge with?") in null|choices
|
||||
|
||||
if(!M)
|
||||
to_chat(src, span("warning", "There are no active gestalts nearby to merge with."))
|
||||
@@ -32,40 +25,38 @@
|
||||
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H)
|
||||
if(!istype(H) || !src || !(src.Adjacent(H)))
|
||||
return 0
|
||||
if(!istype(H) || !Adjacent(H))
|
||||
return FALSE
|
||||
|
||||
to_chat(src, span("warning", "Requesting consent from [H]"))
|
||||
var/r = alert(H,"[src] wishes to join your collective, and become a part of your gestalt. If you accept they will become an equal part of you, though you will remain in control?", "[src] wishes to join you", "Welcome!", "No, leave us..")
|
||||
if (r != "Welcome!")
|
||||
var/r = alert(H, "[src] wishes to join your collective, and become a part of your gestalt. If you accept they will become an equal part of you, though you will remain in control.", "[src] wishes to join you", "Welcome!", "No, leave us..")
|
||||
if(r != "Welcome!")
|
||||
to_chat(src, span("warning", "[H.name] has rejected your wish to merge!"))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
H.visible_message(span("warning", "[H] starts absorbing [src] into its body"), span("warning", "You start absorbing [src]. This will take 15 seconds and both of you must remain still"), span("warning", "You hear a strange, alien. sucking sound"))
|
||||
to_chat(src, "<span class='notice'>You feel yourself slowly becoming part of something greater, remain still to finish.</span>")
|
||||
H.visible_message(span("warning", "[H] starts absorbing [src] into its body."), span("warning", "You start absorbing [src]. This will take 15 seconds and both of you must remain still."), span("warning", "You hear a strange, alien, sucking noise."))
|
||||
to_chat(src, span("notice", "You feel yourself slowly becoming part of something greater, remain still to finish."))
|
||||
face_atom(H)
|
||||
H.face_atom(get_turf(src))
|
||||
if(do_mob(src, H, 150, needhand = 0))
|
||||
if (!(src.Adjacent(H)) || !(istype(src.loc, /turf)))//The loc check prevents us from absorbing the same nymph multiple times at once
|
||||
if(do_mob(src, H, 150, needhand = FALSE))
|
||||
if(!Adjacent(H) || !isturf(loc)) //The loc check prevents us from absorbing the same nymph multiple times at once
|
||||
to_chat(src, span("warning", "Something went wrong while trying to merge into [H], cancelling."))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
gestalt = H
|
||||
sync_languages(gestalt)
|
||||
update_verbs()
|
||||
sleep(2)//Altering the verbs list takes some time and it wont complete after the nymph is moved in. This sleep is necessary
|
||||
to_chat(H, "<span class='notice'>You feel your being twine with that of \the [src] as it merges with your biomass.</span>")
|
||||
sleep(2) //Altering the verbs list takes some time and it wont complete after the nymph is moved in. This sleep is necessary
|
||||
to_chat(H, span("notice", "You feel your being twine with that of \the [src] as it merges with your biomass."))
|
||||
H.status_flags |= PASSEMOTES
|
||||
to_chat(src, "<span class='notice'>You feel your being twine with that of \the [H] as you merge with its biomass.</span>")
|
||||
to_chat(src, span("notice", "You feel your being twine with that of \the [H] as you merge with its biomass."))
|
||||
for(var/obj/O in src.contents)
|
||||
drop_from_inventory(O)
|
||||
src.forceMove(H)
|
||||
else
|
||||
to_chat(src, span("warning", "Something went wrong while trying to merge into [H], cancelling."))
|
||||
return 0
|
||||
|
||||
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
@@ -79,70 +70,66 @@
|
||||
set category = "Abilities"
|
||||
set name = "Absorb Nymph"
|
||||
set desc = "Absorb a diona nymph into yourself, you will remain in control and gain any biomass it has absorbed."
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/alien/diona/C in view(1,src))
|
||||
for(var/mob/living/carbon/alien/diona/C in view(1, src))
|
||||
if(!Adjacent(C) || C.gestalt || C == src) //cant steal nymphs right out of other gestalts
|
||||
continue
|
||||
choices += C
|
||||
|
||||
if((!(src.Adjacent(C)) || C.gestalt || C == src)) continue//cant steal nymphs right out of other gestalts
|
||||
choices.Add(C)
|
||||
|
||||
var/mob/living/carbon/alien/diona/M = input(src,"Which nymph do you wish to absorb?") in null|choices
|
||||
var/mob/living/carbon/alien/diona/M = input(src, "Which nymph do you wish to absorb?") in null|choices
|
||||
|
||||
if(!M)
|
||||
to_chat(src, span("warning", "There is nothing nearby to absorb"))
|
||||
to_chat(src, span("warning", "There are no nymphs in your vicinity."))
|
||||
else if(!do_absorb(M))
|
||||
to_chat(src, span("warning", "You fail to merge with \the [M]..."))
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/proc/do_absorb(var/mob/living/carbon/alien/diona/D)
|
||||
if (D.key)
|
||||
if(D.key)
|
||||
//Code for requesting permission goes here. We will return if its denied or ignored
|
||||
to_chat(src, span("warning", "Requesting consent from [D]"))
|
||||
var/r = alert(D,"[src] wishes to absorb your being, and make you a part of their gestalt. If you accept you will join with them, and give up control to be a part of their collective. \nYou will be part of their larger gestalt if they grow later, too, and all of your stored biomass will be transferred to them. You can split away at anytime, but you cannot reclaim the biomass. Do you wish to be absorbed?", "[src] wishes to absorb you", "Yes, we will join!", "No, i wish to remain alone")
|
||||
if (r != "Yes, we will join!")
|
||||
to_chat(src, span("warning", "Requesting consent from [D]."))
|
||||
var/r = alert(D,"[src] wishes to absorb your being, and make you a part of their gestalt. If you accept you will join with them, and give up control to be a part of their collective. \nYou will be part of their larger gestalt if they grow later, too, and all of your stored biomass will be transferred to them. You can split away at anytime, but you cannot reclaim the biomass. Do you wish to be absorbed?", "[src] wishes to absorb you", "Yes, I will join!", "No, I wish to remain alone!")
|
||||
if(r != "Yes, I will join!")
|
||||
to_chat(src, span("warning", "[D] has refused to join you!"))
|
||||
return
|
||||
else
|
||||
if (!(src.Adjacent(D)) || !(istype(D.loc, /turf)))
|
||||
to_chat(src, span("warning", "Something went wrong while trying to absorb [D], cancelling."))
|
||||
return
|
||||
|
||||
src.visible_message(span("warning", "[src] starts absorbing [D] into its body"), span("warning", "You start absorbing [D]. This will take 15 seconds and both of you must remain still"), span("warning", "You hear a strange, alien. sucking sound"))
|
||||
to_chat(D, "<span class='notice'>You feel yourself slowly becoming part of something greater, remain still to finish.</span>")
|
||||
face_atom(D)
|
||||
D.face_atom(get_turf(src))
|
||||
if(do_mob(src, D, 150, needhand = 0))
|
||||
if (!(src.Adjacent(D)) || !(istype(D.loc, /turf)))//The loc check prevents us from absorbing the same nymph multiple times at once
|
||||
to_chat(src, span("warning", "Something went wrong while trying to absorb [D], cancelling."))
|
||||
else if(!Adjacent(D) || !isturf(D.loc))
|
||||
to_chat(src, span("warning", "\The [D] must remain close to the collective if \he wishes to be part of us."))
|
||||
return
|
||||
|
||||
if (D.stat == DEAD)
|
||||
src.visible_message(span("warning", "[src] starts absorbing [D] into its body."), span("warning", "You start absorbing [D]. This will take 15 seconds and both of you must remain still."), span("warning", "You hear a strange, alien, sucking noise."))
|
||||
to_chat(D, span("notice", "You feel yourself slowly becoming part of something greater, remain still to finish."))
|
||||
face_atom(D)
|
||||
D.face_atom(get_turf(src))
|
||||
if(do_mob(src, D, 150, needhand = FALSE))
|
||||
if(!Adjacent(D) || !isturf(D.loc)) //The loc check prevents us from absorbing the same nymph multiple times at once
|
||||
to_chat(src, span("warning", "\The [D] must remain close to the collective if \he wishes to be part of us."))
|
||||
return
|
||||
|
||||
if(D.stat == DEAD)
|
||||
src.adjustNutritionLoss(-NYMPH_ABSORB_NUTRITION * NYMPH_ABSORB_DEAD_FACTOR)
|
||||
qdel(D)
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
|
||||
D.gestalt = src
|
||||
D.sync_languages(D.gestalt)
|
||||
D.update_verbs()
|
||||
sleep(2)
|
||||
if (is_diona() == DIONA_NYMPH)//We only care about biomass if we're a nymph
|
||||
if(is_diona() == DIONA_NYMPH) //We only care about biomass if we're a nymph
|
||||
src.adjustNutritionLoss(-NYMPH_ABSORB_NUTRITION)
|
||||
src.adjustNutritionLoss(-D.nutrition)
|
||||
D.nutrition = 0
|
||||
|
||||
to_chat(D, "<span class='notice'>You feel your being twine with that of \the [src] as you merge with its biomass.</span>")
|
||||
to_chat(src, "<span class='notice'>You feel your being twine with that of \the [D] as it merges with your biomass.</span>")
|
||||
D.nutrition = FALSE
|
||||
to_chat(D, span("notice", "You feel your being entwine with that of \the [src] as you merge with its biomass."))
|
||||
to_chat(src, span("notice", "You feel your being entwine with that of \the [D] as it merges with your biomass."))
|
||||
for(var/obj/O in D.contents)
|
||||
D.drop_from_inventory(O)
|
||||
D.forceMove(src)
|
||||
|
||||
D.stat = CONSCIOUS
|
||||
status_flags |= PASSEMOTES
|
||||
return 1
|
||||
|
||||
return TRUE
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
//Split allows a nymph to peel away from a gestalt and be a lone agent
|
||||
/mob/living/carbon/alien/diona/proc/split()
|
||||
@@ -150,29 +137,29 @@
|
||||
set name = "Break from gestalt"
|
||||
set desc = "Split away from your gestalt as a lone nymph."
|
||||
|
||||
if(stat == DEAD || paralysis || weakened || stunned || restrained())
|
||||
return
|
||||
if(use_check_and_message(usr))
|
||||
return FALSE
|
||||
|
||||
if(echo)
|
||||
to_chat(src, "<span class='notice'>Your host is still storing you as a nymphatic husk and preventing your departure.</span>")
|
||||
to_chat(src, span("notice", "Your host is still storing you as a nymphatic husk and preventing your departure."))
|
||||
return
|
||||
|
||||
if(!(istype(src.loc,/mob/living/carbon)))
|
||||
src.verbs -= /mob/living/carbon/alien/diona/proc/split
|
||||
if(!iscarbon(loc))
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/split
|
||||
return
|
||||
|
||||
var/r = alert(src,"Splitting will remove you from your gestalt and deposit you on the ground, allowing you to go it alone. If you had any stored biomass before you joined the gestalt, you will not get it back. Are you sure you wish to split?", "Confirm Split", "Time to leaf", "I'll stick around")
|
||||
if (r != "Time to leaf")
|
||||
var/r = alert(src, "Splitting will remove you from your gestalt and deposit you on the ground, allowing you continue alone. If you had any stored biomass before you joined the gestalt, you will not get it back. Are you sure you wish to split?", "Confirm Split", "I am ready to leave.", "I'll stick around.")
|
||||
if(r != "I am ready to leave.")
|
||||
return
|
||||
|
||||
to_chat(src.loc, "<span class='warning'>You feel a pang of loss as [src] splits away from your biomass.</span>")
|
||||
to_chat(src, "<span class='notice'>You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.</span>")
|
||||
to_chat(gestalt, span("warning", "You feel a pang of loss as [src] splits away from your biomass."))
|
||||
to_chat(src, span("notice", "You wiggle out of the depths of [gestalt]'s biomass and plop to the ground."))
|
||||
|
||||
if (gestalt.is_diona() == DIONA_NYMPH)
|
||||
if(gestalt.is_diona() == DIONA_NYMPH)
|
||||
gestalt.adjustNutritionLoss(NYMPH_ABSORB_NUTRITION)
|
||||
|
||||
split_languages(gestalt)
|
||||
src.forceMove(get_turf(src))
|
||||
forceMove(get_turf(src))
|
||||
stat = CONSCIOUS
|
||||
gestalt = null
|
||||
update_verbs()
|
||||
@@ -185,75 +172,76 @@
|
||||
|
||||
//For fun factor, we'll allow the nymph to choose nonvalid targets
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/L in view(1,src))
|
||||
for(var/mob/living/L in view(1, src))
|
||||
if(!Adjacent(L) || L == src)
|
||||
continue
|
||||
if(is_diona(L))
|
||||
continue
|
||||
choices += L
|
||||
|
||||
if((!(src.Adjacent(L)) || L == src)) continue
|
||||
choices.Add(L)
|
||||
|
||||
if (!choices.len)
|
||||
if(!choices.len)
|
||||
to_chat(src, span("warning", "There are no life forms nearby to sample!"))
|
||||
return
|
||||
|
||||
if (choices.len == 1)
|
||||
choices.Add("Cancel")
|
||||
if(choices.len)
|
||||
choices += "Cancel"
|
||||
|
||||
var/mob/living/donor = input(src,"Who do you wish to drain?") in null|choices
|
||||
var/mob/living/donor = input(src, "Who do you wish to sample?") in null|choices
|
||||
|
||||
if (!donor || donor == "Cancel")//they cancelled
|
||||
if(!donor || donor == "Cancel") //they cancelled
|
||||
return
|
||||
|
||||
face_atom(donor)
|
||||
var/types = donor.find_type()
|
||||
|
||||
if (types & TYPE_SYNTHETIC)
|
||||
src.visible_message("<span class='danger'>[src] attempts to bite into [donor.name] but leaps back in surprise as its fangs hit metal.</span>", "<span class='danger'>You attempt to sink your fangs into [donor.name] and get a faceful of unyielding steel as the force breaks several fine protrusions in your mouth.</span>")
|
||||
if(types & TYPE_SYNTHETIC)
|
||||
src.visible_message(span("danger", "[src] attempts to bite into [donor.name] but leaps back in surprise as its fangs hit metal."), span("danger", "You attempt to sink your fangs into [donor.name] and get a faceful of unyielding steel as the force breaks several fine protrusions in your mouth."))
|
||||
donor.adjustBruteLoss(2)
|
||||
src.adjustBruteLoss(15)//biting metal hurts!
|
||||
src.adjustBruteLoss(15) //biting metal hurts!
|
||||
return
|
||||
|
||||
else if (isanimal(donor) && (types & TYPE_ORGANIC) && donor.stat != DEAD)
|
||||
src.visible_message("<span class='danger'>[src] bites into [donor.name] and drains some of their blood</span>", "<span class='danger'>You bite into [donor.name] and drain some blood.</span>")
|
||||
to_chat(src, "<span class='danger'>This simple creature has insufficient intelligence for you to learn anything!</span>")
|
||||
src.visible_message(span("danger", "[src] bites into [donor.name] and drains some of their blood."), span("danger", "You bite into [donor.name] and drain some of their blood."))
|
||||
to_chat(src, span("danger", "This simple creature has insufficient intelligence for you to learn anything!"))
|
||||
donor.adjustBruteLoss(4)
|
||||
adjustNutritionLoss(-20)
|
||||
return
|
||||
else if (types & TYPE_WEIRD)
|
||||
src.visible_message("<span class='danger'>[src] attempts to bite into [donor.name] but passes right through it!.</span>", "<span class='danger'>You attempt to sink your fangs into [donor.name] but pass right through it!</span>")
|
||||
src.visible_message(span("danger", "[src] attempts to bite into [donor.name] but passes right through it!."), span("danger", "You attempt to sink your fangs into [donor.name] but pass right through it!"))
|
||||
return
|
||||
else if (donor.is_diona())
|
||||
to_chat(src, span("warning", "You can't sample the DNA of other diona!"))
|
||||
return
|
||||
else if (istype(donor, /mob/living/carbon))
|
||||
else if (iscarbon(donor))
|
||||
var/mob/living/carbon/D = donor
|
||||
//If we get here, it's -probably- valid
|
||||
|
||||
src.visible_message("<span class='danger'>[src] is trying to bite [donor.name]</span>", span("danger", "You start biting [donor.name], you both must stay still!"))
|
||||
face_atom(get_turf(donor))
|
||||
if (do_mob(src, donor, 40, needhand = 0))
|
||||
|
||||
src.visible_message(span("danger", "[src] is trying to bite [D.name]."), span("danger", "You start biting [D.name], you both must stay still!"))
|
||||
face_atom(get_turf(D))
|
||||
if(do_mob(src, D, 40, needhand = FALSE))
|
||||
//Attempt to find the blood vessel, but don't create a fake one if its not there.
|
||||
//If the target doesn't have a vessel its probably due to someone not implementing it properly, like xenos
|
||||
//We'll still allow it
|
||||
var/datum/reagents/vessel = donor.get_vessel(1)
|
||||
var/datum/reagents/vessel = D.get_vessel(1)
|
||||
var/newDNA
|
||||
var/datum/reagent/blood/B = vessel.get_master_reagent()
|
||||
var/total_blood = B.volume
|
||||
var/remove_amount = (total_blood - 280) * 0.3
|
||||
if (remove_amount > 0)
|
||||
vessel.remove_reagent("blood", remove_amount, 1)//85 units of blood is enough to affect a human and make them woozy
|
||||
adjustNutritionLoss(-remove_amount*0.5)
|
||||
var/remove_amount = total_blood * 0.05
|
||||
if(ishuman(D))
|
||||
var/mob/living/carbon/human/H = D
|
||||
remove_amount = H.species.blood_volume * 0.05
|
||||
if(remove_amount > 0)
|
||||
vessel.remove_reagent("blood", remove_amount, TRUE)
|
||||
adjustNutritionLoss(-remove_amount * 0.5)
|
||||
var/list/data = vessel.get_data("blood")
|
||||
newDNA = data["blood_DNA"]
|
||||
|
||||
if (!newDNA)//Fallback. Adminspawned mobs, and possibly some others, have null dna.
|
||||
newDNA = md5("\ref[donor]")
|
||||
if(!newDNA) //Fallback. Adminspawned mobs, and possibly some others, have null dna.
|
||||
newDNA = md5("\ref[D]")
|
||||
|
||||
donor.adjustBruteLoss(4)
|
||||
src.visible_message("<span class='notice'>[src] sucks some blood from [donor.name]</span>", "<span class='notice'>You extract a delicious mouthful of blood from [donor.name]!</span>")
|
||||
D.adjustBruteLoss(4)
|
||||
src.visible_message(span("notice", "[src] sucks some blood from [D.name].") , span("notice", "You extract a delicious mouthful of blood from [D.name]!"))
|
||||
|
||||
if (newDNA in sampled_DNA)
|
||||
to_chat(src, "<span class='danger'>You have already sampled the DNA of this creature before, you can learn nothing new. Move onto something else.</span>")
|
||||
if(newDNA in sampled_DNA)
|
||||
to_chat(src, span("danger", "You have already sampled the DNA of this creature before, you can learn nothing new. Move onto something else."))
|
||||
return
|
||||
|
||||
else
|
||||
sampled_DNA.Add(newDNA)
|
||||
|
||||
@@ -264,31 +252,31 @@
|
||||
//2 = We learned something!
|
||||
|
||||
//Now we sample their languages!
|
||||
for (var/datum/language/L in donor.languages)
|
||||
for(var/datum/language/L in D.languages)
|
||||
learned = max(learned, 1)
|
||||
if (!(L in languages) && !(L in diona_banned_languages))
|
||||
//We don't know this language, and we can learn it!
|
||||
var/current_progress = language_progress[L.name]
|
||||
current_progress += 1
|
||||
language_progress[L.name] = current_progress
|
||||
to_chat(src, "<span class='notice'><font size=3>You come a little closer to learning [L.name]!</font></span>")
|
||||
to_chat(src, span("notice", "<font size=3>You come a little closer to learning [L.name]!</font>"))
|
||||
learned = 2
|
||||
|
||||
if (!learned)
|
||||
to_chat(src, "<span class='danger'>This creature doesn't know any languages at all!</span>")
|
||||
if(!learned)
|
||||
to_chat(src, span("danger", "This creature doesn't know any languages at all!"))
|
||||
else if (learned == 1)
|
||||
to_chat(src, "<span class='danger'>We have nothing more to learn from this creature. Perhaps try a different species?</span>")
|
||||
to_chat(src, span("danger", "We have nothing more to learn from this creature. Perhaps try a different sample?"))
|
||||
|
||||
update_languages()
|
||||
else
|
||||
to_chat(src, span("warning", "Something went wrong while trying to sample [donor], both you and the target must remain still."))
|
||||
to_chat(src, span("warning", "Something went wrong while trying to sample [D], both you and the target must remain still."))
|
||||
|
||||
//Checks progress on learned languages
|
||||
/mob/living/carbon/alien/diona/proc/update_languages()
|
||||
for (var/i in language_progress)
|
||||
if (language_progress[i] >= LANGUAGE_POINTS_TO_LEARN)
|
||||
for(var/i in language_progress)
|
||||
if(language_progress[i] >= LANGUAGE_POINTS_TO_LEARN)
|
||||
add_language(i)
|
||||
to_chat(src, "<span class='notice'><font size=3>You have mastered the [i] language!</font></span>")
|
||||
to_chat(src, span("notice", "<font size=3>You have mastered the [i] language!</font>"))
|
||||
language_progress.Remove(i)
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/transferMind(var/atom/A)
|
||||
@@ -299,11 +287,11 @@
|
||||
for(var/mob/living/carbon/alien/diona/D in view(7))
|
||||
if(D.master_nymph == src && mind && !client) //if the nymph is subservient to you
|
||||
mind.transfer_to(D)
|
||||
D.stunned = 0//Switching mind seems to temporarily stun mobs
|
||||
D.stunned = 0 //Switching mind seems to temporarily stun mobs
|
||||
for(var/mob/living/carbon/alien/diona/DIO in src.birds_of_feather) //its me!
|
||||
DIO.master_nymph = D
|
||||
break
|
||||
return 1
|
||||
return TRUE
|
||||
..()
|
||||
|
||||
/mob/living/carbon/proc/echo_eject()
|
||||
@@ -311,33 +299,27 @@
|
||||
set name = "Eject Echo"
|
||||
set desc = "Eject any nymphatic husks."
|
||||
|
||||
if(stat == DEAD || paralysis || weakened || stunned || restrained())
|
||||
return
|
||||
if(use_check_and_message(usr))
|
||||
return FALSE
|
||||
|
||||
var/energy
|
||||
|
||||
var/r = alert(src,"Do you choose to eject echoes as nymphs or energy?", "Identify Waste", "Energy", "Nymphs")
|
||||
if (r == "Nymphs")
|
||||
energy = 0
|
||||
else if (r == "Energy")
|
||||
energy = 1
|
||||
else
|
||||
return
|
||||
var/energy = FALSE
|
||||
var/r = alert(src, "Do you choose to eject echoes as nymphs or energy?", "Identify Waste", "Energy", "Nymphs")
|
||||
if(r == "Energy")
|
||||
energy = TRUE
|
||||
|
||||
for(var/mob/living/carbon/alien/diona/D in src)
|
||||
if(D.mind && D.echo)
|
||||
if(energy)
|
||||
var/mob/living/simple_animal/shade/bluespace/BS = new /mob/living/simple_animal/shade/bluespace(get_turf(D))
|
||||
to_chat(D, "<span class='danger'>You feel your nymphatic husk split as you are released again as pure energy!</span>")
|
||||
to_chat(D, span("danger", "You feel your nymphatic husk split as you are released again as pure energy!"))
|
||||
D.mind.transfer_to(BS)
|
||||
to_chat(BS, "<b>You are now a bluespace echo - consciousness imprinted upon wavelengths of bluespace energy. You currently retain no memories of your previous life, but do express a strong desire to return to corporeality. You will die soon, fading away forever. Good luck!</b>")
|
||||
qdel(D)
|
||||
|
||||
else
|
||||
to_chat(src, span("warning", "You feel a pang of loss as [src] splits away from your biomass."))
|
||||
to_chat(D, "<span class='notice'>You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.</span>")
|
||||
to_chat(D, span("notice", "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground."))
|
||||
|
||||
if (D.gestalt.is_diona() == DIONA_NYMPH)
|
||||
if(D.gestalt.is_diona() == DIONA_NYMPH)
|
||||
D.gestalt.adjustNutritionLoss(NYMPH_ABSORB_NUTRITION)
|
||||
|
||||
D.split_languages(D.gestalt)
|
||||
@@ -355,9 +337,82 @@
|
||||
if(stat == DEAD)
|
||||
return
|
||||
|
||||
if(!consume_nutrition_from_air && (nutrition / max_nutrition > 0.25) )
|
||||
if(!consume_nutrition_from_air && (nutrition / max_nutrition > 0.25))
|
||||
to_chat(src, span("warning", "You still have plenty of nutrition left. Consuming air is the last resort."))
|
||||
return
|
||||
|
||||
consume_nutrition_from_air = !consume_nutrition_from_air
|
||||
to_chat(src, span("notice", "You [consume_nutrition_from_air ? "started" : "stopped"] consuming air for nutrition."))
|
||||
to_chat(src, span("notice", "You [consume_nutrition_from_air ? "started" : "stopped"] consuming air for nutrition."))
|
||||
|
||||
/mob/living/carbon/human/proc/create_structure()
|
||||
set category = "Abilities"
|
||||
set name = "Create Structure"
|
||||
set desc = "Expend nymphs or biomass to create structures."
|
||||
|
||||
if(!is_diona(src))
|
||||
to_chat(src, span("danger", "You are not a Diona! You should not have this ability."))
|
||||
log_debug("Non-Diona [name] had Create Structure ability.")
|
||||
return
|
||||
|
||||
if(use_check_and_message(src))
|
||||
return
|
||||
|
||||
var/can_use_biomass
|
||||
if(nutrition >= max_nutrition * 0.25)
|
||||
can_use_biomass = TRUE
|
||||
|
||||
var/can_use_limbs = TRUE
|
||||
var/list/viable_limbs = list(BP_L_ARM, BP_R_ARM)
|
||||
for(var/limb in viable_limbs)
|
||||
var/obj/item/organ/external/O = organs_by_name[limb]
|
||||
if(!O)
|
||||
can_use_limbs = FALSE
|
||||
break
|
||||
|
||||
var/build_method // What are we using to build this thing?
|
||||
if(can_use_biomass)
|
||||
to_chat(src, span("notice", "We will expend biomass to create this structure."))
|
||||
build_method = "biomass"
|
||||
else if(can_use_limbs)
|
||||
to_chat(src, span("notice", "We will detach our arm nymphs and have them form the structure."))
|
||||
build_method = "nymphs"
|
||||
else
|
||||
to_chat(src, span("notice", "We do not have the nymphs nor the biomass to do this!"))
|
||||
return
|
||||
|
||||
var/list/diona_structures = list(
|
||||
"Wall" = /turf/simulated/wall/diona,
|
||||
"Floor" = /turf/simulated/floor/diona,
|
||||
"Glow Bulb" = /obj/structure/diona/bulb/unpowered,
|
||||
"Cancel" = null
|
||||
)
|
||||
|
||||
var/chosen_structure
|
||||
chosen_structure = input("Choose a structure to grow.") in diona_structures
|
||||
if(!chosen_structure || chosen_structure == "Cancel")
|
||||
to_chat(src, span("warning", "We have elected to not grow anything right now."))
|
||||
return
|
||||
|
||||
if(use_check_and_message(src))
|
||||
return
|
||||
|
||||
if(chosen_structure)
|
||||
to_chat(src, span("notice", "We are now creating a [lowertext(chosen_structure)] using our [build_method]..."))
|
||||
|
||||
if(do_after(src, 50))
|
||||
if(build_method == "biomass") // checking again, a lot can change in a short amount of time - geeves
|
||||
if(nutrition >= max_nutrition * 0.25)
|
||||
nutrition -= max_nutrition * 0.25
|
||||
else
|
||||
to_chat(src, span("warning", "We do not have enough biomass!"))
|
||||
return
|
||||
else if(build_method == "nymphs")
|
||||
for(var/limb in viable_limbs)
|
||||
var/obj/item/organ/external/O = organs_by_name[limb]
|
||||
if(!O)
|
||||
to_chat(src, span("warning", "We lost our arm while constructing!"))
|
||||
return
|
||||
O.droplimb(TRUE, DROPLIMB_EDGE)
|
||||
qdel(O)
|
||||
var/structure_path = diona_structures[chosen_structure]
|
||||
new structure_path(get_turf(src))
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
//Dionaea regenerate health and nutrition in light.
|
||||
|
||||
/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment)
|
||||
if (environment && consume_nutrition_from_air)
|
||||
if(environment && consume_nutrition_from_air)
|
||||
environment.remove(diona_handle_air(get_dionastats(), pressure))
|
||||
|
||||
if (stat != DEAD)
|
||||
if(stat != DEAD)
|
||||
diona_handle_light(DS)
|
||||
|
||||
/mob/living/carbon/alien/diona/handle_chemicals_in_body()
|
||||
@@ -16,7 +16,7 @@
|
||||
if(breathing) breathing.metabolize()
|
||||
|
||||
// nutrition decrease
|
||||
if (nutrition > 0 && stat != 2)
|
||||
if(nutrition > 0 && stat != DEAD)
|
||||
adjustNutritionLoss(nutrition_loss)
|
||||
|
||||
//handle_trace_chems() implement this later maybe
|
||||
@@ -29,18 +29,18 @@
|
||||
|
||||
|
||||
/mob/living/carbon/alien/diona/Life()
|
||||
if (!detached && gestalt && (gestalt.life_tick % 5 == 0)) // Minimal processing while in stasis
|
||||
if(!detached && gestalt && (gestalt.life_tick % 5 == 0)) // Minimal processing while in stasis
|
||||
updatehealth()
|
||||
check_status_as_organ()
|
||||
|
||||
else if (!gestalt || detached)
|
||||
else if(!gestalt || detached)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/alien/diona/think()
|
||||
..()
|
||||
if (!gestalt)
|
||||
if(!gestalt)
|
||||
if(stat != DEAD)
|
||||
if(master_nymph && !client && master_nymph != src)
|
||||
walk_to(src,master_nymph, 1, movement_delay())
|
||||
walk_to(src, master_nymph, 1, movement_delay())
|
||||
else
|
||||
walk_to(src,0)
|
||||
walk_to(src, 0)
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
/mob/living/carbon/alien/diona/confirm_evolution()
|
||||
|
||||
//Whitelist requirement for evolution experimentally removed
|
||||
if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist)
|
||||
to_chat(src, "<span class='warning'>You are currently not whitelisted to play as a full diona.</span>")
|
||||
return null
|
||||
|
||||
var/response = alert(src, "A worker gestalt is a large, slow, and durable humanoid form. You will lose the ability to ventcrawl and devour animals, but you will gain hand-like tendrils and the ability to wear things.You have enough biomass, are you certain you're ready to form a new gestalt?","Confirm Gestalt","Growth!","Patience...")
|
||||
if(response != "Growth!") return //Hit the wrong key...again.
|
||||
var/response = alert(src, "A worker gestalt is a large, slow, and durable humanoid form. You will lose the ability to ventcrawl and devour animals, but you will gain hand-like tendrils and the ability to wear things. You have enough biomass, are you certain you're ready to form a new gestalt?", "Confirm Gestalt", "Growth!", "Patience...")
|
||||
if(response != "Growth!")
|
||||
return
|
||||
|
||||
if(istype(loc,/obj/item/holder/diona))
|
||||
var/obj/item/holder/diona/L = loc
|
||||
@@ -25,46 +20,46 @@
|
||||
|
||||
var/limbs_can_grow = round((nutrition / evolve_nutrition) * 6,1)
|
||||
if(limbs_can_grow <= 3) //Head, Trunk, Fork
|
||||
to_chat(src, "<span class='warning'>You do not have enough biomass to grow yet. Currently you can only grow [limbs_can_grow]/6 limbs. ([nutrition]/[evolve_nutrition] biomass).</span>")
|
||||
to_chat(src, span("warning", "You do not have enough biomass to grow yet. Currently you can only grow [limbs_can_grow]/6 limbs. ([nutrition]/[evolve_nutrition] biomass)."))
|
||||
return
|
||||
|
||||
if(gestalt)
|
||||
to_chat(src, "<span class='warning'>You are already part of a collective, if you wish to form your own, you must split off first.</span>")
|
||||
to_chat(src, span("warning", "You are already part of a collective, if you wish to form your own, you must split off first."))
|
||||
return
|
||||
|
||||
if (!istype(loc, /turf))
|
||||
to_chat(src, "<span class='warning'>There's not enough space to grow here. Stand on the floor!.</span>")
|
||||
if(!isturf(loc))
|
||||
to_chat(src, span("warning", "There's not enough space to grow here. Stand on the floor!"))
|
||||
return
|
||||
|
||||
// confirm_evolution() handles choices and other specific requirements.
|
||||
var/new_species = confirm_evolution()
|
||||
if(!new_species || !adult_form )
|
||||
if(!new_species || !adult_form)
|
||||
return
|
||||
|
||||
stunned = 10//No more moving or talking for now
|
||||
//muted = 10
|
||||
stunned = 10 // No more moving or talking for now
|
||||
playsound(src.loc, 'sound/species/diona/gestalt_grow.ogg', 100, 1)
|
||||
src.visible_message("<span class='warning'> [src] begins to shift and quiver.</span>",
|
||||
"<span class='warning'> You begin to shift and quiver, feeling your awareness splinter.</span>")
|
||||
visible_message(span("warning", "[src] begins to shift and quiver."),
|
||||
span("warning", "You begin to shift and quiver, feeling your awareness splinter."))
|
||||
sleep(52)
|
||||
src.visible_message("<span class='warning'> [src] erupts in a shower of shed bark as it splits into a tangle of new dionaea.</span>",
|
||||
"<span class='warning'> All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of new dionaea. We have attained a new form.</span>")
|
||||
visible_message(span("warning", "[src] erupts in a shower of shed bark as it splits into a tangle of new gestalt."),
|
||||
span("warning", "All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of new gestalt. We have attained a new form."))
|
||||
|
||||
var/mob/living/carbon/human/adult = new adult_form(get_turf(src))
|
||||
adult.set_species(new_species)
|
||||
show_evolution_blurb()
|
||||
|
||||
if(mind)
|
||||
mind.original = src//This tracks which nymph 'is' the gestalt
|
||||
mind.original = src //This tracks which nymph 'is' the gestalt
|
||||
mind.transfer_to(adult)
|
||||
else
|
||||
adult.key = src.key
|
||||
adult.key = key
|
||||
|
||||
for (var/obj/item/W in src.contents)
|
||||
src.drop_from_inventory(W)
|
||||
for (var/obj/item/W in contents)
|
||||
drop_from_inventory(W)
|
||||
|
||||
// Remove the adult's languages, then add the babby nymph's languages - geeves
|
||||
//So that the nymph doesn't get basic for free when evolving.
|
||||
if (adult.languages)
|
||||
if(adult.languages)
|
||||
adult.languages.Cut()
|
||||
|
||||
for(var/datum/language/L in languages)
|
||||
@@ -82,18 +77,16 @@
|
||||
src.nutrition = 0
|
||||
src.forceMove(adult)
|
||||
src.stat = CONSCIOUS
|
||||
src.gestalt = adult
|
||||
gestalt = adult
|
||||
|
||||
//What do you call a person with no arms or no legs?
|
||||
var/list/organ_removal_priorities = list(BP_L_ARM,BP_R_ARM,BP_L_LEG,BP_R_LEG)
|
||||
var/list/organ_removal_priorities = list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG)
|
||||
var/limbs_to_remove = (6 - limbs_can_grow)
|
||||
for(var/organ_name in organ_removal_priorities)
|
||||
if(limbs_to_remove <= 0)
|
||||
break
|
||||
var/obj/item/organ/external/O = adult.organs_by_name[organ_name]
|
||||
to_chat(src, "<span class='warning'>You didn't have enough biomass to grow your [O.name]!</span>")
|
||||
//adult.organs -= O
|
||||
O.droplimb(1,DROPLIMB_EDGE)
|
||||
to_chat(src, span("warning", "You didn't have enough biomass to grow your [O.name]!"))
|
||||
O.droplimb(1, DROPLIMB_EDGE)
|
||||
qdel(O)
|
||||
limbs_to_remove -= 1
|
||||
//Matt
|
||||
limbs_to_remove -= 1
|
||||
@@ -1,5 +1,4 @@
|
||||
/mob/living/carbon/alien/diona/update_icons()
|
||||
|
||||
if(stat == DEAD)
|
||||
icon_state = "[initial(icon_state)]_dead"
|
||||
else if(lying || resting || stunned)
|
||||
@@ -17,4 +16,4 @@
|
||||
add_overlay(flower_image)
|
||||
|
||||
if(hat)
|
||||
add_overlay(get_hat_icon(hat, 0, -8))
|
||||
add_overlay(get_hat_icon(hat, 0, -8))
|
||||
@@ -18,7 +18,8 @@
|
||||
/datum/unarmed_attack/diona
|
||||
)
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/consume_nutrition_from_air
|
||||
/mob/living/carbon/human/proc/consume_nutrition_from_air,
|
||||
/mob/living/carbon/human/proc/create_structure
|
||||
)
|
||||
//primitive_form = "Nymph"
|
||||
slowdown = 7
|
||||
|
||||
@@ -1,17 +1,5 @@
|
||||
/turf/simulated/wall/diona/Initialize(mapload)
|
||||
. = ..(mapload,"biomass")
|
||||
|
||||
/turf/simulated/wall/diona/attack_generic(var/mob/user, var/damage, var/attack_message)
|
||||
if(istype(user, /mob/living/carbon/alien/diona))
|
||||
if(can_open == WALL_OPENING)
|
||||
return
|
||||
can_open = WALL_CAN_OPEN
|
||||
user.visible_message("<span class='alium'>\The [user] strokes its feelers against \the [src] and the biomass [density ? "moves aside" : "closes up"].</span>")
|
||||
toggle_open(user)
|
||||
sleep(15)
|
||||
if(can_open == WALL_CAN_OPEN) can_open = 0
|
||||
else
|
||||
return ..(user, damage, attack_message)
|
||||
. = ..(mapload, "biomass")
|
||||
|
||||
/obj/structure/diona
|
||||
icon = 'icons/obj/diona.dmi'
|
||||
@@ -55,6 +43,21 @@
|
||||
light_range = 3
|
||||
light_color = "#557733"
|
||||
|
||||
/obj/structure/diona/bulb/unpowered
|
||||
name = "unpowered glow bulb"
|
||||
desc = "A bulb of some sort. Seems like it needs some power."
|
||||
description_info = "This bulb requires a power cell to glow. Click on it with a power cell in hand to plug it in."
|
||||
light_power = 0
|
||||
light_range = 0
|
||||
|
||||
/obj/structure/diona/bulb/unpowered/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/cell))
|
||||
to_chat(user, span("notice", "You jack the power cell into the glow bulb."))
|
||||
new /obj/structure/diona/bulb(get_turf(src))
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
/datum/random_map/automata/diona
|
||||
iterations = 3
|
||||
descriptor = "diona gestalt"
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
author: Geeves
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- tweak: "Biomass is now less strong."
|
||||
- tweak: "Diona have gotten a ton of minor code improvements, using their abilities should now be a little sane."
|
||||
- tweak: "Diona nymphs don't have to be whitelisted to grow until a full diona now. Administrative action will be taken if this right is abused."
|
||||
- rscadd: "Diona gestalts can now use their biomass / arms to create biomass structures."
|
||||
- rscdel: "Removed nymphs' ability to open biomass walls. It was buggy."
|
||||
- tweak: "Nymphs can now be holstered and worn on the ear slots."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 59 KiB |
Reference in New Issue
Block a user