diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 1515c8b7347..ca4130ad28c 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -178,6 +178,7 @@ #define TREAT_MESSAGE_ARG 1 #define TREAT_TTS_MESSAGE_ARG 2 #define TREAT_TTS_FILTER_ARG 3 + #define TREAT_CAPITALIZE_MESSAGE 4 ///From obj/item/toy/crayon/spraycan #define COMSIG_LIVING_MOB_PAINTED "living_mob_painted" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 8d2b54ab72f..1a6d0d5f18d 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -69,6 +69,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Antagonizes the above. #define TRAIT_DISCOORDINATED_TOOL_USER "discoordinated_tool_user" #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_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" /// Makes it so the mob can use guns regardless of tool user status diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 3e5c2d9b4d5..2028cfc08e2 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -370,6 +370,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_TWOHANDING" = TRAIT_NO_TWOHANDING, "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, + "TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH, "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, "TRAIT_OFF_BALANCE_TACKLER" = TRAIT_OFF_BALANCE_TACKLER, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 0d14fe28db2..8dbf6a8ef62 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -163,6 +163,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_PACIFISM" = TRAIT_PACIFISM, + "TRAIT_HIPPOCRATIC_OATH" = TRAIT_HIPPOCRATIC_OATH, "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index cd8563d849f..117c8e162d6 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -225,6 +225,10 @@ next += target.loc checking = next + + if(SEND_SIGNAL(src, COMSIG_ATOM_CANREACH, ultimate_target) & COMPONENT_ALLOW_REACH) + return TRUE + return FALSE /atom/movable/proc/DirectAccess() diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm index cce25beb216..534d94550c4 100644 --- a/code/datums/mutations/_combined.dm +++ b/code/datums/mutations/_combined.dm @@ -25,6 +25,18 @@ required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive" 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 required = "/datum/mutation/human/glow; /datum/mutation/human/void" result = /datum/mutation/human/glow/anti @@ -36,3 +48,7 @@ /datum/generecipe/martyrdom required = "/datum/mutation/human/strong; /datum/mutation/human/stimmed" result = /datum/mutation/human/martyrdom + +/datum/generecipe/heckacious + required = "/datum/mutation/human/wacky; /datum/mutation/human/trichromatic" + result = /datum/mutation/human/heckacious diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index fc89b22304d..d8aaf3baaaa 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -96,6 +96,8 @@ var/energy_coeff = -1 /// List of strings of valid chromosomes this mutation can accept. 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) . = ..() @@ -145,6 +147,8 @@ owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) grant_power() //we do checks here so nothing about hulk getting magic + if(mutation_traits) + owner.add_traits(mutation_traits, GENETIC_MUTATION) if(!modified) addtimer(CALLBACK(src, PROC_REF(modify), 0.5 SECONDS)) //gonna want children calling ..() to run first @@ -169,6 +173,9 @@ owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) + if(mutation_traits) + owner.remove_traits(mutation_traits, GENETIC_MUTATION) + /mob/living/carbon/proc/update_mutations_overlay() return diff --git a/code/datums/mutations/active.dm b/code/datums/mutations/active.dm new file mode 100644 index 00000000000..42c11e9c6f8 --- /dev/null +++ b/code/datums/mutations/active.dm @@ -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) diff --git a/code/datums/mutations/adaptation.dm b/code/datums/mutations/adaptation.dm index 2cac87dd4b4..7e332984cf9 100644 --- a/code/datums/mutations/adaptation.dm +++ b/code/datums/mutations/adaptation.dm @@ -1,53 +1,58 @@ -/datum/mutation/human/temperature_adaptation - name = "Temperature Adaptation" +/datum/mutation/human/adaptation + name = "Adaptation" desc = "A strange mutation that renders the host immune to damage from extreme temperatures. Does not protect from vacuums." quality = POSITIVE difficulty = 16 - text_gain_indication = "Your body feels warm!" - instability = POSITIVE_INSTABILITY_MAJOR - conflicts = list(/datum/mutation/human/pressure_adaptation) + text_gain_indication = span_notice("Your body feels normal!") + instability = NEGATIVE_STABILITY_MAJOR + 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)) - 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] -/datum/mutation/human/temperature_adaptation/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - owner.add_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTHEAT), GENETIC_MUTATION) +/datum/mutation/human/adaptation/cold + name = "Cold Adaptation" + desc = "A strange mutation that renders the host immune to damage from low temperature environments. It also prevents the host from slipping on ice." + 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) - if(..()) - return - owner.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTHEAT), GENETIC_MUTATION) +/datum/mutation/human/adaptation/heat + name = "Heat Adaptation" + 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." + 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" 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 - difficulty = 16 - text_gain_indication = "Your body feels numb!" - instability = POSITIVE_INSTABILITY_MAJOR - conflicts = list(/datum/mutation/human/temperature_adaptation) - -/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) + text_gain_indication = span_notice("Your body feels impressively pressurized.") + instability = POSITIVE_INSTABILITY_MODERATE + adapt_icon = "pressure" + mutation_traits = list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE) + locked = FALSE diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index f33b90fd7a9..5684b20c454 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -2,8 +2,8 @@ name = "Antenna" desc = "The affected person sprouts an antenna. This is known to allow them to access common radio channels passively." quality = POSITIVE - text_gain_indication = "You feel an antenna sprout from your forehead." - text_lose_indication = "Your antenna shrinks back down." + text_gain_indication = span_notice("You feel an antenna sprout from your forehead.") + text_lose_indication = span_notice("Your antenna shrinks back down.") instability = POSITIVE_INSTABILITY_MINOR difficulty = 8 var/datum/weakref/radio_weakref @@ -44,8 +44,8 @@ name = "Mind Reader" desc = "The affected person can look into the recent memories of others." quality = POSITIVE - text_gain_indication = "You hear distant voices at the corners of your mind." - text_lose_indication = "The distant voices fade." + text_gain_indication = span_notice("You hear distant voices at the corners of your mind.") + text_lose_indication = span_notice("The distant voices fade.") power_path = /datum/action/cooldown/spell/pointed/mindread instability = POSITIVE_INSTABILITY_MINOR difficulty = 8 diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index ff6a4331abc..5c93fa3b6be 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -6,7 +6,7 @@ desc = "A genetic defect that sporadically causes seizures." instability = NEGATIVE_STABILITY_MODERATE quality = NEGATIVE - text_gain_indication = "You get a headache." + text_gain_indication = span_danger("You get a headache.") synchronizer_coeff = 1 power_coeff = 1 @@ -53,7 +53,7 @@ desc = "Strange mutation that causes the holder to randomly mutate." instability = NEGATIVE_STABILITY_MAJOR quality = NEGATIVE - text_gain_indication = "You feel strange." + text_gain_indication = span_danger("You feel strange.") locked = TRUE /datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner) @@ -83,7 +83,7 @@ desc = "A chronic cough." instability = NEGATIVE_STABILITY_MODERATE quality = MINOR_NEGATIVE - text_gain_indication = "You start coughing." + text_gain_indication = span_danger("You start coughing.") synchronizer_coeff = 1 power_coeff = 1 @@ -101,8 +101,8 @@ desc = "Subject is easily terrified, and may suffer from hallucinations." instability = NEGATIVE_STABILITY_MODERATE quality = NEGATIVE - text_gain_indication = "You feel screams echo through your mind..." - text_lose_indication = "The screaming in your mind fades." + text_gain_indication = span_danger("You feel screams echo through your mind...") + text_lose_indication = span_notice("The screaming in your mind fades.") /datum/mutation/human/paranoia/on_life(seconds_per_tick, times_fired) if(SPT_PROB(2.5, seconds_per_tick) && owner.stat == CONSCIOUS) @@ -219,7 +219,7 @@ desc = "A genome that inhibits certain brain functions, causing the holder to appear clumsy. Honk!" instability = NEGATIVE_STABILITY_MAJOR quality = MINOR_NEGATIVE - text_gain_indication = "You feel lightheaded." + text_gain_indication = span_danger("You feel lightheaded.") /datum/mutation/human/clumsy/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -238,7 +238,7 @@ desc = "A chronic twitch that forces the user to scream bad words." //definitely needs rewriting quality = NEGATIVE instability = 0 - text_gain_indication = "You twitch." + text_gain_indication = span_danger("You twitch.") synchronizer_coeff = 1 /datum/mutation/human/tourettes/on_life(seconds_per_tick, times_fired) @@ -262,7 +262,7 @@ desc = "The holder of this genome is completely deaf." instability = NEGATIVE_STABILITY_MAJOR quality = NEGATIVE - text_gain_indication = "You can't seem to hear anything." + text_gain_indication = span_danger("You can't seem to hear anything.") /datum/mutation/human/deaf/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -307,7 +307,7 @@ name = "Glowy" desc = "You permanently emit a light with a random color and intensity." quality = POSITIVE - text_gain_indication = "Your skin begins to glow softly." + text_gain_indication = span_notice("Your skin begins to glow softly.") instability = POSITIVE_INSTABILITY_MINI power_coeff = 1 conflicts = list(/datum/mutation/human/glow/anti) @@ -344,7 +344,7 @@ /datum/mutation/human/glow/anti name = "Anti-Glow" desc = "Your skin seems to attract and absorb nearby light creating 'darkness' around you." - text_gain_indication = "The light around you seems to disappear." + text_gain_indication = span_notice("The light around you seems to disappear.") conflicts = list(/datum/mutation/human/glow) instability = POSITIVE_INSTABILITY_MINOR locked = TRUE @@ -357,7 +357,7 @@ name = "Strength" desc = "The user's muscles slightly expand. Commonly seen in top-ranking boxers." quality = POSITIVE - text_gain_indication = "You feel strong." + text_gain_indication = span_notice("You feel strong.") instability = POSITIVE_INSTABILITY_MINI difficulty = 16 @@ -379,7 +379,7 @@ desc = "The user's chemical balance is more robust. This mutation is known to slightly improve workout efficiency." quality = POSITIVE instability = POSITIVE_INSTABILITY_MINI - text_gain_indication = "You feel stimmed." + text_gain_indication = span_notice("You feel stimmed.") difficulty = 16 /datum/mutation/human/stimmed/on_acquiring(mob/living/carbon/human/owner) @@ -398,8 +398,8 @@ name = "Insulated" desc = "The affected person does not conduct electricity." quality = POSITIVE - text_gain_indication = "Your fingertips go numb." - text_lose_indication = "Your fingertips regain feeling." + text_gain_indication = span_notice("Your fingertips go numb.") + text_lose_indication = span_notice("Your fingertips regain feeling.") difficulty = 16 instability = POSITIVE_INSTABILITY_MODERATE @@ -417,8 +417,9 @@ name = "Fiery Sweat" desc = "The user's skin will randomly combust, but is generally a lot more resilient to burning." quality = NEGATIVE - text_gain_indication = "You feel hot." - text_lose_indication = "You feel a lot cooler." + text_gain_indication = span_warning("You feel hot.") + text_lose_indication = span_notice("You feel a lot cooler.") + conflicts = list(/datum/mutation/human/adaptation/heat) difficulty = 14 synchronizer_coeff = 1 power_coeff = 1 @@ -442,8 +443,8 @@ 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." quality = NEGATIVE - text_gain_indication = "The space around you twists sickeningly." - text_lose_indication = "The space around you settles back to normal." + text_gain_indication = span_warning("The space around you twists sickeningly.") + text_lose_indication = span_notice("The space around you settles back to normal.") difficulty = 18//high so it's hard to unlock and abuse instability = NEGATIVE_STABILITY_MODERATE synchronizer_coeff = 1 @@ -473,8 +474,8 @@ desc = "Subject has acidic chemicals building up underneath the skin. This is often lethal." instability = NEGATIVE_STABILITY_MAJOR quality = NEGATIVE - text_gain_indication = "A horrible burning sensation envelops you as your flesh turns to acid!" - text_lose_indication = "A feeling of relief fills you as your flesh goes back to normal." + text_gain_indication = span_userdanger("A horrible burning sensation envelops you as your flesh turns to acid!") + 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 /// The cooldown for the warning message COOLDOWN_DECLARE(msgcooldown) @@ -494,8 +495,8 @@ desc = "Subject suffers from muscle spasms." instability = NEGATIVE_STABILITY_MODERATE quality = NEGATIVE - text_gain_indication = "You flinch." - text_lose_indication = "Your flinching subsides." + text_gain_indication = span_warning("You flinch.") + text_lose_indication = span_notice("Your flinching subsides.") difficulty = 16 /datum/mutation/human/spastic/on_acquiring() @@ -513,8 +514,8 @@ 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 quality = NEGATIVE - text_gain_indication = "Your right foot feels... left." - text_lose_indication = "Your right foot feels alright." + text_gain_indication = span_warning("Your right foot feels... left.") + text_lose_indication = span_notice("Your right foot feels alright.") difficulty = 16 /datum/mutation/human/extrastun/on_acquiring() @@ -546,8 +547,8 @@ instability = NEGATIVE_STABILITY_MAJOR // free stability >:) locked = TRUE quality = POSITIVE //not that cloning will be an option a lot but generally lets keep this around i guess? - text_gain_indication = "You get an intense feeling of heartburn." - text_lose_indication = "Your internal organs feel at ease." + text_gain_indication = span_warning("You get an intense feeling of heartburn.") + text_lose_indication = span_notice("Your internal organs feel at ease.") /datum/mutation/human/martyrdom/on_acquiring() . = ..() @@ -594,7 +595,7 @@ instability = NEGATIVE_STABILITY_MAJOR difficulty = 12 //pretty good for traitors quality = NEGATIVE //holy shit no eyes or tongue or ears - text_gain_indication = "Something feels off." + text_gain_indication = span_warning("Something feels off.") /datum/mutation/human/headless/on_acquiring() . = ..() diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm index 7bebe9e6b7d..01932fcfc9a 100644 --- a/code/datums/mutations/chameleon.dm +++ b/code/datums/mutations/chameleon.dm @@ -4,8 +4,8 @@ desc = "A genome that causes the holder's skin to become transparent over time." quality = POSITIVE difficulty = 16 - text_gain_indication = "You feel one with your surroundings." - text_lose_indication = "You feel oddly exposed." + text_gain_indication = span_notice("You feel one with your surroundings.") + text_lose_indication = span_notice("You feel oddly exposed.") instability = POSITIVE_INSTABILITY_MAJOR power_coeff = 1 diff --git a/code/datums/mutations/cold.dm b/code/datums/mutations/cold.dm index 32e162bf7d3..fd060bc8ca5 100644 --- a/code/datums/mutations/cold.dm +++ b/code/datums/mutations/cold.dm @@ -2,7 +2,7 @@ name = "Geladikinesis" desc = "Allows the user to concentrate moisture and sub-zero forces into snow." quality = POSITIVE - text_gain_indication = "Your hand feels cold." + text_gain_indication = span_notice("Your hand feels cold.") instability = POSITIVE_INSTABILITY_MINOR difficulty = 10 synchronizer_coeff = 1 @@ -24,7 +24,7 @@ name = "Cryokinesis" desc = "Draws negative energy from the sub-zero void to freeze surrounding temperatures at subject's will." quality = POSITIVE //upsides and downsides - text_gain_indication = "Your hand feels cold." + text_gain_indication = span_notice("Your hand feels cold.") instability = POSITIVE_INSTABILITY_MODERATE difficulty = 12 synchronizer_coeff = 1 diff --git a/code/datums/mutations/fire_breath.dm b/code/datums/mutations/fire_breath.dm index 58369977294..56915ff0130 100644 --- a/code/datums/mutations/fire_breath.dm +++ b/code/datums/mutations/fire_breath.dm @@ -4,8 +4,8 @@ quality = POSITIVE difficulty = 12 locked = TRUE - text_gain_indication = "Your throat is burning!" - text_lose_indication = "Your throat is cooling down." + text_gain_indication = span_notice("Your throat is burning!") + text_lose_indication = span_notice("Your throat is cooling down.") power_path = /datum/action/cooldown/spell/cone/staggered/fire_breath instability = POSITIVE_INSTABILITY_MODERATE energy_coeff = 1 diff --git a/code/datums/mutations/hot.dm b/code/datums/mutations/hot.dm new file mode 100644 index 00000000000..574bc95d1e4 --- /dev/null +++ b/code/datums/mutations/hot.dm @@ -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 diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index b2f2f20f9e9..5717f649b11 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -5,14 +5,14 @@ quality = POSITIVE locked = TRUE difficulty = 16 - text_gain_indication = "Your muscles hurt!" + text_gain_indication = span_notice("Your muscles hurt!") species_allowed = list(SPECIES_HUMAN) //no skeleton/lizard hulk health_req = 25 instability = POSITIVE_INSTABILITY_MAJOR var/scream_delay = 50 var/last_scream = 0 /// List of traits to add/remove when someone gets this mutation. - var/list/mutation_traits = list( + mutation_traits = list( TRAIT_CHUNKYFINGERS, TRAIT_HULK, TRAIT_IGNOREDAMAGESLOWDOWN, @@ -24,7 +24,6 @@ /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.add_traits(mutation_traits, GENETIC_MUTATION) for(var/obj/item/bodypart/part as anything in owner.bodyparts) part.variable_color = COLOR_DARK_LIME owner.update_body_parts() @@ -87,7 +86,6 @@ /datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.remove_traits(mutation_traits, GENETIC_MUTATION) for(var/obj/item/bodypart/part as anything in owner.bodyparts) part.variable_color = null owner.update_body_parts() diff --git a/code/datums/mutations/olfaction.dm b/code/datums/mutations/olfaction.dm index f487702a3c6..b3273c8dd95 100644 --- a/code/datums/mutations/olfaction.dm +++ b/code/datums/mutations/olfaction.dm @@ -3,8 +3,8 @@ desc = "Your sense of smell is comparable to that of a canine." quality = POSITIVE difficulty = 12 - text_gain_indication = "Smells begin to make more sense..." - text_lose_indication = "Your sense of smell goes back to normal." + text_gain_indication = span_notice("Smells begin to make more sense...") + text_lose_indication = span_notice("Your sense of smell goes back to normal.") power_path = /datum/action/cooldown/spell/olfaction instability = POSITIVE_INSTABILITY_MODERATE synchronizer_coeff = 1 diff --git a/code/datums/mutations/passive.dm b/code/datums/mutations/passive.dm index 14135fe426e..46859db6869 100644 --- a/code/datums/mutations/passive.dm +++ b/code/datums/mutations/passive.dm @@ -17,8 +17,8 @@ desc = "Causes the subject to feel just a little bit smarter. Most effective in specimens with low levels of intelligence." quality = POSITIVE instability = POSITIVE_INSTABILITY_MODERATE // literally makes you on par with station equipment - text_gain_indication = "You feel a little bit smarter." - text_lose_indication = "Your mind feels a little bit foggy." + text_gain_indication = span_danger("You feel a little bit smarter.") + text_lose_indication = span_danger("Your mind feels a little bit foggy.") /datum/mutation/human/clever/on_acquiring(mob/living/carbon/human/owner) if(..()) diff --git a/code/datums/mutations/radioactive.dm b/code/datums/mutations/radioactive.dm index 8700e405662..b2a17b53412 100644 --- a/code/datums/mutations/radioactive.dm +++ b/code/datums/mutations/radioactive.dm @@ -2,7 +2,7 @@ name = "Radioactivity" desc = "A volatile mutation that causes the host to sent out deadly beta radiation. This affects both the hosts and their surroundings." quality = NEGATIVE - text_gain_indication = "You can feel it in your bones!" + text_gain_indication = span_warning("You can feel it in your bones!") instability = NEGATIVE_STABILITY_MAJOR difficulty = 8 power_coeff = 1 diff --git a/code/datums/mutations/reach.dm b/code/datums/mutations/reach.dm new file mode 100644 index 00000000000..8d1229c9851 --- /dev/null +++ b/code/datums/mutations/reach.dm @@ -0,0 +1,111 @@ +///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('modular_skyrat/master_files/icons/effects/tele_effects.dmi', "telekinesishead", -MUTATIONS_LAYER)) // SKYRAT EDIT CHANGE - ORIGINAL: 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 diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 66e307c2478..3aceb3e7d8a 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -4,7 +4,7 @@ desc = "The holder of this mutation has poor eyesight." instability = NEGATIVE_STABILITY_MODERATE quality = MINOR_NEGATIVE - text_gain_indication = "You can't see very well." + text_gain_indication = span_danger("You can't see very well.") /datum/mutation/human/nearsight/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -22,7 +22,7 @@ desc = "Renders the subject completely blind." instability = NEGATIVE_STABILITY_MAJOR quality = NEGATIVE - text_gain_indication = "You can't seem to see anything." + text_gain_indication = span_danger("You can't seem to see anything.") /datum/mutation/human/blind/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -40,8 +40,8 @@ desc = "The user of this genome can visually perceive the unique human thermal signature." quality = POSITIVE difficulty = 18 - text_gain_indication = "You can see the heat rising off of your skin..." - text_lose_indication = "You can no longer see the heat rising off of your skin..." + text_gain_indication = span_notice("You can see the heat rising off of your skin...") + 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 synchronizer_coeff = 1 power_coeff = 1 @@ -111,7 +111,7 @@ /datum/mutation/human/xray 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 - text_gain_indication = "The walls suddenly disappear!" + text_gain_indication = span_notice("The walls suddenly disappear!") instability = POSITIVE_INSTABILITY_MAJOR locked = TRUE @@ -135,7 +135,7 @@ quality = POSITIVE locked = TRUE difficulty = 16 - text_gain_indication = "You feel pressure building up behind your eyes." + text_gain_indication = span_notice("You feel pressure building up behind your eyes.") layer_used = FRONT_MUTATIONS_LAYER limb_req = BODY_ZONE_HEAD @@ -186,8 +186,8 @@ desc = "Causes a severe case of Aphasia that prevents reading or writing." instability = NEGATIVE_STABILITY_MAJOR quality = NEGATIVE - text_gain_indication = "You feel unable to read or write." - text_lose_indication = "You feel able to read and write again." + text_gain_indication = span_danger("You feel unable to read or write.") + text_lose_indication = span_danger("You feel able to read and write again.") /datum/mutation/human/illiterate/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -198,3 +198,4 @@ if(..()) return REMOVE_TRAIT(owner, TRAIT_ILLITERATE, GENETIC_MUTATION) + diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 1400503dfc4..5b917aa1397 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -1,12 +1,17 @@ //These are all minor mutations that affect your speech somehow. //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 name = "Nervousness" desc = "Causes the holder to stutter." instability = NEGATIVE_STABILITY_MINI quality = MINOR_NEGATIVE - text_gain_indication = "You feel nervous." + text_gain_indication = span_danger("You feel nervous.") /datum/mutation/human/nervousness/on_life(seconds_per_tick, times_fired) if(SPT_PROB(5, seconds_per_tick)) @@ -17,8 +22,8 @@ desc = "You are not a clown. You are the entire circus." instability = NEGATIVE_STABILITY_MINI quality = MINOR_NEGATIVE - text_gain_indication = "You feel an off sensation in your voicebox." - text_lose_indication = "The off sensation passes." + text_gain_indication = span_sans(span_notice("You feel an off sensation in your voicebox.")) + text_lose_indication = span_notice("The off sensation passes.") /datum/mutation/human/wacky/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -35,13 +40,185 @@ 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 name = "Mute" desc = "Completely inhibits the vocal section of the brain." instability = NEGATIVE_STABILITY_MAJOR quality = NEGATIVE - text_gain_indication = "You feel unable to express yourself at all." - text_lose_indication = "You feel able to speak freely again." + text_gain_indication = span_danger("You feel unable to express yourself at all.") + text_lose_indication = span_danger("You feel able to speak freely again.") /datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -58,8 +235,8 @@ desc = "Partially inhibits the vocal center of the brain, severely distorting speech." instability = NEGATIVE_STABILITY_MODERATE quality = NEGATIVE - text_gain_indication = "You can't seem to form any coherent thoughts!" - text_lose_indication = "Your mind feels more clear." + text_gain_indication = span_danger("You can't seem to form any coherent thoughts!") + text_lose_indication = span_danger("Your mind feels more clear.") /datum/mutation/human/unintelligible/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -76,8 +253,8 @@ desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037." instability = NEGATIVE_STABILITY_MINI quality = MINOR_NEGATIVE - text_gain_indication = "You feel Swedish, however that works." - text_lose_indication = "The feeling of Swedishness passes." + text_gain_indication = span_notice("You feel Swedish, however that works.") + text_lose_indication = span_notice("The feeling of Swedishness passes.") /datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -108,8 +285,8 @@ desc = "Unknown" instability = NEGATIVE_STABILITY_MINI quality = MINOR_NEGATIVE - text_gain_indication = "Ye feel like a reet prat like, innit?" - text_lose_indication = "You no longer feel like being rude and sassy." + text_gain_indication = span_notice("Ye feel like a reet prat like, innit?") + 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) if(..()) @@ -146,9 +323,8 @@ desc = "A terrifying mutation named after its 'patient-zero'." instability = NEGATIVE_STABILITY_MINI quality = MINOR_NEGATIVE - locked = TRUE - text_gain_indication = "You feel pretty good, honeydoll." - text_lose_indication = "You feel a little less conversation would be great." + text_gain_indication = span_notice("You feel pretty good, honeydoll.") + text_lose_indication = span_notice("You feel a little less conversation would be great.") /datum/mutation/human/elvis/on_life(seconds_per_tick, times_fired) switch(pick(1,2)) @@ -194,8 +370,8 @@ desc = "A common mutation that severely decreases intelligence." quality = NEGATIVE locked = TRUE - text_gain_indication = "You feel...totally chill, man!" - text_lose_indication = "You feel like you have a better sense of time." + text_gain_indication = span_notice("You feel...totally chill, man!") + 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) ..() @@ -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." instability = NEGATIVE_STABILITY_MINI quality = MINOR_NEGATIVE - text_gain_indication = "You feel like seeking the holy grail!" - text_lose_indication = "You no longer feel like seeking anything." + text_gain_indication = span_notice("You feel like seeking the holy grail!") + text_lose_indication = span_notice("You no longer feel like seeking anything.") /datum/mutation/human/medieval/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -272,3 +448,7 @@ var/spoken_message = speech_args[SPEECH_MESSAGE] spoken_message = piglatin_sentence(spoken_message) speech_args[SPEECH_MESSAGE] = spoken_message + +#undef ALPHABET +#undef VOWELS +#undef CONSONANTS diff --git a/code/datums/mutations/telekinesis.dm b/code/datums/mutations/telekinesis.dm deleted file mode 100644 index fa0139cb60a..00000000000 --- a/code/datums/mutations/telekinesis.dm +++ /dev/null @@ -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 = "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('modular_skyrat/master_files/icons/effects/tele_effects.dmi', "telekinesishead", -MUTATIONS_LAYER)) //SKYRAT EDIT CHANGE - ORIGINAL: 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) diff --git a/code/datums/mutations/telepathy.dm b/code/datums/mutations/telepathy.dm index 0e3dffb48b4..4fa2a38db14 100644 --- a/code/datums/mutations/telepathy.dm +++ b/code/datums/mutations/telepathy.dm @@ -2,8 +2,8 @@ name = "Telepathy" desc = "A rare mutation that allows the user to telepathically communicate to others." quality = POSITIVE - text_gain_indication = "You can hear your own voice echoing in your mind!" - text_lose_indication = "You don't hear your mind echo anymore." + text_gain_indication = span_notice("You can hear your own voice echoing in your mind!") + text_lose_indication = span_notice("You don't hear your mind echo anymore.") difficulty = 12 power_path = /datum/action/cooldown/spell/list_target/telepathy instability = POSITIVE_INSTABILITY_MINOR // basically a mediocre PDA messager diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index eaa49097035..d80510fb1fe 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -4,8 +4,8 @@ quality = POSITIVE locked = TRUE difficulty = 16 - text_gain_indication = "You feel power flow through your hands." - text_lose_indication = "The energy in your hands subsides." + text_gain_indication = span_notice("You feel power flow through your hands.") + text_lose_indication = span_notice("The energy in your hands subsides.") power_path = /datum/action/cooldown/spell/touch/shock instability = POSITIVE_INSTABILITY_MODERATE // bad stun baton energy_coeff = 1 @@ -85,3 +85,192 @@ icon = 'icons/obj/weapons/hand.dmi' 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" diff --git a/code/datums/mutations/webbing.dm b/code/datums/mutations/webbing.dm index 002687d55be..e372cb4bf5c 100644 --- a/code/datums/mutations/webbing.dm +++ b/code/datums/mutations/webbing.dm @@ -3,7 +3,7 @@ name = "Webbing Production" desc = "Allows the user to lay webbing, and travel through it." quality = POSITIVE - text_gain_indication = "Your skin feels webby." + text_gain_indication = span_notice("Your skin feels webby.") instability = POSITIVE_INSTABILITY_MODERATE // useful until you're lynched power_path = /datum/action/cooldown/mob_cooldown/lay_web/genetic energy_coeff = 1 diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index d349d2a4464..38bb39663e0 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -277,14 +277,14 @@ ) //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] med_hud.show_to(owner) return ..() /datum/status_effect/hippocratic_oath/on_remove() 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] med_hud.hide_from(owner) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 8fee497a4f9..dde01baac03 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -426,12 +426,12 @@ /obj/item/dnainjector/pressuremut name = "\improper DNA injector (Pressure Adaptation)" desc = "Gives you fire." - add_mutations = list(/datum/mutation/human/pressure_adaptation) + add_mutations = list(/datum/mutation/human/adaptation/pressure) /obj/item/dnainjector/antipressure name = "\improper DNA injector (Anti-Pressure Adaptation)" desc = "Cures fire." - remove_mutations = list(/datum/mutation/human/pressure_adaptation) + remove_mutations = list(/datum/mutation/human/adaptation/pressure) /obj/item/dnainjector/radioactive name = "\improper DNA injector (Radioactive)" @@ -500,12 +500,12 @@ /obj/item/dnainjector/firemut name = "\improper DNA injector (Temp Adaptation)" desc = "Gives you fire." - add_mutations = list(/datum/mutation/human/temperature_adaptation) + add_mutations = list(/datum/mutation/human/adaptation/thermal) /obj/item/dnainjector/antifire name = "\improper DNA injector (Anti-Temp Adaptation)" desc = "Cures fire." - remove_mutations = list(/datum/mutation/human/temperature_adaptation) + remove_mutations = list(/datum/mutation/human/adaptation/thermal) /obj/item/dnainjector/thermal name = "\improper DNA injector (Thermal Vision)" diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 7f9177949dd..b71cc55eaa0 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -320,7 +320,7 @@ for(var/mob/living/L in contents) if(L.bodytemperature <= 50 && !HAS_TRAIT(L, TRAIT_RESISTCOLD)) L.apply_status_effect(/datum/status_effect/freon) - MakeSlippery(TURF_WET_PERMAFROST, 50) + MakeSlippery(TURF_WET_PERMAFROST, 10 SECONDS) return TRUE /turf/open/proc/water_vapor_gas_act() diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index bfac673535a..fd18ffe5c1e 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -27,5 +27,5 @@ return H.dna.add_mutation(/datum/mutation/human/hulk) 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) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index fea6af413ec..4c4f7b789b1 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -463,11 +463,12 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( message = unintelligize(message) 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) message = data[TREAT_MESSAGE_ARG] tts_message = data[TREAT_TTS_MESSAGE_ARG] tts_filter = data[TREAT_TTS_FILTER_ARG] + capitalize_message = data[TREAT_CAPITALIZE_MESSAGE] if(!tts_message) tts_message = message diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 3d88c40fdfb..2a8b6ca6b69 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -31,7 +31,7 @@ /obj/projectile/temp/cryo name = "cryo beam" - range = 3 + range = 9 temperature = -240 // Single slow shot reduces temp greatly /obj/projectile/temp/cryo/on_range() @@ -40,3 +40,24 @@ var/turf/open/O = T O.freeze_turf() 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) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 1f18cf0de44..15dc966ae3e 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -503,18 +503,29 @@ 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) - 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 + // Info for non-matrix plebs like me! - 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")) 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_blue, time = 4 SECONDS) - animate(color = col_filter_red, time = 4 SECONDS) + animate(color = col_filter_shift_once, time = 4 SECONDS) + animate(color = col_filter_shift_twice, 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)) @@ -568,18 +579,18 @@ 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_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_wave", 1, list("type" = "wave", "x" = 32, "y" = 32)) 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_red, time = 3 SECONDS) + animate(color = col_filter_reset, time = 3 SECONDS) animate(color = col_filter_mid, time = 3 SECONDS) for(var/filter in game_plane_master_controller.get_filters("blastoff_wave")) diff --git a/code/modules/spells/spell_types/conjure_item/_conjure_item.dm b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm index 7e39f778391..3bbdf25fa84 100644 --- a/code/modules/spells/spell_types/conjure_item/_conjure_item.dm +++ b/code/modules/spells/spell_types/conjure_item/_conjure_item.dm @@ -3,7 +3,7 @@ invocation_type = INVOCATION_NONE /// 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 var/delete_old = TRUE /// List of weakrefs to items summoned @@ -57,7 +57,7 @@ var/mob/mob_caster = cast_on 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) mob_caster.dropItemToGround(existing_item) @@ -65,6 +65,10 @@ if(QDELETED(created)) 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)) mob_caster.put_in_hands(created, del_on_fail = delete_on_failure) diff --git a/icons/mob/actions/actions_genetic.dmi b/icons/mob/actions/actions_genetic.dmi index 9ead1795fe7..497abffe674 100644 Binary files a/icons/mob/actions/actions_genetic.dmi and b/icons/mob/actions/actions_genetic.dmi differ diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index fb8c121218f..b8d3c3ce34b 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/effects/genetics.dmi b/icons/mob/effects/genetics.dmi index ebaad5028a2..76d5224b3c7 100644 Binary files a/icons/mob/effects/genetics.dmi and b/icons/mob/effects/genetics.dmi differ diff --git a/icons/mob/inhands/items/touchspell_lefthand.dmi b/icons/mob/inhands/items/touchspell_lefthand.dmi index 1fc8d962aec..2cf040fcf8d 100644 Binary files a/icons/mob/inhands/items/touchspell_lefthand.dmi and b/icons/mob/inhands/items/touchspell_lefthand.dmi differ diff --git a/icons/mob/inhands/items/touchspell_righthand.dmi b/icons/mob/inhands/items/touchspell_righthand.dmi index cc3adf5eb10..d4815fe6b65 100644 Binary files a/icons/mob/inhands/items/touchspell_righthand.dmi and b/icons/mob/inhands/items/touchspell_righthand.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 98a2e59dbc9..a13ebcc6360 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/obj/weapons/hand.dmi b/icons/obj/weapons/hand.dmi index 5d8827e0a7b..071113138a7 100644 Binary files a/icons/obj/weapons/hand.dmi and b/icons/obj/weapons/hand.dmi differ diff --git a/strings/heckacious.json b/strings/heckacious.json new file mode 100644 index 00000000000..1d43f0bfaff --- /dev/null +++ b/strings/heckacious.json @@ -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" ] + } +} diff --git a/tgstation.dme b/tgstation.dme index 0f745956ef1..d74b72a841c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1739,6 +1739,7 @@ #include "code\datums\mood_events\needs_events.dm" #include "code\datums\mutations\_combined.dm" #include "code\datums\mutations\_mutations.dm" +#include "code\datums\mutations\active.dm" #include "code\datums\mutations\adaptation.dm" #include "code\datums\mutations\antenna.dm" #include "code\datums\mutations\autotomy.dm" @@ -1746,13 +1747,14 @@ #include "code\datums\mutations\chameleon.dm" #include "code\datums\mutations\cold.dm" #include "code\datums\mutations\fire_breath.dm" +#include "code\datums\mutations\hot.dm" #include "code\datums\mutations\hulk.dm" #include "code\datums\mutations\olfaction.dm" #include "code\datums\mutations\passive.dm" #include "code\datums\mutations\radioactive.dm" +#include "code\datums\mutations\reach.dm" #include "code\datums\mutations\sight.dm" #include "code\datums\mutations\speech.dm" -#include "code\datums\mutations\telekinesis.dm" #include "code\datums\mutations\telepathy.dm" #include "code\datums\mutations\tongue_spike.dm" #include "code\datums\mutations\touch.dm"