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:
Geeves
2020-02-01 14:57:01 +02:00
committed by GitHub
parent a50cb2f5a1
commit bddd58a306
14 changed files with 349 additions and 326 deletions
+6 -1
View File
@@ -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
+1 -16
View File
@@ -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
+16 -13
View File
@@ -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"
+11
View File
@@ -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