First Genetics Content in 5 Years (Adds new positive mutations!) (#83652)

## About The Pull Request

Sister PR to #83439, that needs to be merged before this.

Adds a plethora of new positive mutations to the game!

Mutations now have a variable that directly adds and removes traits
instead of manually doing so for idk

Tripled cryobeam range.

Made the mushroom hallucinogen's code more readable.

- Adrenaline Rush
Trigger your body's adrenaline response, granting you 10 * P units of
pump-up, synaptizine, and determination. After 25 seconds, you crash,
recieving 7 * S units of tiring and dizzying solution. Can be Energized,
Powered, and Synchronized.
- Mending Touch
Transfer injuries from the target to yourself! Heal 35 * P damage,
recieving up to 35 * S damage in turn. Transfers moderate wounds, fire
stacks, and attempts to parallel limb-to-limb damage. Has bonuses for
pacifist players. Can be Energized, Powered, and Synchronized.
- Elastic Arms
Your arms become floppy and you can interact with things as if you were
adjacent to them from one tile further! Does not work through walls or
dense objects, and you become unable to lift huge items, pull large
corpses, and you get chunky fingers.

Split temperature adaptation into three:
- Cold Adaptation
Gain cold immunity, gain ice slip immunity!
- Heat Adaptation
Gain heat and ash storm immunity 
- Thermal Adaptation
Resist both cold and heat, but no extra fancies. The sprite is green
now!
Pressure Adapt has a purple sprite.

You can mix the cold mutations with Fiery Sweat to make these new ones:

- Cindikinesis
Instead of summoning snow, you can now summon... ash. Wow. Very cool.
- Pyrokinesis
You can fire fire now! Fires beams of heat that, unlike the temperature
gun, actually ignite on hit. Higher instability cost than its sister
mutation.

The changes have been themed primarily around classic superhero
gimmicks. Genetics feels like a natural spawning point for superheroes,
and its mutations show this via the good ol' 'radiation made me fire eye
lasers' hero backstory. Adding more ways to be a superhero is fun.

Also, added two new speech mutations:
- Trichromatic Larynx
Every word you say is now either red, green, or blue!
- Heckacious Larynx (Trichromatic Larynx x Wacky)
You sound, well. Absolutely ridiculous. Spectacularly silly. Profoundly
wacky. Don't give it to the clown.
Unlocked the Elvis mutation as well.

## Why It's Good For The Game

> Adds a plethora of new positive mutations to the game!

Genetics is in desperate need of new content, all it's had for years is
a slow gutting and removal of the few things it does have. Hulk is,
being real, stupid, dumb, stagnated, and overpowered, but it's been
begrudgingly accepted because genetics is quite literally just, nothing
without it. I'm here to add the somethings to genetics and add some more
variety (and no i'm not touching hulk)

> Mutations now have a variable that directly adds and removes traits
instead of manually doing so for every mutation.

Less stupid

> Tripled cryobeam range.

Shit joke mutation is now long-range shit joke mutation!

> Made the mushroom hallucinogen's code more readable.

Slightly OOS because I was going to add color blind mutations but
decided not to creep. This piece o shit code has been hurting my head
for years and now that I've finally understood it I want to make sure
others don't go through that pani.

> - Adrenaline Rush
A quick burst of some mild chemicals at the cost of eventual nausea,
sounds like a fair trade to me! If you're already on the ground, this
isn't going to do anything.
> - Mending Touch
Healing is something that's lacking from the mutations, and this puts a
fun spin on it, making the caster a damage pincushion as they heal and
absorb damage.
> - Elastic Arms
Classic superhero power, very funny, lots of silly and sandbox
potential. Has innate drawbacks because 1. thematic and 2. it's pretty
strong

> Split temperature adaptation into three:
They combine into the same thing it used to be, so don't freak out. This
just adds some separation between the immune types, for things like
themed superheroes.

> - Cold Adaptation
Perhaps mildly concerning, but I think this might be a fun spin on it?
TODO: make hiking boots effect?
> - Heat Adaptation
Nothing to say. It's cool.
> - Thermal Adaptation
Nothing wrong with this mutation so it stays in

> You can mix the cold mutations with Fiery Sweat to make these new
ones:
How can we have frozone and not, uh human torch or something. why are
there no heavy hitter fire superheroes in marvel or dc???
> - Cindikinesis
Can't really summon an equivalent to snow that's actually useful, so
here's this instead. Clown might like it, or maybe the chemist.
> - Pyrokinesis
The ignition effect is fairly weak and mostly a deterrent. I think this
is the most dangerous ranged mutation in the game, which is kinda sad.

> - Trichromatic Larynx
Colors are fun! We have speech mutations that change words but none that
change their color. Though, to be fair, this was mostly added for the
mutation below's combination.
> - Heckacious Larynx (Trichromatic Larynx x Wacky)
I felt that Wacky wasn't nearly wacky enough. It just made your speech
comic sans. That's great and all, but. It's not much? This will be a
truly clownly mutation, the Genetics equivalent of a HONK mech. I made
it a combination mutation specifically to restrain its power level.
> Unlocked the Elvis mutation as well.
Was there a reason to lock this?

## Changelog

🆑
add: Added tons of new mutations to Genetics, alongside some recipes!
add: Thermal Adaptation has been made a combination mutation from the
stronger but narrower Cold and Heat adaptations.
balance: Cryobeams have 9 tile range, and fiery sweat doesn't cause
spread on contact.
image: Added some neat new sprites for the new mutations, and added a
greyscale version of the magic hand sprites.
code: Infinitesmally improved mutation code.
/🆑
This commit is contained in:
carlarctg
2024-06-28 18:52:09 -03:00
committed by GitHub
parent 64ab2186e3
commit ff836e10be
43 changed files with 877 additions and 182 deletions

View File

@@ -178,6 +178,7 @@
#define TREAT_MESSAGE_ARG 1 #define TREAT_MESSAGE_ARG 1
#define TREAT_TTS_MESSAGE_ARG 2 #define TREAT_TTS_MESSAGE_ARG 2
#define TREAT_TTS_FILTER_ARG 3 #define TREAT_TTS_FILTER_ARG 3
#define TREAT_CAPITALIZE_MESSAGE 4
///From obj/item/toy/crayon/spraycan ///From obj/item/toy/crayon/spraycan
#define COMSIG_LIVING_MOB_PAINTED "living_mob_painted" #define COMSIG_LIVING_MOB_PAINTED "living_mob_painted"

View File

@@ -69,6 +69,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// Antagonizes the above. // Antagonizes the above.
#define TRAIT_DISCOORDINATED_TOOL_USER "discoordinated_tool_user" #define TRAIT_DISCOORDINATED_TOOL_USER "discoordinated_tool_user"
#define TRAIT_PACIFISM "pacifism" #define TRAIT_PACIFISM "pacifism"
// Trait added to the user of a hippocratic oath status effect
#define TRAIT_HIPPOCRATIC_OATH "hippocratic_oath"
#define TRAIT_IGNORESLOWDOWN "ignoreslow" #define TRAIT_IGNORESLOWDOWN "ignoreslow"
#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" #define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown"
/// Makes it so the mob can use guns regardless of tool user status /// Makes it so the mob can use guns regardless of tool user status

View File

@@ -363,6 +363,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NO_TWOHANDING" = TRAIT_NO_TWOHANDING, "TRAIT_NO_TWOHANDING" = TRAIT_NO_TWOHANDING,
"TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR,
"TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY,
"TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH,
"TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE,
"TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER,
"TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED,

View File

@@ -163,6 +163,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED,
"TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE,
"TRAIT_PACIFISM" = TRAIT_PACIFISM, "TRAIT_PACIFISM" = TRAIT_PACIFISM,
"TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH,
"TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER,
"TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM,
"TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG,

View File

@@ -225,6 +225,10 @@
next += target.loc next += target.loc
checking = next checking = next
if(SEND_SIGNAL(src, COMSIG_ATOM_CANREACH, ultimate_target) & COMPONENT_ALLOW_REACH)
return TRUE
return FALSE return FALSE
/atom/movable/proc/DirectAccess() /atom/movable/proc/DirectAccess()

View File

@@ -25,6 +25,18 @@
required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive" required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive"
result = /datum/mutation/human/shock result = /datum/mutation/human/shock
/datum/generecipe/cindikinesis
required = "/datum/mutation/human/geladikinesis; /datum/mutation/human/fire_breath"
result = /datum/mutation/human/geladikinesis/ash
/datum/generecipe/pyrokinesis
required = "/datum/mutation/human/cryokinesis; /datum/mutation/human/fire_breath"
result = /datum/mutation/human/cryokinesis/pyrokinesis
/datum/generecipe/thermal_adaptation
required = "/datum/mutation/human/adaptation/cold; /datum/mutation/human/adaptation/heat"
result = /datum/mutation/human/adaptation/thermal
/datum/generecipe/antiglow /datum/generecipe/antiglow
required = "/datum/mutation/human/glow; /datum/mutation/human/void" required = "/datum/mutation/human/glow; /datum/mutation/human/void"
result = /datum/mutation/human/glow/anti result = /datum/mutation/human/glow/anti
@@ -36,3 +48,7 @@
/datum/generecipe/martyrdom /datum/generecipe/martyrdom
required = "/datum/mutation/human/strong; /datum/mutation/human/stimmed" required = "/datum/mutation/human/strong; /datum/mutation/human/stimmed"
result = /datum/mutation/human/martyrdom result = /datum/mutation/human/martyrdom
/datum/generecipe/heckacious
required = "/datum/mutation/human/wacky; /datum/mutation/human/trichromatic"
result = /datum/mutation/human/heckacious

View File

@@ -96,6 +96,8 @@
var/energy_coeff = -1 var/energy_coeff = -1
/// List of strings of valid chromosomes this mutation can accept. /// List of strings of valid chromosomes this mutation can accept.
var/list/valid_chrom_list = list() var/list/valid_chrom_list = list()
/// List of traits that are added or removed by the mutation with GENETIC_TRAIT source.
var/list/mutation_traits
/datum/mutation/human/New(class = MUT_OTHER, timer, datum/mutation/human/copymut) /datum/mutation/human/New(class = MUT_OTHER, timer, datum/mutation/human/copymut)
. = ..() . = ..()
@@ -141,6 +143,8 @@
owner.overlays_standing[layer_used] = mut_overlay owner.overlays_standing[layer_used] = mut_overlay
owner.apply_overlay(layer_used) owner.apply_overlay(layer_used)
grant_power() //we do checks here so nothing about hulk getting magic grant_power() //we do checks here so nothing about hulk getting magic
if(mutation_traits)
owner.add_traits(mutation_traits, GENETIC_MUTATION)
if(!modified) if(!modified)
addtimer(CALLBACK(src, PROC_REF(modify), 0.5 SECONDS)) //gonna want children calling ..() to run first addtimer(CALLBACK(src, PROC_REF(modify), 0.5 SECONDS)) //gonna want children calling ..() to run first
@@ -165,6 +169,9 @@
owner.overlays_standing[layer_used] = mut_overlay owner.overlays_standing[layer_used] = mut_overlay
owner.apply_overlay(layer_used) owner.apply_overlay(layer_used)
if(mutation_traits)
owner.remove_traits(mutation_traits, GENETIC_MUTATION)
/mob/living/carbon/proc/update_mutations_overlay() /mob/living/carbon/proc/update_mutations_overlay()
return return

View File

@@ -0,0 +1,49 @@
/datum/mutation/human/adrenaline_rush
name = "Adrenaline Rush"
desc = "Allows the host to trigger their body's adrenaline response at will."
quality = POSITIVE
text_gain_indication = span_notice("You feel pumped up!")
instability = POSITIVE_INSTABILITY_MODERATE
power_path = /datum/action/cooldown/adrenaline
energy_coeff = 1
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/adrenaline_rush/modify()
. = ..()
var/datum/action/cooldown/adrenaline/to_modify = .
if(!istype(to_modify)) // null or invalid
return
to_modify.adrenaline_amount = 10 * GET_MUTATION_POWER(src)
to_modify.comedown_amount = 7 / GET_MUTATION_SYNCHRONIZER(src)
/datum/action/cooldown/adrenaline
name = "Adrenaline!"
desc = "Energize yourself, pushing your body to its limits!"
button_icon = 'icons/mob/actions/actions_genetic.dmi'
button_icon_state = "adrenaline"
cooldown_time = 2 MINUTES
check_flags = AB_CHECK_CONSCIOUS
/// How many units of each positive reagent injected during adrenaline.
var/adrenaline_amount = 10
/// How many units of each negative reagent injected after comedown.
var/comedown_amount = 7
/datum/action/cooldown/adrenaline/Activate(mob/living/carbon/cast_on)
. = ..()
to_chat(cast_on, span_userdanger("You feel pumped up! It's time to GO!"))
cast_on.reagents.add_reagent(/datum/reagent/drug/pumpup, adrenaline_amount)
cast_on.reagents.add_reagent(/datum/reagent/medicine/synaptizine, adrenaline_amount)
cast_on.reagents.add_reagent(/datum/reagent/determination, adrenaline_amount)
addtimer(CALLBACK(src, PROC_REF(get_tired), cast_on), 25 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
return TRUE
/datum/action/cooldown/adrenaline/proc/get_tired(mob/living/carbon/cast_on)
to_chat(cast_on, span_danger("Your adrenaline rush makes way for a bout of nausea and a deep feeling of exhaustion in your muscles."))
cast_on.reagents.add_reagent(/datum/reagent/peaceborg/tire, comedown_amount)
cast_on.reagents.add_reagent(/datum/reagent/peaceborg/confuse, comedown_amount)
cast_on.set_dizzy_if_lower(10 SECONDS)

View File

@@ -1,53 +1,58 @@
/datum/mutation/human/temperature_adaptation /datum/mutation/human/adaptation
name = "Temperature Adaptation" name = "Adaptation"
desc = "A strange mutation that renders the host immune to damage from extreme temperatures. Does not protect from vacuums." desc = "A strange mutation that renders the host immune to damage from extreme temperatures. Does not protect from vacuums."
quality = POSITIVE quality = POSITIVE
difficulty = 16 difficulty = 16
text_gain_indication = "<span class='notice'>Your body feels warm!</span>" text_gain_indication = span_notice("Your body feels normal!")
instability = POSITIVE_INSTABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
conflicts = list(/datum/mutation/human/pressure_adaptation) locked = TRUE // fake parent
conflicts = list(/datum/mutation/human/adaptation)
mutation_traits = list(TRAIT_WADDLING)
/// Icon used for the adaptation overlay
var/adapt_icon = "meow"
/datum/mutation/human/temperature_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) /datum/mutation/human/adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..() ..()
conflicts = typesof(src)
if(!(type in visual_indicators)) if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "fire", -MUTATIONS_LAYER)) visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', adapt_icon, -MUTATIONS_LAYER))
/datum/mutation/human/temperature_adaptation/get_visual_indicator() /datum/mutation/human/adaptation/get_visual_indicator()
return visual_indicators[type][1] return visual_indicators[type][1]
/datum/mutation/human/temperature_adaptation/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/adaptation/cold
if(..()) name = "Cold Adaptation"
return desc = "A strange mutation that renders the host immune to damage from low temperature environments. It also prevents the host from slipping on ice."
owner.add_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTHEAT), GENETIC_MUTATION) text_gain_indication = span_notice("Your body feels refreshingly cold.")
instability = POSITIVE_INSTABILITY_MODERATE
mutation_traits = list(TRAIT_RESISTCOLD, TRAIT_NO_SLIP_ICE)
adapt_icon = "cold"
locked = FALSE
/datum/mutation/human/temperature_adaptation/on_losing(mob/living/carbon/human/owner) /datum/mutation/human/adaptation/heat
if(..()) name = "Heat Adaptation"
return desc = "A strange mutation that renders the host immune to damage from high temperature, including being set alight, though the flame itself still burns clothing. It also seems to make the host resist ash storms."
owner.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTHEAT), GENETIC_MUTATION) text_gain_indication = span_notice("Your body feels invigoratingly warm.")
instability = POSITIVE_INSTABILITY_MODERATE
mutation_traits = list(TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE)
adapt_icon = "fire"
locked = FALSE
/datum/mutation/human/pressure_adaptation /datum/mutation/human/adaptation/thermal
name = "Thermal Adaptation"
desc = "A strange mutation that renders the host immune to damage from both low and high temperature environments. Does not protect from high or low pressure environments."
difficulty = 32
text_gain_indication = span_notice("Your body feels pleasantly room temperature.")
instability = POSITIVE_INSTABILITY_MAJOR
mutation_traits = list(TRAIT_RESISTHEAT, TRAIT_RESISTCOLD)
adapt_icon = "thermal"
locked = TRUE // recipe
/datum/mutation/human/adaptation/pressure
name = "Pressure Adaptation" name = "Pressure Adaptation"
desc = "A strange mutation that renders the host immune to damage from both low and high pressure environments. Does not protect from temperature, including the cold of space." desc = "A strange mutation that renders the host immune to damage from both low and high pressure environments. Does not protect from temperature, including the cold of space."
quality = POSITIVE text_gain_indication = span_notice("Your body feels impressively pressurized.")
difficulty = 16 instability = POSITIVE_INSTABILITY_MODERATE
text_gain_indication = "<span class='notice'>Your body feels numb!</span>" adapt_icon = "pressure"
instability = POSITIVE_INSTABILITY_MAJOR mutation_traits = list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE)
conflicts = list(/datum/mutation/human/temperature_adaptation) locked = FALSE
/datum/mutation/human/pressure_adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "pressure", -MUTATIONS_LAYER))
/datum/mutation/human/pressure_adaptation/get_visual_indicator()
return visual_indicators[type][1]
/datum/mutation/human/pressure_adaptation/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.add_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE), GENETIC_MUTATION)
/datum/mutation/human/pressure_adaptation/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.remove_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE), GENETIC_MUTATION)

