Diona Suck (#9965)

This commit is contained in:
Geeves
2020-10-31 15:42:45 +01:00
committed by GitHub
parent a55c4d49c9
commit d826425fbe
6 changed files with 117 additions and 90 deletions
@@ -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."