Adds magic tarot cards [SERIOUS DO NOT CLOSE AFTER AFD] (#24933)

* starts it

* Update magic_tarot.dm

* MORE PROGRESS

* So many thanks to Cloudbucket, for sprites

* The Work, the Art, continues.

* more changes

* pushes the Work foward. All cards done.

* and more thanks github

* adds to BSH

* tochat

* Finishes QWERTYTODO. Magic key. World smoke

* Isaac and his mother lived alone in a small house on a hill.  Isaac kept to himself, drawing pictures and playing with his toys as his mom watched Christian broadcasts on the television.  Life was simple, and they were both happy. That was, until the day Isaac’s mom heard a voice from above.  “Your son has become corrupted by sin. He needs to be saved.”  “I will do my best to save him, my Lord,” Isaac’s mother replied, rushing into Isaac’s room, removing all that was evil from his life.  Again the voice called to her, "Isaac’s soul is still corrupt. He needs to be cut off from all that is evil in this world and confess his sins."  “I will follow your instructions, Lord. I have faith in thee,” Isaac’s mother replied, as she locked Isaac in his room, away from the evils of the world.  One last time, Isaac’s mom heard the voice of God calling to her.  “You've done as I've asked, but I still question your devotion to me. To prove your faith, I will ask one more thing of you."  "Yes Lord, anything!” Isaac’s mother begged.  "To prove your love and devotion, I require a sacrifice. Your son, Isaac, will be this sacrifice. Go into his room and end his life, as an offering to me to prove you love me above all else."  "Yes Lord", she replied, grabbing a butcher’s knife from the kitchen.  Isaac, watching through a crack in his door, trembled in fear.  Scrambling around his room to find a hiding place, he noticed a trap door to the basement hidden under his rug.  Without hesitation, he flung open the hatch, just as his mother burst through his door, and threw himself down into the unknown depths below.

* nanny bag it before I forget

* Apply suggestions from code review

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>

* returns early

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>

* RE-RE-RE-REVIEW

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Co-authored-by: synthtee <127706731+SynthTwo@users.noreply.github.com>

* requested changes and such

* duh

* Apply suggestions from code review

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>

* returns early

* Update code/datums/status_effects/buffs.dm

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>

* new hrefs here to troll CI :trollface:

* Update code/game/gamemodes/wizard/magic_tarot.dm

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>

---------

Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: synthtee <127706731+SynthTwo@users.noreply.github.com>
This commit is contained in:
Qwertytoforty
2024-04-24 19:10:46 -04:00
committed by GitHub
parent 69d6a8df21
commit af5d187014
25 changed files with 1154 additions and 13 deletions
@@ -126,6 +126,11 @@
/obj/structure/bed,
/turf/simulated/floor/mineral/titanium/purple,
/area/ruin/space/powered)
"Q" = (
/obj/structure/table/wood,
/obj/item/blank_tarot_card,
/turf/simulated/floor/mineral/titanium/purple,
/area/ruin/space/powered)
(1,1,1) = {"
a
@@ -277,7 +282,7 @@ b
j
r
w
n
Q
j
b
a
@@ -167,6 +167,7 @@
/area/ruin/space/unpowered)
"aF" = (
/obj/structure/table/wood,
/obj/item/blank_tarot_card,
/turf/simulated/floor/wood{
icon_state = "wood-broken6"
},
+12
View File
@@ -18,6 +18,8 @@
#define STATUS_EFFECT_SHADOW_MEND /datum/status_effect/shadow_mend //Quick, powerful heal that deals damage afterwards. Heals 15 brute/burn every second for 3 seconds.
#define STATUS_EFFECT_VOID_PRICE /datum/status_effect/void_price //The price of healing yourself with void energy. Deals 3 brute damage every 3 seconds for 30 seconds.
#define STATUS_EFFECT_SHADOW_MEND_DEVIL /datum/status_effect/shadow_mend/devil //Tarot version, hurts others over self
#define STATUS_EFFECT_HIPPOCRATIC_OATH /datum/status_effect/hippocraticOath //Gives you an aura of healing as well as regrowing the Rod of Asclepius if lost
#define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core
@@ -37,6 +39,8 @@
#define STATUS_EFFECT_BLOODDRUNK /datum/status_effect/blooddrunk //Stun immunity and greatly reduced damage taken
#define STATUS_EFFECT_BLOODDRUNK_CHARIOT /datum/status_effect/blooddrunk/chariot //adds pacifism
#define STATUS_EFFECT_DASH /datum/status_effect/dash // Grants the ability to dash, expiring after a few secodns
/// Rapid burn/brute/oxy/blood healing from the cling ability
@@ -62,6 +66,12 @@
#define STATUS_EFFECT_BEARSERKER_RAGE /datum/status_effect/bearserker_rage
#define STATUS_EFFECT_XRAY /datum/status_effect/xray // Xray vision for 2 minutes
#define STATUS_EFFECT_BADASS /datum/status_effect/badass // Badass trait for 2 minutes.
#define STATUS_EFFECT_REVERSED_SUN /datum/status_effect/reversed_sun // Weaker eternal darkness, nightvision, but nearsight
/////////////
// DEBUFFS //
/////////////
@@ -114,6 +124,8 @@
#define STATUS_EFFECT_PEPPERSPRAYED /datum/status_effect/pepper_spray
#define STATUS_EFFECT_REVERSED_HIGH_PRIESTESS /datum/status_effect/reversed_high_priestess //Bubblegum will chase the person hit by the effect, grabbing people at random. This can and WILL include the caster.
//#define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse
//#define CURSE_BLINDING 1 //makes the edges of the target's screen obscured
//#define CURSE_SPAWNING 2 //spawns creatures that attack the target only
+101 -4
View File
@@ -62,6 +62,11 @@
id = "shadow_mend"
duration = 3 SECONDS
alert_type = /atom/movable/screen/alert/status_effect/shadow_mend
/// If this is true, the status effect will try to apply the debuff to others, rather than the user
var/devil = FALSE
/datum/status_effect/shadow_mend/devil
devil = TRUE
/atom/movable/screen/alert/status_effect/shadow_mend
name = "Shadow Mend"
@@ -78,10 +83,25 @@
owner.adjustFireLoss(-15)
/datum/status_effect/shadow_mend/on_remove()
owner.visible_message("<span class='warning'>The violet light around [owner] glows black!</span>", "<span class='warning'>The tendrils around you cinch tightly and reap their toll...</span>")
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, 1)
owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
if(!devil)
owner.visible_message("<span class='warning'>The violet light around [owner] glows black!</span>", "<span class='warning'>The tendrils around you cinch tightly and reap their toll...</span>")
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, TRUE)
owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
return
var/found_someone = FALSE
for(var/mob/living/L in oview(9, owner))
found_someone = TRUE
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, TRUE)
L.Beam(owner, "grabber_beam", time = 1 SECONDS, maxdistance = 9)
L.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
if(found_someone)
owner.visible_message("<span class='warning'>The violet light around [owner] glows black... and shoots off to those around [owner.p_them()]!</span>", "<span class='warning'>The tendrils around you cinch tightly... but then unwravel and fly at others!</span>")
else
owner.visible_message("<span class='warning'>The violet light around [owner] glows black!</span>", "<span class='warning'>The tendrils around you cinch tightly and reap their toll...</span>")
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, TRUE)
owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
/datum/status_effect/void_price
id = "void_price"
@@ -110,6 +130,13 @@
tick_interval = 0
alert_type = /atom/movable/screen/alert/status_effect/blooddrunk
var/blooddrunk_damage_mod_remove = 4 // Damage is multiplied by this at the end of the status effect. Modify this one, it changes the _add
/// If this is the chariot subtype, which grants pacifism while the effect is active.
var/chariot = FALSE
/datum/status_effect/blooddrunk/chariot
duration = 10 SECONDS
chariot = TRUE
blooddrunk_damage_mod_remove = 6
/atom/movable/screen/alert/status_effect/blooddrunk
name = "Blood-Drunk"
@@ -120,6 +147,8 @@
. = ..()
if(.)
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "blooddrunk")
if(chariot)
ADD_TRAIT(owner, TRAIT_PACIFISM, "blooddrunk")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
var/blooddrunk_damage_mod_add = 1 / blooddrunk_damage_mod_remove // Damage is multiplied by this at the start of the status effect. Don't modify this one directly.
@@ -144,6 +173,7 @@
H.physiology.stamina_mod *= blooddrunk_damage_mod_remove
add_attack_logs(owner, owner, "lost blood-drunk stun immunity", ATKLOG_ALL)
REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "blooddrunk")
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "blooddrunk")
if(islist(owner.stun_absorption) && owner.stun_absorption["blooddrunk"])
owner.remove_stun_absorption("blooddrunk")
@@ -183,7 +213,7 @@
H.physiology.stamina_mod *= 0.5
H.physiology.stun_mod *= 0.5
var/datum/antagonist/vampire/V = owner.mind.has_antag_datum(/datum/antagonist/vampire)
if(V.get_ability(/datum/vampire_passive/blood_swell_upgrade))
if(V?.get_ability(/datum/vampire_passive/blood_swell_upgrade))
bonus_damage_applied = TRUE
H.physiology.melee_bonus += 10
H.dna.species.punchstunthreshold += 8 //higher chance to stun but not 100%
@@ -776,3 +806,70 @@
var/mob/living/carbon/human/H = owner
H.physiology.stamina_mod /= 0.75
add_attack_logs(owner, owner, "lost bearserker rage resistances", ATKLOG_ALL)
/datum/status_effect/xray
id = "xray"
alert_type = null
status_type = STATUS_EFFECT_REFRESH
duration = 2 MINUTES
tick_interval = 0
/datum/status_effect/xray/on_apply()
. = ..()
ADD_TRAIT(owner, TRAIT_XRAY_VISION, "XRAY_BUFF")
ADD_TRAIT(owner, TRAIT_NIGHT_VISION, "XRAY_BUFF")
owner.update_sight()
/datum/status_effect/xray/on_remove()
. = ..()
REMOVE_TRAIT(owner, TRAIT_XRAY_VISION, "XRAY_BUFF")
REMOVE_TRAIT(owner, TRAIT_NIGHT_VISION, "XRAY_BUFF")
owner.update_sight()
/datum/status_effect/badass
id = "badass"
alert_type = null
status_type = STATUS_EFFECT_REFRESH
duration = 2 MINUTES
tick_interval = 0
/datum/status_effect/badass/on_apply()
. = ..()
ADD_TRAIT(owner, TRAIT_BADASS, "BADDASS_BUFF")
/datum/status_effect/badass/on_remove()
. = ..()
REMOVE_TRAIT(owner, TRAIT_BADASS, "BADDASS_BUFF")
/datum/status_effect/reversed_sun
id = "reversed_sun"
alert_type = null
status_type = STATUS_EFFECT_REFRESH
duration = 1 MINUTES
tick_interval = 0.2 SECONDS
/datum/status_effect/reversed_sun/on_apply()
. = ..()
owner.become_nearsighted("REVERSED_SUN")
ADD_TRAIT(owner, TRAIT_NIGHT_VISION, "REVERSED_SUN")
owner.update_sight()
owner.set_light(7, -5, "#ddd6cf")
/datum/status_effect/reversed_sun/on_remove()
. = ..()
owner.remove_light()
owner.cure_nearsighted("REVERSED_SUN")
REMOVE_TRAIT(owner, TRAIT_NIGHT_VISION, "REVERSED_SUN")
owner.update_sight()
/datum/status_effect/reversed_sun/tick()
for(var/atom/movable/AM in oview(8, owner))
if(isliving(AM))
var/mob/living/L = AM
if(L.affects_vampire(owner))
L.adjust_bodytemperature(-1.5 * TEMPERATURE_DAMAGE_COEFFICIENT)
continue
if(istype(AM, /obj/item/projectile))
var/obj/item/projectile/P = AM
if(P.flag == ENERGY || P.flag == LASER)
P.damage *= 0.85
+26
View File
@@ -1322,3 +1322,29 @@
desc = "Real winners quit before they reach the ultimate prize."
#undef DEFAULT_MAX_CURSE_COUNT
/datum/status_effect/reversed_high_priestess
id = "reversed_high_priestess"
duration = 1 MINUTES
status_type = STATUS_EFFECT_REFRESH
tick_interval = 6 SECONDS
alert_type = /atom/movable/screen/alert/status_effect/bubblegum_curse
/datum/status_effect/reversed_high_priestess/tick()
. = ..()
new /obj/effect/bubblegum_warning(get_turf(owner))
/obj/effect/bubblegum_warning
name = "bloody rift"
desc = "You feel like even being *near* this is a bad idea"
icon = 'icons/obj/biomass.dmi'
icon_state = "rift"
color = "red"
/obj/effect/bubblegum_warning/Initialize()
. = ..()
addtimer(CALLBACK(src, PROC_REF(slap_someone)), 2.5 SECONDS) //A chance to run away
/obj/effect/bubblegum_warning/proc/slap_someone()
new /obj/effect/abstract/bubblegum_rend_helper(get_turf(src), null, 10)
qdel(src)
@@ -305,6 +305,17 @@
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
job = list("Head of Personnel", "Quartermaster", "Cargo Technician", "Librarian", "Coroner", "Psychiatrist", "Virologist")
// Tarot card generator, librarian and Chaplain.
/datum/uplink_item/jobspecific/tarot_generator
name = "Enchanted tarot card deck"
desc = "A magic tarot card deck \"borrowed\" from a Wizard federation storage unit. \
Capable of producing magic tarot cards of the 22 major arcana, and their reversed versions. Each card has a different effect. \
Throw the card at someone to use it on them, or use it in hand to apply it to yourself. Unlimited uses, 25 second cooldown, can have up to 3 cards in the world."
reference = "tarot"
item = /obj/item/tarot_generator
cost = 55 //This can do a lot of stuff, but is quite random. As such, higher price.
job = list("Chaplain", "Librarian")
//--------------------------//
// Species Restricted Gear //
+1 -1
View File
@@ -318,7 +318,7 @@ GLOBAL_LIST_INIT(blacklisted_pylon_turfs, typecacheof(list(
selection_title = "Archives"
creation_message = "<span class='cultitalic'>You invoke the dark magic of the tomes creating a %ITEM%!</span>"
choosable_items = list("Shuttle Curse" = /obj/item/shuttle_curse, "Zealot's Blindfold" = /obj/item/clothing/glasses/hud/health/night/cultblind,
"Veil Shifter" = /obj/item/cult_shift, "Reality sunderer" = /obj/item/portal_amulet) //Add void torch to veil shifter spawn
"Veil Shifter" = /obj/item/cult_shift, "Reality sunderer" = /obj/item/portal_amulet, "Blank Tarot Card" = /obj/item/blank_tarot_card)
/obj/structure/cult/functional/archives/Initialize(mapload)
. = ..()
+885
View File
@@ -0,0 +1,885 @@
/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(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(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
throwforce = 0
force = 0
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(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><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
throwforce = 0
force = 0
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
/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/attack_self(mob/user)
if(our_tarot)
INVOKE_ASYNC(our_tarot, TYPE_PROC_REF(/datum/tarot, activate), user)
poof()
/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(isliving(hit_atom) && our_tarot)
INVOKE_ASYNC(our_tarot, TYPE_PROC_REF(/datum/tarot, activate), hit_atom)
poof()
/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))
qdel(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)
/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!"
/// What icon is used for the card?
var/card_icon = "the_unknown"
/// Are we reversed? Used for the card back.
var/reversed = FALSE
/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."
card_icon = "the_fool"
/datum/tarot/the_fool/activate(mob/living/target)
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."
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."
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."
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!"
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(is_blocked_turf(T))
continue
L.Add(T)
if(!length(L))
to_chat(target, "<span class='warning'>Huh. No bridge? Well, that sucks.</span>")
return
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."
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."
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."
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."
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."
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 GLOB.machines)
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
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."
card_icon = "wheel_of_fortune"
/datum/tarot/wheel_of_fortune/activate(mob/living/target)
var/list/static/bad_vendors = list(
/obj/machinery/economy/vending/liberationstation,
/obj/machinery/economy/vending/toyliberationstation,
/obj/machinery/economy/vending/wallmed
)
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."
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."
card_icon = "the_hanged_man"
/datum/tarot/the_hanged_man/activate(mob/living/target)
if(target.flying)
return
target.flying = TRUE
addtimer(VARSET_CALLBACK(target, flying, FALSE), 60 SECONDS)
/datum/tarot/death
name = "XIII - Death"
desc = "Lay waste to all that oppose you."
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."
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 == NONTHREAT)
continue
D.cure()
/datum/tarot/the_devil
name = "XV - The Devil"
desc = "Revel in the power of darkness."
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."
card_icon = "the_tower"
/datum/tarot/the_tower/activate(mob/living/target)
var/obj/item/grenade/clusterbuster/ied/bakoom = new(get_turf(target))
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."
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(is_blocked_turf(T))
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
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."
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)
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))
var/turf/T = get_turf(pick(funny_ruin_list))
target.forceMove(T)
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
T.ChangeTurf(/turf/simulated/floor/plating) //we give them plating so they are not trapped in a wall, and a pickaxe to avoid being trapped in a wall
new /obj/item/pickaxe/emergency(T)
target.update_parallax_contents()
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>")
var/turf/T = get_turf(pick(funny_ruin_list))
target.forceMove(T)
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
T.ChangeTurf(/turf/simulated/floor/plating) //we give them plating so they are not trapped in a wall, and a pickaxe to avoid being trapped in a wall
new /obj/item/pickaxe/emergency(T)
target.update_parallax_contents()
return
/datum/tarot/the_sun
name = "XIX - The Sun"
desc = "May the light heal and enlighten you."
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."
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."
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."
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(/obj/item/bio_chip, I))
continue
H.unEquip(I)
/datum/tarot/reversed/the_magician
name = "I - The Magician?"
desc = "May no harm come to you."
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)
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."
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."
card_icon = "the_empress?"
/datum/tarot/reversed/the_empress/activate(mob/living/target)
for(var/mob/living/L in oview(9, target))
L.apply_status_effect(STATUS_EFFECT_PACIFIED)
/datum/tarot/reversed/the_emperor
name = "IV - The Emperor?"
desc = "May you find a worthy opponent."
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
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."
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(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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
card_icon = "the_moon?"
/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."
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
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."
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(is_blocked_turf(T))
continue
L.Add(T)
if(!length(L))
to_chat(target, "<span class='warning'>Hmm. No base? A miner issue.</span>")
return
target.forceMove(pick(L))
to_chat(target, "<span class='userdanger'>You are abruptly pulled through space!</span>")
+7 -3
View File
@@ -79,7 +79,9 @@ GLOBAL_LIST_INIT(summoned_magic, list(
/obj/item/scrying,
/obj/item/clothing/suit/space/hardsuit/wizard,
/obj/item/immortality_talisman,
/obj/item/melee/ghost_sword))
/obj/item/melee/ghost_sword,
/obj/item/tarot_card_pack,
/obj/item/tarot_card_pack/jumbo))
GLOBAL_LIST_INIT(summoned_special_magic, list(
/obj/item/gun/magic/staff/animate,
@@ -87,7 +89,8 @@ GLOBAL_LIST_INIT(summoned_special_magic, list(
/obj/item/contract,
/obj/item/gun/magic/staff/chaos,
/obj/item/necromantic_stone,
/obj/item/blood_contract))
/obj/item/blood_contract,
/obj/item/tarot_generator))
//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways)
GLOBAL_LIST_INIT(summoned_magic_objectives, list(
@@ -100,7 +103,8 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list(
/obj/item/necromantic_stone,
/obj/item/scrying,
/obj/item/spellbook,
/obj/item/storage/belt/wands/full))
/obj/item/storage/belt/wands/full,
/obj/item/tarot_generator))
// If true, it's the probability of triggering "survivor" antag.
GLOBAL_VAR_INIT(summon_guns_triggered, FALSE)
+9
View File
@@ -483,6 +483,15 @@
cost = 1
category = "Artefacts"
/datum/spellbook_entry/item/tarot_generator
name = "Enchanted tarot card deck"
desc = "An magic tarot card deck, enchanted with special Ink. \
Capable of producing magic tarot cards of the 22 major arcana, both normal and reversed. Each card has a different effect. \
Throw the card at someone to use it on them, or use it in hand to apply it to yourself. Unlimited uses, 12 second cooldown, can have up to 5 cards in the world."
item_path = /obj/item/tarot_generator/wizard
cost = 2
category = "Artefacts"
//Weapons and Armors
/datum/spellbook_entry/item/battlemage
name = "Battlemage Armor"
@@ -9,6 +9,13 @@
name = "blood sparks"
icon_state = "bloodsparkles"
/obj/effect/temp_visual/cult/sparks/hierophant
icon = 'icons/effects/effects.dmi'
randomdir = TRUE
duration = 12
name = "purple sparks"
icon_state = "hierophant_blast"
/obj/effect/temp_visual/dir_setting/cult/phase
name = "phase glow"
duration = 12
@@ -514,7 +514,7 @@ GLOBAL_LIST_INIT(cult_recipes, list (
new /datum/stack_recipe/cult("runed girder (used to make cult walls)", /obj/structure/girder/cult, 1, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE, cult_structure = TRUE),
new /datum/stack_recipe/cult("pylon (heals nearby cultists)", /obj/structure/cult/functional/pylon, 4, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE, cult_structure = TRUE),
new /datum/stack_recipe/cult("forge (crafts shielded robes, flagellant's robes, and mirror shields)", /obj/structure/cult/functional/forge, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE, cult_structure = TRUE),
new /datum/stack_recipe/cult("archives (crafts zealot's blindfolds, shuttle curse orbs, veil shifters, and reality sunderers)", /obj/structure/cult/functional/archives, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE, cult_structure = TRUE),
new /datum/stack_recipe/cult("archives (crafts zealot's blindfolds, shuttle curse orbs, veil shifters, reality sunderers, and blank tarot cards)", /obj/structure/cult/functional/archives, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE, cult_structure = TRUE),
new /datum/stack_recipe/cult("altar (crafts eldritch whetstones, construct shells, and flasks of unholy water)", /obj/structure/cult/functional/altar, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE, cult_structure = TRUE),
))
@@ -47,6 +47,21 @@
return
A.emag_act(user)
/obj/item/card/emag/magic_key
name = "magic key"
desc = "It's a magic key, that will open one door!"
icon_state = "magic_key"
origin_tech = "magnets=2"
/obj/item/card/emag/magic_key/afterattack(atom/target, mob/user, proximity)
if(!istype(target, /obj/machinery/door))
return
var/obj/machinery/door/D = target
D.locked = FALSE
update_icon()
. = ..()
qdel(src)
/obj/item/card/cmag
desc = "It's a card coated in a slurry of electromagnetic bananium."
name = "jestographic sequencer"
@@ -227,6 +227,11 @@
desc = "For when you need to knock out EVERYONE."
payload = /obj/item/grenade/gas/knockout
/obj/item/grenade/clusterbuster/ied
name = "\improper IED Cluster Grenade"
desc = "For when you need to do something between everything and nothing."
payload = /obj/item/grenade/iedcasing
////////////Clusterbuster of Clusterbusters////////////
//As a note: be extrodinarily careful about make the payload clusterbusters as it can quickly destroy the MC/Server
@@ -720,7 +720,8 @@
/obj/item/warp_cube/red = 1,
/obj/item/reagent_containers/drinks/everfull = 2,
/obj/item/clothing/suit/space/hardsuit/wizard = 2,
/obj/item/immortality_talisman = 1 ) //spells recharge when invincible
/obj/item/immortality_talisman = 1, //spells recharge when invincible
/obj/item/tarot_generator/wizard = 2)
var/obj/item/pickeda = pick(list_a)
value += list_a[pickeda]
new pickeda(src)
@@ -117,3 +117,17 @@
user.dust()
dump_contents()
visible_message("<span class='warning'>[src] shatters!</span>")
/obj/structure/closet/statue/indestructible
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
timer = 240 SECONDS_TO_LIFE_CYCLES
/obj/structure/closet/statue/indestructible/ex_act(severity)
return //No delimbing them
/obj/structure/closet/statue/indestructible/shatter(mob/user)
return //No. Failsafe.
/obj/structure/closet/statue/indestructible/singularity_act()
return //I mean maybe but no.
@@ -18,8 +18,12 @@
/obj/item/guardiancreator = 1, // jackpot.
/obj/item/spellbook/oneuse/knock = 1, // tresspassing charges incoming
/obj/item/gun/magic/wand/resurrection = 1, // medbay's best friend
/obj/item/tarot_generator = 1, // A little bit of everything, all of the time.
/obj/item/spellbook/oneuse/charge = 20, // and now for less useful stuff to dilute the good loot chances
/obj/item/spellbook/oneuse/summonitem = 20,
/obj/item/spellbook/oneuse/forcewall = 10,
/obj/item/book/granter/spell/summon_cheese = 20 // hungry wizard stuff
/obj/item/tarot_card_pack = 10,
/obj/item/tarot_card_pack/jumbo = 6,
/obj/item/tarot_card_pack/mega = 4,
/obj/item/book/granter/spell/summon_cheese = 15 // hungry wizard stuff
)
+17
View File
@@ -611,6 +611,23 @@
/obj/item/clothing/suit/proc/setup_shielding()
return
///Hierophant card shielding. Saves me time.
/obj/item/clothing/suit/proc/setup_hierophant_shielding()
var/datum/component/shielded/shield = GetComponent(/datum/component/shielded)
if(!shield)
AddComponent(/datum/component/shielded, recharge_start_delay = 0 SECONDS, shield_icon = "shield-hierophant", run_hit_callback = CALLBACK(src, PROC_REF(hierophant_shield_damaged)))
return
if(shield.shield_icon == "shield-hierophant") //If the hierophant shield has been used, recharge it. Otherwise, it's a shielded component we don't want to touch
shield.current_charges = 3
/// A proc for callback when the shield breaks, since I am stupid and want custom effects.
/obj/item/clothing/suit/proc/hierophant_shield_damaged(mob/living/wearer, attack_text, new_current_charges)
wearer.visible_message("<span class='danger'>[attack_text] is deflected in a burst of dark-purple sparks!</span>")
new /obj/effect/temp_visual/cult/sparks/hierophant(get_turf(wearer))
playsound(wearer,'sound/magic/blind.ogg', 200, TRUE, -2)
if(new_current_charges == 0)
wearer.visible_message("<span class='danger'>The runed shield around [wearer] suddenly disappears!</span>")
//Proc that opens and closes jackets.
/obj/item/clothing/suit/proc/adjustsuit(mob/user)
if(ignore_suitadjust)
@@ -69,6 +69,18 @@
if(23)
new /obj/item/borg/upgrade/modkit/lifesteal(src)
new /obj/item/bedsheet/cult(src)
if(24)
switch(rand(1, 11))
if(1)
new /obj/item/blank_tarot_card(src)
if(2 to 5)
new /obj/item/tarot_card_pack(src)
if(6 to 8)
new /obj/item/tarot_card_pack/jumbo(src)
if(9, 10)
new /obj/item/tarot_card_pack/mega(src)
if(11)
new /obj/item/tarot_generator(src) // ~1/250? Seems reasonable
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disk
@@ -969,6 +969,17 @@
var/picked_reagent = pick(random_reagents)
return picked_reagent
/// Returns a random reagent ID, with real non blacklisted balance boosting action!
/proc/get_unrestricted_random_reagent_id()
var/static/list/random_reagents
if(!length(random_reagents))
random_reagents = list()
for(var/datum/reagent/thing as anything in subtypesof(/datum/reagent))
var/R = initial(thing.id)
random_reagents += R
var/picked_reagent = pick(random_reagents)
return picked_reagent
/datum/reagents/proc/get_reagent_from_id(id)
var/datum/reagent/result = null
for(var/A in reagent_list)
+5 -1
View File
@@ -116,7 +116,11 @@
/obj/item/bedsheet/cult = 2,
/obj/item/bedsheet/wiz = 2,
/obj/item/stack/sheet/mineral/tranquillite/fifty = 3,
/obj/item/clothing/gloves/combat = 5
/obj/item/clothing/gloves/combat = 5,
/obj/item/blank_tarot_card = 5,
/obj/item/tarot_card_pack = 5,
/obj/item/tarot_card_pack/jumbo = 3,
/obj/item/tarot_card_pack/mega = 2
)
/obj/effect/spawner/lootdrop/bluespace_tap/organic
Binary file not shown.

Before

Width:  |  Height:  |  Size: 484 KiB

After

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 37 KiB

+1
View File
@@ -752,6 +752,7 @@
#include "code\game\gamemodes\vampire\vampire_gamemode.dm"
#include "code\game\gamemodes\wizard\artefact.dm"
#include "code\game\gamemodes\wizard\godhand.dm"
#include "code\game\gamemodes\wizard\magic_tarot.dm"
#include "code\game\gamemodes\wizard\raginmages.dm"
#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"