View File

@@ -2,8 +2,8 @@
name = "Antenna" name = "Antenna"
desc = "The affected person sprouts an antenna. This is known to allow them to access common radio channels passively." desc = "The affected person sprouts an antenna. This is known to allow them to access common radio channels passively."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>You feel an antenna sprout from your forehead.</span>" text_gain_indication = span_notice("You feel an antenna sprout from your forehead.")
text_lose_indication = "<span class='notice'>Your antenna shrinks back down.</span>" text_lose_indication = span_notice("Your antenna shrinks back down.")
instability = POSITIVE_INSTABILITY_MINOR instability = POSITIVE_INSTABILITY_MINOR
difficulty = 8 difficulty = 8
var/datum/weakref/radio_weakref var/datum/weakref/radio_weakref
@@ -44,8 +44,8 @@
name = "Mind Reader" name = "Mind Reader"
desc = "The affected person can look into the recent memories of others." desc = "The affected person can look into the recent memories of others."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>You hear distant voices at the corners of your mind.</span>" text_gain_indication = span_notice("You hear distant voices at the corners of your mind.")
text_lose_indication = "<span class='notice'>The distant voices fade.</span>" text_lose_indication = span_notice("The distant voices fade.")
power_path = /datum/action/cooldown/spell/pointed/mindread power_path = /datum/action/cooldown/spell/pointed/mindread
instability = POSITIVE_INSTABILITY_MINOR instability = POSITIVE_INSTABILITY_MINOR
difficulty = 8 difficulty = 8

View File

