mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-02 05:32:16 +00:00
* Reworks cures, adds strains, adds treatment chems to symptoms
* Enables coexistence of different samples of the same strain at different stages within the same container
* Adds symptom guessing. Correct guesses reduce analysis time and wrong ones increase it.
* Adds a chance for a virus to evolve into a new strain. changing the cure and adding/subtracting symptoms
* Revert "Adds a chance for a virus to evolve into a new strain. changing the cure and adding/subtracting symptoms"
This reverts commit 124dd485c7.
* Adds spontaneous virus mutations, strain tracking. Removes antibody metabolism
* change the amount of time added/reduced by each factor
* Creates a disease outbreak event that allows admins to cause an outbreak of a virus of their choosing. Allows virus creation when choosing virus to give someone or for an outbreak.
* The normal base property values are now the defaults for disease creation
* Rebuild TGUI
* Rebuild TGUI
* Rebuild TGUI
* Update tgui.bundle.js
* remove redundant lines
* improves ui some and moves to using world time for analysis time
* fixes a bug with the analysis time and updates the initial known advanced disease list
* Buffs the disease outbreak event and adds a base stat row to the PANDEMIC
* Update tgui.bundle.js
* Implements calibration
* Adds a remove from database button
* Moves the known disease global list to work per z level
* Removes treatments from most chems and makes each instance of a symptom not acting purge some of the reagent that treated it
* Update symptoms.dm
* Adds stage to unknown diseases
* Moves accumulated error to work per z level and change the location of the delete strain data button
* Adds confirmation to the delete data button and moves the disease text out of the loop in the copy constructor
* fix indentation
* Replaces pent with hydrocodone in the advanced cure list
* gives more buffs to event disease based on severity. removes longevity from possible symptoms an event disease can get. Fixes a bug with determining analysis time
* Update tgui.bundle.js
* Update pandemic.dm
* Update pandemic.dm
* Update tgui.bundle.js
* review changes
* Update tgui.bundle.js
* Update tgui.bundle.js
* Update tgui.bundle.js
* Update tgui.bundle.js
* Update tgui.bundle.js
* Update tgui.bundle.js
* Update tgui.bundle.js
* Update tgui.bundle.js
* review changes
* Update tgui.bundle.js
* Makes vaccines only add resistances and no longer cure
* improves pandemic ui and fixes calibration button not being properly disabled
* Update tgui.bundle.js
* Add the new agars to the virologist's fridge
* lowered evolution chance of viruses a bit
* further lowers evolution chance
* Update advance.dm
* Changes the scaling of analysis time and fixes stage speed presentation in the pandemic
* Scanners can now see virus strains that have been inserted in the pandemic
* Allows a mob to be infected by both an event and non event disease
* Fixes the +1 syringe of translocation stabbing your feet
* Update tgui.bundle.js
* Changes spontanous mutation to be per spread and makes disease events less likely.
* Diseases less common, mutations happen only on spread now, symptom list ordered alphabetically in the dropdown, fixed some bugs
* Update tgui.bundle.js
* changes virus alerts
* Removes numbers from the virus alert text and fixes a bug that caused excessive virus mutations
* Update tgui.bundle.js
* refactor disease spread
* Changes disease spread logic to give players options to protect themselves and others
* Blackbox things
* Increases announcement timer and fixes the infection talley
* Update disease_outbreak.dm
* Adds an incubation period to advanced viruses. bumps sneeze back to 5 range
* Adds failsafe to disease outbreaks that will infect a random crew member if none have arrived in 10 minutes
* Only record advanced disease infections
* Properly handle recording of disease infection events
* Changed resistance effect on cure
* another adjustment to res effect on cure
* Small resist buff, spontanous combustion buff and some calculation fixes
* changes spontanous combustion stat bonuses and maluses
* Update flesh_eating.dm
* Update flesh_eating.dm
* Update flesh_eating.dm
* Big trait changes and rebalance
* adds treatments to fire and necro
* Introduces viral contamination of food and reagent containers, as well as disinfection
* Fix runtime in reagent transfers
* Revert the prefs and config changes
* Slowed down diseases and made symptoms more gradual, improved disease alerts to both crew and dchat
* Sterilizine now sterilizes things contaminated with viruses. Heat reactions now take place alongside chemical reactions when adding reagents to a beaker
* Adds option to order sterile masks, goggles and biosuits in packs of 4. Makes sterile masks as good as internals for viruses
* adds logging to pandemic
* Changes symptom stats and increased disease varaiety
* Fixes some disease bugs
* Fixes some bugs and makes it behave better
* Adds shiver emote to shiver symptom
* Adds admin message/log to contracting an event disease and fixes copy behaviour when infecting
* Prefix spread defines
* Change the rest of the macros
* correct the disinfection temp macro
* Moves disease signals to their own file
* move disnifection temp back
* fix a type
* viral contaminations component review changes
* var name changes
* more style fixes
* Update tgui.bundle.js
* fixes pandemic
* Fixes disease outbreak having two carriers sometimes and changes the virus alert to the new one
* Update disease_defines.dm
* fixes samples not passing stages on properly
* actually fixes the bug
* Fixes stabilization being lost on cloning
* Finally completely and absolutely fixes the sample stages bug(please)
* Makes the pandemic a machine
* Update pandemic.dm
* removed drinks from cure requirements
* lowers chance of major viral outbreak
* fixes pandemic not processing properly
* Changes the cure system to have more options
* Makes mixing event viruses more random
* Fixes hardsuits having a 1% chance to be infected
* Increases virus protection of most clothing. medical scrubs and surgical hat buffed sunstantially
* Slow down progress of diseases
* makes spread less likely
* envirosuit is now slightly more protective from viruses, while the medical one is as good as scrubs
* Adds further protection to helmets
* Increases the number of possible cures and the scaling of required cures
* Pandemic ui improvements
* Update _disease.dm
* fix a bug with spread target in the disease outbreak event
* changes some clothing permeability
* Adds the ability to make viral DNA extracts by injecting a sample into a black slime core. It's equivalent to 2 stages
* Adds age to health analyzer, makes viral evolution toggle minor disabilities, confusion symptom now confuses more often
* Update pandemic.dm
* replace lazarus with acetic acid in the cures
* Changes the relation of the amount of cure options to required cures and the scaling of required cures with resistance
* Fixes virus renaming
* changes description and permeability of some medical jumpsuits
* Adds a list of all diseases infecting client mobs to the disease outbreak event
* uses event UID instead of ref in the disease
* Adds advanced disease carriers to admin antag menu
* Adds viral eraser which removes tracking and stabilizing. Admin spawn only for now
* Update tgui.bundle.js
* Adds the ability to create viral genetic material using radiation. it can be used in addition to that produced in xenobio
* changes alert logic, disease generation logic, adds treatments to weakness, cough and sneeze now more gradual and cough spreads at range 3
* makes disease advance a bit faster
* reduce time to announcement to 6 minutes after 3 people are infected
* Changes medibot disease detection to be the same as analyzers. Treatment chems now put the symptom on a cooldown that persists after they leave the body.
* Make sure the disease outbreak event only selects crew
* Fix abductor virus gland virus generation
* Adds sterilizine to viro locker
* Fixes null viruses appearing when merging virusless blood
* Adds oculine to hyphema treatments
* Rebalances weight loss and flesh eating
* Improvements to advanced disease carrier tab on the TGUI antag menu
* change the flag on away missions
* Update mob_spawn.dm
* Update tgui.bundle.js
* adds sterilizine recipe back
* Adds viral contamination to surgery tools and surgery steps
* small changes
* fixes pandemic ui. should work properly now(I hope)
* CI compliance
* Update flesh_eating.dm
* Update vomit.dm
* Update tgui.bundle.js
* Initial revision of analysis and fixes the UI issue with multiple stage samples
* refactors treatment and makes treatment chems more adjustable
* var correction
* symptoms and their contribution now show up on the pandemic
* Update tgui.bundle.js
* Update code/datums/diseases/advance/symptoms/cough.dm
Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
* change wizard disease and zombie disease macros to new ones
* Update tgui.bundle.js
* changes the part requirements on the pandemic boards to fit the actual parts
* fix misbehaviour when inserting samples without symptoms
* Some changes to difficulty scaling, reverts the level of projectile vomiting back to 4, and disallows germaphobes to avoid infection by injection
* Adds viral contamination to IV bags
---------
Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
1013 lines
39 KiB
Plaintext
1013 lines
39 KiB
Plaintext
/obj/item/tarot_generator
|
|
name = "enchanted tarot card deck"
|
|
desc = "This tarot card box has quite the array of runes and artwork on it."
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "tarot_box"
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
/// What is the maximum number of cards the tarot generator can have in the world at a time?
|
|
var/maximum_cards = 3
|
|
/// List of cards we have created, to check against maximum, and so we can purge them from the pack.
|
|
var/list/our_card_list = list()
|
|
///How long the cooldown is each time we draw a card before we can draw another?
|
|
var/our_card_cooldown_time = 25 SECONDS
|
|
COOLDOWN_DECLARE(card_cooldown)
|
|
|
|
/obj/item/tarot_generator/wizard
|
|
maximum_cards = 5
|
|
our_card_cooldown_time = 12 SECONDS // A minute for a full hand of 5 cards
|
|
|
|
/obj/item/tarot_generator/attack_self__legacy__attackchain(mob/user)
|
|
if(!COOLDOWN_FINISHED(src, card_cooldown))
|
|
to_chat(user, "<span class='warning'>[src]'s magic is still recovering from the last card, wait [round(COOLDOWN_TIMELEFT(src, card_cooldown) / 10)] more second\s!</span>")
|
|
return
|
|
if(length(our_card_list) >= maximum_cards)
|
|
to_chat(user, "<span class='warning'>[src]'s magic can only support up to [maximum_cards] in the world at once, use or destroy some!</span>")
|
|
return
|
|
var/obj/item/magic_tarot_card/MTC = new /obj/item/magic_tarot_card(get_turf(src), src)
|
|
our_card_list += MTC
|
|
user.put_in_hands(MTC)
|
|
to_chat(user, "<span class='hierophant'>You draw [MTC.name]... [MTC.card_desc]</span>") //No period on purpose.
|
|
COOLDOWN_START(src, card_cooldown, our_card_cooldown_time)
|
|
|
|
/obj/item/tarot_generator/examine(mob/user)
|
|
. = ..()
|
|
. += "<span class='hierophant'>Alt-Shift-Click to destroy all cards it has produced.</span>"
|
|
. += "<span class='hierophant'>It has [length(our_card_list)] card\s in the world right now.</span>"
|
|
if(!COOLDOWN_FINISHED(src, card_cooldown))
|
|
. += "<span class='hierophant'>You may draw another card again in [round(COOLDOWN_TIMELEFT(src, card_cooldown) / 10)] second\s.</span>"
|
|
|
|
/obj/item/tarot_generator/AltShiftClick(mob/user)
|
|
for(var/obj/item/magic_tarot_card/MTC in our_card_list)
|
|
MTC.dust()
|
|
to_chat(user, "<span class='hierophant'>You dispell the cards [src] had created.</span>")
|
|
|
|
// Booster packs filled with 3, 5, or 7 playing cards! Used by the wizard space ruin, or rarely in lavaland tendril chests.
|
|
/obj/item/tarot_card_pack
|
|
name = "\improper Enchanted Arcana Pack"
|
|
desc = "A pack of 3 Enchanted tarot cards. Collect them all!"
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "pack"
|
|
///How many cards in a pack. 3 in base, 5 in jumbo, 7 in mega
|
|
var/cards = 3
|
|
|
|
/obj/item/tarot_card_pack/attack_self__legacy__attackchain(mob/user)
|
|
user.visible_message("<span class='notice'>[user] tears open [src].</span>", \
|
|
"<span class='hierophant'>You tear open [src]!</span>")
|
|
playsound(loc, 'sound/items/poster_ripped.ogg', 50, TRUE)
|
|
for(var/i in 1 to cards)
|
|
new /obj/item/magic_tarot_card(get_turf(src))
|
|
qdel(src)
|
|
|
|
/obj/item/tarot_card_pack/jumbo
|
|
name = "\improper Jumbo Arcana Pack"
|
|
desc = "A Jumbo card pack from your friend Jimbo!"
|
|
icon_state = "jumbopack"
|
|
cards = 5
|
|
|
|
/obj/item/tarot_card_pack/mega
|
|
name = "\improper MEGA Arcana Pack"
|
|
desc = "Sadly, you won't find a Joker for an angel room, or a Soul card in here either."
|
|
icon_state = "megapack"
|
|
cards = 7
|
|
|
|
// Blank tarot cards. Made by the cult, however also good for space ruins potentially, where one feels a card pack would be too much?
|
|
/obj/item/blank_tarot_card
|
|
name = "blank tarot card"
|
|
desc = "A blank tarot card."
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "tarot_blank"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
throw_speed = 3
|
|
throw_range = 10
|
|
resistance_flags = FLAMMABLE
|
|
/// If a person can choose what the card produces. No cost if they can choose.
|
|
var/let_people_choose = FALSE
|
|
|
|
/obj/item/blank_tarot_card/examine(mob/user)
|
|
. = ..()
|
|
if(!let_people_choose)
|
|
. += "<span class='hierophant'>With a bit of Ink, a work of art could be created. Will you provide your Ink?</span>"
|
|
else
|
|
. += "<span class='hierophant'>We have the Ink... Could you provide your Vision instead?</span>"
|
|
|
|
/obj/item/blank_tarot_card/attack_self__legacy__attackchain(mob/user)
|
|
if(!ishuman(user))
|
|
return
|
|
if(!let_people_choose)
|
|
var/mob/living/carbon/human/H = user
|
|
if(H.dna && (NO_BLOOD in H.dna.species.species_traits))
|
|
to_chat(user, "<span class='cult'>No blood to provide?...</span><span class='hierophant'> Then no Ink for the art...</span>")
|
|
return
|
|
if(H.blood_volume <= 100) //Shouldn't happen, they should be dead, but failsafe. Not bleeding as then they could recover the blood with blood rites
|
|
return
|
|
H.blood_volume -= 100
|
|
H.drop_item()
|
|
var/obj/item/magic_tarot_card/MTC = new /obj/item/magic_tarot_card(get_turf(src))
|
|
user.put_in_hands(MTC)
|
|
to_chat(user, "<span class='cult'>Your blood flows into [src]...</span><span class='hierophant'> And your Ink makes a work of art! [MTC.name]... [MTC.card_desc]</span>") //No period on purpose.
|
|
qdel(src)
|
|
return
|
|
var/tarot_type
|
|
var/tarot_name
|
|
var/list/card_by_name = list()
|
|
for(var/T in subtypesof(/datum/tarot) - /datum/tarot/reversed)
|
|
var/datum/tarot/temp = T
|
|
card_by_name[temp.name] = T
|
|
|
|
tarot_name = tgui_input_list(user, "Choose the Work of Art to create.", "Art Creation", card_by_name)
|
|
tarot_type = card_by_name[tarot_name]
|
|
if(tarot_type)
|
|
user.drop_item()
|
|
var/obj/item/magic_tarot_card/MTC = new /obj/item/magic_tarot_card(get_turf(src), null, tarot_type)
|
|
user.put_in_hands(MTC)
|
|
to_chat(user, "<span class='hierophant'>You put your Vision into [src], and your Vision makes a work of Art! [MTC.name]... [MTC.card_desc]</span>") //No period on purpose.
|
|
qdel(src)
|
|
|
|
/obj/item/blank_tarot_card/choose //For admins mainly, to spawn a specific tarot card. Not recommended for ruins.
|
|
let_people_choose = TRUE
|
|
|
|
/obj/item/magic_tarot_card
|
|
name = "XXII - The Unknown"
|
|
desc = "A beautiful tarot card. However, it feels like... more?"
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "tarot_the_unknown"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
throw_speed = 3
|
|
throw_range = 10
|
|
resistance_flags = FLAMMABLE
|
|
/// The deck that created us. Notifies it we have been deleted on use.
|
|
var/obj/item/tarot_generator/creator_deck
|
|
/// Our magic tarot card datum that lets the tarot card do stuff on use, or hitting someone
|
|
var/datum/tarot/our_tarot
|
|
/// Our fancy description given to use by the tarot datum.
|
|
var/card_desc = "Untold answers... wait what? This is a bug, report this as an issue on github!"
|
|
/// Is the card face down? Shows the card back, hides the examine / name.
|
|
var/face_down = FALSE
|
|
/// Will this card automatically disappear if thrown at a non-mob?
|
|
var/needs_mob_target = TRUE
|
|
/// Has the card been activated? If it has, don't activate it again
|
|
var/has_been_activated = FALSE
|
|
|
|
/obj/item/magic_tarot_card/Initialize(mapload, obj/item/tarot_generator/source, datum/tarot/chosen_tarot)
|
|
. = ..()
|
|
if(source)
|
|
creator_deck = source
|
|
if(chosen_tarot)
|
|
our_tarot = new chosen_tarot
|
|
if(!istype(our_tarot))
|
|
var/tarotpath = pick(subtypesof(/datum/tarot) - /datum/tarot/reversed)
|
|
our_tarot = new tarotpath
|
|
name = our_tarot.name
|
|
card_desc = our_tarot.desc
|
|
icon_state = "tarot_[our_tarot.card_icon]"
|
|
|
|
/obj/item/magic_tarot_card/Destroy()
|
|
if(creator_deck)
|
|
creator_deck.our_card_list -= src
|
|
return ..()
|
|
|
|
/obj/item/magic_tarot_card/examine(mob/user)
|
|
. = ..()
|
|
if(!face_down)
|
|
. += "<span class='hierophant'>[card_desc]</span>"
|
|
. += "<span class='hierophant'>Alt-Shift-Click to flip the card over.</span>"
|
|
|
|
/obj/item/magic_tarot_card/examine_more(mob/user)
|
|
. = ..()
|
|
if(!face_down)
|
|
. += "<span class='hierophant'>[src] [our_tarot.extended_desc]</span>"
|
|
|
|
/obj/item/magic_tarot_card/attack_self__legacy__attackchain(mob/user)
|
|
poof()
|
|
if(has_been_activated)
|
|
return
|
|
if(face_down)
|
|
flip()
|
|
if(our_tarot)
|
|
user.drop_item()
|
|
pre_activate(user, user)
|
|
return
|
|
qdel(src)
|
|
|
|
/obj/item/magic_tarot_card/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, dodgeable)
|
|
if(face_down)
|
|
flip()
|
|
. = ..()
|
|
|
|
/obj/item/magic_tarot_card/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
|
. = ..()
|
|
if(needs_mob_target && !isliving(hit_atom))
|
|
return
|
|
poof()
|
|
if(has_been_activated)
|
|
return
|
|
if(isliving(hit_atom) && our_tarot)
|
|
pre_activate(hit_atom, locateUID(throwingdatum.thrower_uid))
|
|
return
|
|
qdel(src)
|
|
|
|
/obj/item/magic_tarot_card/AltShiftClick(mob/user)
|
|
flip()
|
|
|
|
/obj/item/magic_tarot_card/proc/flip()
|
|
if(!face_down)
|
|
icon_state = "cardback[our_tarot.reversed ? "?" : ""]"
|
|
name = "Enchanted tarot card"
|
|
face_down = TRUE
|
|
else
|
|
name = our_tarot.name
|
|
icon_state = "tarot_[our_tarot.card_icon]"
|
|
face_down = FALSE
|
|
|
|
/obj/item/magic_tarot_card/proc/poof()
|
|
new /obj/effect/temp_visual/revenant(get_turf(src))
|
|
|
|
/obj/item/magic_tarot_card/proc/dust()
|
|
visible_message("<span class='danger'>[src] disintegrates into dust!</span>")
|
|
new /obj/effect/temp_visual/revenant(get_turf(src))
|
|
qdel(src)
|
|
|
|
/obj/item/magic_tarot_card/proc/pre_activate(mob/user, atom/movable/thrower)
|
|
if(user != thrower) //Ignore antimagic stuff if the user is the thrower (aka self activation)
|
|
if(user.can_block_magic(our_tarot.antimagic_flags, 1))
|
|
visible_message("<span class='warning'>[src] burns up in a flash on contact with [user]!</span>")
|
|
qdel(src)
|
|
return
|
|
has_been_activated = TRUE
|
|
forceMove(user)
|
|
var/obj/effect/temp_visual/card_preview/tarot/draft = new(user, "tarot_[our_tarot.card_icon]")
|
|
user.vis_contents += draft
|
|
user.visible_message("<span class='hierophant'>[user] holds up [src]!</span>")
|
|
addtimer(CALLBACK(our_tarot, TYPE_PROC_REF(/datum/tarot, activate), user), 0.5 SECONDS)
|
|
if(ismob(thrower) && our_tarot)
|
|
add_attack_logs(thrower, user, "[thrower] has activated [our_tarot.name] on [user]", ATKLOG_FEW)
|
|
QDEL_IN(src, 0.6 SECONDS)
|
|
|
|
/obj/effect/temp_visual/card_preview
|
|
name = "a card"
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "tarot_the_unknown"
|
|
pixel_y = 20
|
|
duration = 1.5 SECONDS
|
|
|
|
/obj/effect/temp_visual/card_preview/Initialize(mapload, new_icon_state)
|
|
. = ..()
|
|
if(new_icon_state)
|
|
icon_state = new_icon_state
|
|
|
|
flourish()
|
|
|
|
/obj/effect/temp_visual/card_preview/proc/flourish()
|
|
var/new_filter = isnull(get_filter("ray"))
|
|
ray_filter_helper(1, 40, "#fcf3dc", 6, 20)
|
|
if(new_filter)
|
|
animate(get_filter("ray"), alpha = 0, offset = 10, time = duration, loop = -1)
|
|
animate(offset = 0, time = duration)
|
|
|
|
/obj/effect/temp_visual/card_preview/tarot
|
|
name = "a tarot card"
|
|
|
|
/obj/effect/temp_visual/card_preview/tarot/flourish()
|
|
var/new_filter = isnull(get_filter("ray"))
|
|
ray_filter_helper(1, 40,"#fcf3dc", 6, 20)
|
|
if(new_filter)
|
|
animate(get_filter("ray"), alpha = 0, offset = 10, time = duration, loop = -1)
|
|
animate(offset = 0, time = duration)
|
|
|
|
/datum/tarot
|
|
/// Name used for the card
|
|
var/name = "XXII - The Unknown."
|
|
/// Desc used for the card description of the card
|
|
var/desc = "Untold answers... wait what? This is a bug, report this as an issue on github!"
|
|
/// Extended desc for the cards. For what they do
|
|
var/extended_desc = "asks you to report this as a bug on GitHub!"
|
|
/// What icon is used for the card?
|
|
var/card_icon = "the_unknown"
|
|
/// Are we reversed? Used for the card back.
|
|
var/reversed = FALSE
|
|
/// What antimagic flags do we have?
|
|
var/antimagic_flags = MAGIC_RESISTANCE
|
|
|
|
/datum/tarot/proc/activate(mob/living/target)
|
|
stack_trace("A bugged tarot card was spawned and used. Please make an issue report! Type was [src.type]")
|
|
|
|
/datum/tarot/reversed
|
|
name = "XXII - The Unknown?"
|
|
desc = "Untold answers... wait what? This is a bug, report this as an issue on github! This one was a reversed arcana!"
|
|
card_icon = "the_unknown?"
|
|
reversed = TRUE
|
|
|
|
/datum/tarot/the_fool
|
|
name = "0 - The Fool"
|
|
desc = "Where journey begins."
|
|
extended_desc = "returns the affected user to the arrival point of this forsaken journey."
|
|
card_icon = "the_fool"
|
|
|
|
/datum/tarot/the_fool/activate(mob/living/target)
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
target.forceMove(pick(GLOB.latejoin))
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
|
|
|
/datum/tarot/the_magician
|
|
name = "I - The Magician"
|
|
desc = "May you never miss your goal."
|
|
extended_desc = "makes the user feel extraordinarily badass for a couple of minutes."
|
|
card_icon = "the_magician"
|
|
|
|
/datum/tarot/the_magician/activate(mob/living/target)
|
|
target.apply_status_effect(STATUS_EFFECT_BADASS)
|
|
to_chat(target, "<span class='notice'>You feel badass.</span>")
|
|
|
|
/datum/tarot/the_high_priestess
|
|
name = "II - The High Priestess"
|
|
desc = "Mother is watching you."
|
|
extended_desc = "alerts bubblegum to the user, who will strike them down. The user will receive heavy damage and will be immobilized."
|
|
card_icon = "the_high_priestess"
|
|
|
|
/datum/tarot/the_high_priestess/activate(mob/living/target)
|
|
new /obj/effect/abstract/bubblegum_rend_helper(get_turf(target), target, 20)
|
|
|
|
/obj/effect/abstract/bubblegum_rend_helper
|
|
name = "bubblegum_rend_helper"
|
|
|
|
/obj/effect/abstract/bubblegum_rend_helper/Initialize(mapload, mob/living/owner, damage)
|
|
. = ..()
|
|
INVOKE_ASYNC(src, PROC_REF(rend), owner, damage)
|
|
|
|
/obj/effect/abstract/bubblegum_rend_helper/proc/rend(mob/living/owner, damage)
|
|
if(!owner)
|
|
for(var/mob/living/L in shuffle(view(9, src)))
|
|
owner = L
|
|
break
|
|
owner.Immobilize(3 SECONDS)
|
|
for(var/i in 1 to 3)
|
|
var/turf/first_turf = get_turf(owner)
|
|
new /obj/effect/decal/cleanable/blood/bubblegum(first_turf)
|
|
if(prob(50))
|
|
new /obj/effect/temp_visual/bubblegum_hands/rightsmack(first_turf)
|
|
else
|
|
new /obj/effect/temp_visual/bubblegum_hands/leftsmack(first_turf)
|
|
sleep(6)
|
|
var/turf/second_turf = get_turf(owner)
|
|
to_chat(owner, "<span class='userdanger'>Something huge rends you!</span>")
|
|
playsound(second_turf, 'sound/misc/demon_attack1.ogg', 100, TRUE, -1)
|
|
owner.adjustBruteLoss(damage)
|
|
qdel(src)
|
|
|
|
/datum/tarot/the_empress
|
|
name = "III - The Empress"
|
|
desc = "May your rage bring power."
|
|
extended_desc = "gives the user a temporary boost of speed. This includes attack speed."
|
|
card_icon = "the_empress"
|
|
|
|
/datum/tarot/the_empress/activate(mob/living/target)
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/H = target
|
|
H.reagents.add_reagent("mephedrone", 4.5)
|
|
H.reagents.add_reagent("mitocholide", 12)
|
|
|
|
/datum/tarot/the_emperor
|
|
name = "IV - The Emperor"
|
|
desc = "Challenge me!"
|
|
extended_desc = "warps the user to where command commonly resides. Be ready for a fight."
|
|
card_icon = "the_emperor"
|
|
|
|
/datum/tarot/the_emperor/activate(mob/living/target)
|
|
var/list/L = list()
|
|
for(var/turf/T in get_area_turfs(/area/station/command/bridge))
|
|
if(T.is_blocked_turf())
|
|
continue
|
|
L.Add(T)
|
|
|
|
if(!length(L))
|
|
to_chat(target, "<span class='warning'>Huh. No bridge? Well, that sucks.</span>")
|
|
return
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
target.forceMove(pick(L))
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
|
|
|
/datum/tarot/the_hierophant
|
|
name = "V - The Hierophant"
|
|
desc = "Two prayers for the lost."
|
|
extended_desc = "enchants the user's suit with magic that's strong enough to negate three attacks."
|
|
card_icon = "the_hierophant"
|
|
|
|
/datum/tarot/the_hierophant/activate(mob/living/target)
|
|
if(!ishuman(target))
|
|
return
|
|
var/mob/living/carbon/human/H = target
|
|
if(!H.wear_suit)
|
|
return
|
|
H.wear_suit.setup_hierophant_shielding()
|
|
H.update_appearance(UPDATE_ICON)
|
|
|
|
/datum/tarot/the_lovers
|
|
name = "VI - The Lovers"
|
|
desc = "May you prosper and be in good health."
|
|
extended_desc = "will restore the overall health of the user."
|
|
card_icon = "the_lovers"
|
|
|
|
/datum/tarot/the_lovers/activate(mob/living/target)
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/H = target
|
|
H.adjustBruteLoss(-40, robotic = TRUE)
|
|
H.adjustFireLoss(-40, robotic = TRUE)
|
|
H.blood_volume = min(H.blood_volume + 100, BLOOD_VOLUME_NORMAL)
|
|
else
|
|
target.adjustBruteLoss(-40)
|
|
target.adjustFireLoss(-40)
|
|
target.adjustOxyLoss(-40)
|
|
target.adjustToxLoss(-40)
|
|
|
|
/datum/tarot/the_chariot
|
|
name = "VII - The Chariot"
|
|
desc = "May nothing stand before you."
|
|
extended_desc = "imbues the user with immense power and speed, rendering them practically immortal for 10 seconds, at the cost of being unable to harm another living thing."
|
|
card_icon = "the_chariot"
|
|
|
|
/datum/tarot/the_chariot/activate(mob/living/target)
|
|
target.apply_status_effect(STATUS_EFFECT_BLOOD_RUSH)
|
|
target.apply_status_effect(STATUS_EFFECT_BLOODDRUNK_CHARIOT)
|
|
|
|
/datum/tarot/justice
|
|
name = "VIII - Justice"
|
|
desc = "May your future become balanced."
|
|
extended_desc = "grants the user a medical first aid kit, a magical key that can open a single door, and 100 credits."
|
|
card_icon = "justice"
|
|
|
|
/datum/tarot/justice/activate(mob/living/target)
|
|
var/turf/target_turf = get_turf(target)
|
|
new /obj/item/storage/firstaid/regular(target_turf)
|
|
new /obj/item/grenade/chem_grenade/waterpotassium(target_turf)
|
|
new /obj/item/card/emag/magic_key(target_turf)
|
|
new /obj/item/stack/spacecash/c100(target_turf)
|
|
|
|
/datum/tarot/the_hermit
|
|
name = "IX - The Hermit"
|
|
desc = "May you see what life has to offer."
|
|
extended_desc = "teleports the user to a random vending machine within the station."
|
|
card_icon = "the_hermit"
|
|
|
|
/datum/tarot/the_hermit/activate(mob/living/target)
|
|
var/list/viable_vendors = list()
|
|
for(var/obj/machinery/economy/vending/candidate in SSmachines.get_by_type(/obj/machinery/economy/vending))
|
|
if(!is_station_level(candidate.z))
|
|
continue
|
|
viable_vendors += candidate
|
|
|
|
if(!length(viable_vendors))
|
|
to_chat(target, "<span class='warning'>No vending machines? Well, with luck cargo will have something to offer. If you go there yourself.</span>")
|
|
return
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
target.forceMove(get_turf(pick(viable_vendors)))
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
|
|
|
/datum/tarot/wheel_of_fortune
|
|
name = "X - Wheel of Fortune"
|
|
desc = "Spin the wheel of destiny."
|
|
extended_desc = "summons a random vending machine."
|
|
card_icon = "wheel_of_fortune"
|
|
|
|
/datum/tarot/wheel_of_fortune/activate(mob/living/target)
|
|
var/list/static/bad_vendors = typesof(/obj/machinery/economy/vending/liberationstation)\
|
|
+ typesof(/obj/machinery/economy/vending/toyliberationstation)\
|
|
+ typesof(/obj/machinery/economy/vending/wallmed) // Future proofing in case we add more subtypes of disallowed vendors
|
|
var/turf/target_turf = get_turf(target)
|
|
var/vendorpath = pick(subtypesof(/obj/machinery/economy/vending) - bad_vendors)
|
|
new vendorpath(target_turf)
|
|
|
|
/datum/tarot/strength
|
|
name = "XI - Strength"
|
|
desc = "May your power bring rage."
|
|
extended_desc = "grants the user strength beyond belief, but renders them unable to handle ranged weapons."
|
|
card_icon = "strength"
|
|
|
|
/datum/tarot/strength/activate(mob/living/target)
|
|
target.apply_status_effect(STATUS_EFFECT_VAMPIRE_GLADIATOR)
|
|
target.apply_status_effect(STATUS_EFFECT_BLOOD_SWELL)
|
|
|
|
/datum/tarot/the_hanged_man
|
|
name = "XII - The Hanged Man"
|
|
desc = "May you find enlightenment."
|
|
extended_desc = "allows the user to fly for a minute."
|
|
card_icon = "the_hanged_man"
|
|
|
|
/datum/tarot/the_hanged_man/activate(mob/living/target)
|
|
if(HAS_TRAIT(target, TRAIT_FLYING))
|
|
return
|
|
ADD_TRAIT(target, TRAIT_FLYING, "tarot")
|
|
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(callback_remove_trait), target, TRAIT_FLYING, "tarot"), 60 SECONDS)
|
|
|
|
/datum/tarot/death
|
|
name = "XIII - Death"
|
|
desc = "Lay waste to all that oppose you."
|
|
extended_desc = "deals damage to all those the user can see. Aside from themselves, of course."
|
|
card_icon = "death"
|
|
|
|
/datum/tarot/death/activate(mob/living/target)
|
|
for(var/mob/living/L in oview(9, target))
|
|
L.adjustBruteLoss(20)
|
|
L.adjustFireLoss(20)
|
|
|
|
/datum/tarot/temperance
|
|
name = "XIV - Temperance"
|
|
desc = "May you be pure in heart."
|
|
extended_desc = "cures all ailments the user has. Also reinvigorates their organs."
|
|
card_icon = "temperance"
|
|
|
|
/datum/tarot/temperance/activate(mob/living/target)
|
|
if(!ishuman(target))
|
|
return
|
|
var/mob/living/carbon/human/H = target
|
|
var/obj/item/organ/internal/body_egg/egg = H.get_int_organ(/obj/item/organ/internal/body_egg)
|
|
if(egg)
|
|
egg.remove(H)
|
|
H.vomit()
|
|
egg.forceMove(get_turf(H))
|
|
H.reagents.add_reagent("mutadone", 1)
|
|
for(var/obj/item/organ/internal/I in H.internal_organs)
|
|
I.heal_internal_damage(60)
|
|
H.apply_status_effect(STATUS_EFFECT_PANACEA)
|
|
for(var/thing in H.viruses)
|
|
var/datum/disease/D = thing
|
|
if(D.severity == VIRUS_NONTHREAT)
|
|
continue
|
|
D.cure()
|
|
|
|
/datum/tarot/the_devil
|
|
name = "XV - The Devil"
|
|
desc = "Revel in the power of darkness."
|
|
extended_desc = "steals the life-force of everyone around the user."
|
|
card_icon = "the_devil"
|
|
|
|
/datum/tarot/the_devil/activate(mob/living/target)
|
|
target.apply_status_effect(STATUS_EFFECT_SHADOW_MEND_DEVIL)
|
|
|
|
/datum/tarot/the_tower
|
|
name = "XVI - The Tower"
|
|
desc = "Destruction brings creation."
|
|
extended_desc = "summons a self-replicating bomb."
|
|
card_icon = "the_tower"
|
|
|
|
/datum/tarot/the_tower/activate(mob/living/target)
|
|
var/obj/item/grenade/clusterbuster/ied/bakoom = new(get_turf(target))
|
|
var/turf/bombturf = get_turf(target)
|
|
target.investigate_log("[key_name(target)] has been activated (either thrown at or used) on [target] at [bombturf.x],[bombturf.y],[bombturf.z]", INVESTIGATE_BOMB) // Yes, this is an atom proc. Suffering
|
|
bakoom.prime()
|
|
|
|
/// I'm sorry matt, this is very funny.
|
|
/datum/tarot/the_stars
|
|
name = "XVII - The Stars"
|
|
desc = "May you find what you desire."
|
|
extended_desc = "teleports the user to the station's evidence room, and opens a single locker within."
|
|
card_icon = "the_stars"
|
|
|
|
/datum/tarot/the_stars/activate(mob/living/target)
|
|
var/list/L = list()
|
|
for(var/turf/T in get_area_turfs(/area/station/security/evidence))
|
|
if(T.is_blocked_turf())
|
|
continue
|
|
L.Add(T)
|
|
|
|
if(!length(L))
|
|
to_chat(target, "<span class='warning'>Huh. No evidence? Well, that means they can't charge you with a crime, right?</span>")
|
|
return
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
target.forceMove(pick(L))
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
|
for(var/obj/structure/closet/C in shuffle(view(9, target)))
|
|
if(istype(C, /obj/structure/closet/secure_closet))
|
|
var/obj/structure/closet/secure_closet/SC = C
|
|
SC.locked = FALSE
|
|
C.open()
|
|
break //Only open one locker
|
|
|
|
/datum/tarot/the_moon
|
|
name = "XVIII - The Moon"
|
|
desc = "May you find all you have lost."
|
|
extended_desc = "teleports the user to a random place of interest, starting with the sector the user is in first."
|
|
card_icon = "the_moon"
|
|
|
|
/datum/tarot/the_moon/activate(mob/living/target)
|
|
var/list/funny_ruin_list = list()
|
|
var/turf/target_turf = get_turf(target)
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
for(var/I in GLOB.ruin_landmarks)
|
|
var/obj/effect/landmark/ruin/ruin_landmark = I
|
|
if(ruin_landmark.z == target_turf.z)
|
|
funny_ruin_list += ruin_landmark
|
|
|
|
if(length(funny_ruin_list))
|
|
teleport(target, get_turf(pick(funny_ruin_list)))
|
|
return
|
|
//We did not find a ruin on the same level. Well. I hope you have a space suit, but we'll go space ruins as they are mostly sorta kinda safer.
|
|
for(var/I in GLOB.ruin_landmarks)
|
|
var/obj/effect/landmark/ruin/ruin_landmark = I
|
|
if(!is_mining_level(ruin_landmark.z))
|
|
funny_ruin_list += ruin_landmark
|
|
|
|
if(!length(funny_ruin_list))
|
|
to_chat(target, "<span class='warning'>Huh. No space ruins? Well, this card is RUINED!</span>")
|
|
return
|
|
|
|
teleport(target, get_turf(pick(funny_ruin_list)))
|
|
|
|
/datum/tarot/the_moon/proc/teleport(mob/living/target, turf/teleport_location)
|
|
teleport_location.ChangeTurf(/turf/simulated/floor/plating) //we give them plating so they are not trapped in a wall or fall into lava/chasm, and a pickaxe to avoid being trapped in a wall
|
|
target.forceMove(teleport_location)
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
|
new /obj/item/pickaxe/emergency(teleport_location)
|
|
target.update_parallax_contents()
|
|
|
|
/datum/tarot/the_sun
|
|
name = "XIX - The Sun"
|
|
desc = "May the light heal and enlighten you."
|
|
extended_desc = "fully rejuvenates the user back to their peak strength."
|
|
card_icon = "the_sun"
|
|
|
|
/datum/tarot/the_sun/activate(mob/living/target)
|
|
target.revive()
|
|
|
|
/datum/tarot/judgement
|
|
name = "XX - Judgement"
|
|
desc = "Judge lest ye be judged."
|
|
extended_desc = "alerts the denizens of the afterlife to the user's existence. Prepare to be judged."
|
|
card_icon = "judgement"
|
|
|
|
/datum/tarot/judgement/activate(mob/living/target)
|
|
notify_ghosts("[target] has used a judgment card. Judge them. Or not, up to you.", enter_link = "<a href=byond://?src=[UID()];follow=1>(Click to judge)</a>", source = target, action = NOTIFY_FOLLOW)
|
|
|
|
/datum/tarot/the_world
|
|
name = "XXI - The World"
|
|
desc = "Open your eyes and see."
|
|
extended_desc = "bellows out smoke and grants the user full x-ray vision for two minutes."
|
|
card_icon = "the_world"
|
|
|
|
/datum/tarot/the_world/activate(mob/living/target)
|
|
var/datum/effect_system/smoke_spread/bad/smoke = new()
|
|
smoke.set_up(10, FALSE, target)
|
|
smoke.start()
|
|
target.apply_status_effect(STATUS_EFFECT_XRAY)
|
|
|
|
////////////////////////////////
|
|
////////REVERSED ARCANA/////////
|
|
////////////////////////////////
|
|
|
|
/datum/tarot/reversed/the_fool
|
|
name = "0 - The Fool?"
|
|
desc = "Let go and move on."
|
|
extended_desc = "removes all items from the user, leaving them completely naked."
|
|
card_icon = "the_fool?"
|
|
|
|
/datum/tarot/reversed/the_fool/activate(mob/living/target)
|
|
if(!ishuman(target))
|
|
return
|
|
var/mob/living/carbon/human/H = target
|
|
for(var/obj/item/I in H)
|
|
if(istype(I, /obj/item/bio_chip))
|
|
continue
|
|
H.drop_item_to_ground(I)
|
|
|
|
/datum/tarot/reversed/the_magician
|
|
name = "I - The Magician?"
|
|
desc = "May no harm come to you."
|
|
extended_desc = "will repulse everything away from the user."
|
|
card_icon = "the_magician?"
|
|
|
|
/datum/tarot/reversed/the_magician/activate(mob/living/target)
|
|
var/list/thrown_atoms = list()
|
|
var/sparkle_path = /obj/effect/temp_visual/gravpush
|
|
for(var/turf/T in range(5, target)) //Done this way so things don't get thrown all around hilariously.
|
|
for(var/atom/movable/AM in T)
|
|
if(ismob(AM))
|
|
var/mob/victim_mob = AM
|
|
if(victim_mob.can_block_magic(antimagic_flags))
|
|
continue
|
|
thrown_atoms += AM
|
|
for(var/atom/movable/AM as anything in thrown_atoms)
|
|
if(AM == target || AM.anchored || (ismob(AM) && !isliving(AM)))
|
|
continue
|
|
|
|
var/throw_target = get_edge_target_turf(target, get_dir(target, get_step_away(AM, target)))
|
|
var/dist_from_user = get_dist(target, AM)
|
|
if(dist_from_user == 0)
|
|
if(isliving(AM))
|
|
var/mob/living/M = AM
|
|
M.Weaken(6 SECONDS)
|
|
M.adjustBruteLoss(10)
|
|
to_chat(M, "<span class='userdanger'>You're slammed into the floor by [name]!</span>")
|
|
add_attack_logs(target, M, "[M] was thrown by [target]'s [name]", ATKLOG_ALMOSTALL)
|
|
else
|
|
new sparkle_path(get_turf(AM), get_dir(target, AM))
|
|
if(isliving(AM))
|
|
var/mob/living/M = AM
|
|
to_chat(M, "<span class='userdanger'>You're thrown back by [name]!</span>")
|
|
add_attack_logs(target, M, "[M] was thrown by [target]'s [name]", ATKLOG_ALMOSTALL)
|
|
INVOKE_ASYNC(AM, TYPE_PROC_REF(/atom/movable, throw_at), throw_target, ((clamp((3 - (clamp(dist_from_user - 2, 0, dist_from_user))), 3, 3))), 1) //So stuff gets tossed around at the same time.
|
|
|
|
/datum/tarot/reversed/the_high_priestess
|
|
name = "II - The High Priestess?"
|
|
desc = "Run."
|
|
extended_desc = "summons Bubblegum to tear portals open around the user that will grab and damage everyone nearby."
|
|
card_icon = "the_high_priestess?"
|
|
|
|
/datum/tarot/reversed/the_high_priestess/activate(mob/living/target)
|
|
target.visible_message("<span class='colossus'><b>WHO DARES TO TRY TO USE MY POWER IN A CARD?</b></span>")
|
|
target.apply_status_effect(STATUS_EFFECT_REVERSED_HIGH_PRIESTESS)
|
|
|
|
/datum/tarot/reversed/the_empress
|
|
name = "III - The Empress?"
|
|
desc = "May your love bring protection."
|
|
extended_desc = "pacifies everyone in range, except for the user, for 40 seconds."
|
|
card_icon = "the_empress?"
|
|
|
|
/datum/tarot/reversed/the_empress/activate(mob/living/target)
|
|
for(var/mob/living/L in oview(9, target))
|
|
if(L.can_block_magic(antimagic_flags))
|
|
to_chat(L, "<span class='notice'>You feel calm for a second, but it quickly passes.</span>")
|
|
continue
|
|
L.apply_status_effect(STATUS_EFFECT_PACIFIED)
|
|
|
|
/datum/tarot/reversed/the_emperor
|
|
name = "IV - The Emperor?"
|
|
desc = "May you find a worthy opponent."
|
|
extended_desc = "teleports the user to a random head of staff."
|
|
card_icon = "the_emperor?"
|
|
|
|
/datum/tarot/reversed/the_emperor/activate(mob/living/target)
|
|
var/list/L = list()
|
|
var/list/heads = SSticker.mode.get_all_heads()
|
|
for(var/datum/mind/head in heads)
|
|
if(ishuman(head.current))
|
|
L.Add(head.current)
|
|
|
|
if(!length(L))
|
|
to_chat(target, "<span class='warning'>Huh. No command members? I hope you didn't kill them all already...</span>")
|
|
return
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
target.forceMove(get_turf(pick(L)))
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
|
|
|
/datum/tarot/reversed/the_hierophant
|
|
name = "V - The Hierophant?"
|
|
desc = "Two prayers for the forgotten."
|
|
extended_desc = "makes the Hierophant attack two random mobs in range."
|
|
card_icon = "the_hierophant?"
|
|
|
|
/datum/tarot/reversed/the_hierophant/activate(mob/living/target)
|
|
var/active_chasers = 0
|
|
for(var/mob/living/M in shuffle(orange(7, target)))
|
|
if(M.stat == DEAD) //Let us not have dead mobs be used to make a disco inferno.
|
|
continue
|
|
if(M.can_block_magic(antimagic_flags)) //Be spared!
|
|
continue
|
|
if(active_chasers >= 2)
|
|
return
|
|
var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(target), target, M, 1, FALSE)
|
|
C.moving = 2
|
|
C.standard_moving_before_recalc = 2
|
|
C.moving_dir = text2dir(pick("NORTH", "SOUTH", "EAST", "WEST"))
|
|
active_chasers++
|
|
|
|
/datum/tarot/reversed/the_lovers
|
|
name = "VI - The Lovers?"
|
|
desc = "May your heart shatter to pieces."
|
|
extended_desc = "causes the user of this card to experience true heartbreak - leaving their chest broken and battered."
|
|
card_icon = "the_lovers?"
|
|
|
|
/datum/tarot/reversed/the_lovers/activate(mob/living/target)
|
|
if(!ishuman(target))
|
|
return
|
|
var/mob/living/carbon/human/H = target
|
|
H.apply_damage(20, BRUTE, BODY_ZONE_CHEST)
|
|
H.bleed(120)
|
|
var/obj/item/organ/external/chest = H.get_organ(BODY_ZONE_CHEST)
|
|
chest.fracture()
|
|
var/datum/organ/heart/datum_heart = H.get_int_organ_datum(ORGAN_DATUM_HEART)
|
|
var/obj/item/organ/internal/our_heart = datum_heart.linked_organ
|
|
our_heart.receive_damage(20, TRUE)
|
|
|
|
/datum/tarot/reversed/the_chariot
|
|
name = "VII - The Chariot?"
|
|
desc = "May nothing walk past you."
|
|
extended_desc = "will petrify the user for two minutes, rendering them completely indestructible."
|
|
card_icon = "the_chariot?"
|
|
|
|
/datum/tarot/reversed/the_chariot/activate(mob/living/target)
|
|
target.Stun(4 SECONDS)
|
|
new /obj/structure/closet/statue/indestructible(get_turf(target), target)
|
|
|
|
/datum/tarot/reversed/justice
|
|
name = "VIII - Justice?"
|
|
desc = "May your sins come back to torment you."
|
|
extended_desc = "creates a random orderable crate. This can include crates Supply would otherwise not have access to at the time."
|
|
card_icon = "justice?"
|
|
|
|
/datum/tarot/reversed/justice/activate(mob/living/target)
|
|
var/list/static/ignored_supply_pack_types = list(
|
|
/datum/supply_packs/abstract,
|
|
/datum/supply_packs/abstract/shuttle
|
|
)
|
|
var/chosen = pick(SSeconomy.supply_packs - ignored_supply_pack_types)
|
|
var/datum/supply_packs/the_pack = new chosen()
|
|
var/spawn_location = get_turf(target)
|
|
var/obj/structure/closet/crate/crate = the_pack.create_package(spawn_location)
|
|
crate.name = "magic [crate.name]"
|
|
qdel(the_pack)
|
|
|
|
/datum/tarot/reversed/the_hermit
|
|
name = "IX - The Hermit?"
|
|
desc = "May you see the value of all things in life."
|
|
extended_desc = "will sell all loose guns, grenades, batons, and armor around the user, transforming them directly into cash."
|
|
card_icon = "the_hermit?"
|
|
|
|
/datum/tarot/reversed/the_hermit/activate(mob/living/target) //Someone can improve this in the future (hopefully comment will not be here in 10 years.)
|
|
for(var/obj/item/I in view(7, target))
|
|
if(istype(I, /obj/item/gun))
|
|
new /obj/item/stack/spacecash/c200(get_turf(I))
|
|
qdel(I)
|
|
continue
|
|
if(istype(I, /obj/item/grenade))
|
|
new /obj/item/stack/spacecash/c50(get_turf(I))
|
|
qdel(I)
|
|
if(istype(I, /obj/item/clothing/suit/armor))
|
|
new /obj/item/stack/spacecash/c100(get_turf(I))
|
|
qdel(I)
|
|
if(istype(I, /obj/item/melee/baton))
|
|
new /obj/item/stack/spacecash/c100(get_turf(I))
|
|
qdel(I)
|
|
|
|
/datum/tarot/reversed/wheel_of_fortune
|
|
name = "X - Wheel of Fortune?"
|
|
desc = "Throw the dice of fate."
|
|
extended_desc = "forces the user to roll for a powerful magical artifact. The outcome can be highly positive or highly negative; it is up to fate."
|
|
card_icon = "wheel_of_fortune?"
|
|
|
|
/datum/tarot/reversed/wheel_of_fortune/activate(mob/living/target)
|
|
var/obj/item/dice/d20/fate/one_use/gonna_roll_a_one = new /obj/item/dice/d20/fate/one_use(get_turf(target))
|
|
gonna_roll_a_one.diceroll(target)
|
|
|
|
/datum/tarot/reversed/strength
|
|
name = "XI - Strength?"
|
|
desc = "May you break their resolve."
|
|
extended_desc = "breaks the minds of those around the user, dealing heavy brain damage, and causing two minutes of hallucinations."
|
|
card_icon = "strength?"
|
|
|
|
/datum/tarot/reversed/strength/activate(mob/living/target)
|
|
for(var/mob/living/M in oview(9, target))
|
|
M.Hallucinate(2 MINUTES)
|
|
new /obj/effect/hallucination/delusion(get_turf(M), M)
|
|
M.adjustBrainLoss(30)
|
|
|
|
/datum/tarot/reversed/the_hanged_man
|
|
name = "XII - The Hanged Man?"
|
|
desc = "May your greed know no bounds."
|
|
extended_desc = "forces the user to spin a cursed slot machine."
|
|
card_icon = "the_hanged_man?"
|
|
|
|
/datum/tarot/reversed/the_hanged_man/activate(mob/living/target)
|
|
var/obj/structure/cursed_slot_machine/pull_the_lever_kronk = new /obj/structure/cursed_slot_machine(get_turf(target))
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/WRONG_LEVER = target
|
|
pull_the_lever_kronk.attack_hand(WRONG_LEVER)
|
|
|
|
/datum/tarot/reversed/death
|
|
name = "XIII - Death?"
|
|
desc = "May life spring forth from the fallen."
|
|
extended_desc = "grants the user a soulstone and a construct to freely use on the dead."
|
|
card_icon = "death?"
|
|
|
|
/datum/tarot/reversed/death/activate(mob/living/target)
|
|
new /obj/structure/constructshell(get_turf(target))
|
|
new /obj/item/soulstone/anybody(get_turf(target))
|
|
|
|
/datum/tarot/reversed/temperance
|
|
name = "XIV - Temperance?"
|
|
desc = "May your hunger be satiated."
|
|
extended_desc = "forces the user to eat five pills containing random reagents."
|
|
card_icon = "temperance?"
|
|
|
|
/datum/tarot/reversed/temperance/activate(mob/living/target)
|
|
if(!ishuman(target))
|
|
return
|
|
var/mob/living/carbon/human/H = target
|
|
for(var/i in 1 to 5)
|
|
var/datum/reagents/R = new /datum/reagents(10)
|
|
R.add_reagent(get_unrestricted_random_reagent_id(), 10)
|
|
R.reaction(H, REAGENT_INGEST)
|
|
R.trans_to(H, 10)
|
|
target.visible_message("<span class='warning'>[target] consumes 5 pills rapidly!</span>")
|
|
|
|
/datum/tarot/reversed/the_devil
|
|
name = "XV - The Devil?"
|
|
desc = "Bask in the light of your mercy."
|
|
extended_desc = "summons a primed cluster flashbang at the user's feet."
|
|
card_icon = "the_devil?"
|
|
|
|
/datum/tarot/reversed/the_devil/activate(mob/living/target)
|
|
var/obj/item/grenade/clusterbuster/i_hate_nians = new(get_turf(target))
|
|
i_hate_nians.prime()
|
|
|
|
/datum/tarot/reversed/the_tower
|
|
name = "XVI - The Tower?"
|
|
desc = "Creation brings destruction."
|
|
extended_desc = "will create large stone walls that erupt from the ground around the user."
|
|
card_icon = "the_tower?"
|
|
|
|
/datum/tarot/reversed/the_tower/activate(mob/living/target)
|
|
for(var/turf/T in RANGE_TURFS(9, target))
|
|
if(locate(/mob/living) in T)
|
|
continue
|
|
if(istype(T, /turf/simulated/wall/indestructible))
|
|
continue
|
|
if(prob(66))
|
|
continue
|
|
T.ChangeTurf(/turf/simulated/mineral/random/labormineral)
|
|
|
|
/datum/tarot/reversed/the_stars
|
|
name = "XVII - The Stars?"
|
|
desc = "May your loss bring fortune."
|
|
extended_desc = "will cause a large amount of genetic decomposition to the user, as well as hurting a limb. However, it will reward the user with two additional cards."
|
|
card_icon = "the_stars?"
|
|
|
|
/datum/tarot/reversed/the_stars/activate(mob/living/target) //Heavy clone damage hit, but gain 2 cards. Not teathered to the card producer. Could lead to card stacking, but would require the sun to fix easily
|
|
if(!ishuman(target))
|
|
return
|
|
var/mob/living/carbon/human/H = target
|
|
H.adjustCloneLoss(50)
|
|
for(var/obj/item/organ/external/E in shuffle(H.bodyparts))
|
|
switch(rand(1,3))
|
|
if(1)
|
|
E.fracture()
|
|
if(2)
|
|
E.cause_internal_bleeding()
|
|
if(3)
|
|
E.cause_burn_wound()
|
|
break // I forgot the break the first time. Very funny.
|
|
|
|
H.drop_l_hand()
|
|
H.drop_r_hand()
|
|
var/obj/item/magic_tarot_card/MTC = new /obj/item/magic_tarot_card(get_turf(src))
|
|
var/obj/item/magic_tarot_card/MPC = new /obj/item/magic_tarot_card(get_turf(src))
|
|
H.put_in_hands(MTC)
|
|
H.put_in_hands(MPC)
|
|
|
|
/datum/tarot/reversed/the_moon
|
|
name = "XVIII - The Moon?"
|
|
desc = "May you remember lost memories."
|
|
extended_desc = "will reveal the memories of everyone in range to the user."
|
|
card_icon = "the_moon?"
|
|
antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND
|
|
|
|
/datum/tarot/reversed/the_moon/activate(mob/living/target)
|
|
for(var/mob/living/L in view(5, target)) //Shorter range as this kinda can give away antagonists, though that is also funny.
|
|
target.mind.show_memory(L, 0) //Safe code? Bank accounts? PDA codes? It's yours my friend, as long as you have enough tarots
|
|
|
|
/datum/tarot/reversed/the_sun
|
|
name = "XIX - The Sun?"
|
|
desc = "May the darkness swallow all around you."
|
|
extended_desc = "makes the user emit darkness, freezing anyone nearby. They will also become nearsighted for the duration, however."
|
|
card_icon = "the_sun?"
|
|
|
|
/datum/tarot/reversed/the_sun/activate(mob/living/target)
|
|
target.apply_status_effect(STATUS_EFFECT_REVERSED_SUN)
|
|
|
|
/datum/tarot/reversed/judgement
|
|
name = "XX - Judgement?"
|
|
desc = "May you redeem those found wanting." //Who wants more, but ghosts for something interesting
|
|
extended_desc = "nudges the future events of this shift to be more... interesting."
|
|
card_icon = "judgement?"
|
|
|
|
/datum/tarot/reversed/judgement/activate(mob/living/target)
|
|
var/datum/event_container/EC = SSevents.event_containers[EVENT_LEVEL_MODERATE]
|
|
var/decrease = 5 MINUTES
|
|
EC.next_event_time -= decrease
|
|
log_and_message_admins("decreased timer for [GLOB.severity_to_string[EC.severity]] events by 5 minutes by use of a [src].")
|
|
|
|
/datum/tarot/reversed/the_world
|
|
name = "XXI - The World?"
|
|
desc = "Step into the abyss."
|
|
extended_desc = "teleports the user to the mining outpost."
|
|
card_icon = "the_world?"
|
|
|
|
/datum/tarot/reversed/the_world/activate(mob/living/target)
|
|
var/list/L = list()
|
|
for(var/turf/T in get_area_turfs(/area/mine/outpost)) //Lavaland is the abyss, but also too hot to send people too. Mining base should be fair!
|
|
if(T.is_blocked_turf())
|
|
continue
|
|
L.Add(T)
|
|
|
|
if(!length(L))
|
|
to_chat(target, "<span class='warning'>Hmm. No base? A miner issue.</span>")
|
|
return
|
|
if(SEND_SIGNAL(target, COMSIG_MOVABLE_TELEPORTING, get_turf(target)) & COMPONENT_BLOCK_TELEPORT)
|
|
return FALSE
|
|
target.forceMove(pick(L))
|
|
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|