mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 12:02:31 +01:00
Diona Suck (#9965)
This commit is contained in:
@@ -31,8 +31,6 @@
|
||||
var/flower_color
|
||||
var/image/flower_image
|
||||
|
||||
var/list/sampled_DNA
|
||||
var/list/language_progress
|
||||
var/obj/item/clothing/head/hat
|
||||
var/datum/reagents/vessel
|
||||
var/energy_duration = 144 // The time in seconds that this diona can exist in total darkness before its energy runs out
|
||||
@@ -101,8 +99,6 @@
|
||||
eat_types |= TYPE_ORGANIC
|
||||
nutrition = 0 //We dont start with biomass
|
||||
update_verbs()
|
||||
sampled_DNA = list()
|
||||
language_progress = list()
|
||||
|
||||
|
||||
/mob/living/carbon/alien/diona/verb/check_light()
|
||||
@@ -244,7 +240,7 @@
|
||||
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/proc/sample
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/remove_hat
|
||||
verbs |= /mob/living/carbon/alien/diona/proc/split
|
||||
else
|
||||
@@ -253,7 +249,7 @@
|
||||
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/proc/sample
|
||||
verbs |= /mob/living/carbon/alien/diona/proc/remove_hat
|
||||
verbs -= /mob/living/carbon/alien/diona/proc/split // we want to remove this one
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
update_verbs()
|
||||
|
||||
//Draws a sizeable blood sample from a victim to read their DNA and learn languages
|
||||
/mob/living/carbon/alien/diona/proc/sample()
|
||||
/mob/living/carbon/proc/sample()
|
||||
set category = "Abilities"
|
||||
set name = "Sample DNA"
|
||||
set desc = "Learn languages by draining some blood from a nearby lifeform. You will partially learn any language it knows."
|
||||
@@ -184,101 +184,29 @@
|
||||
if(!length(choices))
|
||||
to_chat(src, SPAN_WARNING("There are no life forms nearby to sample!"))
|
||||
return
|
||||
else
|
||||
choices += "Cancel"
|
||||
|
||||
var/mob/living/donor = input(src, "Who do you wish to sample?") in null|choices
|
||||
|
||||
if(!donor || donor == "Cancel") //they cancelled
|
||||
var/mob/living/donor = input(src, "Who do you wish to sample?", "Blood Sampling") as null|anything in choices
|
||||
if(!donor || !Adjacent(donor))
|
||||
return
|
||||
|
||||
face_atom(donor)
|
||||
var/types = donor.find_type()
|
||||
|
||||
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."))
|
||||
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!
|
||||
return
|
||||
|
||||
adjustBruteLoss(15) //biting metal hurts!
|
||||
else if (isanimal(donor) && (types & TYPE_ORGANIC) && donor.stat != DEAD)
|
||||
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."))
|
||||
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_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
|
||||
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!"))
|
||||
else if (iscarbon(donor))
|
||||
var/mob/living/carbon/D = donor
|
||||
//If we get here, it's -probably- valid
|
||||
|
||||
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 = 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 * 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(/datum/reagent/blood, remove_amount, TRUE)
|
||||
adjustNutritionLoss(-remove_amount * 0.5)
|
||||
var/list/data = vessel.get_data(/datum/reagent/blood)
|
||||
newDNA = data["blood_DNA"]
|
||||
|
||||
if(!newDNA) //Fallback. Adminspawned mobs, and possibly some others, have null dna.
|
||||
newDNA = md5("\ref[D]")
|
||||
|
||||
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_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)
|
||||
|
||||
var/learned = 0
|
||||
//Learned var:
|
||||
//0 = The target has no languages
|
||||
//1 = We already everything they know or can't learn
|
||||
//2 = We learned something!
|
||||
|
||||
//Now we sample their 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_NOTICE("<font size=3>You come a little closer to learning [L.name]!</font>"))
|
||||
learned = 2
|
||||
|
||||
if(!learned)
|
||||
to_chat(src, SPAN_DANGER("This creature doesn't know any languages at all!"))
|
||||
else if (learned == 1)
|
||||
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 [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)
|
||||
add_language(i)
|
||||
to_chat(src, SPAN_NOTICE("<font size=3>You have mastered the [i] language!</font>"))
|
||||
language_progress.Remove(i)
|
||||
var/datum/dionastats/DS = get_dionastats()
|
||||
if(DS)
|
||||
DS.do_blood_suck(src, donor)
|
||||
|
||||
/mob/living/carbon/alien/diona/proc/transferMind(var/atom/A)
|
||||
set category = "Abilities"
|
||||
|
||||
@@ -616,6 +616,9 @@ var/list/diona_banned_languages = list(
|
||||
var/restrictedlight_factor = 0.8 //A value between 0 and 1 that determines how much we nerf the strength of certain worn lights
|
||||
//1 means flashlights work normally., 0 means they do nothing
|
||||
|
||||
var/list/sampled_DNA = list()
|
||||
var/list/language_progress = list()
|
||||
|
||||
var/obj/item/organ/internal/diona/node/light_organ = null //The organ this gestalt uses to receive light. This is left null for nymphs
|
||||
var/obj/item/organ/internal/diona/nutrients/nutrient_organ = null //Organ
|
||||
var/LMS = 1 //Lightmessage state. Switching between states gives the user a message
|
||||
@@ -626,6 +629,83 @@ var/list/diona_banned_languages = list(
|
||||
var/regen_limb_progress
|
||||
var/pause_regen = FALSE
|
||||
|
||||
/datum/dionastats/proc/do_blood_suck(var/mob/living/carbon/user, var/mob/living/carbon/D)
|
||||
user.visible_message(SPAN_DANGER("[user] is trying to bite [D.name]."), SPAN_DANGER("You start biting \the [D], you both must stay still!"))
|
||||
user.face_atom(get_turf(D))
|
||||
if(do_mob(user, 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 = 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 * 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(/datum/reagent/blood, remove_amount, TRUE)
|
||||
user.adjustNutritionLoss(-remove_amount * 0.5)
|
||||
var/list/data = vessel.get_data(/datum/reagent/blood)
|
||||
newDNA = data["blood_DNA"]
|
||||
|
||||
if(!newDNA) //Fallback. Adminspawned mobs, and possibly some others, have null dna.
|
||||
newDNA = md5("\ref[D]")
|
||||
|
||||
D.adjustBruteLoss(4)
|
||||
user.visible_message(SPAN_NOTICE("[user] sucks some blood from \the [D].") , SPAN_NOTICE("You extract a delicious mouthful of blood from \the [D]!"))
|
||||
to_chat(D, SPAN_NOTICE("You feel some liquid being injected at the bite site."))
|
||||
D.reagents.add_reagent(/datum/reagent/mortaphenyl/aphrodite, 5)
|
||||
if(D.client)
|
||||
INVOKE_ASYNC(src, .proc/memory_transfer, user, D)
|
||||
if(newDNA in sampled_DNA)
|
||||
to_chat(user, 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)
|
||||
|
||||
var/learned = 0
|
||||
//Learned var:
|
||||
//0 = The target has no languages
|
||||
//1 = We already everything they know or can't learn
|
||||
//2 = We learned something!
|
||||
|
||||
//Now we sample their languages!
|
||||
for(var/datum/language/L in D.languages)
|
||||
learned = max(learned, 1)
|
||||
if (!(L in user.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(user, SPAN_NOTICE("<font size=3>You come a little closer to learning [L.name]!</font>"))
|
||||
learned = 2
|
||||
|
||||
if(!learned)
|
||||
to_chat(user, SPAN_DANGER("This creature doesn't know any languages at all!"))
|
||||
else if (learned == 1)
|
||||
to_chat(user, SPAN_DANGER("We have nothing more to learn from this creature. Perhaps try a different sample?"))
|
||||
|
||||
update_languages(user)
|
||||
else
|
||||
to_chat(user, SPAN_WARNING("Something went wrong while trying to sample [D], both you and the target must remain still."))
|
||||
|
||||
/datum/dionastats/proc/memory_transfer(var/mob/user, var/mob/donor)
|
||||
var/memory_drain = input(donor, "[user] just drained some of your blood, including some of your memory. What was on your mind?", "Diona Memory Transfer") as null|text
|
||||
if(!memory_drain || memory_drain == "")
|
||||
to_chat(user, SPAN_WARNING("\The [donor] had nothing swimming around in their brain."))
|
||||
else
|
||||
memory_drain = capitalize(sanitize(memory_drain))
|
||||
to_chat(user, SPAN_NOTICE("You gather the following knowledge from \the [donor]: [memory_drain]"))
|
||||
|
||||
/datum/dionastats/proc/update_languages(var/mob/user)
|
||||
for(var/i in language_progress)
|
||||
if(language_progress[i] >= LANGUAGE_POINTS_TO_LEARN)
|
||||
user.add_language(i)
|
||||
to_chat(user, SPAN_NOTICE("<font size=3>You have mastered the [i] language!</font>"))
|
||||
language_progress.Remove(i)
|
||||
|
||||
/datum/dionastats/Destroy()
|
||||
light_organ = null //Nulling out these references to prevent GC errors
|
||||
nutrient_organ = null
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
)
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/consume_nutrition_from_air,
|
||||
/mob/living/carbon/human/proc/create_structure
|
||||
/mob/living/carbon/human/proc/create_structure,
|
||||
/mob/living/carbon/proc/sample
|
||||
)
|
||||
//primitive_form = "Nymph"
|
||||
slowdown = 7
|
||||
|
||||
@@ -310,7 +310,21 @@
|
||||
M.add_chemical_effect(CE_EMETIC, dose/6)
|
||||
if(M.losebreath < 15)
|
||||
M.losebreath++
|
||||
|
||||
|
||||
/datum/reagent/mortaphenyl/aphrodite
|
||||
name = "Aphrodite"
|
||||
description = "Aphrodite is the name given to the chemical diona inject into organics soon after biting them. It serves a dual purpose of dulling the pain of the wound, and gathering deep-seated fragments of learned skills and memories, such as languages."
|
||||
color = "#a59153"
|
||||
overdose = 10
|
||||
scannable = TRUE
|
||||
fallback_specific_heat = 1
|
||||
taste_description = "euphoric acid"
|
||||
|
||||
/datum/reagent/mortaphenyl/aphrodite/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
M.add_chemical_effect(CE_PAINKILLER, 70)
|
||||
M.eye_blurry = max(M.eye_blurry, 3)
|
||||
M.confused = max(M.confused, 6)
|
||||
|
||||
/datum/reagent/oxycomorphine
|
||||
name = "Oxycomorphine"
|
||||
description = "Oxycomorphine is a highly advanced, powerful analgesic medication which is extremely effective at treating severe-agonising pain as a result of injuries usually incompatible with life. The drug is highly addictive and sense-numbing. Oxycomorphine is not effective when inhaled."
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
author: Geeves
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- rscadd: "Diona now absorb knowledge along with language when sucking blood, this is a user prompt that the suckee must enter, and will probably fail to."
|
||||
- rscadd: "Diona gestalts can now also sample DNA to learn languages and gain knowledge."
|
||||
- rscadd: "Diona now inject a medium painkiller when sucking blood, called 'Aphrodite'."
|
||||
Reference in New Issue
Block a user