@@ -6,7 +6,7 @@
desc = "A genetic defect that sporadically causes seizures." desc = "A genetic defect that sporadically causes seizures."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You get a headache.</span>" text_gain_indication = span_danger("You get a headache.")
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
@@ -53,7 +53,7 @@
desc = "Strange mutation that causes the holder to randomly mutate." desc = "Strange mutation that causes the holder to randomly mutate."
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel strange.</span>" text_gain_indication = span_danger("You feel strange.")
locked = TRUE locked = TRUE
/datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner)
@@ -83,7 +83,7 @@
desc = "A chronic cough." desc = "A chronic cough."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You start coughing.</span>" text_gain_indication = span_danger("You start coughing.")
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
@@ -101,8 +101,8 @@
desc = "Subject is easily terrified, and may suffer from hallucinations." desc = "Subject is easily terrified, and may suffer from hallucinations."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel screams echo through your mind...</span>" text_gain_indication = span_danger("You feel screams echo through your mind...")
text_lose_indication = "<span class='notice'>The screaming in your mind fades.</span>" text_lose_indication = span_notice("The screaming in your mind fades.")
/datum/mutation/human/paranoia/on_life(seconds_per_tick, times_fired) /datum/mutation/human/paranoia/on_life(seconds_per_tick, times_fired)
if(SPT_PROB(2.5, seconds_per_tick) && owner.stat == CONSCIOUS) if(SPT_PROB(2.5, seconds_per_tick) && owner.stat == CONSCIOUS)
@@ -198,7 +198,7 @@
desc = "A genome that inhibits certain brain functions, causing the holder to appear clumsy. Honk!" desc = "A genome that inhibits certain brain functions, causing the holder to appear clumsy. Honk!"
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You feel lightheaded.</span>" text_gain_indication = span_danger("You feel lightheaded.")
/datum/mutation/human/clumsy/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/clumsy/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -217,7 +217,7 @@
desc = "A chronic twitch that forces the user to scream bad words." //definitely needs rewriting desc = "A chronic twitch that forces the user to scream bad words." //definitely needs rewriting
quality = NEGATIVE quality = NEGATIVE
instability = 0 instability = 0
text_gain_indication = "<span class='danger'>You twitch.</span>" text_gain_indication = span_danger("You twitch.")
synchronizer_coeff = 1 synchronizer_coeff = 1
/datum/mutation/human/tourettes/on_life(seconds_per_tick, times_fired) /datum/mutation/human/tourettes/on_life(seconds_per_tick, times_fired)
@@ -241,7 +241,7 @@
desc = "The holder of this genome is completely deaf." desc = "The holder of this genome is completely deaf."
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You can't seem to hear anything.</span>" text_gain_indication = span_danger("You can't seem to hear anything.")
/datum/mutation/human/deaf/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/deaf/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -286,7 +286,7 @@
name = "Glowy" name = "Glowy"
desc = "You permanently emit a light with a random color and intensity." desc = "You permanently emit a light with a random color and intensity."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>Your skin begins to glow softly.</span>" text_gain_indication = span_notice("Your skin begins to glow softly.")
instability = POSITIVE_INSTABILITY_MINI instability = POSITIVE_INSTABILITY_MINI
power_coeff = 1 power_coeff = 1
conflicts = list(/datum/mutation/human/glow/anti) conflicts = list(/datum/mutation/human/glow/anti)
@@ -323,7 +323,7 @@
/datum/mutation/human/glow/anti /datum/mutation/human/glow/anti
name = "Anti-Glow" name = "Anti-Glow"
desc = "Your skin seems to attract and absorb nearby light creating 'darkness' around you." desc = "Your skin seems to attract and absorb nearby light creating 'darkness' around you."
text_gain_indication = "<span class='notice'>The light around you seems to disappear.</span>" text_gain_indication = span_notice("The light around you seems to disappear.")
conflicts = list(/datum/mutation/human/glow) conflicts = list(/datum/mutation/human/glow)
instability = POSITIVE_INSTABILITY_MINOR instability = POSITIVE_INSTABILITY_MINOR
locked = TRUE locked = TRUE
@@ -336,7 +336,7 @@
name = "Strength" name = "Strength"
desc = "The user's muscles slightly expand. Commonly seen in top-ranking boxers." desc = "The user's muscles slightly expand. Commonly seen in top-ranking boxers."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>You feel strong.</span>" text_gain_indication = span_notice("You feel strong.")
instability = POSITIVE_INSTABILITY_MINI instability = POSITIVE_INSTABILITY_MINI
difficulty = 16 difficulty = 16
@@ -358,7 +358,7 @@
desc = "The user's chemical balance is more robust. This mutation is known to slightly improve workout efficiency." desc = "The user's chemical balance is more robust. This mutation is known to slightly improve workout efficiency."
quality = POSITIVE quality = POSITIVE
instability = POSITIVE_INSTABILITY_MINI instability = POSITIVE_INSTABILITY_MINI
text_gain_indication = "<span class='notice'>You feel stimmed.</span>" text_gain_indication = span_notice("You feel stimmed.")
difficulty = 16 difficulty = 16
/datum/mutation/human/stimmed/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/stimmed/on_acquiring(mob/living/carbon/human/owner)
@@ -377,8 +377,8 @@
name = "Insulated" name = "Insulated"
desc = "The affected person does not conduct electricity." desc = "The affected person does not conduct electricity."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>Your fingertips go numb.</span>" text_gain_indication = span_notice("Your fingertips go numb.")
text_lose_indication = "<span class='notice'>Your fingertips regain feeling.</span>" text_lose_indication = span_notice("Your fingertips regain feeling.")
difficulty = 16 difficulty = 16
instability = POSITIVE_INSTABILITY_MODERATE instability = POSITIVE_INSTABILITY_MODERATE
@@ -396,8 +396,9 @@
name = "Fiery Sweat" name = "Fiery Sweat"
desc = "The user's skin will randomly combust, but is generally a lot more resilient to burning." desc = "The user's skin will randomly combust, but is generally a lot more resilient to burning."
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='warning'>You feel hot.</span>" text_gain_indication = span_warning("You feel hot.")
text_lose_indication = "<span class='notice'>You feel a lot cooler.</span>" text_lose_indication = span_notice("You feel a lot cooler.")
conflicts = list(/datum/mutation/human/adaptation/heat)
difficulty = 14 difficulty = 14
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
@@ -421,8 +422,8 @@
name = "Spatial Instability" name = "Spatial Instability"
desc = "The victim of the mutation has a very weak link to spatial reality, and may be displaced. Often causes extreme nausea." desc = "The victim of the mutation has a very weak link to spatial reality, and may be displaced. Often causes extreme nausea."
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='warning'>The space around you twists sickeningly.</span>" text_gain_indication = span_warning("The space around you twists sickeningly.")
text_lose_indication = "<span class='notice'>The space around you settles back to normal.</span>" text_lose_indication = span_notice("The space around you settles back to normal.")
difficulty = 18//high so it's hard to unlock and abuse difficulty = 18//high so it's hard to unlock and abuse
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
synchronizer_coeff = 1 synchronizer_coeff = 1
@@ -452,8 +453,8 @@
desc = "Subject has acidic chemicals building up underneath the skin. This is often lethal." desc = "Subject has acidic chemicals building up underneath the skin. This is often lethal."
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='userdanger'>A horrible burning sensation envelops you as your flesh turns to acid!</span>" text_gain_indication = span_userdanger("A horrible burning sensation envelops you as your flesh turns to acid!")
text_lose_indication = "<span class='notice'>A feeling of relief fills you as your flesh goes back to normal.</span>" text_lose_indication = span_notice("A feeling of relief fills you as your flesh goes back to normal.")
difficulty = 18//high so it's hard to unlock and use on others difficulty = 18//high so it's hard to unlock and use on others
/// The cooldown for the warning message /// The cooldown for the warning message
COOLDOWN_DECLARE(msgcooldown) COOLDOWN_DECLARE(msgcooldown)
@@ -473,8 +474,8 @@
desc = "Subject suffers from muscle spasms." desc = "Subject suffers from muscle spasms."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='warning'>You flinch.</span>" text_gain_indication = span_warning("You flinch.")
text_lose_indication = "<span class='notice'>Your flinching subsides.</span>" text_lose_indication = span_notice("Your flinching subsides.")
difficulty = 16 difficulty = 16
/datum/mutation/human/spastic/on_acquiring() /datum/mutation/human/spastic/on_acquiring()
@@ -492,8 +493,8 @@
desc = "A mutation that replaces the right foot with another left foot. Symptoms include kissing the floor when taking a step." desc = "A mutation that replaces the right foot with another left foot. Symptoms include kissing the floor when taking a step."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='warning'>Your right foot feels... left.</span>" text_gain_indication = span_warning("Your right foot feels... left.")
text_lose_indication = "<span class='notice'>Your right foot feels alright.</span>" text_lose_indication = span_notice("Your right foot feels alright.")
difficulty = 16 difficulty = 16
/datum/mutation/human/extrastun/on_acquiring() /datum/mutation/human/extrastun/on_acquiring()
@@ -525,8 +526,8 @@
instability = NEGATIVE_STABILITY_MAJOR // free stability >:) instability = NEGATIVE_STABILITY_MAJOR // free stability >:)
locked = TRUE locked = TRUE
quality = POSITIVE //not that cloning will be an option a lot but generally lets keep this around i guess? quality = POSITIVE //not that cloning will be an option a lot but generally lets keep this around i guess?
text_gain_indication = "<span class='warning'>You get an intense feeling of heartburn.</span>" text_gain_indication = span_warning("You get an intense feeling of heartburn.")
text_lose_indication = "<span class='notice'>Your internal organs feel at ease.</span>" text_lose_indication = span_notice("Your internal organs feel at ease.")
/datum/mutation/human/martyrdom/on_acquiring() /datum/mutation/human/martyrdom/on_acquiring()
. = ..() . = ..()
@@ -573,7 +574,7 @@
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
difficulty = 12 //pretty good for traitors difficulty = 12 //pretty good for traitors
quality = NEGATIVE //holy shit no eyes or tongue or ears quality = NEGATIVE //holy shit no eyes or tongue or ears
text_gain_indication = "<span class='warning'>Something feels off.</span>" text_gain_indication = span_warning("Something feels off.")
/datum/mutation/human/headless/on_acquiring() /datum/mutation/human/headless/on_acquiring()
. = ..() . = ..()

View File

@@ -4,8 +4,8 @@
desc = "A genome that causes the holder's skin to become transparent over time." desc = "A genome that causes the holder's skin to become transparent over time."
quality = POSITIVE quality = POSITIVE
difficulty = 16 difficulty = 16
text_gain_indication = "<span class='notice'>You feel one with your surroundings.</span>" text_gain_indication = span_notice("You feel one with your surroundings.")
text_lose_indication = "<span class='notice'>You feel oddly exposed.</span>" text_lose_indication = span_notice("You feel oddly exposed.")
instability = POSITIVE_INSTABILITY_MAJOR instability = POSITIVE_INSTABILITY_MAJOR
power_coeff = 1 power_coeff = 1

View File

@@ -2,7 +2,7 @@
name = "Geladikinesis" name = "Geladikinesis"
desc = "Allows the user to concentrate moisture and sub-zero forces into snow." desc = "Allows the user to concentrate moisture and sub-zero forces into snow."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>Your hand feels cold.</span>" text_gain_indication = span_notice("Your hand feels cold.")
instability = POSITIVE_INSTABILITY_MINOR instability = POSITIVE_INSTABILITY_MINOR
difficulty = 10 difficulty = 10
synchronizer_coeff = 1 synchronizer_coeff = 1
@@ -24,7 +24,7 @@
name = "Cryokinesis" name = "Cryokinesis"
desc = "Draws negative energy from the sub-zero void to freeze surrounding temperatures at subject's will." desc = "Draws negative energy from the sub-zero void to freeze surrounding temperatures at subject's will."
quality = POSITIVE //upsides and downsides quality = POSITIVE //upsides and downsides
text_gain_indication = "<span class='notice'>Your hand feels cold.</span>" text_gain_indication = span_notice("Your hand feels cold.")
instability = POSITIVE_INSTABILITY_MODERATE instability = POSITIVE_INSTABILITY_MODERATE
difficulty = 12 difficulty = 12
synchronizer_coeff = 1 synchronizer_coeff = 1

View File

@@ -4,8 +4,8 @@
quality = POSITIVE quality = POSITIVE
difficulty = 12 difficulty = 12
locked = TRUE locked = TRUE
text_gain_indication = "<span class='notice'>Your throat is burning!</span>" text_gain_indication = span_notice("Your throat is burning!")
text_lose_indication = "<span class='notice'>Your throat is cooling down.</span>" text_lose_indication = span_notice("Your throat is cooling down.")
power_path = /datum/action/cooldown/spell/cone/staggered/fire_breath power_path = /datum/action/cooldown/spell/cone/staggered/fire_breath
instability = POSITIVE_INSTABILITY_MODERATE instability = POSITIVE_INSTABILITY_MODERATE
energy_coeff = 1 energy_coeff = 1

View File

