Files
Bubberstation/code/datums/components/heart_eater.dm
T
2165300a01 Adds 9 wizard perks (#83262)
## About The Pull Request

Add new spells category for wizards: Perks. perks are not really spells,
but useful (and not so useful) improvements for your wizard which
provide more variety for builds.
https://youtu.be/eeVvUkVE3xQ
All perks cost 2 points, they work without wizard’s uniform, cannot
refund, effect start only at the station (perks will not work at the
wizard’s base). Perk can only be purchased once.

9 added perks:
1. Four Hands - gives you 2 extra hands.
2. Worm Born - on death, wizard turns into a large worm and can no
longer return to his previous form.
![Снимок экрана 2024-06-02
223645](https://github.com/tgstation/tgstation/assets/120736708/2dfac647-4c3c-4824-8320-73fc98cc61fd)
3. Dejavu - every 60 seconds returns wizard to where he was 60 seconds
ago and restores his health to the amount he had 60 seconds ago.
4. Sale Off - When buying something from a book of spells, wizard has a
chance not to spend points for the purchase, depending on the purchase
price. 1/2/3/4 price chance 50/25/15/10%. You can no longer refund
purchases.
5. Gamble - Give wizard 2 random perks.
6. Heart Eater - By eating someone's heart, the wizard has a chance to
either increase his maximum HP and stamina by 25 or lose 10 percent of
his maximum HP but get a random mutation.
7. Slime Friends - Slimes is your friends now. Every 20 Seconds you
spend 50 nutriments to spawn random big angry slime.
8. Transparence - wizard becomes half transparent, any projectiles pass
through, but you loses 25% of max HP and you get a stalker who will
follow you to the station to kill you.
9. Magnetism - Wizard gain gravitational anomaly that orbit around him,
which attracts objects and people.
https://youtu.be/gp6ZtTrZu7I

## Why It's Good For The Game

Gives the wizard more options to create a fun and interesting builds

## Changelog

🆑
add: new wizard spells category - perks.
add: adds 9 wizard perks.
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2024-07-15 16:28:41 +01:00

119 lines
4.2 KiB
Plaintext

/datum/component/heart_eater
/// Check if we fully ate whole heart and reset when we start eat new one.
var/bites_taken = 0
/// Remember the number of species damage_modifier.
var/remember_modifier = 0
/// Remember last heart we ate and reset bites_taken counter if we start eat new one
var/datum/weakref/last_heart_we_ate
/// List of all mutations allowed to get.
var/static/list/datum/mutation/human/mutations_list = list(
/datum/mutation/human/adaptation/cold,
/datum/mutation/human/adaptation/heat,
/datum/mutation/human/adaptation/pressure,
/datum/mutation/human/adaptation/thermal,
/datum/mutation/human/chameleon,
/datum/mutation/human/cryokinesis,
/datum/mutation/human/cryokinesis/pyrokinesis,
/datum/mutation/human/dwarfism,
/datum/mutation/human/geladikinesis/ash,
/datum/mutation/human/insulated,
/datum/mutation/human/telekinesis,
/datum/mutation/human/telepathy,
/datum/mutation/human/thermal,
/datum/mutation/human/tongue_spike,
/datum/mutation/human/webbing,
/datum/mutation/human/xray,
)
/datum/component/heart_eater/Initialize(...)
. = ..()
if(!ishuman(parent))
return COMPONENT_INCOMPATIBLE
prepare_species(parent)
/datum/component/heart_eater/RegisterWithParent()
. = ..()
RegisterSignal(parent, COMSIG_SPECIES_GAIN, PROC_REF(on_species_change))
RegisterSignal(parent, COMSIG_LIVING_FINISH_EAT, PROC_REF(eat_eat_eat))
/datum/component/heart_eater/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, COMSIG_LIVING_FINISH_EAT)
UnregisterSignal(parent, COMSIG_SPECIES_GAIN)
/datum/component/heart_eater/proc/prepare_species(mob/living/carbon/human/eater)
if(eater.get_liked_foodtypes() & GORE)
return
var/obj/item/organ/internal/tongue/eater_tongue = eater.get_organ_slot(ORGAN_SLOT_TONGUE)
if(!eater_tongue)
return
eater_tongue.disliked_foodtypes &= ~GORE
eater_tongue.liked_foodtypes |= GORE
/datum/component/heart_eater/proc/on_species_change(mob/living/carbon/human/eater, datum/species/new_species, datum/species/old_species)
SIGNAL_HANDLER
eater.dna?.species?.damage_modifier += remember_modifier
prepare_species(eater)
/// Proc called when we finish eat somthing.
/datum/component/heart_eater/proc/eat_eat_eat(mob/living/carbon/human/eater, datum/what_we_ate)
SIGNAL_HANDLER
if(get_area(eater) == GLOB.areas_by_type[/area/centcom/wizard_station])
return
if(!istype(what_we_ate, /obj/item/organ/internal/heart))
return
var/obj/item/organ/internal/heart/we_ate_heart = what_we_ate
var/obj/item/organ/internal/heart/previous_heart = last_heart_we_ate?.resolve()
if(we_ate_heart == previous_heart)
return
bites_taken = 0
last_heart_we_ate = WEAKREF(we_ate_heart)
bites_taken++
if(bites_taken < (we_ate_heart.reagents.total_volume/2))
return
if(prob(50))
perfect_heart(eater)
return
not_perfect_heart(eater)
///Perfect heart give our +10 damage modifier(Max. 80).
/datum/component/heart_eater/proc/perfect_heart(mob/living/carbon/human/eater)
if(eater.dna?.species?.damage_modifier >= 80)
healing_heart(eater)
return
eater.dna?.species?.damage_modifier += 10
remember_modifier += 10
healing_heart(eater)
to_chat(eater, span_warning("This heart is perfect. You feel a surge of vital energy."))
///Not Perfect heart give random mutation.
/datum/component/heart_eater/proc/not_perfect_heart(mob/living/carbon/human/eater)
var/datum/mutation/human/new_mutation
var/list/datum/mutation/human/shuffle_mutation_list = shuffle(mutations_list)
for(var/mutation_in_list in shuffle_mutation_list)
if(is_type_in_list(mutation_in_list, eater.dna.mutations))
continue
new_mutation = mutation_in_list
break
if(isnull(new_mutation))
healing_heart(eater)
return
eater.dna.add_mutation(new_mutation)
healing_heart(eater)
to_chat(eater, span_warning("This heart is not right for you. You now have [new_mutation.name] mutation."))
///Heart eater give also strong healing from hearts.
/datum/component/heart_eater/proc/healing_heart(mob/living/carbon/human/eater)
for(var/heal_organ in eater.organs)
eater.adjustOrganLoss(heal_organ, -50)
for(var/datum/wound/heal_wound in eater.all_wounds)
heal_wound.remove_wound()
eater.adjustBruteLoss(-50)
eater.adjustFireLoss(-50)
eater.adjustToxLoss(-50)
eater.adjustOxyLoss(-50)
eater.adjustStaminaLoss(-50)