diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 5cba4687daf..c233fc66a18 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -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
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 9c881dd3d3e..3d7c0ff5da9 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -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
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
index 177d32d14ef..c3ce56b6f9b 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
@@ -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("[M] pets the [src]")
+ 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("\The [H] removes \the [src]'s [hat].")
+ 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, "\The [src] is already wearing \the [hat].")
+ to_chat(user, span("warning", "\The [src] is already wearing \the [hat]."))
return
user.unEquip(W)
wear_hat(W)
- user.visible_message("\The [user] puts \the [W] on \the [src].")
+ 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)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm
index 87f2a4cab7b..0120d8e8984 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm
@@ -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, "You are too small to pull that.")
+ to_chat(src, span("warning", "You are too small to pull that."))
return
else
..()
else
- to_chat(src, "You are too small to pull that.")
+ 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 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("[user] chops up \the [src]!")
+ 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("[user] butchers \the [src] messily!")
- gib()
\ No newline at end of file
+ user.visible_message(span("warning", "[user] butchers \the [src] messily!"))
+ gib()
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
index 889f9dceffc..09eedaac9a7 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
@@ -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, "You feel yourself slowly becoming part of something greater, remain still to finish.")
+ 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, "You feel your being twine with that of \the [src] as it merges with your biomass.")
+ 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, "You feel your being twine with that of \the [H] as you merge with its biomass.")
+ 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, "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 = 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, "You feel your being twine with that of \the [src] as you merge with its biomass.")
- to_chat(src, "You feel your being twine with that of \the [D] as it merges with your biomass.")
+ 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, "Your host is still storing you as a nymphatic husk and preventing your departure.")
+ 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, "You feel a pang of loss as [src] splits away from your biomass.")
- to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.")
+ 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("[src] attempts to bite into [donor.name] but leaps back in surprise as its fangs hit metal.", "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.")
+ 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("[src] bites into [donor.name] and drains some of their blood", "You bite into [donor.name] and drain some blood.")
- to_chat(src, "This simple creature has insufficient intelligence for you to learn anything!")
+ 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("[src] attempts to bite into [donor.name] but passes right through it!.", "You attempt to sink your fangs into [donor.name] but pass right through it!")
+ 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("[src] is trying to bite [donor.name]", 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("[src] sucks some blood from [donor.name]", "You extract a delicious mouthful of blood from [donor.name]!")
+ 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, "You have already sampled the DNA of this creature before, you can learn nothing new. Move onto something else.")
+ 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, "You come a little closer to learning [L.name]!")
+ to_chat(src, span("notice", "You come a little closer to learning [L.name]!"))
learned = 2
- if (!learned)
- to_chat(src, "This creature doesn't know any languages at all!")
+ if(!learned)
+ to_chat(src, span("danger", "This creature doesn't know any languages at all!"))
else if (learned == 1)
- to_chat(src, "We have nothing more to learn from this creature. Perhaps try a different species?")
+ 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, "You have mastered the [i] language!")
+ to_chat(src, span("notice", "You have mastered the [i] language!"))
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, "You feel your nymphatic husk split as you are released again as pure energy!")
+ 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, "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!")
qdel(D)
-
else
to_chat(src, span("warning", "You feel a pang of loss as [src] splits away from your biomass."))
- to_chat(D, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.")
+ 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."))
\ No newline at end of file
+ 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))
diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm
index 11cc0050a4e..5ba9787efb6 100644
--- a/code/modules/mob/living/carbon/alien/diona/life.dm
+++ b/code/modules/mob/living/carbon/alien/diona/life.dm
@@ -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)
diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm
index 8ab518c28e4..e58ab4db0bd 100644
--- a/code/modules/mob/living/carbon/alien/diona/progression.dm
+++ b/code/modules/mob/living/carbon/alien/diona/progression.dm
@@ -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, "You are currently not whitelisted to play as a full diona.")
- 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, "You do not have enough biomass to grow yet. Currently you can only grow [limbs_can_grow]/6 limbs. ([nutrition]/[evolve_nutrition] biomass).")
+ 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, "You are already part of a collective, if you wish to form your own, you must split off first.")
+ 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, "There's not enough space to grow here. Stand on the floor!.")
+ 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(" [src] begins to shift and quiver.",
- " You begin to shift and quiver, feeling your awareness splinter.")
+ 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(" [src] erupts in a shower of shed bark as it splits into a tangle of new dionaea.",
- " 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.")
+ 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, "You didn't have enough biomass to grow your [O.name]!")
- //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
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm
index 73281937eb7..b20542886f2 100644
--- a/code/modules/mob/living/carbon/alien/diona/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/diona/update_icons.dm
@@ -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))
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm
index b9f65bfbfdb..cb9a0ea93da 100644
--- a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm
@@ -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
diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm
index 5c108faddc3..2228fdeb7e0 100644
--- a/code/modules/random_map/automata/diona.dm
+++ b/code/modules/random_map/automata/diona.dm
@@ -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("\The [user] strokes its feelers against \the [src] and the biomass [density ? "moves aside" : "closes up"].")
- 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"
diff --git a/html/changelogs/geeves-dionaebuffs.yml b/html/changelogs/geeves-dionaebuffs.yml
new file mode 100644
index 00000000000..9ebf4729b57
--- /dev/null
+++ b/html/changelogs/geeves-dionaebuffs.yml
@@ -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."
\ No newline at end of file
diff --git a/icons/mob/diona.dmi b/icons/mob/diona.dmi
index 9ae5dbbac94..267b5ec4817 100644
Binary files a/icons/mob/diona.dmi and b/icons/mob/diona.dmi differ
diff --git a/icons/turf/smooth/diona_wall.dmi b/icons/turf/smooth/diona_wall.dmi
index e7a7abd08d8..81052baa19b 100644
Binary files a/icons/turf/smooth/diona_wall.dmi and b/icons/turf/smooth/diona_wall.dmi differ
diff --git a/icons/turf/wall_masks.dmi b/icons/turf/wall_masks.dmi
index 093f30775c7..4746e3e72b2 100644
Binary files a/icons/turf/wall_masks.dmi and b/icons/turf/wall_masks.dmi differ