@@ -0,0 +1,31 @@
/datum/mutation/human/geladikinesis/ash
name = "Cindikinesis"
desc = "Allows the user to concentrate nearby heat into a pile of ash. Wow. Very interesting."
text_gain_indication = span_notice("Your hand feels warm.")
locked = TRUE
power_path = /datum/action/cooldown/spell/conjure_item/snow/ash
/datum/action/cooldown/spell/conjure_item/snow/ash
name = "Create Ash"
desc = "Concentrates pyrokinetic forces to create ash, useful for basically nothing."
button_icon_state = "ash"
item_type = /obj/effect/decal/cleanable/ash
/datum/mutation/human/cryokinesis/pyrokinesis
name = "Pyrokinesis"
desc = "Draws positive energy from the surroundings to heat surrounding temperatures at subject's will."
text_gain_indication = span_notice("Your hand feels hot!")
locked = TRUE
power_path = /datum/action/cooldown/spell/pointed/projectile/cryo/pyro
/datum/action/cooldown/spell/pointed/projectile/cryo/pyro
name = "Pyrobeam"
desc = "This power fires a heated bolt at a target."
button_icon_state = "firebeam"
base_icon_state = "firebeam"
cooldown_time = 30 SECONDS
active_msg = "You focus your pyrokinesis!"
deactive_msg = "You cool down."
projectile_type = /obj/projectile/temp/pyro

View File

@@ -5,14 +5,14 @@
quality = POSITIVE quality = POSITIVE
locked = TRUE locked = TRUE
difficulty = 16 difficulty = 16
text_gain_indication = "<span class='notice'>Your muscles hurt!</span>" text_gain_indication = span_notice("Your muscles hurt!")
species_allowed = list(SPECIES_HUMAN) //no skeleton/lizard hulk species_allowed = list(SPECIES_HUMAN) //no skeleton/lizard hulk
health_req = 25 health_req = 25
instability = POSITIVE_INSTABILITY_MAJOR instability = POSITIVE_INSTABILITY_MAJOR
var/scream_delay = 50 var/scream_delay = 50
var/last_scream = 0 var/last_scream = 0
/// List of traits to add/remove when someone gets this mutation. /// List of traits to add/remove when someone gets this mutation.
var/list/mutation_traits = list( mutation_traits = list(
TRAIT_CHUNKYFINGERS, TRAIT_CHUNKYFINGERS,
TRAIT_HULK, TRAIT_HULK,
TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_IGNOREDAMAGESLOWDOWN,
@@ -24,7 +24,6 @@
/datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
return return
owner.add_traits(mutation_traits, GENETIC_MUTATION)
for(var/obj/item/bodypart/part as anything in owner.bodyparts) for(var/obj/item/bodypart/part as anything in owner.bodyparts)
part.variable_color = COLOR_DARK_LIME part.variable_color = COLOR_DARK_LIME
owner.update_body_parts() owner.update_body_parts()
@@ -87,7 +86,6 @@
/datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner) /datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner)
if(..()) if(..())
return return
owner.remove_traits(mutation_traits, GENETIC_MUTATION)
for(var/obj/item/bodypart/part as anything in owner.bodyparts) for(var/obj/item/bodypart/part as anything in owner.bodyparts)
part.variable_color = null part.variable_color = null
owner.update_body_parts() owner.update_body_parts()

View File

@@ -3,8 +3,8 @@
desc = "Your sense of smell is comparable to that of a canine." desc = "Your sense of smell is comparable to that of a canine."
quality = POSITIVE quality = POSITIVE
difficulty = 12 difficulty = 12
text_gain_indication = "<span class='notice'>Smells begin to make more sense...</span>" text_gain_indication = span_notice("Smells begin to make more sense...")
text_lose_indication = "<span class='notice'>Your sense of smell goes back to normal.</span>" text_lose_indication = span_notice("Your sense of smell goes back to normal.")
power_path = /datum/action/cooldown/spell/olfaction power_path = /datum/action/cooldown/spell/olfaction
instability = POSITIVE_INSTABILITY_MODERATE instability = POSITIVE_INSTABILITY_MODERATE
synchronizer_coeff = 1 synchronizer_coeff = 1

View File

@@ -17,8 +17,8 @@
desc = "Causes the subject to feel just a little bit smarter. Most effective in specimens with low levels of intelligence." desc = "Causes the subject to feel just a little bit smarter. Most effective in specimens with low levels of intelligence."
quality = POSITIVE quality = POSITIVE
instability = POSITIVE_INSTABILITY_MODERATE // literally makes you on par with station equipment instability = POSITIVE_INSTABILITY_MODERATE // literally makes you on par with station equipment
text_gain_indication = "<span class='danger'>You feel a little bit smarter.</span>" text_gain_indication = span_danger("You feel a little bit smarter.")
text_lose_indication = "<span class='danger'>Your mind feels a little bit foggy.</span>" text_lose_indication = span_danger("Your mind feels a little bit foggy.")
/datum/mutation/human/clever/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/clever/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())

View File

@@ -2,7 +2,7 @@
name = "Radioactivity" name = "Radioactivity"
desc = "A volatile mutation that causes the host to sent out deadly beta radiation. This affects both the hosts and their surroundings." desc = "A volatile mutation that causes the host to sent out deadly beta radiation. This affects both the hosts and their surroundings."
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='warning'>You can feel it in your bones!</span>" text_gain_indication = span_warning("You can feel it in your bones!")
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
difficulty = 8 difficulty = 8
power_coeff = 1 power_coeff = 1

View File

@@ -0,0 +1,112 @@
///Telekinesis lets you interact with objects from range, and gives you a light blue halo around your head.
/datum/mutation/human/telekinesis
name = "Telekinesis"
desc = "A strange mutation that allows the holder to interact with objects through thought."
quality = POSITIVE
difficulty = 18
text_gain_indication = span_notice("You feel smarter!")
limb_req = BODY_ZONE_HEAD
instability = POSITIVE_INSTABILITY_MAJOR
///Typecache of atoms that TK shouldn't interact with
var/static/list/blacklisted_atoms = typecacheof(list(/atom/movable/screen))
/datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER))
/datum/mutation/human/telekinesis/on_acquiring(mob/living/carbon/human/homan)
. = ..()
if(.)
return
RegisterSignal(homan, COMSIG_MOB_ATTACK_RANGED, PROC_REF(on_ranged_attack))
/datum/mutation/human/telekinesis/on_losing(mob/living/carbon/human/homan)
. = ..()
if(.)
return
UnregisterSignal(homan, COMSIG_MOB_ATTACK_RANGED)
/datum/mutation/human/telekinesis/get_visual_indicator()
return visual_indicators[type][1]
///Triggers on COMSIG_MOB_ATTACK_RANGED. Usually handles stuff like picking up items at range.
/datum/mutation/human/telekinesis/proc/on_ranged_attack(mob/source, atom/target)
SIGNAL_HANDLER
if(is_type_in_typecache(target, blacklisted_atoms))
return
if(!tkMaxRangeCheck(source, target) || source.z != target.z)
return
return target.attack_tk(source)
/datum/mutation/human/elastic_arms
name = "Elastic Arms"
desc = "Subject's arms have become elastic, allowing them to stretch up to a meter away. However, this elasticity makes it difficult to wear gloves, handle complex tasks, or grab large objects."
quality = POSITIVE
instability = POSITIVE_INSTABILITY_MAJOR
text_gain_indication = span_warning("You feel armstrong!")
text_lose_indication = span_warning("Your arms stop feeling so saggy all the time.")
difficulty = 32
mutation_traits = list(TRAIT_CHUNKYFINGERS, TRAIT_NO_TWOHANDING)
/datum/mutation/human/elastic_arms/on_acquiring(mob/living/carbon/human/homan)
. = ..()
if(.)
return
RegisterSignal(homan, COMSIG_ATOM_CANREACH, PROC_REF(on_canreach))
RegisterSignal(homan, COMSIG_LIVING_TRY_PUT_IN_HAND, PROC_REF(on_owner_equipping_item))
RegisterSignal(homan, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull))
/datum/mutation/human/elastic_arms/on_losing(mob/living/carbon/human/homan)
. = ..()
if(.)
return
UnregisterSignal(homan, list(COMSIG_ATOM_CANREACH, COMSIG_LIVING_TRY_PUT_IN_HAND, COMSIG_LIVING_TRY_PULL))
/// signal sent when prompting if an item can be equipped
/datum/mutation/human/elastic_arms/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/pick_item)
SIGNAL_HANDLER
if(pick_item.w_class > WEIGHT_CLASS_BULKY) // cant decide if i should limit to huge or bulky.
pick_item.balloon_alert(owner, "arms too floppy to wield!")
return COMPONENT_LIVING_CANT_PUT_IN_HAND
/// signal sent when owner tries to pull
/datum/mutation/human/elastic_arms/proc/on_owner_try_pull(mob/living/carbon/owner, atom/movable/target, force)
SIGNAL_HANDLER
if(isliving(target))
var/mob/living/living_target = target
if(living_target.mob_size > MOB_SIZE_HUMAN)
living_target.balloon_alert(owner, "arms too floppy to pull this!")
return COMSIG_LIVING_CANCEL_PULL
if(isitem(target))
var/obj/item/item_target = target
if(item_target.w_class > WEIGHT_CLASS_BULKY)
item_target.balloon_alert(owner, "arms too floppy to pull this!")
return COMSIG_LIVING_CANCEL_PULL
// probably buggy. let's enlist our players as bug testers
/datum/mutation/human/elastic_arms/proc/on_canreach(mob/source, atom/target)
SIGNAL_HANDLER
var/distance = get_dist(target, source)
// We only care about handling the reach distance, anything closer or further is handled normally.
// Also, no z-level shenanigans. Yet.
if((distance != 2) || source.z != target.z)
return
var/direction = get_dir(source, target)
if(!direction)
return
var/turf/open/adjacent_turf = get_step(source, direction)
// Make sure it's an open turf we're trying to pass over.
if(!istype(adjacent_turf))
return
// Check if there's something dense inbetween, then allow it.
for(var/atom/thing in adjacent_turf)
if(thing.density)
return
return COMPONENT_ALLOW_REACH

View File

