From 559700a58b719426bd78b5d7466a333d45958a97 Mon Sep 17 00:00:00 2001 From: Rob Nelson Date: Sun, 26 Jan 2014 01:40:49 -0800 Subject: [PATCH] Added a bunch of new goon powers. Conflicts: code/modules/mob/living/carbon/human/emote.dm --- code/game/dna/genes/goon_disabilities.dm | 85 +++- code/game/dna/genes/goon_powers.dm | 397 +++++++++++++++++- code/game/gamemodes/setupgame.dm | 8 + code/game/objects/effects/effect_system.dm | 2 +- code/global.dm | 8 + code/modules/mob/living/carbon/human/emote.dm | 74 +++- code/modules/mob/living/carbon/human/human.dm | 5 + code/setup.dm | 1 + 8 files changed, 561 insertions(+), 19 deletions(-) diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index acfd8c90fef..047edf87483 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -9,7 +9,7 @@ // WAS: /datum/bioEffect/mute /datum/dna/gene/disability/mute name = "Mute" - desc = "Completley shuts down the speech center of the subject's brain." + desc = "Completely shuts down the speech center of the subject's brain." activation_message = "You feel unable to express yourself at all." deactivation_message = "You feel able to speak freely again." @@ -278,4 +278,85 @@ C << "\red [src.personalized_stink]" else C << "\red [stinkString()]" -*/ \ No newline at end of file +*/ + + +//////////////////////////////////////////////////////////////////////// +// WAS: /datum/bioEffect/immolate +/datum/dna/gene/basic/grant_spell/immolate + name = "Incendiary Mitochondria" + desc = "The subject becomes able to convert excess cellular energy into thermal energy." + activation_messages = list("You suddenly feel rather hot.") + deactivation_messages = list("You no longer feel uncomfortably hot.") + + spelltype=/obj/effect/proc_holder/spell/targeted/immolate + + New() + ..() + block = IMMOLATEBLOCK + +/obj/effect/proc_holder/spell/targeted/immolate + name = "Incendiary Mitochondria" + desc = "The subject becomes able to convert excess cellular energy into thermal energy." + panel = "Mutant Powers" + + charge_type = "recharge" + charge_max = 600 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = -1 + selection_type = "range" + +/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets) + if (istype(usr,/mob/living/)) + var/mob/living/L = usr + + L.adjust_fire_stacks(0.5) // Same as walking into fire. Was 100 (goon fire) + L.visible_message("\red [L.name] suddenly bursts into flames!") + //playsound(L.loc, 'mag_fireballlaunch.ogg', 50, 0) + + return + +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/melt +/datum/dna/gene/basic/grant_verb/melt + name = "Self Biomass Manipulation" + desc = "The subject becomes able to transform the matter of their cells into a liquid state." + activation_messages = list("You feel strange and jiggly.") + deactivation_messages = list("You feel more solid.") + + verbtype=/proc/bioproc_melt + + New() + ..() + block = MELTBLOCK + +/proc/bioproc_melt() + set name = "Dissolve" + set desc = "Transform yourself into a liquified state." + set category = "Mutant Abilities" + + if (istype(usr,/mob/living/carbon/human/)) + var/mob/living/carbon/human/H = usr + + H.visible_message("\red [H.name]'s flesh melts right off! Holy shit!") + //if (H.gender == "female") + // playsound(H.loc, 'female_fallscream.ogg', 50, 0) + //else + // playsound(H.loc, 'male_fallscream.ogg', 50, 0) + //playsound(H.loc, 'bubbles.ogg', 50, 0) + //playsound(H.loc, 'loudcrunch2.ogg', 50, 0) + var/mob/living/carbon/human/skellington/nH = new /mob/living/carbon/human/skellington(H.loc) + nH.real_name = H.real_name + nH.name = "[H.name]'s skeleton" + //H.decomp_stage = 4 + nH.brain_op_stage = 4 + H.gib(1) + else + usr.visible_message("\red [usr.name] melts into a pile of bloody viscera!") + usr.gib(1) + + return diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 83b7e681e08..69b232442ff 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -72,4 +72,399 @@ if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained()) M.alpha = round(255 * 0.10) else - M.alpha = round(255 * 0.80) \ No newline at end of file + M.alpha = round(255 * 0.80) + +///////////////////////////////////////////////////////////////////////////////////////// + +/datum/dna/gene/basic/grant_spell + var/obj/effect/proc_holder/spell/spelltype + + activate(var/mob/M, var/connected, var/flags) + ..() + M.spell_list += spelltype + return 1 + + deactivate(var/mob/M, var/connected, var/flags) + ..() + M.spell_list -= spelltype +/datum/dna/gene/basic/grant_verb + var/verbtype + + activate(var/mob/M, var/connected, var/flags) + ..() + M.verbs += verbtype + return 1 + + deactivate(var/mob/M, var/connected, var/flags) + ..() + M.verbs -= verbtype + +// WAS: /datum/bioEffect/cryokinesis +/datum/dna/gene/basic/grant_spell/cryo + name = "Cryokinesis" + desc = "Allows the subject to lower the body temperature of others." + activation_messages = list("You notice a strange cold tingle in your fingertips.") + deactivation_messages = list("Your fingers feel warmer.") + + spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis + + New() + ..() + block = CRYOBLOCK + +/obj/effect/proc_holder/spell/targeted/cryokinesis + name = "Cryokinesis" + desc = "Drops the bodytemperature of another person." + panel = "Mutant Powers" + + charge_type = "recharge" + charge_max = 600 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = 7 + selection_type = "range" + var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + +/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets) + if(!targets.len) + usr << "No target found in range." + return + + var/mob/living/carbon/C = targets[1] + + if(!iscarbon(C)) + usr << "\red This will only work on normal organic beings." + return + + C.bodytemperature = -1500 + C.ExtinguishMob() + + C.visible_message("\red A cloud of fine ice crystals engulfs [C]!") + + //playsound(usr.loc, 'bamf.ogg', 50, 0) + + new/obj/effects/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis")) + + return + +/obj/effects/self_deleting + density = 0 + opacity = 0 + anchored = 1 + icon = null + desc = "" + //layer = 15 + + New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something") + src.name = oname + loc=location + src.icon = I + spawn(duration) + del(src) + +/////////////////////////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/mattereater +/datum/dna/gene/basic/grant_spell/mattereater + name = "Matter Eater" + desc = "Allows the subject to eat just about anything without harm." + activation_messages = list("You feel hungry.") + deactivation_messages = list("You don't feel quite so hungry anymore.") + + spelltype=/obj/effect/proc_holder/spell/targeted/eat + + New() + ..() + block = EATBLOCK + +/obj/effect/proc_holder/spell/targeted/eat + name = "Eat" + desc = "Eat just about anything!" + panel = "Mutant Powers" + + charge_type = "recharge" + charge_max = 300 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = 1 + selection_type = "range" + +/obj/effect/proc_holder/spell/targeted/eat/choose_targets(mob/user = usr) + var/list/targets = list() + var/list/possible_targets = list() + + for(var/obj/item/O in view_or_range(range, user, selection_type)) + possible_targets += O + + targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets + + if(!targets.len) //doesn't waste the spell + revert_cast(user) + return + + perform(targets) + +/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets) + if(!targets.len) + usr << "No target found in range." + return + + var/obj/item/the_item = targets[1] + + usr.visible_message("\red [usr] eats [the_item].") + playsound(usr.loc, 'sound/items/eatfood.ogg', 50, 0) + + del(the_item) + + if(ishuman(usr)) + var/mob/living/carbon/human/H=usr + for(var/name in H.organs_by_name) + var/datum/organ/external/affecting = null + if(!H.organs[name]) + continue + affecting = H.organs[name] + if(!istype(affecting, /datum/organ/external)) + continue + affecting.heal_damage(4, 0) + usr:UpdateDamageIcon() + usr:updatehealth() + + return + +//////////////////////////////////////////////////////////////////////// + +//WAS: /datum/bioEffect/jumpy +/datum/dna/gene/basic/grant_spell/jumpy + name = "Jumpy" + desc = "Allows the subject to leap great distances." + //cooldown = 30 + activation_messages = list("Your leg muscles feel taut and strong.") + deactivation_messages = list("Your leg muscles shrink back to normal.") + + spelltype =/obj/effect/proc_holder/spell/targeted/leap + + New() + ..() + block = JUMPBLOCK + +/obj/effect/proc_holder/spell/targeted/leap + name = "Jump" + desc = "Leap great distances!" + panel = "Mutant Powers" + range = -1 + include_user = 1 + + charge_type = "recharge" + charge_max = 30 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + +/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets) + if (istype(usr.loc,/mob/)) + usr << "\red You can't jump right now!" + return + + if (istype(usr.loc,/turf/)) + usr.visible_message("\red [usr.name] takes a huge leap!") + playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) + var/prevLayer = usr.layer + usr.layer = 15 + + for(var/i=0, i<10, i++) + step(usr, usr.dir) + if(i < 5) usr.pixel_y += 8 + else usr.pixel_y -= 8 + sleep(1) + + if (M_FAT in usr.mutations && prob(66)) + usr.visible_message("\red [usr.name] crashes due to their heavy weight!") + //playsound(usr.loc, 'zhit.wav', 50, 1) + usr.weakened += 10 + usr.stunned += 5 + + usr.layer = prevLayer + + if (istype(usr.loc,/obj/)) + var/obj/container = usr.loc + usr << "\red You leap and slam your head against the inside of [container]! Ouch!" + usr.paralysis += 3 + usr.weakened += 5 + container.visible_message("\red [usr.loc] emits a loud thump and rattles a bit.") + playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1) + var/wiggle = 6 + while(wiggle > 0) + wiggle-- + container.pixel_x = rand(-3,3) + container.pixel_y = rand(-3,3) + sleep(1) + container.pixel_x = 0 + container.pixel_y = 0 + + + return + +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/polymorphism + +/datum/dna/gene/basic/grant_spell/polymorph + name = "Polymorphism" + desc = "Enables the subject to reconfigure their appearance to mimic that of others." + + spelltype =/obj/effect/proc_holder/spell/targeted/polymorph + //cooldown = 1800 + activation_messages = list("You don't feel entirely like yourself somehow.") + deactivation_messages = list("You feel secure in your identity.") + + New() + ..() + block = POLYMORPHBLOCK + +/obj/effect/proc_holder/spell/targeted/polymorph + name = "Polymorph" + desc = "Mimic the appearance of others!" + panel = "Mutant Powers" + charge_max = 1800 + + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = 1 + selection_type = "range" + +/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets) + var/mob/living/M=targets[1] + if(!ishuman(M)) + usr << "\red You can only change your appearance to that of another human." + return + + if(!ishuman(usr)) return + + + //playsound(usr.loc, 'blobattack.ogg', 50, 1) + + usr.visible_message("\red [usr]'s body shifts and contorts.") + + spawn(10) + if(M && usr) + //playsound(usr.loc, 'gib.ogg', 50, 1) + usr.UpdateAppearance(M.dna.UI) + usr:real_name = M:real_name + usr:name = M:name +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/empath +/datum/dna/gene/basic/grant_verb/empath + name = "Empathic Thought" + desc = "The subject becomes able to read the minds of others for certain information." + + verbtype = /proc/bioproc_empath + activation_messages = list("You suddenly notice more about others than you did before.") + deactivation_messages = list("You no longer feel able to sense intentions.") + + New() + ..() + block = EMPATHBLOCK + +/proc/bioproc_empath(var/mob/living/carbon/M in range(7,usr)) + set name = "Read Mind" + set desc = "Read the minds of others for information." + set category = "Mutant Abilities" + + if(!iscarbon(M)) + usr << "\red You may only use this on other organic beings." + return + + if(usr.stat) + return + + if (M_PSY_RESIST in M.mutations) + usr << "\red You can't see into [M.name]'s mind at all!" + return + + if (M.stat == 2) + usr << "\red [M.name] is dead and cannot have their mind read." + return + if (M.health < 0) + usr << "\red [M.name] is dying, and their thoughts are too scrambled to read." + return + + usr << "\blue Mind Reading of [M.name]:" + var/pain_condition = M.health + // lower health means more pain + var/list/randomthoughts = list("what to have for lunch","the future","the past","money", + "their hair","what to do next","their job","space","amusing things","sad things", + "annoying things","happy things","something incoherent","something they did wrong") + var/thoughts = "thinking about [pick(randomthoughts)]" + if (M.fire_stacks) + pain_condition -= 50 + thoughts = "preoccupied with the fire" + if (M.radiation) + pain_condition -= 25 + + switch(pain_condition) + if (81 to INFINITY) + usr << "\blue Condition: [M.name] feels good." + if (61 to 80) + usr << "\blue Condition: [M.name] is suffering mild pain." + if (41 to 60) + usr << "\blue Condition: [M.name] is suffering significant pain." + if (21 to 40) + usr << "\blue Condition: [M.name] is suffering severe pain." + else + usr << "\blue Condition: [M.name] is suffering excruciating pain." + thoughts = "haunted by their own mortality" + + switch(M.a_intent) + if ("help") + usr << "\blue Mood: You sense benevolent thoughts from [M.name]." + if ("disarm") + usr << "\blue Mood: You sense cautious thoughts from [M.name]." + if ("grab") + usr << "\blue Mood: You sense hostile thoughts from [M.name]." + if ("harm") + usr << "\blue Mood: You sense cruel thoughts from [M.name]." + for(var/mob/living/L in view(7,M)) + if (L == M) + continue + thoughts = "thinking about punching [L.name]" + break + else + usr << "\blue Mood: You sense strange thoughts from [M.name]." + + if (istype(M,/mob/living/carbon/human)) + var/numbers[0] + var/mob/living/carbon/human/H = M + if(H.mind && H.mind.initial_account) + numbers += H.mind.initial_account.account_number + numbers += H.mind.initial_account.remote_access_pin + if(numbers.len>0) + usr << "\blue Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]." + usr << "\blue Thoughts: [M.name] is currently [thoughts]." + + if (/datum/dna/gene/basic/grant_verb/empath in M.active_genes) + M << "\red You sense [usr.name] reading your mind." + else if (prob(5) || M.mind.assigned_role=="Chaplain") + M << "\red You sense someone intruding upon your thoughts..." + return + +//////////////////////////////////////////////////////////////////////// + +// WAS: /datum/bioEffect/superfart +/datum/dna/gene/basic/superfart + name = "High-Pressure Intestines" + desc = "Vastly increases the gas capacity of the subject's digestive tract." + activation_messages = list("You feel bloated and gassy.") + deactivation_messages = list("You no longer feel gassy. What a relief!") + + mutation = M_SUPER_FART + + New() + ..() + block = SUPERFARTBLOCK \ No newline at end of file diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index dc85d7e9970..c47f04daeb1 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -77,6 +77,14 @@ PSYRESISTBLOCK = getAssignedBlock("PSYRESIST", numsToAssign, DNA_HARD_BOUNDS) SHADOWBLOCK = getAssignedBlock("SHADOW", numsToAssign, DNA_HARDER_BOUNDS) CHAMELEONBLOCK = getAssignedBlock("CHAMELEON", numsToAssign, DNA_HARDER_BOUNDS) + CRYOBLOCK = getAssignedBlock("CRYO", numsToAssign, DNA_HARD_BOUNDS) + EATBLOCK = getAssignedBlock("EAT", numsToAssign, DNA_HARD_BOUNDS) + JUMPBLOCK = getAssignedBlock("JUMP", numsToAssign, DNA_HARD_BOUNDS) + MELTBLOCK = getAssignedBlock("MELT", numsToAssign) + IMMOLATEBLOCK = getAssignedBlock("IMMOLATE", numsToAssign) + EMPATHBLOCK = getAssignedBlock("EMPATH", numsToAssign, DNA_HARD_BOUNDS) + SUPERFARTBLOCK = getAssignedBlock("SUPERFART", numsToAssign, DNA_HARDER_BOUNDS) + POLYMORPHBLOCK = getAssignedBlock("POLYMORPH", numsToAssign, DNA_HARDER_BOUNDS) // // Static Blocks diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index d8df24484f2..df8ce5328c6 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -523,7 +523,7 @@ steam.start() -- spawns the effect number = n cardinals = c - chemholder.reagents.add_reagent("mercury", 50) + chemholder.reagents.add_reagent("space_drugs", rand(1,10)) if(istype(loca, /turf/)) location = loca diff --git a/code/global.dm b/code/global.dm index 038f9ab0bc0..3dee0d74ab2 100644 --- a/code/global.dm +++ b/code/global.dm @@ -86,6 +86,14 @@ var/SOBERBLOCK = 0 var/PSYRESISTBLOCK = 0 var/SHADOWBLOCK = 0 var/CHAMELEONBLOCK = 0 +var/CRYOBLOCK = 0 +var/EATBLOCK = 0 +var/JUMPBLOCK = 0 +var/MELTBLOCK = 0 +var/EMPATHBLOCK = 0 +var/SUPERFARTBLOCK = 0 +var/IMMOLATEBLOCK = 0 +var/POLYMORPHBLOCK = 0 var/skipupdate = 0 /////////////// diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 2a4d1b79d54..08d8cbaf434 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -548,22 +548,66 @@ if(world.time-lastFart >= 600) message = "[src] [pick("passes wind","farts")]." m_type = 2 - var/location = get_turf(src) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + + var/turf/location = get_turf(src) + var/aoe_range=2 // Default + if(M_SUPER_FART in mutations) + aoe_range+=5 + + // If we're wearing a suit, don't blast or gas those around us. + var/wearing_suit=0 + var/wearing_mask=0 + if(wear_suit && wear_suit.body_parts_covered & LOWER_TORSO) + wearing_suit=1 + if (internal != null && wear_mask && (wear_mask.flags & MASKINTERNALS)) + wearing_mask=1 + + // Process toxic farts first. if(M_TOXIC_FARTS in mutations) - if(wear_suit && wear_suit.body_parts_covered & LOWER_TORSO) - if (internal != null && wear_mask && (wear_mask.flags & MASKINTERNALS)) - return - src << "\red You gas yourself!" - reagents.add_reagent("mercury", rand(10,20)) - return - var/datum/effect/effect/system/chem_smoke_spread/fart/S = new /datum/effect/effect/system/chem_smoke_spread/fart - S.attach(location) - S.set_up(src, 10, 0, location) - spawn(0) - S.start() - sleep(10) - S.start() + message="" + if(wearing_suit) + if(!wearing_mask) + src << "\red You gas yourself!" + reagents.add_reagent("space_drugs", rand(10,20)) + else + // Was /turf/, now /mob/ + for(var/mob/M in view(location,2)) + // Now, we don't have this: + //new /obj/effects/fart_cloud(T,L) + // But: + // <[REDACTED]> so, what it does is...imagine a 3x3 grid with the person in the center. When someone uses the emote *fart (it's not a spell style ability and has no cooldown), then anyone in the 8 tiles AROUND the person who uses it + // <[REDACTED]> gets between 1 and 10 units of jenkem added to them...we obviously don't have Jenkem, but Space Drugs do literally the same exact thing as Jenkem + // <[REDACTED]> the user, of course, isn't impacted because it's not an actual smoke cloud + // So, let's give 'em space drugs. + M.reagents.add_reagent("space_drugs",rand(1,10)) + /* + var/datum/effect/effect/system/smoke_spread/chem/fart/S = new /datum/effect/effect/system/smoke_spread/chem/fart + S.attach(location) + S.set_up(src, 10, 0, location) + spawn(0) + S.start() + sleep(10) + S.start() + */ + if(M_SUPER_FART in mutations) + message="" + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + visible_message("\red [name] hunches down and grits their teeth!") + if(do_after(usr,30)) + visible_message("\red [name] unleashes a [pick("tremendous","gigantic","colossal")] fart!","You hear a [pick("tremendous","gigantic","colossal")] fart.") + //playsound(L.loc, 'superfart.ogg', 50, 0) + if(wearing_suit) + for(var/mob/living/V in view(src,aoe_range)) + shake_camera(V,10,5) + if (V == src) + continue + V << "\red You are sent flying!" + V.Weaken(5) // why the hell was this set to 12 christ + step_away(V,location,15) + step_away(V,location,15) + step_away(V,location,15) + else + usr << "\red You were interrupted and couldn't fart! Rude!" lastFart=world.time else message = "[src] strains, and nothing happens." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a13fb11e76f..31d92e2ea7d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -32,6 +32,11 @@ set_species("Vox") ..() +/mob/living/carbon/human/skellington/New() + h_style = "Bald" + set_species("Skellington") + ..() + /mob/living/carbon/human/diona/New() species = new /datum/species/diona(src) ..() diff --git a/code/setup.dm b/code/setup.dm index e5b5eb44d26..33734fe20a1 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -368,6 +368,7 @@ var/MAX_EXPLOSION_RANGE = 14 #define M_STRONG 202 // (Nothing) #define M_SOBER 203 // Increased alcohol metabolism #define M_PSY_RESIST 204 // Block remoteview +#define M_SUPER_FART 205 // Duh //disabilities #define NEARSIGHTED 1