Files
Aurora.3/code/modules/games/cards.dm
2025-06-17 02:33:31 +02:00

676 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/datum/playingcard
var/name = "playing card"
var/desc = null
var/card_icon = "card_back"
var/back_icon = "card_back"
/obj/item/deck
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/item/playing_cards.dmi'
var/list/cards = list()
var/shuffle_sound = 'sound/items/cards/cardshuffle.ogg'
var/hand_type
/obj/item/deck/attack(mob/living/target_mob, mob/living/user, target_zone)
if (user.a_intent == I_HURT)
. = ..()
if(length(cards))
if(target_mob == user)
attack_self(user)
else
deal_card(user, target_mob)
/obj/item/deck/attack_self(mob/user, modifiers)
if(length(cards))
deal_card(user, user)
. = ..()
/obj/item/deck/proc/generate_deck() //the procs that creates the cards
return
/obj/item/deck/cards
name = "deck of cards"
desc = "A simple deck of playing cards."
desc_info = "Ctrl-click to draw/deal. Alt-click to shuffle."
icon_state = "deck"
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
hand_type = /obj/item/hand/cards
/obj/item/deck/Initialize()
. = ..()
generate_deck()
/obj/item/deck/cards/generate_deck()
var/datum/playingcard/P
for(var/suit in list("spades","clubs","diamonds","hearts"))
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten", "jack","queen","king"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[number]_[suit]"
P.back_icon = "card_back"
cards += P
for(var/i = 0,i<2,i++)
P = new()
P.name = "joker"
P.card_icon = "joker"
cards += P
/obj/item/deck/attack_hand(mob/user)
if(length(cards) && (user.l_hand == src || user.r_hand == src))
deal_card(user, user)
else
..()
/obj/item/deck/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/hand))
var/obj/item/hand/H = attacking_item
for(var/datum/playingcard/P in H.cards)
cards += P
qdel(attacking_item)
return
..()
/obj/item/deck/verb/drawcard()
set category = "Object"
set name = "Draw"
set desc = "Draw a card from the deck."
set src in view(1)
draw_card(usr)
/obj/item/deck/proc/draw_card(var/mob/user)
if(use_check_and_message(user, USE_DISALLOW_SILICONS) || !Adjacent(user))
return
if(!iscarbon(user))
to_chat(user, SPAN_WARNING("Your simple form can't operate \the [src]."))
if(!length(cards))
to_chat(usr, SPAN_WARNING("There are no cards in \the [src]."))
return
var/obj/item/hand/H
if(user.l_hand && istype(user.l_hand, /obj/item/hand))
H = user.l_hand
else if(user.r_hand && istype(user.r_hand, /obj/item/hand))
H = user.r_hand
else
H = new hand_type(get_turf(src))
H.concealed = TRUE
if(!user.put_in_hands(H))
return
if(!H || !user)
return
var/datum/playingcard/P = cards[1]
H.cards += P
cards -= P
H.update_icon()
balloon_alert_to_viewers("draws a card")
if(!length(cards))
qdel(src)
/obj/item/deck/verb/pickcard()
set category = "Object"
set name = "Pick"
set desc = "Pick a card from the deck."
set src in view(1)
pick_card(usr)
/obj/item/deck/proc/pick_card(var/mob/user)
if(use_check_and_message(user, USE_DISALLOW_SILICONS) || !Adjacent(user))
return
if(!iscarbon(user))
to_chat(user, SPAN_WARNING("Your simple form can't operate \the [src]."))
if(!length(cards))
to_chat(usr, SPAN_WARNING("There are no cards in \the [src]."))
return
var/obj/item/hand/H
if(user.l_hand && istype(user.l_hand,/obj/item/hand))
H = user.l_hand
else if(user.r_hand && istype(user.r_hand,/obj/item/hand))
H = user.r_hand
else
H = new hand_type(get_turf(src))
user.put_in_hands(H)
if(!H || !user)
return
var/list/to_discard = list()
for(var/datum/playingcard/P in cards)
to_discard[P.name] = P
var/discarding = tgui_input_list(user, "Which card do you wish to pick?", "Deck of Cards", to_discard)
if(!discarding || !to_discard[discarding] || !user || !src)
return
var/datum/playingcard/P = to_discard[discarding]
H.cards += P
cards -= P
H.update_icon()
balloon_alert_to_viewers("picks out a card")
if(!length(cards))
qdel(src)
/obj/item/deck/verb/dealcard()
set category = "Object"
set name = "Deal"
set desc = "Deal a card from the deck."
set src in view(1)
deal_card(usr, FALSE)
/obj/item/deck/proc/deal_card(mob/user, mob/living/target)
if(use_check_and_message(user, USE_DISALLOW_SILICONS) || !Adjacent(user))
return
if(!iscarbon(user))
to_chat(user, SPAN_WARNING("Your simple form can't operate \the [src]."))
if(!length(cards))
to_chat(usr, SPAN_WARNING("There are no cards in \the [src]."))
return
if(!target)
var/list/players = list()
for(var/mob/living/player in viewers(3))
if(!player.stat)
players += player
target = tgui_input_list(usr, "Who do you wish to deal a card?", "Deal", players)
if(target == user)
draw_card(user)
return
if((istype(get_step(target,target.dir), /obj/machinery/door/window) || istype(get_step(target,target.dir), /obj/structure/window)) && target.density)
return // should stop you from dragging through windows
if(!length(cards))
to_chat(user, SPAN_WARNING("There are no cards in the deck."))
return
var/obj/item/hand/H = new hand_type(user.loc)
H.randpixel = 6
H.randpixel_xy()
H.cards += cards[1]
cards -= cards[1]
H.concealed = TRUE
H.update_icon()
user.do_attack_animation(src, null)
balloon_alert_to_viewers("deals a card")
H.throw_at(get_step(target,target.dir), 10, 1, user, FALSE)
if(!length(cards))
qdel(src)
/obj/item/hand/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/hand))
var/obj/item/hand/H = attacking_item
user.visible_message("<b>\The [user]</b> adds \the [H] to their hand.", SPAN_NOTICE("You add \the [H] to your hand."))
for(var/datum/playingcard/P in cards)
H.cards += P
H.concealed = src.concealed
qdel(src)
H.update_icon()
return
if(istype(attacking_item, /obj/item/deck))
var/obj/item/deck/D = attacking_item
for(var/datum/playingcard/P in cards)
D.cards += P
qdel(src)
return
..()
/obj/item/deck/afterattack(obj/target, mob/user, proximity)
if(!ishuman(target))
return
var/mob/living/carbon/human/H = target
if(target == user)
return
if (H in range(user, 3))
deal_card(user, H)
/obj/item/deck/CtrlClick(var/mob/user)
draw_card(user)
/obj/item/deck/AltClick(var/mob/user)
. = ..()
if(use_check_and_message(user))
return
var/list/newcards = list()
while(length(cards))
var/datum/playingcard/P = pick(cards)
newcards += P
cards -= P
cards = newcards
playsound(src.loc, shuffle_sound, 100, 1, -4)
balloon_alert_to_viewers("shuffling")
/obj/item/pack
name = "card pack"
desc = "For those with disposible income."
icon = 'icons/obj/item/playing_cards.dmi'
icon_state = "card_pack"
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
w_class = WEIGHT_CLASS_TINY
var/list/cards = list()
/obj/item/pack/attack_self(var/mob/user as mob)
user.visible_message("<b>\The [user]</b> rips open \the [src]!")
var/obj/item/hand/H = new()
H.cards += cards
cards.Cut();
user.drop_from_inventory(src,get_turf(src))
H.update_icon()
user.put_in_active_hand(H)
qdel(src)
/obj/item/hand
name = "hand of cards"
desc = "Some playing cards."
icon = 'icons/obj/item/playing_cards.dmi'
icon_state = null
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
w_class = WEIGHT_CLASS_TINY
var/deck_type
var/concealed = TRUE
var/list/cards = list()
/obj/item/hand/cards
deck_type = /obj/item/deck/cards
/obj/item/hand/MouseEntered(location, control, params)
. = ..()
if(length(cards) == 1 && !concealed)
var/datum/playingcard/P = cards[1]
openToolTip(usr, src, params, P.name)
/obj/item/hand/MouseExited(location, control, params)
. = ..()
closeToolTip(usr)
/obj/item/hand/verb/pickcard()
set category = "Object"
set name = "Pick"
set desc = "Pick a card from your hand in front of you."
set src in usr
pick_card(usr)
/obj/item/hand/proc/pick_card(var/mob/user, var/deploy_in_front = TRUE)
var/list/to_discard = list()
for(var/datum/playingcard/P in cards)
to_discard[P.name] = P
var/input_text = "Which card do you wish to [deploy_in_front ? "put down" : "draw"]?"
var/discarding = tgui_input_list(user, input_text, "Hand of Cards", to_discard)
if(!discarding || !to_discard[discarding] || !user || !src)
return
var/datum/playingcard/card = to_discard[discarding]
qdel(to_discard)
var/obj/item/hand/H = new /obj/item/hand(src.loc)
H.cards += card
cards -= card
H.concealed = FALSE
H.update_icon()
src.update_icon()
playsound(src, 'sound/items/cards/cardflip.ogg', 50, TRUE)
balloon_alert_to_viewers("picks out a card")
if(deploy_in_front)
H.forceMove(get_step(usr, usr.dir))
else
user.put_in_hands(H)
if(!length(cards))
qdel(src)
/obj/item/hand/attack_hand(mob/user)
if(length(cards) > 1 && (user.l_hand == src || user.r_hand == src))
pick_card(user, FALSE)
else
..()
/obj/item/hand/attack_self(var/mob/user as mob)
concealed(user)
/obj/item/hand/CtrlClick(var/mob/user as mob)
pick_card(user)
/obj/item/hand/AltClick(mob/user)
concealed(user)
/obj/item/hand/proc/concealed(var/mob/user as mob)
concealed = !concealed
if(locate(/obj/structure/table) in loc)
update_icon(user.dir)
else
update_icon()
playsound(src, 'sound/items/cards/cardflip.ogg', 50, TRUE)
balloon_alert_to_viewers("[concealed ? "conceals" : "reveals"] their hand.")
/obj/item/hand/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
if((!concealed || src.loc == user) && length(cards))
if(length(cards) > 1)
. += "It contains: "
for(var/datum/playingcard/P in cards)
. += "The [P.name]. [P.desc ? "<i>[P.desc]</i>" : ""]"
/obj/item/hand/update_icon(var/direction = 0)
if(randpixel)
randpixel = 0
randpixel_xy(0)
if(!length(cards))
qdel(src)
return
else if(length(cards) > 1)
name = "hand of cards"
desc = "Some playing cards."
else
name = "playing card"
desc = "A playing card."
ClearOverlays()
if(length(cards) == 1)
var/datum/playingcard/P = cards[1]
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
AddOverlays(I)
return
var/offset = FLOOR(20/length(cards), 1)
var/matrix/M = matrix()
if(direction)
switch(direction)
if(NORTH)
M.Turn(0)
if(SOUTH)
M.Turn(180)
if(WEST)
M.Turn(270)
if(EAST)
M.Turn(90)
var/i = 0
for(var/datum/playingcard/P in cards)
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
//I.pixel_x = origin+(offset*i)
switch(direction)
if(SOUTH)
I.pixel_x = 8-(offset*i)
if(WEST)
I.pixel_y = -6+(offset*i)
if(EAST)
I.pixel_y = 8-(offset*i)
else
I.pixel_x = -7+(offset*i)
I.transform = M
AddOverlays(I)
i++
/obj/item/hand/dropped(mob/user)
..()
if(locate(/obj/structure/table) in get_step(user, user.dir))
update_icon(user.dir)
else
update_icon(0)
/obj/item/hand/pickup(mob/user as mob)
..()
update_icon()
/obj/item/hand/verb/deck_card()
set category = "Object"
set name = "Deck"
set desc = "Turn this hand of cards into a deck."
set src in usr
create_deck(usr)
/obj/item/hand/proc/create_deck(var/mob/user)
if(use_check_and_message(user, USE_DISALLOW_SILICONS) || !Adjacent(user))
return
if(!iscarbon(user))
to_chat(user, SPAN_WARNING("Your simple form can't operate \the [src]."))
if(!length(cards))
to_chat(usr, SPAN_WARNING("There are no cards in \the [src]."))
return
if(!deck_type)
to_chat(usr, SPAN_WARNING("You can't turn \the [src] into a deck."))
return
var/obj/item/deck/D = new deck_type(new(user.loc))
if(!D || !user)
return
D.cards = cards
user.visible_message(SPAN_NOTICE("<b>\The [user]</b> turns his hand into a deck."), SPAN_NOTICE("You turn your hand into a deck."))
qdel(src)
user.put_in_hands(D)
/// Lyodii *not* tarot deck.
/obj/item/deck/lyodii
name = "lyodii fatesayer deck"
icon = 'icons/obj/item/playing_cards.dmi'
icon_state = "lyodii_deck"
desc = "A traditionally-made deck of Fatesayer cards, used by the people of the Lyod to tell one's fate."
desc_extended = "These 'cards' are actually rectangular pieces of bone, engraved with different religious imagery. They are then painted with soot or blood-ink. Usually made by tribal shamans in \
agonizingly difficult work, these are hand-crafted by each tribe - thus some imagery can deviate from one another. A deck consists of 36 pieces, divided as follows: Spirits, Beasts, Winds and Paths \
each having eight cards in their stack and Bones, with four cards. Traditionally a Bone card is drawn, then one each of the rest. The Bone cards put the other four cards into perspective so one's fate \
can be determined. More modern iterations of these Fatesayer decks are also made by the few permanent settlements in the Lyod, to sell them off. They are not using real bone and the imagery is usually more \
refined and detailed, since they are machine-made."
drop_sound = 'sound/items/drop/bone_drop.ogg'
pickup_sound = 'sound/items/drop/bone_drop.ogg'
shuffle_sound = 'sound/items/cards/bone_shuffle.ogg'
hand_type = /obj/item/hand/lyodii
/obj/item/hand/lyodii
deck_type = /obj/item/deck/lyodii
desc = "A deck of lyodii Fatesayer cards."
drop_sound = 'sound/items/drop/bone_drop.ogg'
pickup_sound = 'sound/items/drop/bone_drop.ogg'
/obj/item/deck/lyodii/spirits
name = "lyodii fatesayer spirits deck"
desc = "A traditionally-made deck of Fatesayer cards, used by the people of the Lyod. This stack contains the Spirits cards. "
icon_state = "lyodii_deck"
item_state = "lyodii_deck"
/obj/item/deck/lyodii/spirits/generate_deck()
var/datum/playingcard/P
for(var/name in list("Chieftain","Shaman","Crown of Ice","Dreaming Girl","Flamewalker","Tall Stranger","Mother","Hollowed Man"))
P = new()
P.name = "[name]"
switch(name)
if("Chieftain")
P.desc = "A tall figure stands before a wind-beaten tent, draped in heavy furs. One hand holds a carved antler staff, the other is raised toward a gathering of smaller shadowy figures. The chieftain's eyes are closed in \
burdened contemplation. Behind him, the sun is barely visible over the horizon. It is associated with: leadership, burden, guidance."
if("Shaman")
P.desc = "A kneeling figure surrounded by animal bones and burning herbs. Her face is painted with blood and soot. Behind her, a spectral shape looms but no details can be made out. It is associated with: wisdom, communion \
with spirits, madness."
if("Crown of Ice")
P.desc = "A throne of cracked glacier-ice, on it sitting a crown of deep blue ice. There are two sockets embedded in the crown, one with a sapphire, one empty. It is associated with: harsh judge, death's herald."
if("Dreaming Girl")
P.desc = "A young girl sleeping in a snowdrift, untouched by cold. Above her, the night sky swirls with auroras forming vague shapes. Her expression is peaceful, but a tear of blood escapes one eye. It is associated with: \
prophecy, confusion, hidden truths."
if("Flamewalker")
P.desc = "A cloaked figure walking across an icefield. He's burning. Fire doesnt consume him—it emerges from his footprints. He carries a bundle of books and bones wrapped in red cloth. It is associated with: \
change-bringing, exile, innovation."
if("Tall Stranger")
P.desc = "A faceless, well-built and tall standing figure in fine red-gilded robes stands at atop a snowdrift. He holds a sword in one hand, the other's clenched to a fist. No footprints are left where he stands. \
It is associated with: deception, fate disguised, dishonesty."
if("Mother")
P.desc = "A woman cradling a baby in one arm, a ceremonial blade in the other. Her expression is conflicted. Behind her, two paths diverge—one leads to a firelit camp, the other into a storm. It is associated with: \
choices, nurture vs. law, duality."
if("Hollowed Man")
P.desc = "A man torso unclothed, kneels in the snow. A hole where his heart should be reveals a swirling void inside. Spirits drift around him. It is associated with: sacrifice, emptiness, spiritual rebirth."
P.card_icon = "spirits"
P.back_icon = "card_back_lyodii"
cards += P
/obj/item/deck/lyodii/paths
name = "lyodii fatesayer paths deck"
desc = "A traditionally-made deck of Fatesayer cards, used by the people of the Lyod. This stack contains the Paths cards. "
icon_state = "lyodii_deck"
item_state = "lyodii_deck"
/obj/item/deck/lyodii/paths/generate_deck()
var/datum/playingcard/P
for(var/name in list("Frozen Footprint","Shared Fire","Broken Edict","Silent Hunt","Lost Tribe","Marked Bone","Buried Blade","Icebound Oath"))
P = new()
P.name = "[name]"
switch(name)
if("Frozen Footprint")
P.desc = "A single footprint frozen solid in a cracked icy path. It glows faintly, untouched by time. Around it, scattered is a bloodied cloth and a broken spearhead. It is associated with: missed opportunity, consequences."
if("Shared Fire")
P.desc = "Several figures gather around a fire in the middle of a blizzard. Though cold rages around them, their circle is warm. Shadows on the tent walls show animals instead of people. One figure extends a \
hand to the viewer. It is associated with: community, sacrifice, loyality."
if("Broken Edict")
P.desc = "A sacred tablet cracked down the middle, one half buried in snow, the crack forms a lightning-shaped glyph. A fox sits nearby, watching. It is associated with: rebellion, righteousness, moral ambiguity."
if("Silent Hunt")
P.desc = "A hunter crouches in the snow, bow drawn, breath invisible. Behind them, a spectral beast stalks them in silence. No footprints in the snow. Both hunter and hunted wear the same carved mask. It is associated with: \
patience, waiting, unspoken action."
if("Lost Tribe")
P.desc = "A caravan of silhouettes walks endlessly across a snowplain beneath a starry sky. One member carries a banner with, but it is impossible to see what it shows. It is associated with: disconnection, wandering."
if("TMarked Bone")
P.desc = "A long, polished bone lies on a shrine, carved with fresh glyphs bleeding red ink, a spectral bird watches from above. The glyphs emit a faint glow. It is associated with: signs from the Goddess, omens."
if("Buried Blade")
P.desc = "A ritual dagger protrudes from a snowbank, only its hilt visible. Blood stains the snow nearby. The hilt is wrapped in two colors. A snowflake lands, forming a glyph for 'lies'. It is associated with: \
hidden conflict, denial."
if("Icebound Oath")
P.desc = "Two figures clasp wrists, their hands frozen together by blue ice. One looks determined, the other regretful. A small fire burns in the background. It is associated with: duty, promise, burdens kept too long."
P.card_icon = "paths"
P.back_icon = "card_back_lyodii"
cards += P
/obj/item/deck/lyodii/beasts
name = "lyodii fatesayer beasts deck"
desc = "A traditionally-made deck of Fatesayer cards, used by the people of the Lyod. This stack contains the Beasts cards."
icon_state = "lyodii_deck"
item_state = "lyodii_deck"
/obj/item/deck/lyodii/beasts/generate_deck()
var/datum/playingcard/P
for(var/name in list("Tenelote","Arctic Fox","Bisumoi","Prejoroub","Yastr","Ptarmigan","Reindeer","Snow Hare"))
P = new()
P.name = "[name]"
switch(name)
if("Tenelote")
P.desc = "A massive white-furred Tenelote, horned, stands atop a frozen ridge. Its eyes glow faintly blue, snow spirals upward around it. Broken spears stick out of its flank, yet it stands unbowed. Behind it, \
a blizzard is approaching. It is associated with: strength, endurance, ferocity."
if("Arctic Fox")
P.desc = "A small, sleek fox slinks through moonlit snow, looking back over its shoulder with knowing eyes. One pawprint glows faintly. Its tail is split in two. In the snow nearby: a discarded bone dice and a \
trail of feathers. It is associated with: cunning, hidden paths, trickery."
if("Bisumoi")
P.desc = "A towering moose-like creature with two sets of twisted antlers resembling roots and glyphs. It gazes at the viewer through milky eyes while snow falls silently around it. It is associated with: \
ancient wisdom, balance, ancestral memory."
if("Prejoroub")
P.desc = "A long-winged bird, vulture-like but with a face that resembles a skull, circles over a field strewn with bones. Feathers fall from its wings, where they land, fire erupts. Its shadow is shaped like a wolf. \
It is associated with: death, scavenging, what must be taken."
if("Yastr")
P.desc = "A flock of thin-necked bird with long wings fly across the tundra under a blazing sunset. The lead bird looks back, as if uncertain. A single figure watches from afar, unseen by the beasts. It is associated with: \
migration, movement, restlessness."
if("Ptarmigan")
P.desc = "A deceptively calm snowbird perches on a branch above a frozen lake. Beneath the ice, shadows twist and churn. One of the eyes of the bird is missing. A bloodied feather drifts down toward the viewer. It is associated with: \
danger beneath calm, betrayal."
if("Reindeer")
P.desc = "A scarred reindeer stands within a ring of tribal totems. It bows its head, offering its antlers to a shamanic figure. Runes burned into its flank. Each totem around it is engraved with different runes. \
It is associated with: loyalty, hunger, bonds."
if("Snow Hare")
P.desc = "A white hare dashes through the snow under a full moon, carrying a leaf bundle in its mouth. Behind it in the sky, there's a shooting star. Three small spirits follow behind, barely visible. Snowflakes around \
the hare are all different glyphs. It is associated with: small joys, fleeting beauty, messages."
P.card_icon = "beasts"
P.back_icon = "card_back_lyodii"
cards += P
/obj/item/deck/lyodii/winds
name = "lyodii fatesayer winds deck"
desc = "A traditionally-made deck of Fatesayer cards, used by the people of the Lyod. This stack contains the Winds cards. "
icon_state = "lyodii_deck"
item_state = "lyodii_deck"
/obj/item/deck/lyodii/winds/generate_deck()
var/datum/playingcard/P
for(var/name in list("North Wind","South Wind","East Wind","West Wind","Windless Day","Black Gale","Whisper Breeze","Stormcry"))
P = new()
P.name = "[name]"
switch(name)
if("North Wind")
P.desc = "A gentle, blue-hued gust flows over a landscape, moving over a firelit camp. Spirals of warmth rise from the fires. The wind forms a protective circle. It is associated with: mercy, home, unexpected aid."
if("South Wind")
P.desc = "A crimson gale howls down a mountainside, tearing trees from the ground. A figure walks into it, teeth bared. Faint, distorted faces can be seen in the gusts. Shattered ice-crystals fly like knives. \
It is associated with: cruelty, challenge, reckoning."
if("East Wind")
P.desc = "A pale wind carries seeds and starlight across a dark horizon. Dawn breaks just as the wind touches the earth. One cloud overhead resembles an open eye. It is associated with: beginnings, clarity, sacred insight."
if("West Wind")
P.desc = "A wind brushes over a field of grave markers made of bone. Spirits rise gently in its wake. Faint faces drift briefly along the wind. The moon watches in the sky. It is associated with: endings, \
mystery, ancestral voices."
if("Windless Day")
P.desc = "A completely still scene, a frozen lake, unmoving trees, a bird suspended in midair. A sense of being trapped in time. A small crack in the lake surface forms the glyph for 'waiting'. It is associated with: \
stagnation, hidden tension."
if("Black Gale")
P.desc = "A storm-black wind crashes into tents, tearing them apart as lightning strikes nearby. The wind has claws. Each lightning bolt forms a different rune for destruction, punishment. It is associated with: \
upheaval, divine punishment."
if("Whisper Breeze")
P.desc = "A soft breeze curls around a sleeping childs ear, one candle stands nearby. It is associated with: secrets, subtle shifts."
if("Stormcry")
P.desc = "Rain and wind mix with wailing spirit-faces. A lone figure kneels on a clifftop, arms raised in anguish. Tears fall upward, the wind feels heavy. It is associated with: rage, grief, release."
P.card_icon = "winds"
P.back_icon = "card_back_lyodii"
cards += P
/obj/item/deck/lyodii/bones
name = "lyodii fatesayer bones deck"
desc = "A traditionally-made deck of Fatesayer cards, used by the people of the Lyod. This stack contains the Bones cards. "
icon_state = "lyodii_deck"
item_state = "lyodii_deck"
/obj/item/deck/lyodii/bones/generate_deck()
var/datum/playingcard/P
for(var/name in list("Bone of Birth","Bone of Death","Bone of Choice","Goddess"))
P = new()
P.name = "[name]"
P.card_icon = "bones"
P.back_icon = "card_back_lyodii"
switch(name)
if("Bone of Birth")
P.desc = "A curved rib bone floats in a pool of water, illuminated from below. Inside it, a tiny sprout grows. In the waters reflection, the bone looks like a cradle. It is associated with: legacy, fate beginning to move."
if("Bone of Death")
P.desc = "A skull, half-buried in snow, with a single red flower growing from one eye socket. A spirit form rises behind the skull, birds fly overhead. It is associated with: inevitable ends, sacred cycles."
if("Bone of Choice")
P.desc = "A forked femur lies between two paths—one lined with fire, the other shadowy. A hand hesitates above it. The bone is marked with tally marks and blood-stained glyphs. It is associated with: the moment of truth, \
taking action."
if("Goddess")
P.desc = "A glowing, diffuse spectral form floats above a ritual circle of bones. Light spills from the heavens onto it. Snowflakes falling nearby take on different shapes of animals, eyes and hands. It is associated with: \
divine will, judgement, revelation."
P.card_icon = "goddess"
cards += P
/obj/item/storage/box/lyodii
name = "fatesayer box"
desc = "A small leather case to to hold all 36 cards of a Fatesayer deck."
icon_state = "card_holder_empty"
icon = 'icons/obj/storage/misc.dmi'
can_hold = list(/obj/item/deck, /obj/item/hand, /obj/item/card)
storage_slots = 5 //Needs to hold all five Fatesayer cards.
use_sound = 'sound/items/drop/shoes.ogg'
drop_sound = 'sound/items/drop/hat.ogg'
/obj/item/storage/box/lyodii/fill()
..()
new /obj/item/deck/lyodii/spirits(src)
new /obj/item/deck/lyodii/paths(src)
new /obj/item/deck/lyodii/beasts(src)
new /obj/item/deck/lyodii/winds(src)
new /obj/item/deck/lyodii/bones(src)