@@ -4,7 +4,7 @@
desc = "The holder of this mutation has poor eyesight." desc = "The holder of this mutation has poor eyesight."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You can't see very well.</span>" text_gain_indication = span_danger("You can't see very well.")
/datum/mutation/human/nearsight/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/nearsight/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -22,7 +22,7 @@
desc = "Renders the subject completely blind." desc = "Renders the subject completely blind."
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You can't seem to see anything.</span>" text_gain_indication = span_danger("You can't seem to see anything.")
/datum/mutation/human/blind/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/blind/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -40,8 +40,8 @@
desc = "The user of this genome can visually perceive the unique human thermal signature." desc = "The user of this genome can visually perceive the unique human thermal signature."
quality = POSITIVE quality = POSITIVE
difficulty = 18 difficulty = 18
text_gain_indication = "<span class='notice'>You can see the heat rising off of your skin...</span>" text_gain_indication = span_notice("You can see the heat rising off of your skin...")
text_lose_indication = "<span class='notice'>You can no longer see the heat rising off of your skin...</span>" text_lose_indication = span_notice("You can no longer see the heat rising off of your skin...")
instability = POSITIVE_INSTABILITY_MAJOR // thermals aren't station equipment instability = POSITIVE_INSTABILITY_MAJOR // thermals aren't station equipment
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
@@ -111,7 +111,7 @@
/datum/mutation/human/xray /datum/mutation/human/xray
name = "X Ray Vision" name = "X Ray Vision"
desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, wich might be fun for later //hmb desc = "A strange genome that allows the user to see between the spaces of walls." //actual x-ray would mean you'd constantly be blasting rads, wich might be fun for later //hmb
text_gain_indication = "<span class='notice'>The walls suddenly disappear!</span>" text_gain_indication = span_notice("The walls suddenly disappear!")
instability = POSITIVE_INSTABILITY_MAJOR instability = POSITIVE_INSTABILITY_MAJOR
locked = TRUE locked = TRUE
@@ -135,7 +135,7 @@
quality = POSITIVE quality = POSITIVE
locked = TRUE locked = TRUE
difficulty = 16 difficulty = 16
text_gain_indication = "<span class='notice'>You feel pressure building up behind your eyes.</span>" text_gain_indication = span_notice("You feel pressure building up behind your eyes.")
layer_used = FRONT_MUTATIONS_LAYER layer_used = FRONT_MUTATIONS_LAYER
limb_req = BODY_ZONE_HEAD limb_req = BODY_ZONE_HEAD
@@ -186,8 +186,8 @@
desc = "Causes a severe case of Aphasia that prevents reading or writing." desc = "Causes a severe case of Aphasia that prevents reading or writing."
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel unable to read or write.</span>" text_gain_indication = span_danger("You feel unable to read or write.")
text_lose_indication = "<span class='danger'>You feel able to read and write again.</span>" text_lose_indication = span_danger("You feel able to read and write again.")
/datum/mutation/human/illiterate/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/illiterate/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -198,3 +198,4 @@
if(..()) if(..())
return return
REMOVE_TRAIT(owner, TRAIT_ILLITERATE, GENETIC_MUTATION) REMOVE_TRAIT(owner, TRAIT_ILLITERATE, GENETIC_MUTATION)

View File

@@ -1,12 +1,17 @@
//These are all minor mutations that affect your speech somehow. //These are all minor mutations that affect your speech somehow.
//Individual ones aren't commented since their functions should be evident at a glance //Individual ones aren't commented since their functions should be evident at a glance
// no they arent bro
#define ALPHABET list("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z")
#define VOWELS list("a", "e", "i", "o", "u")
#define CONSONANTS (ALPHABET - VOWELS)
/datum/mutation/human/nervousness /datum/mutation/human/nervousness
name = "Nervousness" name = "Nervousness"
desc = "Causes the holder to stutter." desc = "Causes the holder to stutter."
instability = NEGATIVE_STABILITY_MINI instability = NEGATIVE_STABILITY_MINI
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You feel nervous.</span>" text_gain_indication = span_danger("You feel nervous.")
/datum/mutation/human/nervousness/on_life(seconds_per_tick, times_fired) /datum/mutation/human/nervousness/on_life(seconds_per_tick, times_fired)
if(SPT_PROB(5, seconds_per_tick)) if(SPT_PROB(5, seconds_per_tick))
@@ -17,8 +22,8 @@
desc = "You are not a clown. You are the entire circus." desc = "You are not a clown. You are the entire circus."
instability = NEGATIVE_STABILITY_MINI instability = NEGATIVE_STABILITY_MINI
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='sans'><span class='infoplain'>You feel an off sensation in your voicebox.</span></span>" text_gain_indication = span_sans(span_notice("You feel an off sensation in your voicebox."))
text_lose_indication = "<span class='notice'>The off sensation passes.</span>" text_lose_indication = span_notice("The off sensation passes.")
/datum/mutation/human/wacky/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/wacky/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -35,13 +40,185 @@
speech_args[SPEECH_SPANS] |= SPAN_SANS speech_args[SPEECH_SPANS] |= SPAN_SANS
// Lower rust floor probability
// Make it only happen on open turf
// Add early return to wall hitting
// Fix throw at on cult sac
// Reduce tochat prob on rust floor
// add trait rusty to windows
// aim assist on rc doesnt work
// also in general
// give master seek to rusted harvester
/datum/mutation/human/heckacious
name = "heckacious larincks"
desc = "duge what is WISH your words man..........."
quality = MINOR_NEGATIVE
text_gain_indication = span_sans(span_red("aw SHIT man. your throat feels like FUCKASS."))
text_lose_indication = span_notice("The demonic entity possessing your larynx has finally released its grasp.")
locked = TRUE
conflicts = list(/datum/mutation/human/trichromatic) // they both modify with the same spans. also would be way too annoying
/datum/mutation/human/heckacious/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
RegisterSignal(owner, COMSIG_LIVING_TREAT_MESSAGE, PROC_REF(handle_caps))
RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/datum/mutation/human/heckacious/on_losing(mob/living/carbon/human/owner)
if(..())
return
UnregisterSignal(owner, list(COMSIG_LIVING_TREAT_MESSAGE, COMSIG_MOB_SAY))
/datum/mutation/human/heckacious/proc/handle_caps(atom/movable/source, list/message_args)
SIGNAL_HANDLER
message_args[TREAT_CAPITALIZE_MESSAGE] = FALSE
/datum/mutation/human/heckacious/proc/handle_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
if(!message)
return
// Split for swapping purposes
message = " [message] "
// Splitting up each word in the text to manually apply our intended changes
var/list/message_words = splittext(message, " ")
// What we use in the end
var/list/edited_message_words
for(var/editing_word in message_words)
if(editing_word == " " || editing_word == "" )
continue
// Used to replace the original later
var/og_word = editing_word
// Iterating through each replaceable-string in the .json
var/list/static/super_wacky_words = strings("heckacious.json", "heckacious")
// If the word doesn't get replaced we might do something with it later
var/word_edited
for(var/key in super_wacky_words)
var/value = super_wacky_words[key]
// If list, pick one value from said list
if(islist(value))
value = pick(value)
editing_word = replacetextEx(editing_word, "[uppertext(key)]", "[uppertext(value)]")
editing_word = replacetextEx(editing_word, "[capitalize(key)]", "[capitalize(value)]")
editing_word = replacetextEx(editing_word, "[key]", "[value]")
// Enable if we actually found something to change
if(editing_word != og_word)
word_edited = TRUE
// Random caps
if(prob(10))
editing_word = uppertext(editing_word)
// some times....... we add DOTS...
if(prob(10))
for(var/dotnum in 1 to rand(2, 8))
editing_word += "."
// If no replacement we do it manually
if(!word_edited)
if(prob(65))
editing_word = replacetext(editing_word, pick(VOWELS), pick(VOWELS))
// Many more consonants, double it!
for(var/i in 1 to rand(1, 2))
editing_word = replacetext(editing_word, pick(CONSONANTS), pick(CONSONANTS))
// rarely, lettter is DOUBBLED...
var/patchword = ""
for(var/letter in 1 to length(editing_word))
if(prob(92))
patchword += editing_word[letter]
continue
patchword += replacetext(editing_word[letter], "", editing_word[letter] + editing_word[letter])
editing_word = patchword
// Some words are randomly recolored and resized so they get a few of these
editing_word = span_class_handler(editing_word)
LAZYADD(edited_message_words, editing_word)
var/edited_message = jointext(edited_message_words, " ")
message = trim(edited_message)
speech_args[SPEECH_MESSAGE] = message
/datum/mutation/human/heckacious/proc/span_class_handler(message, looped = FALSE)
// Sadly combining span colors will not combine the colors of the message
if(prob(15))
switch(rand(1,3))
if(1)
message = span_red(message)
if(2)
message = span_blue(message)
if(3)
message = span_green(message)
if(prob(15))
switch(rand(1,2))
if(1)
message = span_big(message)
if(2)
message = span_small(message)
// do it AGAIN
if(prob(40))
span_class_handler(message, looped = TRUE)
return message
/datum/mutation/human/trichromatic
name = "Trichromatic Larynx"
desc = "A strange mutation originating from Clown Planet which alters the color of the patient's vocal chords."
quality = MINOR_NEGATIVE
text_gain_indication = span_red("You") + span_blue(" feel ") + span_green("Weird.")
text_lose_indication = span_notice("Your colors feel normal again.")
conflicts = list(/datum/mutation/human/heckacious)
/datum/mutation/human/trichromatic/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/datum/mutation/human/trichromatic/on_losing(mob/living/carbon/human/owner)
if(..())
return
UnregisterSignal(owner, COMSIG_MOB_SAY)
/datum/mutation/human/trichromatic/proc/handle_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
var/message = speech_args[SPEECH_MESSAGE]
var/list/message_words = splittext(message, " ")
var/list/static/span_combo_list = list("green", "red", "blue")
var/words_key = 1
for(var/i in message_words)
message_words[words_key] = span_class_handler(message_words[words_key])
words_key++
var/edited_message = jointext(message_words, " ")
message = trim(edited_message)
speech_args[SPEECH_MESSAGE] = message
/datum/mutation/human/trichromatic/proc/span_class_handler(message)
// Sadly combining span colors will not combine the colors of the message
switch(rand(1,3))
if(1)
message = span_red(message)
if(2)
message = span_blue(message)
if(3)
message = span_green(message)
return message
/datum/mutation/human/mute /datum/mutation/human/mute
name = "Mute" name = "Mute"
desc = "Completely inhibits the vocal section of the brain." desc = "Completely inhibits the vocal section of the brain."
instability = NEGATIVE_STABILITY_MAJOR instability = NEGATIVE_STABILITY_MAJOR
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You feel unable to express yourself at all.</span>" text_gain_indication = span_danger("You feel unable to express yourself at all.")
text_lose_indication = "<span class='danger'>You feel able to speak freely again.</span>" text_lose_indication = span_danger("You feel able to speak freely again.")
/datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -58,8 +235,8 @@
desc = "Partially inhibits the vocal center of the brain, severely distorting speech." desc = "Partially inhibits the vocal center of the brain, severely distorting speech."
instability = NEGATIVE_STABILITY_MODERATE instability = NEGATIVE_STABILITY_MODERATE
quality = NEGATIVE quality = NEGATIVE
text_gain_indication = "<span class='danger'>You can't seem to form any coherent thoughts!</span>" text_gain_indication = span_danger("You can't seem to form any coherent thoughts!")
text_lose_indication = "<span class='danger'>Your mind feels more clear.</span>" text_lose_indication = span_danger("Your mind feels more clear.")
/datum/mutation/human/unintelligible/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/unintelligible/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -76,8 +253,8 @@
desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037." desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037."
instability = NEGATIVE_STABILITY_MINI instability = NEGATIVE_STABILITY_MINI
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='notice'>You feel Swedish, however that works.</span>" text_gain_indication = span_notice("You feel Swedish, however that works.")
text_lose_indication = "<span class='notice'>The feeling of Swedishness passes.</span>" text_lose_indication = span_notice("The feeling of Swedishness passes.")
/datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -108,8 +285,8 @@
desc = "Unknown" desc = "Unknown"
instability = NEGATIVE_STABILITY_MINI instability = NEGATIVE_STABILITY_MINI
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='notice'>Ye feel like a reet prat like, innit?</span>" text_gain_indication = span_notice("Ye feel like a reet prat like, innit?")
text_lose_indication = "<span class='notice'>You no longer feel like being rude and sassy.</span>" text_lose_indication = span_notice("You no longer feel like being rude and sassy.")
/datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -146,9 +323,8 @@
desc = "A terrifying mutation named after its 'patient-zero'." desc = "A terrifying mutation named after its 'patient-zero'."
instability = NEGATIVE_STABILITY_MINI instability = NEGATIVE_STABILITY_MINI
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
locked = TRUE text_gain_indication = span_notice("You feel pretty good, honeydoll.")
text_gain_indication = "<span class='notice'>You feel pretty good, honeydoll.</span>" text_lose_indication = span_notice("You feel a little less conversation would be great.")
text_lose_indication = "<span class='notice'>You feel a little less conversation would be great.</span>"
/datum/mutation/human/elvis/on_life(seconds_per_tick, times_fired) /datum/mutation/human/elvis/on_life(seconds_per_tick, times_fired)
switch(pick(1,2)) switch(pick(1,2))
@@ -194,8 +370,8 @@
desc = "A common mutation that severely decreases intelligence." desc = "A common mutation that severely decreases intelligence."
quality = NEGATIVE quality = NEGATIVE
locked = TRUE locked = TRUE
text_gain_indication = "<span class='notice'>You feel...totally chill, man!</span>" text_gain_indication = span_notice("You feel...totally chill, man!")
text_lose_indication = "<span class='notice'>You feel like you have a better sense of time.</span>" text_lose_indication = span_notice("You feel like you have a better sense of time.")
/datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner)
..() ..()
@@ -212,8 +388,8 @@
desc = "A horrible mutation originating from the distant past, thought to have once been a common gene in all of old world Europe." desc = "A horrible mutation originating from the distant past, thought to have once been a common gene in all of old world Europe."
instability = NEGATIVE_STABILITY_MINI instability = NEGATIVE_STABILITY_MINI
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='notice'>You feel like seeking the holy grail!</span>" text_gain_indication = span_notice("You feel like seeking the holy grail!")
text_lose_indication = "<span class='notice'>You no longer feel like seeking anything.</span>" text_lose_indication = span_notice("You no longer feel like seeking anything.")
/datum/mutation/human/medieval/on_acquiring(mob/living/carbon/human/owner) /datum/mutation/human/medieval/on_acquiring(mob/living/carbon/human/owner)
if(..()) if(..())
@@ -272,3 +448,7 @@
var/spoken_message = speech_args[SPEECH_MESSAGE] var/spoken_message = speech_args[SPEECH_MESSAGE]
spoken_message = piglatin_sentence(spoken_message) spoken_message = piglatin_sentence(spoken_message)
speech_args[SPEECH_MESSAGE] = spoken_message speech_args[SPEECH_MESSAGE] = spoken_message
#undef ALPHABET
#undef VOWELS
#undef CONSONANTS

