mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-21 14:03:30 +01:00
1533 lines
52 KiB
Plaintext
1533 lines
52 KiB
Plaintext
/datum/bioEffect/power
|
|
name = "Cryokinesis"
|
|
desc = "Allows the subject to control ice and cold."
|
|
id = "cryokinesis"
|
|
msgGain = "You notice a strange cold tingle in your fingertips."
|
|
msgLose = "Your fingers feel warmer."
|
|
effectType = effectTypePower
|
|
cooldown = 600
|
|
probability = 66
|
|
blockCount = 3
|
|
blockGaps = 2
|
|
stability_loss = 10
|
|
var/using = 0
|
|
var/safety = 0
|
|
var/power = 0
|
|
var/ability_path = /datum/targetable/geneticsAbility/cryokinesis
|
|
var/datum/targetable/geneticsAbility/ability = /datum/targetable/geneticsAbility/cryokinesis
|
|
|
|
New()
|
|
..()
|
|
check_ability_owner()
|
|
|
|
OnAdd()
|
|
..()
|
|
if (istype(owner,/mob/living/carbon/human/))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.hud.update_ability_hotbar()
|
|
check_ability_owner()
|
|
return
|
|
|
|
OnRemove()
|
|
..()
|
|
if (istype(owner,/mob/living/carbon/human/))
|
|
var/mob/living/carbon/human/H = owner
|
|
if (H.hud)
|
|
H.hud.update_ability_hotbar()
|
|
return
|
|
|
|
proc/check_ability_owner()
|
|
if (ispath(ability_path))
|
|
var/datum/targetable/geneticsAbility/AB = new ability_path(src)
|
|
ability = AB
|
|
AB.linked_power = src
|
|
spawn(0)
|
|
AB.owner = src.owner
|
|
|
|
/datum/targetable/geneticsAbility/cryokinesis
|
|
name = "Cryokinesis"
|
|
desc = "Exert control over cold and ice."
|
|
icon_state = "cryokinesis"
|
|
targeted = 1
|
|
target_anything = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
var/turf/T = get_turf(target)
|
|
|
|
target.visible_message("<span style=\"color:red\"><b>[owner]</b> points at [target]!</span>")
|
|
playsound(target.loc, "sound/effects/bamf.ogg", 50, 0)
|
|
particleMaster.SpawnSystem(new /datum/particleSystem/tele_wand(get_turf(target),"8x8snowflake","#88FFFF"))
|
|
|
|
var/obj/decal/icefloor/B
|
|
B = new /obj/decal/icefloor(T)
|
|
spawn(800)
|
|
B.dispose()
|
|
|
|
if (linked_power.power)
|
|
for (var/turf/TF in orange(1,T))
|
|
B = new /obj/decal/icefloor(TF)
|
|
spawn(800)
|
|
B.dispose()
|
|
|
|
for (var/mob/living/L in T.contents)
|
|
if (L == owner && linked_power.safety)
|
|
continue
|
|
boutput(L, "<span style=\"color:blue\">You are struck by a burst of ice cold air!</span>")
|
|
if(L.burning)
|
|
L.set_burning(0)
|
|
L.bodytemperature = 100
|
|
if (linked_power.power)
|
|
new /obj/icecube(get_turf(L), L)
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/mattereater
|
|
name = "Matter Eater"
|
|
desc = "Allows the subject to eat just about anything without harm."
|
|
id = "mattereater"
|
|
msgGain = "You feel hungry."
|
|
msgLose = "You don't feel quite so hungry anymore."
|
|
cooldown = 300
|
|
probability = 66
|
|
blockCount = 4
|
|
blockGaps = 2
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/mattereater
|
|
var/target_path = "/obj/item/"
|
|
|
|
/datum/targetable/geneticsAbility/mattereater
|
|
name = "Matter Eater"
|
|
desc = "Eat just about anything!"
|
|
icon_state = "mattereater"
|
|
targeted = 0
|
|
var/using = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
if (using)
|
|
return 1
|
|
using = 1
|
|
|
|
var/datum/bioEffect/power/mattereater/ME = linked_power
|
|
var/base_path = text2path("[ME.target_path]")
|
|
if (!ispath(base_path))
|
|
base_path = /obj/item/
|
|
var/list/items = get_filtered_atoms_in_touch_range(owner,base_path)
|
|
if (istype(owner.loc,/mob/) || istype(owner.loc,/obj/))
|
|
for (var/atom/A in owner.loc.contents)
|
|
if (istype(A,ME.target_path))
|
|
items += A
|
|
|
|
if (linked_power.power)
|
|
items += get_filtered_atoms_in_touch_range(owner, /obj/the_server_ingame_whoa)
|
|
//So people can still get the meat ending
|
|
|
|
if (!items.len)
|
|
boutput(usr, "/red You can't find anything nearby to eat.")
|
|
using = 0
|
|
return
|
|
|
|
var/obj/the_item = input("Which item do you want to eat?","Matter Eater") as null|obj in items
|
|
if (!the_item)
|
|
using = 0
|
|
return 1
|
|
|
|
var/area/cur_area = get_area(owner)
|
|
var/turf/cur_turf = get_turf(owner)
|
|
if (isrestrictedz(cur_turf.z) && !cur_area.may_eat_here_in_restricted_z && (!owner.client || !owner.client.holder))
|
|
owner.show_text("<span style=\"color:red\">Man, this place really did a number on your appetite. You can't bring yourself to eat anything here.</span>")
|
|
using = 0
|
|
return 1
|
|
|
|
if (istype(the_item, /obj/the_server_ingame_whoa))
|
|
var/obj/the_server_ingame_whoa/the_server = the_item
|
|
the_server.eaten(owner)
|
|
using = 0
|
|
return
|
|
owner.visible_message("<span style=\"color:red\">[owner] eats [the_item].</span>")
|
|
playsound(owner.loc, "sound/items/eatfood.ogg", 50, 0)
|
|
the_item.set_loc(owner)
|
|
qdel(the_item)
|
|
|
|
if (ishuman(owner))
|
|
for(var/A in owner.organs)
|
|
var/obj/item/affecting = null
|
|
if (!owner.organs[A]) continue
|
|
affecting = owner.organs[A]
|
|
if (!istype(affecting, /obj/item))
|
|
continue
|
|
affecting.heal_damage(4, 0)
|
|
owner.UpdateDamageIcon()
|
|
owner.updatehealth()
|
|
|
|
using = 0
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/jumpy
|
|
name = "Jumpy"
|
|
desc = "Allows the subject to leap great distances."
|
|
id = "jumpy"
|
|
msgGain = "Your leg muscles feel taut and strong."
|
|
msgLose = "Your leg muscles shrink back to normal."
|
|
cooldown = 30
|
|
probability = 99
|
|
blockCount = 4
|
|
blockGaps = 2
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/jumpy
|
|
|
|
/datum/targetable/geneticsAbility/jumpy
|
|
name = "Jumpy"
|
|
desc = "Take a big leap forward."
|
|
icon_state = "jumpy"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
|
|
if (istype(owner.loc,/mob/))
|
|
boutput(usr, "<span style=\"color:red\">You can't jump right now!</span>")
|
|
return 1
|
|
|
|
var/jump_tiles = 10
|
|
var/pixel_move = 8
|
|
var/sleep_time = 1
|
|
if (linked_power.power)
|
|
jump_tiles = 20
|
|
pixel_move = 16
|
|
sleep_time = 0.5
|
|
|
|
if (istype(owner.loc,/turf/))
|
|
usr.visible_message("<span style=\"color:red\"><b>[owner]</b> takes a huge leap!</span>")
|
|
playsound(owner.loc, "sound/weapons/thudswoosh.ogg", 50, 1)
|
|
var/prevLayer = owner.layer
|
|
owner.layer = EFFECTS_LAYER_BASE
|
|
|
|
for(var/i=0, i < jump_tiles, i++)
|
|
step(owner, owner.dir)
|
|
if(i < jump_tiles / 2)
|
|
owner.pixel_y += pixel_move
|
|
else
|
|
owner.pixel_y -= pixel_move
|
|
sleep(sleep_time)
|
|
|
|
usr.pixel_y = 0
|
|
|
|
if (owner.bioHolder.HasEffect("fat") && prob(66) && !linked_power.safety)
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner]</b> crashes due to their heavy weight!</span>")
|
|
playsound(usr.loc, "sound/effects/zhit.ogg", 50, 1)
|
|
owner.weakened += 10
|
|
owner.stunned += 5
|
|
|
|
owner.layer = prevLayer
|
|
|
|
if (istype(owner.loc,/obj/))
|
|
var/obj/container = owner.loc
|
|
boutput(owner, "<span style=\"color:red\">You leap and slam your head against the inside of [container]! Ouch!</span>")
|
|
owner.paralysis += 3
|
|
owner.weakened += 5
|
|
container.visible_message("<span style=\"color:red\"><b>[owner.loc]</b> emits a loud thump and rattles a bit.</span>")
|
|
playsound(owner.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
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/polymorphism
|
|
name = "Polymorphism"
|
|
desc = "Enables the subject to reconfigure their appearance to mimic that of others."
|
|
id = "polymorphism"
|
|
msgGain = "You don't feel entirely like yourself somehow."
|
|
msgLose = "You feel secure in your identity."
|
|
cooldown = 1800
|
|
probability = 66
|
|
blockCount = 4
|
|
blockGaps = 4
|
|
stability_loss = 15
|
|
ability_path = /datum/targetable/geneticsAbility/polymorphism
|
|
|
|
/datum/targetable/geneticsAbility/polymorphism
|
|
name = "Polymorphism"
|
|
desc = "Mimic the appearance of others."
|
|
icon_state = "polymorphism"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
if (!istype(target,/mob/living/carbon/human))
|
|
boutput(owner, "<span style=\"color:red\">[target] does not seem to be compatible with this ability.</span>")
|
|
return 1
|
|
if (target == owner)
|
|
boutput(owner, "<span style=\"color:red\">While \"be yourself\" is pretty good advice, that would be taking it a bit too literally.</span>")
|
|
return 1
|
|
var/mob/living/carbon/human/H = target
|
|
if (!H.bioHolder)
|
|
boutput(owner, "<span style=\"color:red\">[target] does not seem to be compatible with this ability.</span>")
|
|
return 1
|
|
|
|
if (get_dist(H,owner) > 1 && !owner.bioHolder.HasEffect("telekinesis"))
|
|
boutput(owner, "<span style=\"color:red\">You must be within touching distance of [target] for this to work.</span>")
|
|
return 1
|
|
|
|
playsound(owner.loc, "sound/effects/blobattack.ogg", 50, 1)
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner]</b> touches [target], then begins to shifts and contort!</span>")
|
|
|
|
spawn(10)
|
|
if(H && owner)
|
|
playsound(owner.loc, "sound/effects/gib.ogg", 50, 1)
|
|
owner.bioHolder.CopyOther(H.bioHolder, copyAppearance = 1, copyPool = 0, copyEffectBlocks = 0, copyActiveEffects = 0)
|
|
owner.real_name = H.real_name
|
|
owner.name = H.name
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/telepathy
|
|
name = "Telepathy"
|
|
desc = "Allows the subject to project their thoughts into the minds of other organics."
|
|
id = "telepathy"
|
|
msgGain = "You can hear your own voice echoing in your mind."
|
|
msgLose = "Your mental voice fades away."
|
|
probability = 99
|
|
blockCount = 4
|
|
blockGaps = 2
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/telepathy
|
|
|
|
/datum/targetable/geneticsAbility/telepathy
|
|
name = "Telepathy"
|
|
desc = "Transmit psychic messages to others."
|
|
icon_state = "telepathy"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
var/mob/living/carbon/recipient = null
|
|
if (istype(target,/mob/living/carbon/))
|
|
recipient = target
|
|
else if (ismob(target) && !istype(target,/mob/living/carbon/))
|
|
boutput(owner, "<span style=\"color:red\">You can't transmit to [target] as they are too different from you mentally!</span>")
|
|
return 1
|
|
else
|
|
var/turf/T = get_turf(target)
|
|
for (var/mob/living/carbon/C in T.contents)
|
|
recipient = C
|
|
break
|
|
|
|
if (!recipient)
|
|
boutput(owner, "<span style=\"color:red\">There's nobody there to transmit a message to.</span>")
|
|
return 1
|
|
|
|
if (recipient.bioHolder.HasEffect("psy_resist"))
|
|
boutput(owner, "<span style=\"color:red\">You can't contact [recipient.name]'s mind at all!</span>")
|
|
return 1
|
|
|
|
if(!recipient.client || recipient.stat)
|
|
boutput(recipient, "<span style=\"color:red\">You can't seem to get through to [recipient.name] mentally.</span>")
|
|
return 1
|
|
|
|
var/msg = copytext( adminscrub(input(usr, "Message to [recipient.name]:","Telepathy") as text), 1, MAX_MESSAGE_LEN)
|
|
if (!msg)
|
|
return 1
|
|
|
|
var/psyname = "A psychic voice"
|
|
if (recipient.bioHolder.HasOneOfTheseEffects("telepathy","empath"))
|
|
psyname = "[owner.name]"
|
|
|
|
boutput(recipient, "<span style='color: #BD33D9'><b>[psyname]</b> echoes, \"<i>[msg]</i>\"</span>")
|
|
boutput(owner, "<span style='color: #BD33D9'>You echo \"<i>[msg]</i>\" to <b>[recipient.name]</b>.</span>")
|
|
|
|
logTheThing("telepathy", owner, recipient, "TELEPATHY to %target%: [msg]")
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/empath
|
|
name = "Empathic Thought"
|
|
desc = "The subject becomes able to read the minds of others for certain information."
|
|
id = "empath"
|
|
msgGain = "You suddenly notice more about others than you did before."
|
|
msgLose = "You no longer feel able to sense intentions."
|
|
probability = 99
|
|
blockCount = 3
|
|
blockGaps = 2
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/empath
|
|
|
|
/datum/targetable/geneticsAbility/empath
|
|
name = "Mind Reader"
|
|
desc = "Read the minds of others for information."
|
|
icon_state = "empath"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
var/mob/living/carbon/read = null
|
|
if (istype(target,/mob/living/carbon/))
|
|
read = target
|
|
else if (ismob(read) && !istype(target,/mob/living/carbon/))
|
|
boutput(owner, "<span style=\"color:red\">You can't read the thoughts of [target] as they are too different from you mentally!</span>")
|
|
return 1
|
|
else
|
|
var/turf/T = get_turf(target)
|
|
for (var/mob/living/carbon/C in T.contents)
|
|
read = C
|
|
break
|
|
|
|
if (!read)
|
|
boutput(owner, "<span style=\"color:red\">There's nobody there to read the thoughts of.</span>")
|
|
return 1
|
|
|
|
if (read.bioHolder.HasEffect("psy_resist"))
|
|
boutput(owner, "<span style=\"color:red\">You can't see into [read.name]'s mind at all!</span>")
|
|
return 1
|
|
|
|
if (read.stat == 2)
|
|
boutput(owner, "<span style=\"color:red\">[read.name] is dead and cannot have their mind read.</span>")
|
|
return
|
|
if (read.health < 0)
|
|
boutput(owner, "<span style=\"color:red\">[read.name] is dying, and their thoughts are too scrambled to read.</span>")
|
|
return
|
|
|
|
boutput(usr, "<span style=\"color:blue\">Mind Reading of [read.name]:</b></span>")
|
|
var/pain_condition = read.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 (read.burning)
|
|
pain_condition -= 50
|
|
thoughts = "preoccupied with the fire"
|
|
if (read.radiation)
|
|
pain_condition -= 25
|
|
|
|
switch(pain_condition)
|
|
if (81 to INFINITY)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Condition</b>: [read.name] feels good.</span>")
|
|
if (61 to 80)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Condition</b>: [read.name] is suffering mild pain.</span>")
|
|
if (41 to 60)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Condition</b>: [read.name] is suffering significant pain.</span>")
|
|
if (21 to 40)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Condition</b>: [read.name] is suffering severe pain.</span>")
|
|
else
|
|
boutput(owner, "<span style=\"color:blue\"><b>Condition</b>: [read.name] is suffering excruciating pain.</span>")
|
|
thoughts = "haunted by their own mortality"
|
|
|
|
switch(read.a_intent)
|
|
if (INTENT_HELP)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Mood</b>: You sense benevolent thoughts from [read.name].</span>")
|
|
if (INTENT_DISARM)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Mood</b>: You sense cautious thoughts from [read.name].</span>")
|
|
if (INTENT_GRAB)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Mood</b>: You sense hostile thoughts from [read.name].</span>")
|
|
if (INTENT_HARM)
|
|
boutput(owner, "<span style=\"color:blue\"><b>Mood</b>: You sense cruel thoughts from [read.name].</span>")
|
|
for(var/mob/living/L in view(7,read))
|
|
if (L == read)
|
|
continue
|
|
thoughts = "thinking about punching [L.name]"
|
|
break
|
|
else
|
|
boutput(owner, "<span style=\"color:blue\"><b>Mood</b>: You sense strange thoughts from [read.name].</span>")
|
|
|
|
if (istype(target,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = read
|
|
boutput(owner, "<span style=\"color:blue\"><b>Numbers</b>: You sense the number [H.pin] is important to [H.name].</span>")
|
|
boutput(owner, "<span style=\"color:blue\"><b>Thoughts</b>: [read.name] is currently [thoughts].</span>")
|
|
|
|
if (read.bioHolder.HasEffect("empath"))
|
|
boutput(read, "<span style=\"color:red\">You sense [owner.name] reading your mind.</span>")
|
|
else if (read.bioHolder.HasEffect("training_chaplain"))
|
|
boutput(read, "<span style=\"color:red\">You sense someone intruding upon your thoughts...</span>")
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/immolate
|
|
name = "Incendiary Mitochondria"
|
|
desc = "The subject becomes able to convert excess cellular energy into thermal energy."
|
|
id = "immolate"
|
|
msgGain = "You suddenly feel rather hot."
|
|
msgLose = "You no longer feel uncomfortably hot."
|
|
cooldown = 600
|
|
probability = 66
|
|
blockCount = 3
|
|
blockGaps = 2
|
|
stability_loss = 10
|
|
ability_path = /datum/targetable/geneticsAbility/immolate
|
|
|
|
/datum/targetable/geneticsAbility/immolate
|
|
name = "Immolate"
|
|
desc = "Wreath yourself in burning flames."
|
|
icon_state = "immolate"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
|
|
playsound(owner.loc, "sound/effects/mag_fireballlaunch.ogg", 50, 0)
|
|
|
|
if (owner.bioHolder && (owner.bioHolder.HasEffect("fire_resist") || owner.bioHolder.HasEffect("thermal_resist")))
|
|
owner.show_message("<span style=\"color:red\">Your body emits an odd burnt odor but you somehow cannot bring yourself to heat up. Huh.</span>")
|
|
return
|
|
|
|
if (linked_power.power)
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]</b> erupts into a huge column of flames! Holy shit!</span>")
|
|
fireflash_sm(get_turf(owner), 3, 7000, 2000)
|
|
else
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]</b> suddenly bursts into flames!</span>")
|
|
owner.set_burning(100)
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/melt
|
|
name = "Self Biomass Manipulation"
|
|
desc = "The subject becomes able to transform the matter of their cells into a liquid state."
|
|
id = "melt"
|
|
msgGain = "You feel strange and jiggly."
|
|
msgLose = "You feel more solid."
|
|
cooldown = 1200
|
|
probability = 66
|
|
blockCount = 3
|
|
blockGaps = 2
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/melt
|
|
|
|
/datum/targetable/geneticsAbility/melt
|
|
name = "Dissolve"
|
|
desc = "Transform yourself into a liquid state."
|
|
icon_state = "melt"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
|
|
if (linked_power.safety && spell_invisibility(owner, 1, 0, 0, 1) == 1) // Dry run. Can we phaseshift?
|
|
spell_invisibility(owner,50)
|
|
playsound(owner.loc, "sound/effects/mag_phase.ogg", 25, 1, -1)
|
|
else
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]'s flesh melts right off! Holy shit!</b></span>")
|
|
if (owner.gender == "female")
|
|
playsound(owner.loc, "sound/voice/female_fallscream.ogg", 50, 0)
|
|
else
|
|
playsound(owner.loc, "sound/voice/male_fallscream.ogg", 50, 0)
|
|
playsound(owner.loc, "sound/effects/bubbles.ogg", 50, 0)
|
|
playsound(owner.loc, "sound/misc/loudcrunch2.ogg", 50, 0)
|
|
if (istype(owner,/mob/living/carbon/human/))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.skeletonize()
|
|
|
|
var/bdna = null // For forensics (Convair880).
|
|
var/btype = null
|
|
if (H.bioHolder.Uid && H.bioHolder.bloodType)
|
|
bdna = H.bioHolder.Uid
|
|
btype = H.bioHolder.bloodType
|
|
gibs(owner.loc, null, null, bdna, btype)
|
|
|
|
else
|
|
owner.gib()
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/superfart
|
|
name = "High-Pressure Intestines"
|
|
desc = "Vastly increases the gas capacity of the subject's digestive tract."
|
|
id = "superfart"
|
|
msgGain = "You feel bloated and gassy."
|
|
msgLose = "You no longer feel gassy. What a relief!"
|
|
cooldown = 900
|
|
probability = 33
|
|
blockCount = 4
|
|
blockGaps = 3
|
|
stability_loss = 15
|
|
ability_path = /datum/targetable/geneticsAbility/superfart
|
|
var/farting = 0
|
|
|
|
/datum/targetable/geneticsAbility/superfart
|
|
name = "Superfart"
|
|
desc = "Unleash a gigantic fart!"
|
|
icon_state = "superfart"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
|
|
if (!farting_allowed)
|
|
boutput(owner, "<span style=\"color:red\">Farting is disabled.</span>")
|
|
return 1
|
|
var/datum/bioEffect/power/superfart/SF = linked_power
|
|
|
|
if (SF.farting)
|
|
boutput(owner, "<span style=\"color:red\">You're already farting! Be patient!</span>")
|
|
return 1
|
|
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]</b> hunches down and grits their teeth!</span>")
|
|
SF.farting = 1
|
|
var/stun_time = 3
|
|
var/fart_range = 6
|
|
var/gib_user = 0
|
|
var/throw_speed = 15
|
|
var/throw_repeat = 3
|
|
var/sound_volume = 50
|
|
var/sound_repeat = 1
|
|
var/fart_string = " unleashes a [pick("tremendous","gigantic","colossal")] fart!"
|
|
|
|
if(linked_power.power)
|
|
stun_time = 6
|
|
fart_range = 12
|
|
throw_speed = 30
|
|
throw_repeat = 6
|
|
sound_volume = 100
|
|
sound_repeat = 3
|
|
if (!linked_power.safety)
|
|
gib_user = 1
|
|
fart_string = "'s body is torn apart like a wet paper bag by [his_or_her(owner)] unbelievably powerful farting!"
|
|
|
|
sleep(30)
|
|
if (can_act(owner))
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]</b>[fart_string]</span>")
|
|
while (sound_repeat > 0)
|
|
sound_repeat--
|
|
playsound(owner.loc, "sound/misc/superfart.ogg", sound_volume, 1)
|
|
|
|
for(var/mob/living/V in range(get_turf(owner),fart_range))
|
|
shake_camera(V,10,5)
|
|
if (V == owner)
|
|
continue
|
|
boutput(V, "<span style=\"color:red\">You are sent flying!</span>")
|
|
|
|
V.weakened += stun_time
|
|
// why the hell was this set to 12 christ
|
|
while (throw_repeat > 0)
|
|
throw_repeat--
|
|
step_away(V,get_turf(owner),throw_speed)
|
|
|
|
if(owner.bioHolder.HasEffect("toxic_farts"))
|
|
for(var/turf/T in view(get_turf(owner),2))
|
|
new /obj/effects/fart_cloud(owner,owner)
|
|
|
|
SF.farting = 0
|
|
if (gib_user)
|
|
owner.gib()
|
|
for (var/turf/T in range(owner,6))
|
|
animate_shake(T,5,rand(3,8),rand(3,8))
|
|
else
|
|
boutput(owner, "<span style=\"color:red\">You were interrupted and couldn't fart! Rude!</span>")
|
|
SF.farting = 0
|
|
return 1
|
|
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/eyebeams
|
|
name = "Optic Energizer"
|
|
desc = "Imbues the subject's eyes with the potential to project concentrated thermal energy."
|
|
id = "eyebeams"
|
|
msgGain = "Your eyes ache and burn."
|
|
msgLose = "Your eyes stop aching."
|
|
cooldown = 80
|
|
probability = 33
|
|
blockCount = 3
|
|
blockGaps = 5
|
|
stability_loss = 10
|
|
ability_path = /datum/targetable/geneticsAbility/eyebeams
|
|
var/projectile_path = "/datum/projectile/laser/eyebeams"
|
|
|
|
/datum/targetable/geneticsAbility/eyebeams
|
|
name = "Eyebeams"
|
|
desc = "Shoot lasers from your eyes."
|
|
icon_state = "eyebeams"
|
|
targeted = 1
|
|
target_anything = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
var/turf/T = get_turf(target)
|
|
|
|
var/datum/bioEffect/power/eyebeams/EB = linked_power
|
|
var/projectile_path = text2path("[EB.projectile_path]")
|
|
if(linked_power.power)
|
|
projectile_path = /datum/projectile/laser
|
|
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]</b> shoots eye beams!</span>")
|
|
var/datum/projectile/laser/eyebeams/PJ = new projectile_path
|
|
shoot_projectile_ST(owner, PJ, T)
|
|
|
|
/datum/projectile/laser/eyebeams
|
|
name = "optic laser"
|
|
icon_state = "eyebeam"
|
|
power = 20
|
|
cost = 20
|
|
sname = "phaser bolt"
|
|
dissipation_delay = 5
|
|
shot_sound = 'sound/weapons/TaserOLD.ogg'
|
|
color_red = 1
|
|
color_green = 0
|
|
color_blue = 1
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/adrenaline
|
|
name = "Adrenaline Rush"
|
|
desc = "Enables the user to voluntarily empty glands of stimulants. May be dangerous with repeated use."
|
|
id = "adrenaline"
|
|
probability = 66
|
|
blockCount = 4
|
|
blockGaps = 4
|
|
cooldown = 600
|
|
msgGain = "You feel hype!"
|
|
msgLose = "You don't feel so pumped anymore."
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/adrenaline
|
|
|
|
/datum/targetable/geneticsAbility/adrenaline
|
|
name = "Adrenaline Rush"
|
|
desc = "Infuse your bloodstream with stimulants."
|
|
icon_state = "adrenaline"
|
|
targeted = 0
|
|
can_act_check = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
var/multiplier = 1
|
|
if(linked_power.power)
|
|
multiplier = 2
|
|
if (owner.reagents)
|
|
boutput(owner, "<span style=\"color:blue\">You get pumped up!</span>")
|
|
owner.emote("scream")
|
|
owner.reagents.add_reagent("epinephrine",20 * multiplier)
|
|
owner.reagents.add_reagent("salicylic_acid",20 * multiplier)
|
|
if(linked_power.safety)
|
|
owner.reagents.add_reagent("methamphetamine",max(0,20 - owner.reagents.get_reagent_amount("methamphetamine")))
|
|
owner.reagents.add_reagent("energydrink",max(0,5 - owner.reagents.get_reagent_amount("energydrink")))
|
|
else
|
|
owner.reagents.add_reagent("methamphetamine",20 * multiplier)
|
|
owner.reagents.add_reagent("energydrink",5 * multiplier)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/midas
|
|
name = "Midas Touch"
|
|
desc = "Allows the subject to transmute materials at will."
|
|
id = "midas"
|
|
msgGain = "Your fingers sparkle and gleam."
|
|
msgLose = "Your fingers return to normal."
|
|
cooldown = 300
|
|
probability = 99
|
|
blockCount = 2
|
|
blockGaps = 4
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/midas
|
|
var/transmute_material = "gold"
|
|
|
|
/datum/targetable/geneticsAbility/midas
|
|
name = "Midas Touch"
|
|
desc = "Transmute an object to gold by touching it."
|
|
icon_state = "midas"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
if(linked_power.using)
|
|
return 1
|
|
|
|
var/base_path = /obj/item/
|
|
if (linked_power.power)
|
|
base_path = /obj/
|
|
|
|
var/list/items = get_filtered_atoms_in_touch_range(owner,base_path)
|
|
if (!items.len)
|
|
boutput(usr, "/red You can't find anything nearby to touch.")
|
|
return 1
|
|
|
|
linked_power.using = 1
|
|
var/obj/the_item = input("Which item do you want to transmute?","Midas Touch") as null|obj in items
|
|
if (!the_item)
|
|
last_cast = 0
|
|
linked_power.using = 0
|
|
return 1
|
|
|
|
if (!linked_power)
|
|
owner.visible_message("[owner] touches [the_item].")
|
|
else
|
|
if (istype(linked_power,/datum/bioEffect/power/midas))
|
|
var/datum/bioEffect/power/midas/linked = linked_power
|
|
owner.visible_message("<span style=\"color:red\">[owner] touches [the_item], turning it to [linked.transmute_material]!</span>")
|
|
the_item.setMaterial(getCachedMaterial(linked.transmute_material))
|
|
else
|
|
owner.visible_message("<span style=\"color:red\">[owner] touches [the_item], turning it to gold!</span>")
|
|
the_item.setMaterial(getCachedMaterial("gold"))
|
|
linked_power.using = 0
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/// COMBINATION-ONLY EFFECTS BELOW
|
|
|
|
/datum/bioEffect/power/healing_touch
|
|
name = "Healing Touch"
|
|
desc = "Allows the subject to heal the wounds of others with a touch."
|
|
id = "healing_touch"
|
|
msgGain = "Your hands radiate a comforting aura."
|
|
msgLose = "The aura around your hands dissipates."
|
|
cooldown = 900
|
|
occur_in_genepools = 0
|
|
stability_loss = 10
|
|
ability_path = /datum/targetable/geneticsAbility/healing_touch
|
|
|
|
/datum/targetable/geneticsAbility/healing_touch
|
|
name = "Healing Touch"
|
|
desc = "Soothe the wounds of others."
|
|
icon_state = "healingtouch"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
if (get_dist(target,owner) > 1 && !owner.bioHolder.HasEffect("telekinesis"))
|
|
boutput(usr, "<span style=\"color:red\">You need to be closer to do that.</span>")
|
|
return 1
|
|
|
|
if (!istype(target,/mob/living/carbon/))
|
|
boutput(usr, "<span style=\"color:red\">This power won't work on that!</span>")
|
|
return 1
|
|
|
|
if (target == owner)
|
|
boutput(usr, "<span style=\"color:red\">This power doesn't work when you touch yourself. Weirdo.</span>")
|
|
return 1
|
|
|
|
var/mob/living/carbon/C = target
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner] touches [C], enveloping them in a soft glow!</b></span>")
|
|
boutput(C, "<span style=\"color:blue\">You feel your pain fading away.</span>")
|
|
var/amount_to_heal = 25
|
|
if (linked_power.power)
|
|
amount_to_heal = 50
|
|
C.HealDamage("All", amount_to_heal, amount_to_heal)
|
|
C.take_toxin_damage(0 - amount_to_heal)
|
|
C.take_oxygen_deprivation(0 - amount_to_heal)
|
|
C.take_brain_damage(0 - amount_to_heal)
|
|
return
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/dimension_shift
|
|
// cant get the scary shit to work so tOt for now
|
|
name = "Dimension Shift"
|
|
desc = "Phase out and hide in another dimension."
|
|
id = "dimension_shift"
|
|
msgGain = "You can see a faint blue light."
|
|
msgLose = "The blue light fades away."
|
|
cooldown = 900
|
|
occur_in_genepools = 0
|
|
stability_loss = 20
|
|
ability_path = /datum/targetable/geneticsAbility/dimension_shift
|
|
var/active = 0
|
|
var/processing = 0
|
|
var/atom/last_loc = null
|
|
|
|
/datum/targetable/geneticsAbility/dimension_shift
|
|
name = "Dimension Shift"
|
|
desc = "Hide in another dimension to avoid hazards."
|
|
icon_state = "dimensionshift"
|
|
targeted = 0
|
|
cooldown = 900
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
|
|
if (!istype(linked_power,/datum/bioEffect/power/dimension_shift))
|
|
return 1
|
|
var/datum/bioEffect/power/dimension_shift/P = linked_power
|
|
|
|
if (!istype(owner.loc,/turf/) && !istype(owner.loc,/obj/dummy/spell_invis/))
|
|
boutput(owner, "<span style=\"color:red\">That won't work here.</span>")
|
|
return 1
|
|
|
|
if (P.processing)
|
|
return 1
|
|
|
|
P.processing = 1
|
|
|
|
if (!P.active)
|
|
P.active = 1
|
|
P.last_loc = owner.loc
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner] vanishes in a burst of blue light!</b></span>")
|
|
playsound(owner.loc, "sound/effects/ghost2.ogg", 50, 0)
|
|
animate(owner, color = "#0000FF", time = 5, easing = LINEAR_EASING)
|
|
animate(alpha = 0, time = 5, easing = LINEAR_EASING)
|
|
spawn(7)
|
|
var/obj/dummy/spell_invis/invis_object = new /obj/dummy/spell_invis(get_turf(owner))
|
|
invis_object.canmove = 0
|
|
owner.set_loc(invis_object)
|
|
P.processing = 0
|
|
return 1
|
|
else
|
|
var/obj/dummy/spell_invis/invis_object
|
|
if (istype(owner.loc,/obj/dummy/spell_invis/))
|
|
invis_object = owner.loc
|
|
owner.set_loc(P.last_loc)
|
|
if (invis_object)
|
|
qdel(invis_object)
|
|
P.last_loc = null
|
|
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner] appears in a burst of blue light!</b></span>")
|
|
playsound(owner.loc, "sound/effects/ghost2.ogg", 50, 0)
|
|
spawn(7)
|
|
animate(owner, alpha = 255, time = 5, easing = LINEAR_EASING)
|
|
animate(color = "#FFFFFF", time = 5, easing = LINEAR_EASING)
|
|
P.active = 0
|
|
P.processing = 0
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/photokinesis
|
|
name = "Photokinesis"
|
|
desc = "Allows the subject to create a source of light."
|
|
id = "photokinesis"
|
|
msgGain = "Everything seems too dark!"
|
|
msgLose = "It's too bright!"
|
|
cooldown = 600
|
|
occur_in_genepools = 0
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/photokinesis
|
|
var/red = 0
|
|
var/green = 0
|
|
var/blue = 0
|
|
|
|
New()
|
|
..()
|
|
red = rand(5,10) / 10
|
|
green = rand(5,10) / 10
|
|
blue = rand(5,10) / 10
|
|
|
|
/datum/targetable/geneticsAbility/photokinesis
|
|
name = "Photokinesis"
|
|
desc = "Create a strong source of light."
|
|
icon_state = "photokinesis"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
if (!istype(linked_power,/datum/bioEffect/power/photokinesis/))
|
|
return 1
|
|
var/datum/bioEffect/power/photokinesis/P = linked_power
|
|
|
|
var/turf/T = get_turf(target)
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner]</b> raises [his_or_her(owner)] hands into the air!</span>")
|
|
playsound(owner.loc, "sound/effects/heavenly.ogg", 50, 0)
|
|
var/strength = 7
|
|
var/time = 300
|
|
if (linked_power.power)
|
|
strength = 13
|
|
time = 600
|
|
new /obj/photokinesis_light(T,P.red,P.green,P.blue,strength,time)
|
|
|
|
/obj/photokinesis_light
|
|
name = ""
|
|
desc = ""
|
|
density = 0
|
|
anchored = 1
|
|
mouse_opacity = 0
|
|
icon = null
|
|
icon_state = null
|
|
var/datum/light/light
|
|
|
|
New(var/loc,var/color_R,var/color_G,var/color_B,var/strength = 7,var/time = 300)
|
|
..()
|
|
light = new /datum/light/point
|
|
light.set_brightness(strength / 7)
|
|
light.set_color(color_R, color_G, color_B)
|
|
light.attach(src)
|
|
light.enable()
|
|
|
|
if (isnum(time))
|
|
spawn(time)
|
|
qdel(src)
|
|
|
|
disposing()
|
|
..()
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/erebokinesis
|
|
name = "Erebokinesis"
|
|
desc = "Allows the subject to snuff out all light in an area."
|
|
id = "erebokinesis"
|
|
msgGain = "Everything seems too bright!"
|
|
msgLose = "It's too dark!"
|
|
cooldown = 600
|
|
occur_in_genepools = 0
|
|
stability_loss = 5
|
|
ability_path = /datum/targetable/geneticsAbility/erebokinesis
|
|
var/time = 0
|
|
var/size = 0
|
|
|
|
New()
|
|
..()
|
|
size = rand(2,4)
|
|
time = rand(200,600)
|
|
|
|
/datum/targetable/geneticsAbility/erebokinesis
|
|
name = "Erebokinesis"
|
|
desc = "Create a field of darkness."
|
|
icon_state = "erebokinesis"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
if (!istype(linked_power,/datum/bioEffect/power/erebokinesis/))
|
|
return 1
|
|
var/datum/bioEffect/power/erebokinesis/P = linked_power
|
|
var/field_size = P.size
|
|
var/field_time = P.time
|
|
if (P.power)
|
|
field_size *= 2
|
|
field_time *= 2
|
|
|
|
var/turf/T = get_turf(target)
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner]</b> raises [his_or_her(owner)] hands into the air!</span>")
|
|
playsound(owner.loc, "sound/effects/chanting.ogg", 50, 0)
|
|
new /obj/darkness_field(T,field_time)
|
|
for(var/turf/TD in circular_range(T,field_size))
|
|
new /obj/darkness_field(TD,field_time)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/fire_breath
|
|
name = "Fire Breath"
|
|
desc = "Allows the subject to exhale fire."
|
|
id = "fire_breath"
|
|
msgGain = "Your throat is burning!"
|
|
msgLose = "Your throat feels a lot better now."
|
|
cooldown = 600
|
|
occur_in_genepools = 0
|
|
stability_loss = 10
|
|
ability_path = /datum/targetable/geneticsAbility/fire_breath
|
|
var/temperature = 1200
|
|
var/range = 4
|
|
|
|
/datum/targetable/geneticsAbility/fire_breath
|
|
name = "Fire Breath"
|
|
desc = "Huff and puff, and burn their house down!"
|
|
icon_state = "firebreath"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
var/turf/T = get_turf(target)
|
|
var/list/affected_turfs = getline(owner, T)
|
|
var/datum/bioEffect/power/fire_breath/FB = linked_power
|
|
var/range = FB.range
|
|
var/temp = FB.temperature
|
|
if (FB.power)
|
|
range *= 2
|
|
temp *= 4
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner] breathes fire!</b></span>")
|
|
playsound(owner.loc, "sound/effects/mag_fireballlaunch.ogg", 50, 0)
|
|
var/turf/currentturf
|
|
var/turf/previousturf
|
|
for(var/turf/F in affected_turfs)
|
|
previousturf = currentturf
|
|
currentturf = F
|
|
if(currentturf.density || istype(currentturf, /turf/space))
|
|
break
|
|
if(previousturf && LinkBlocked(previousturf, currentturf))
|
|
break
|
|
if (F == get_turf(owner))
|
|
continue
|
|
if (get_dist(owner,F) > range)
|
|
continue
|
|
tfireflash(F,0.5,temp)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/brown_note
|
|
name = "Brown Note"
|
|
desc = "Allows the subject to emit noises that can cause involuntary flatus in others."
|
|
id = "brown_note"
|
|
msgGain = "You feel mischevious!"
|
|
msgLose = "You want to behave yourself again."
|
|
cooldown = 30
|
|
blockCount = 1
|
|
blockGaps = 3
|
|
stability_loss = 15
|
|
ability_path = /datum/targetable/geneticsAbility/brown_note
|
|
|
|
/datum/targetable/geneticsAbility/brown_note
|
|
name = "Brown Note"
|
|
desc = "Mess with others using the power of sound!"
|
|
icon_state = "brownnote"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name] makes a weird noise!</b></span>")
|
|
playsound(owner.loc, 'sound/items/hellhorn_0.ogg', 50, 0)
|
|
for (var/mob/living/L in range(7,owner))
|
|
if (L.hearing_check(1))
|
|
if(locate(/obj/item/storage/bible) in get_turf(L))
|
|
owner.visible_message("<span style=\"color:red\"><b>A mysterious force smites [owner.name] for inciting blasphemy!</b></span>")
|
|
owner.gib()
|
|
else
|
|
L.emote("fart")
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/telekinesis_drag
|
|
name = "Telekinetic Pull"
|
|
desc = "Allows the subject to influence physical objects through utilizing latent powers in their mind."
|
|
id = "telekinesis_drag"
|
|
effectType = effectTypePower
|
|
probability = 8
|
|
blockCount = 5
|
|
blockGaps = 5
|
|
reclaim_mats = 40
|
|
msgGain = "You feel your consciousness expand outwards."
|
|
msgLose = "Your conciousness closes inwards."
|
|
stability_loss = 15
|
|
ability_path = /datum/targetable/geneticsAbility/telekinesis
|
|
|
|
OnMobDraw()
|
|
if (disposed)
|
|
return
|
|
if (ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
overlay_image = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "telekinesishead[H.bioHolder.HasEffect("fat") ? "fat" :""]", layer = MOB_LAYER)
|
|
return
|
|
|
|
OnAdd()
|
|
..()
|
|
if (ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.set_body_icon_dirty()
|
|
|
|
OnRemove()
|
|
..()
|
|
if (ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.set_body_icon_dirty()
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/telekinesis
|
|
name = "Telekinesis"
|
|
desc = "Allows the subject to influence physical objects through utilizing latent powers in their mind."
|
|
id = "telekinesis_command"
|
|
effectType = effectTypePower
|
|
probability = 8
|
|
blockCount = 5
|
|
blockGaps = 5
|
|
reclaim_mats = 40
|
|
msgGain = "You feel your consciousness expand outwards."
|
|
msgLose = "Your conciousness closes inwards."
|
|
stability_loss = 30
|
|
occur_in_genepools = 0
|
|
ability_path = /datum/targetable/geneticsAbility/telekinesis
|
|
|
|
/datum/targetable/geneticsAbility/telekinesis
|
|
name = "Telekinetic Throw"
|
|
icon_state = "tk"
|
|
desc = "Command a few objects to hurl themselves at the target location."
|
|
targeted = 1
|
|
target_anything = 1
|
|
cooldown = 200
|
|
|
|
cast(atom/T)
|
|
var/list/thrown = list()
|
|
var/current_prob = 100
|
|
var/modifier = 0.4
|
|
|
|
if (linked_power.power)
|
|
modifier *= 2
|
|
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner.name]</b> makes a gesture at [T.name]!</span>")
|
|
|
|
for (var/obj/O in view(7, owner))
|
|
if (!O.anchored && isturf(O.loc))
|
|
if (prob(current_prob))
|
|
current_prob *= modifier // very steep. probably grabs 3 or 4 objects per cast -- much less effective than revenant command
|
|
thrown += O
|
|
animate_float(O)
|
|
spawn(10)
|
|
for (var/obj/O in thrown)
|
|
O.throw_at(T, 32, 2)
|
|
|
|
return 0
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/darkcloak
|
|
name = "Cloak of Darkness"
|
|
desc = "Enables the subject to bend low levels of light around themselves, creating a cloaking effect."
|
|
id = "cloak_of_darkness"
|
|
effectType = effectTypePower
|
|
isBad = 0
|
|
probability = 33
|
|
blockGaps = 3
|
|
blockCount = 3
|
|
msgGain = "You begin to fade into the shadows."
|
|
msgLose = "You become fully visible."
|
|
lockProb = 40
|
|
lockedGaps = 1
|
|
lockedDiff = 3
|
|
lockedChars = list("G","C","A","T")
|
|
lockedTries = 8
|
|
stability_loss = 20
|
|
cooldown = 0
|
|
var/active = 0
|
|
ability_path = /datum/targetable/geneticsAbility/darkcloak
|
|
|
|
proc/cloak_decloak(var/which_way = 1)
|
|
if (!src.owner || !isliving(src.owner))
|
|
return
|
|
|
|
var/mob/living/L = owner
|
|
if (which_way == 1)
|
|
L.invisibility = 1
|
|
L.UpdateOverlays(overlay_image, id)
|
|
else
|
|
L.invisibility = 0
|
|
L.UpdateOverlays(null, id)
|
|
|
|
return
|
|
|
|
OnAdd()
|
|
if (ishuman(owner))
|
|
overlay_image = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "aurapulse", layer = MOB_LIMB_LAYER)
|
|
overlay_image.color = "#333333"
|
|
..()
|
|
owner.UpdateOverlays(null, id)
|
|
|
|
OnRemove()
|
|
..()
|
|
src.cloak_decloak(2)
|
|
return
|
|
|
|
OnLife()
|
|
if (isliving(owner))
|
|
var/mob/living/L = owner
|
|
var/turf/T = get_turf(L)
|
|
|
|
if (T && isturf(T))
|
|
var/area/A = get_area(T)
|
|
if (istype(T, /turf/space) || (A && (istype(A, /area/shuttle/) || istype(A, /area/shuttle_transit_space) || A.name == "Space")))
|
|
src.cloak_decloak(2)
|
|
|
|
else
|
|
if (T.RL_GetBrightness() < 0.2 && can_act(owner) && src.active)
|
|
src.cloak_decloak(1)
|
|
else
|
|
src.cloak_decloak(2)
|
|
else
|
|
src.cloak_decloak(2)
|
|
return
|
|
|
|
/datum/targetable/geneticsAbility/darkcloak
|
|
name = "Cloak of Darkness"
|
|
icon_state = "darkcloak"
|
|
desc = "Activate or deactivate your cloak of darkness."
|
|
targeted = 0
|
|
cooldown = 0
|
|
can_act_check = 0
|
|
|
|
cast(atom/T)
|
|
var/datum/bioEffect/power/darkcloak/DC = linked_power
|
|
if (DC.active)
|
|
boutput(usr, "You stop using your cloak of darkness.")
|
|
DC.active = 0
|
|
else
|
|
boutput(usr, "You start using your cloak of darkness.")
|
|
DC.active = 1
|
|
return 0
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/chameleon
|
|
name = "Chameleon"
|
|
desc = "The subject becomes able to subtly alter light patterns to become invisible, as long as they remain still."
|
|
id = "chameleon"
|
|
effectType = effectTypePower
|
|
probability = 33
|
|
blockCount = 3
|
|
blockGaps = 3
|
|
msgGain = "You feel one with your surroundings."
|
|
msgLose = "You feel oddly exposed."
|
|
lockProb = 40
|
|
lockedGaps = 1
|
|
lockedDiff = 3
|
|
lockedChars = list("G","C","A","T")
|
|
lockedTries = 8
|
|
stability_loss = 20
|
|
cooldown = 0
|
|
var/active = 0
|
|
ability_path = /datum/targetable/geneticsAbility/chameleon
|
|
|
|
OnAdd()
|
|
if (ishuman(owner))
|
|
overlay_image = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "aurapulse", layer = MOB_LIMB_LAYER)
|
|
..()
|
|
owner.UpdateOverlays(null, id)
|
|
|
|
OnRemove()
|
|
..()
|
|
if (isliving(owner))
|
|
var/mob/living/L = owner
|
|
L.UpdateOverlays(null, id)
|
|
L.invisibility = 0
|
|
return
|
|
|
|
OnLife()
|
|
if(isliving(owner))
|
|
var/mob/living/L = owner
|
|
if ((world.timeofday - owner.l_move_time) >= 30 && can_act(owner) && src.active)
|
|
L.UpdateOverlays(overlay_image, id)
|
|
L.invisibility = 1
|
|
else
|
|
L.UpdateOverlays(null, id)
|
|
L.invisibility = 0
|
|
|
|
/datum/targetable/geneticsAbility/chameleon
|
|
name = "Chameleon"
|
|
icon_state = "chameleon"
|
|
desc = "Activate or deactivate your chameleon cloak."
|
|
targeted = 0
|
|
cooldown = 0
|
|
can_act_check = 0
|
|
|
|
cast(atom/T)
|
|
var/datum/bioEffect/power/chameleon/CH = linked_power
|
|
if (CH.active)
|
|
boutput(usr, "You stop using your chameleon cloaking.")
|
|
CH.active = 0
|
|
else
|
|
boutput(usr, "You start using your chameleon cloaking.")
|
|
CH.active = 1
|
|
return 0
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/bigpuke
|
|
name = "Mass Emesis"
|
|
desc = "Allows the subject to expel chemicals via the mouth."
|
|
id = "bigpuke"
|
|
msgGain = "You feel sick."
|
|
msgLose = "You feel much better!"
|
|
cooldown = 300
|
|
occur_in_genepools = 0
|
|
stability_loss = 10
|
|
ability_path = /datum/targetable/geneticsAbility/bigpuke
|
|
var/range = 3
|
|
|
|
/datum/targetable/geneticsAbility/bigpuke
|
|
name = "Mass Emesis"
|
|
desc = "BLAAAAAAAARFGHHHHHGHH"
|
|
icon_state = "bigpuke"
|
|
targeted = 1
|
|
|
|
cast(atom/target)
|
|
if (..())
|
|
return 1
|
|
|
|
var/turf/T = get_turf(target)
|
|
var/list/affected_turfs = getline(owner, T)
|
|
var/datum/bioEffect/power/bigpuke/BP = linked_power
|
|
var/range = BP.range
|
|
if (BP.power)
|
|
range *= 2
|
|
owner.visible_message("<span style=\"color:red\"><b>[owner] horfs up a huge stream of puke!</b></span>")
|
|
logTheThing("combat", owner, target, "power-pukes [log_reagents(owner)] at [log_loc(owner)].")
|
|
playsound(owner.loc, "sound/misc/meat_plop.ogg", 50, 0)
|
|
owner.reagents.add_reagent("vomit",20)
|
|
var/turf/currentturf
|
|
var/turf/previousturf
|
|
for(var/turf/F in affected_turfs)
|
|
previousturf = currentturf
|
|
currentturf = F
|
|
if(currentturf.density || istype(currentturf, /turf/space))
|
|
break
|
|
if(previousturf && LinkBlocked(previousturf, currentturf))
|
|
break
|
|
if (F == get_turf(owner))
|
|
continue
|
|
if (get_dist(owner,F) > range)
|
|
continue
|
|
owner.reagents.reaction(F,TOUCH)
|
|
for(var/mob/living/L in F.contents)
|
|
owner.reagents.reaction(L,TOUCH)
|
|
for(var/obj/O in F.contents)
|
|
owner.reagents.reaction(O,TOUCH)
|
|
owner.reagents.clear_reagents()
|
|
return 0
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/datum/bioEffect/power/ink
|
|
name = "Ink Glands"
|
|
desc = "Allows the subject to expel modified melanin."
|
|
id = "inkglands"
|
|
msgGain = "You feel artistic."
|
|
msgLose = "You don't really feel artistic anymore."
|
|
cooldown = 0
|
|
occur_in_genepools = 0
|
|
stability_loss = 2
|
|
ability_path = /datum/targetable/geneticsAbility/ink
|
|
var/color = "#888888"
|
|
|
|
New()
|
|
..()
|
|
color = random_color_hex()
|
|
|
|
/datum/targetable/geneticsAbility/ink
|
|
name = "Ink Glands"
|
|
desc = "Spray colorful ink onto an object."
|
|
icon_state = "ink"
|
|
targeted = 0
|
|
|
|
cast()
|
|
if (..())
|
|
return 1
|
|
|
|
var/base_path = /obj
|
|
var/list/items = get_filtered_atoms_in_touch_range(owner,base_path)
|
|
if (!items.len)
|
|
boutput(usr, "/red You can't find anything nearby to spray ink on.")
|
|
return 1
|
|
|
|
var/obj/the_item = input("Which item do you want to color?","Ink Glands") as null|obj in items
|
|
if (!the_item)
|
|
last_cast = 0
|
|
return 1
|
|
|
|
var/datum/bioEffect/power/ink/I = linked_power
|
|
if (!linked_power)
|
|
owner.visible_message("[owner] spits on [the_item]. Gross.")
|
|
else
|
|
owner.visible_message("<span style=\"color:red\">[owner] sprays ink onto [the_item]!</span>")
|
|
the_item.color = I.color
|
|
return 0
|
|
|
|
////////////////
|
|
// Admin Only //
|
|
////////////////
|
|
|
|
/datum/bioEffect/power/fade_out
|
|
name = "Fading"
|
|
desc = "Allows the subject to become visible or invisible at will."
|
|
id = "fade"
|
|
cooldown = 0
|
|
occur_in_genepools = 0
|
|
scanner_visibility = 0
|
|
curable_by_mutadone = 0
|
|
ability_path = /datum/targetable/geneticsAbility/fade
|
|
|
|
/datum/targetable/geneticsAbility/fade
|
|
name = "Fade"
|
|
desc = "Fade in and out. An admin power."
|
|
icon_state = "template"
|
|
targeted = 0
|
|
can_act_check = 0
|
|
var/active = 0
|
|
var/fading = 0
|
|
|
|
cast()
|
|
if (..() || fading)
|
|
return 1
|
|
|
|
if (active)
|
|
fading = 1
|
|
animate(usr, time = 10, alpha = 0, easing = LINEAR_EASING)
|
|
fading = 0
|
|
else
|
|
fading = 1
|
|
animate(usr, time = 10, alpha = 255, easing = LINEAR_EASING)
|
|
fading = 0 |