View File

@@ -1,40 +0,0 @@
///Telekinesis lets you interact with objects from range, and gives you a light blue halo around your head.
/datum/mutation/human/telekinesis
name = "Telekinesis"
desc = "A strange mutation that allows the holder to interact with objects through thought."
quality = POSITIVE
difficulty = 18
text_gain_indication = "<span class='notice'>You feel smarter!</span>"
limb_req = BODY_ZONE_HEAD
instability = POSITIVE_INSTABILITY_MAJOR
///Typecache of atoms that TK shouldn't interact with
var/static/list/blacklisted_atoms = typecacheof(list(/atom/movable/screen))
/datum/mutation/human/telekinesis/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()
if(!(type in visual_indicators))
visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER))
/datum/mutation/human/telekinesis/on_acquiring(mob/living/carbon/human/H)
. = ..()
if(.)
return
RegisterSignal(H, COMSIG_MOB_ATTACK_RANGED, PROC_REF(on_ranged_attack))
/datum/mutation/human/telekinesis/on_losing(mob/living/carbon/human/H)
. = ..()
if(.)
return
UnregisterSignal(H, COMSIG_MOB_ATTACK_RANGED)
/datum/mutation/human/telekinesis/get_visual_indicator()
return visual_indicators[type][1]
///Triggers on COMSIG_MOB_ATTACK_RANGED. Usually handles stuff like picking up items at range.
/datum/mutation/human/telekinesis/proc/on_ranged_attack(mob/source, atom/target)
SIGNAL_HANDLER
if(is_type_in_typecache(target, blacklisted_atoms))
return
if(!tkMaxRangeCheck(source, target) || source.z != target.z)
return
return target.attack_tk(source)

View File

@@ -2,8 +2,8 @@
name = "Telepathy" name = "Telepathy"
desc = "A rare mutation that allows the user to telepathically communicate to others." desc = "A rare mutation that allows the user to telepathically communicate to others."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>You can hear your own voice echoing in your mind!</span>" text_gain_indication = span_notice("You can hear your own voice echoing in your mind!")
text_lose_indication = "<span class='notice'>You don't hear your mind echo anymore.</span>" text_lose_indication = span_notice("You don't hear your mind echo anymore.")
difficulty = 12 difficulty = 12
power_path = /datum/action/cooldown/spell/list_target/telepathy power_path = /datum/action/cooldown/spell/list_target/telepathy
instability = POSITIVE_INSTABILITY_MINOR // basically a mediocre PDA messager instability = POSITIVE_INSTABILITY_MINOR // basically a mediocre PDA messager

View File

@@ -4,8 +4,8 @@
quality = POSITIVE quality = POSITIVE
locked = TRUE locked = TRUE
difficulty = 16 difficulty = 16
text_gain_indication = "<span class='notice'>You feel power flow through your hands.</span>" text_gain_indication = span_notice("You feel power flow through your hands.")
text_lose_indication = "<span class='notice'>The energy in your hands subsides.</span>" text_lose_indication = span_notice("The energy in your hands subsides.")
power_path = /datum/action/cooldown/spell/touch/shock power_path = /datum/action/cooldown/spell/touch/shock
instability = POSITIVE_INSTABILITY_MODERATE // bad stun baton instability = POSITIVE_INSTABILITY_MODERATE // bad stun baton
energy_coeff = 1 energy_coeff = 1
@@ -85,3 +85,192 @@
icon = 'icons/obj/weapons/hand.dmi' icon = 'icons/obj/weapons/hand.dmi'
icon_state = "zapper" icon_state = "zapper"
inhand_icon_state = "zapper" inhand_icon_state = "zapper"
/datum/mutation/human/lay_on_hands
name = "Mending Touch"
desc = "The affected can lay their hands on other people to transfer a small amount of their injuries to themselves."
quality = POSITIVE
locked = FALSE
difficulty = 16
text_gain_indication = span_notice("Your hand feels blessed!")
text_lose_indication = span_notice("Your hand feels secular once more.")
power_path = /datum/action/cooldown/spell/touch/lay_on_hands
instability = POSITIVE_INSTABILITY_MAJOR
energy_coeff = 1
power_coeff = 1
synchronizer_coeff = 1
/datum/mutation/human/lay_on_hands/modify()
. = ..()
var/datum/action/cooldown/spell/touch/lay_on_hands/to_modify =.
if(!istype(to_modify)) // null or invalid
return
// More healing if powered up.
to_modify.heal_multiplier = GET_MUTATION_POWER(src)
// Less pain if synchronized.
to_modify.pain_multiplier = GET_MUTATION_SYNCHRONIZER(src)
/datum/action/cooldown/spell/touch/lay_on_hands
name = "Mending Touch"
desc = "You can now lay your hands on other people to transfer a small amount of their physical injuries to yourself."
button_icon = 'icons/mob/actions/actions_genetic.dmi'
button_icon_state = "mending_touch"
sound = 'sound/magic/staff_healing.ogg'
cooldown_time = 12 SECONDS
school = SCHOOL_RESTORATION
invocation_type = INVOCATION_NONE
spell_requirements = NONE
antimagic_flags = NONE
hand_path = /obj/item/melee/touch_attack/lay_on_hands
draw_message = span_notice("You ready your hand to transfer injuries to yourself.")
drop_message = span_notice("You lower your hand.")
/// Multiplies the amount healed, without increasing the received damage.
var/heal_multiplier = 1
/// Multiplies the incoming pain from healing.
var/pain_multiplier = 1
/// Icon used for beaming effect
var/beam_icon = "blood"
/datum/action/cooldown/spell/touch/lay_on_hands/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/mendicant)
var/mob/living/hurtguy = victim
// Heal more, hurt a bit more.
// If you crunch the numbers it sounds crazy good,
// but I think that's a fair reward for combining the efforts of Genetics, Medbay, and Mining to reach a hidden mechanic.
if(HAS_TRAIT_FROM(mendicant, TRAIT_HIPPOCRATIC_OATH, HIPPOCRATIC_OATH_TRAIT))
heal_multiplier *= 2
pain_multiplier *= 0.5
to_chat(mendicant, span_green("You can feel the magic of the Rod of Aesculapius aiding your efforts!"))
beam_icon = "sendbeam"
var/obj/item/rod_of_asclepius/rod = locate() in mendicant.contents
if(rod)
rod.add_filter("cool_glow", 2, list("type" = "outline", "color" = COLOR_VERY_PALE_LIME_GREEN, "size" = 1.25))
addtimer(CALLBACK(rod, TYPE_PROC_REF(/datum, remove_filter), "cool_glow"), 6 SECONDS)
// If a normal pacifist, heal and hurt more!
else if(HAS_TRAIT(mendicant, TRAIT_PACIFISM))
heal_multiplier *= 1.75
pain_multiplier *= 1.75
to_chat(mendicant, span_green("Your peaceful nature helps you guide all the pain to yourself."))
var/success
if(iscarbon(hurtguy))
success = do_complicated_heal(mendicant, hurtguy, heal_multiplier, pain_multiplier)
else
success = do_simple_heal(mendicant, hurtguy, heal_multiplier, pain_multiplier)
// Both types can be ignited (technically at least), so we can just do this here.
if(hurtguy.has_status_effect(/datum/status_effect/fire_handler/fire_stacks))
mendicant.set_fire_stacks(hurtguy.fire_stacks * pain_multiplier, remove_wet_stacks = TRUE)
if(hurtguy.on_fire)
mendicant.ignite_mob()
hurtguy.extinguish_mob()
// No healies in the end, cancel
if(!success)
return FALSE
mendicant.Beam(hurtguy, icon_state = beam_icon, time = 0.5 SECONDS)
beam_icon = initial(beam_icon)
hurtguy.update_damage_overlays()
mendicant.update_damage_overlays()
hurtguy.visible_message(span_notice("[mendicant] lays hands on [hurtguy]!"))
to_chat(target, span_boldnotice("[mendicant] lays hands on you, healing you!"))
new /obj/effect/temp_visual/heal(get_turf(hurtguy), COLOR_VERY_PALE_LIME_GREEN)
return success
/datum/action/cooldown/spell/touch/lay_on_hands/proc/do_simple_heal(mob/living/carbon/mendicant, mob/living/hurtguy, heal_multiplier, pain_multiplier)
// Did the transfer work?
. = FALSE
// Damage to heal
var/brute_to_heal = min(hurtguy.getBruteLoss(), 35 * heal_multiplier)
// no double dipping
var/burn_to_heal = min(hurtguy.getFireLoss(), (35 - brute_to_heal) * heal_multiplier)
// Get at least organic limb to transfer the damage to
var/list/mendicant_organic_limbs = list()
for(var/obj/item/bodypart/possible_limb in mendicant.bodyparts)
if(IS_ORGANIC_LIMB(possible_limb))
mendicant_organic_limbs += possible_limb
// None? Gtfo
if(isnull(mendicant_organic_limbs))
return .
// Try to use our active hand, otherwise pick at random
var/obj/item/bodypart/mendicant_transfer_limb = mendicant.get_active_hand()
if(!(mendicant_transfer_limb in mendicant_organic_limbs))
mendicant_transfer_limb = pick(mendicant_organic_limbs)
mendicant_transfer_limb.receive_damage(brute_to_heal * pain_multiplier, burn_to_heal * pain_multiplier, forced = TRUE, wound_bonus = CANT_WOUND)
if(brute_to_heal)
hurtguy.adjustBruteLoss(brute_to_heal)
. = TRUE
if(burn_to_heal)
hurtguy.adjustFireLoss(burn_to_heal)
. = TRUE
return .
/datum/action/cooldown/spell/touch/lay_on_hands/proc/do_complicated_heal(mob/living/carbon/mendicant, mob/living/carbon/hurtguy, heal_multiplier, pain_multiplier)
// Did the transfer work?
. = FALSE
// Get the hurtguy's limbs and the mendicant's limbs to attempt a 1-1 transfer.
var/list/hurt_limbs = hurtguy.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) + hurtguy.get_wounded_bodyparts(BODYTYPE_ORGANIC)
var/list/mendicant_organic_limbs = list()
for(var/obj/item/bodypart/possible_limb in mendicant.bodyparts)
if(IS_ORGANIC_LIMB(possible_limb))
mendicant_organic_limbs += possible_limb
// If we have no organic available limbs just give up.
if(!length(mendicant_organic_limbs) || !length(hurt_limbs))
return
// Counter to make sure we don't take too much from separate limbs
var/total_damage_healed = 0
// Transfer damage from one limb to the mendicant's counterpart.
for(var/obj/item/bodypart/affected_limb as anything in hurt_limbs)
var/obj/item/bodypart/mendicant_transfer_limb = mendicant.get_bodypart(affected_limb.body_zone)
// If the compared limb isn't organic, skip it and pick a random one.
if(!(mendicant_transfer_limb in mendicant_organic_limbs))
mendicant_transfer_limb = pick(mendicant_organic_limbs)
// Transfer at most 35 damage by default.
var/brute_damage = min(affected_limb.brute_dam, 35 * heal_multiplier)
// no double dipping
var/burn_damage = min(affected_limb.burn_dam, (35 * heal_multiplier) - brute_damage)
if((brute_damage || burn_damage) && total_damage_healed < (35 * heal_multiplier))
total_damage_healed = brute_damage + burn_damage
. = TRUE
// Heal!
affected_limb.heal_damage(brute_damage * heal_multiplier, burn_damage * heal_multiplier, required_bodytype = BODYTYPE_ORGANIC)
// Hurt!
mendicant_transfer_limb.receive_damage(brute_damage * pain_multiplier, burn_damage * pain_multiplier, forced = TRUE, wound_bonus = CANT_WOUND)
// Force light wounds onto you.
for(var/datum/wound/iter_wound as anything in affected_limb.wounds)
if(iter_wound.severity > WOUND_SEVERITY_MODERATE)
continue
. = TRUE
iter_wound.remove_wound()
iter_wound.apply_wound(mendicant_transfer_limb)
return .
/obj/item/melee/touch_attack/lay_on_hands
name = "mending touch"
desc = "Unlike in your favorite tabletop games, you sadly can't cast this on yourself, so you can't use that as a Scapegoat." // mayus is reference. if you get it youre cool
icon = 'icons/obj/weapons/hand.dmi'
icon_state = "greyscale"
color = COLOR_VERY_PALE_LIME_GREEN
inhand_icon_state = "greyscale"

View File

@@ -3,7 +3,7 @@
name = "Webbing Production" name = "Webbing Production"
desc = "Allows the user to lay webbing, and travel through it." desc = "Allows the user to lay webbing, and travel through it."
quality = POSITIVE quality = POSITIVE
text_gain_indication = "<span class='notice'>Your skin feels webby.</span>" text_gain_indication = span_notice("Your skin feels webby.")
instability = POSITIVE_INSTABILITY_MODERATE // useful until you're lynched instability = POSITIVE_INSTABILITY_MODERATE // useful until you're lynched
power_path = /datum/action/cooldown/mob_cooldown/lay_web/genetic power_path = /datum/action/cooldown/mob_cooldown/lay_web/genetic
energy_coeff = 1 energy_coeff = 1

View File

@@ -277,14 +277,14 @@
) )
//Makes the user passive, it's in their oath not to harm! //Makes the user passive, it's in their oath not to harm!
ADD_TRAIT(owner, TRAIT_PACIFISM, HIPPOCRATIC_OATH_TRAIT) owner.add_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH), HIPPOCRATIC_OATH_TRAIT)
var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
med_hud.show_to(owner) med_hud.show_to(owner)
return ..() return ..()
/datum/status_effect/hippocratic_oath/on_remove() /datum/status_effect/hippocratic_oath/on_remove()
QDEL_NULL(aura_healing) QDEL_NULL(aura_healing)
REMOVE_TRAIT(owner, TRAIT_PACIFISM, HIPPOCRATIC_OATH_TRAIT) owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH), HIPPOCRATIC_OATH_TRAIT)
var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
med_hud.hide_from(owner) med_hud.hide_from(owner)

View File

@@ -426,12 +426,12 @@
/obj/item/dnainjector/pressuremut /obj/item/dnainjector/pressuremut
name = "\improper DNA injector (Pressure Adaptation)" name = "\improper DNA injector (Pressure Adaptation)"
desc = "Gives you fire." desc = "Gives you fire."
add_mutations = list(/datum/mutation/human/pressure_adaptation) add_mutations = list(/datum/mutation/human/adaptation/pressure)
/obj/item/dnainjector/antipressure /obj/item/dnainjector/antipressure
name = "\improper DNA injector (Anti-Pressure Adaptation)" name = "\improper DNA injector (Anti-Pressure Adaptation)"
desc = "Cures fire." desc = "Cures fire."
remove_mutations = list(/datum/mutation/human/pressure_adaptation) remove_mutations = list(/datum/mutation/human/adaptation/pressure)
/obj/item/dnainjector/radioactive /obj/item/dnainjector/radioactive
name = "\improper DNA injector (Radioactive)" name = "\improper DNA injector (Radioactive)"
@@ -500,12 +500,12 @@
/obj/item/dnainjector/firemut /obj/item/dnainjector/firemut
name = "\improper DNA injector (Temp Adaptation)" name = "\improper DNA injector (Temp Adaptation)"
desc = "Gives you fire." desc = "Gives you fire."
add_mutations = list(/datum/mutation/human/temperature_adaptation) add_mutations = list(/datum/mutation/human/adaptation/thermal)
/obj/item/dnainjector/antifire /obj/item/dnainjector/antifire
name = "\improper DNA injector (Anti-Temp Adaptation)" name = "\improper DNA injector (Anti-Temp Adaptation)"
desc = "Cures fire." desc = "Cures fire."
remove_mutations = list(/datum/mutation/human/temperature_adaptation) remove_mutations = list(/datum/mutation/human/adaptation/thermal)
/obj/item/dnainjector/thermal /obj/item/dnainjector/thermal
name = "\improper DNA injector (Thermal Vision)" name = "\improper DNA injector (Thermal Vision)"

View File

@@ -320,7 +320,7 @@
for(var/mob/living/L in contents) for(var/mob/living/L in contents)
if(L.bodytemperature <= 50 && !HAS_TRAIT(L, TRAIT_RESISTCOLD)) if(L.bodytemperature <= 50 && !HAS_TRAIT(L, TRAIT_RESISTCOLD))
L.apply_status_effect(/datum/status_effect/freon) L.apply_status_effect(/datum/status_effect/freon)
MakeSlippery(TURF_WET_PERMAFROST, 50) MakeSlippery(TURF_WET_PERMAFROST, 10 SECONDS)
return TRUE return TRUE
/turf/open/proc/water_vapor_gas_act() /turf/open/proc/water_vapor_gas_act()

View File

@@ -27,5 +27,5 @@
return return
H.dna.add_mutation(/datum/mutation/human/hulk) H.dna.add_mutation(/datum/mutation/human/hulk)
H.dna.add_mutation(/datum/mutation/human/xray) H.dna.add_mutation(/datum/mutation/human/xray)
H.dna.add_mutation(/datum/mutation/human/pressure_adaptation) H.dna.add_mutation(/datum/mutation/human/adaptation/pressure)
H.dna.add_mutation(/datum/mutation/human/telekinesis) H.dna.add_mutation(/datum/mutation/human/telekinesis)

View File

@@ -454,11 +454,12 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
message = unintelligize(message) message = unintelligize(message)
tts_filter = list() tts_filter = list()
var/list/data = list(message, tts_message, tts_filter) var/list/data = list(message, tts_message, tts_filter, capitalize_message)
SEND_SIGNAL(src, COMSIG_LIVING_TREAT_MESSAGE, data) SEND_SIGNAL(src, COMSIG_LIVING_TREAT_MESSAGE, data)
message = data[TREAT_MESSAGE_ARG] message = data[TREAT_MESSAGE_ARG]
tts_message = data[TREAT_TTS_MESSAGE_ARG] tts_message = data[TREAT_TTS_MESSAGE_ARG]
tts_filter = data[TREAT_TTS_FILTER_ARG] tts_filter = data[TREAT_TTS_FILTER_ARG]
capitalize_message = data[TREAT_CAPITALIZE_MESSAGE]
if(!tts_message) if(!tts_message)
tts_message = message tts_message = message

View File

@@ -31,7 +31,7 @@
/obj/projectile/temp/cryo /obj/projectile/temp/cryo
name = "cryo beam" name = "cryo beam"
range = 3 range = 9
temperature = -240 // Single slow shot reduces temp greatly temperature = -240 // Single slow shot reduces temp greatly
/obj/projectile/temp/cryo/on_range() /obj/projectile/temp/cryo/on_range()
@@ -40,3 +40,24 @@
var/turf/open/O = T var/turf/open/O = T
O.freeze_turf() O.freeze_turf()
return ..() return ..()
/obj/projectile/temp/pyro
name = "hot beam"
icon_state = "firebeam" // sets on fire, diff sprite!
range = 9
temperature = 240
/obj/projectile/temp/pyro/on_hit(atom/target, blocked, pierce_hit)
. = ..()
if(!.)
return
var/mob/living/living_target = target
if(!istype(living_target))
return
living_target.adjust_fire_stacks(2)
living_target.ignite_mob()
/obj/projectile/temp/pyro/on_range()
var/turf/location = get_turf(src)
new /obj/effect/hotspot(location)
location.hotspot_expose(700, 50, 1)

View File

@@ -503,18 +503,29 @@
var/atom/movable/plane_master_controller/game_plane_master_controller = psychonaut.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] var/atom/movable/plane_master_controller/game_plane_master_controller = psychonaut.hud_used.plane_master_controllers[PLANE_MASTERS_GAME]
var/list/col_filter_identity = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.000,0,0,0) // Info for non-matrix plebs like me!
var/list/col_filter_green = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.333,0,0,0)
var/list/col_filter_blue = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.666,0,0,0)
var/list/col_filter_red = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 1.000,0,0,0) //visually this is identical to the identity
game_plane_master_controller.add_filter("rainbow", 10, color_matrix_filter(col_filter_red, FILTER_COLOR_HSL)) // This doesn't change the RGB matrixes directly at all. Instead, it shifts all the colors' Hue by 33%,
// Shifting them up the color wheel, turning R to G, G to B, B to R, making a psychedelic effect.
// The second moves them two colors up instead, turning R to B, G to R, B to G.
// The third does a full spin, or resets it back to normal.
// Imagine a triangle on the color wheel with the points located at the color peaks, rotating by 90 degrees each time.
// The value with decimals is the Hue. The rest are Saturation, Luminosity, and Alpha, though they're unused here.
// The filters were initially named _green, _blue, _red, despite every filter changing all the colors. It caused me a 2-years-long headache.
var/list/col_filter_identity = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.000,0,0,0)
var/list/col_filter_shift_once = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.333,0,0,0)
var/list/col_filter_shift_twice = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.666,0,0,0)
var/list/col_filter_reset = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 1.000,0,0,0) //visually this is identical to the identity
game_plane_master_controller.add_filter("rainbow", 10, color_matrix_filter(col_filter_reset, FILTER_COLOR_HSL))
for(var/filter in game_plane_master_controller.get_filters("rainbow")) for(var/filter in game_plane_master_controller.get_filters("rainbow"))
animate(filter, color = col_filter_identity, time = 0 SECONDS, loop = -1, flags = ANIMATION_PARALLEL) animate(filter, color = col_filter_identity, time = 0 SECONDS, loop = -1, flags = ANIMATION_PARALLEL)
animate(color = col_filter_green, time = 4 SECONDS) animate(color = col_filter_shift_once, time = 4 SECONDS)
animate(color = col_filter_blue, time = 4 SECONDS) animate(color = col_filter_shift_twice, time = 4 SECONDS)
animate(color = col_filter_red, time = 4 SECONDS) animate(color = col_filter_reset, time = 4 SECONDS)
game_plane_master_controller.add_filter("psilocybin_wave", 1, list("type" = "wave", "size" = 2, "x" = 32, "y" = 32)) game_plane_master_controller.add_filter("psilocybin_wave", 1, list("type" = "wave", "size" = 2, "x" = 32, "y" = 32))
@@ -568,18 +579,18 @@
var/atom/movable/plane_master_controller/game_plane_master_controller = dancer.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] var/atom/movable/plane_master_controller/game_plane_master_controller = dancer.hud_used.plane_master_controllers[PLANE_MASTERS_GAME]
var/list/col_filter_blue = list(0,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.764,0,0,0) //most blue color var/list/col_filter_shift_twice = list(0,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.764,0,0,0) //most blue color
var/list/col_filter_mid = list(0,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.832,0,0,0) //red/blue mix midpoint var/list/col_filter_mid = list(0,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.832,0,0,0) //red/blue mix midpoint
var/list/col_filter_red = list(0,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.900,0,0,0) //most red color var/list/col_filter_reset = list(0,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0.900,0,0,0) //most red color
game_plane_master_controller.add_filter("blastoff_filter", 10, color_matrix_filter(col_filter_mid, FILTER_COLOR_HCY)) game_plane_master_controller.add_filter("blastoff_filter", 10, color_matrix_filter(col_filter_mid, FILTER_COLOR_HCY))
game_plane_master_controller.add_filter("blastoff_wave", 1, list("type" = "wave", "x" = 32, "y" = 32)) game_plane_master_controller.add_filter("blastoff_wave", 1, list("type" = "wave", "x" = 32, "y" = 32))
for(var/filter in game_plane_master_controller.get_filters("blastoff_filter")) for(var/filter in game_plane_master_controller.get_filters("blastoff_filter"))
animate(filter, color = col_filter_blue, time = 3 SECONDS, loop = -1, flags = ANIMATION_PARALLEL) animate(filter, color = col_filter_shift_twice, time = 3 SECONDS, loop = -1, flags = ANIMATION_PARALLEL)
animate(color = col_filter_mid, time = 3 SECONDS) animate(color = col_filter_mid, time = 3 SECONDS)
animate(color = col_filter_red, time = 3 SECONDS) animate(color = col_filter_reset, time = 3 SECONDS)
animate(color = col_filter_mid, time = 3 SECONDS) animate(color = col_filter_mid, time = 3 SECONDS)
for(var/filter in game_plane_master_controller.get_filters("blastoff_wave")) for(var/filter in game_plane_master_controller.get_filters("blastoff_wave"))

View File

@@ -3,7 +3,7 @@
invocation_type = INVOCATION_NONE invocation_type = INVOCATION_NONE
/// Typepath of whatever item we summon /// Typepath of whatever item we summon
var/obj/item/item_type var/obj/item_type
/// If TRUE, we delete any previously created items when we cast the spell /// If TRUE, we delete any previously created items when we cast the spell
var/delete_old = TRUE var/delete_old = TRUE
/// List of weakrefs to items summoned /// List of weakrefs to items summoned
@@ -57,7 +57,7 @@
var/mob/mob_caster = cast_on var/mob/mob_caster = cast_on
if(istype(mob_caster)) if(istype(mob_caster))
var/obj/item/existing_item = mob_caster.get_active_held_item() var/obj/existing_item = mob_caster.get_active_held_item()
if(existing_item) if(existing_item)
mob_caster.dropItemToGround(existing_item) mob_caster.dropItemToGround(existing_item)
@@ -65,6 +65,10 @@
if(QDELETED(created)) if(QDELETED(created))
CRASH("[type] tried to create an item, but failed. It's item type is [item_type].") CRASH("[type] tried to create an item, but failed. It's item type is [item_type].")
if(!isitem(created))
created.forceMove(cast_on.drop_location())
return
if(istype(mob_caster)) if(istype(mob_caster))
mob_caster.put_in_hands(created, del_on_fail = delete_on_failure) mob_caster.put_in_hands(created, del_on_fail = delete_on_failure)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

98
strings/heckacious.json Normal file
View File

@@ -0,0 +1,98 @@
{
"heckacious": {
"your": "youre",
"fucking": "banging",
"economy": "econony",
"know": "no",
"ing": "in",
"they are": "there",
"sometimes": "some times",
"do": "does",
"hug": "bro hug bump",
"we're": "where",
"game": "big game",
"has": "hass",
"downtown": "down town",
"jimmy": "geromy",
"jeremy": "geromy",
"anywhere": "anywear",
"smoking": "toking up",
"lying": "lyong",
"AH": "AUGH",
"distraction": "distaction",
"lie": "ruse",
"angle": "angel",
"drink": "pour",
"the": "thef",
"backward": [ "back ward", "awayways" ],
"god damn": "GOD DAMN",
"goddamn": "GOD DAMN",
"trick": "dunk",
"impossible": "unreal",
"court": "coart",
"holding": "holdung",
"reverse": "flip",
"inverse": "flip",
"around": "turn-ways",
"difference": "differance",
"values": "vaules",
"inside": "insine",
"pipe": "punpe",
"suspicious": "plot thicken",
"awesome": "hella",
"reference": "refrance",
"amazing": "fucking incredible",
"woman": "wonan",
"god": "gog",
"bible": "bibble",
"jesus": "jescus",
"christ": [ "chris", "dick" ],
"sigh": "sign",
"bathroom": "banthroom",
"remember": "remender",
"night": "nite",
"nachos": "nachoes",
"nacho": "nancho",
"dorito": "nancho",
"party": "panty",
"dumbass": "dumpass",
"they": "their",
"okay": "ohh kayy",
"stupid": "stutid",
"reagent": "regent",
"idiot": "fuckass",
"awful": "conksuck",
"moron": "PIECE OF SHIT",
"more": "wider",
"serious": "keeping it real",
"extreme": "x-treme",
"guaranteed": "garganted",
"black": "blapck",
"glow": "glowns",
"deadly": "deudly",
"flying": "lifdoff",
"cloud": "cloun",
"seeing": "scoping",
"great": "choice",
"look": "lonk",
"shit": "balls warmed oveur",
"battery": "babbery",
"retard": "dicktard",
"gay": "homo",
"close": "closte",
"wrong": "wrog",
"who": "whoof",
"new": "newd",
"holy": "hopy",
"um": "unm",
"horse": "hornse",
"this": "thits",
"then": "than",
"quick": "soon",
"bro": [ "brah", "bro" ],
"dude": [ "duge", "bro", "brah" ],
"'": [ "'", "" ],
"i'm": [ "im", "i am" ],
"he's": [ "hes", "he is", "he'ss" ]
}
}

View File

@@ -1643,6 +1643,7 @@
#include "code\datums\mood_events\needs_events.dm" #include "code\datums\mood_events\needs_events.dm"
#include "code\datums\mutations\_combined.dm" #include "code\datums\mutations\_combined.dm"
#include "code\datums\mutations\_mutations.dm" #include "code\datums\mutations\_mutations.dm"
#include "code\datums\mutations\active.dm"
#include "code\datums\mutations\adaptation.dm" #include "code\datums\mutations\adaptation.dm"
#include "code\datums\mutations\antenna.dm" #include "code\datums\mutations\antenna.dm"
#include "code\datums\mutations\autotomy.dm" #include "code\datums\mutations\autotomy.dm"
@@ -1650,13 +1651,14 @@
#include "code\datums\mutations\chameleon.dm" #include "code\datums\mutations\chameleon.dm"
#include "code\datums\mutations\cold.dm" #include "code\datums\mutations\cold.dm"
#include "code\datums\mutations\fire_breath.dm" #include "code\datums\mutations\fire_breath.dm"
#include "code\datums\mutations\hot.dm"
#include "code\datums\mutations\hulk.dm" #include "code\datums\mutations\hulk.dm"
#include "code\datums\mutations\olfaction.dm" #include "code\datums\mutations\olfaction.dm"
#include "code\datums\mutations\passive.dm" #include "code\datums\mutations\passive.dm"
#include "code\datums\mutations\radioactive.dm" #include "code\datums\mutations\radioactive.dm"
#include "code\datums\mutations\reach.dm"
#include "code\datums\mutations\sight.dm" #include "code\datums\mutations\sight.dm"
#include "code\datums\mutations\speech.dm" #include "code\datums\mutations\speech.dm"
#include "code\datums\mutations\telekinesis.dm"
#include "code\datums\mutations\telepathy.dm" #include "code\datums\mutations\telepathy.dm"
#include "code\datums\mutations\tongue_spike.dm" #include "code\datums\mutations\tongue_spike.dm"
#include "code\datums\mutations\touch.dm" #include "code\datums\mutations\touch.dm"