From 305038f064af7544168fc7bf2fa4a1f476202de2 Mon Sep 17 00:00:00 2001
From: "Wowzewow (Wezzy)" <42310821+alsoandanswer@users.noreply.github.com>
Date: Sun, 13 Apr 2025 18:14:05 +0800
Subject: [PATCH] Joker Poker, feat. You have UNOOOO (#20598)

- rscadd: "Streamlines card mechanics. Click on others to deal to them,
yourself to draw. Ctrl-click to draw, Alt-click to shuffle."
- rscadd: "Adds KOTAHI, the shedding type card game fun for the whole
family."
- rscadd: "Tweaks throw sound volume."
- bugfix: "Fixes some runtimes with cards."
- imageadd: "New sprites for playing cards."
Also seperates picking cards into it's own verb, and no more tooltips
when concealed. No more cheating.
(Also changes the throw sound volume, so it doesn't horribly spike the
volume when you're dealing normally)
KOTAHI sprites by CevUI, modified by myself.
---
aurorastation.dme | 1 +
code/__DEFINES/sound.dm | 2 -
code/game/objects/items.dm | 4 +-
code/game/objects/items/tajara.dm | 2 +-
code/modules/battlemonsters/items/deck.dm | 2 +-
.../preference_setup/loadout/items/toy.dm | 4 +
code/modules/games/cards.dm | 314 ++++++++++++------
code/modules/games/kotahi.dm | 38 +++
code/modules/games/tarot.dm | 20 +-
html/changelogs/wezzy_cards.yml | 62 ++++
icons/obj/item/playing_cards.dmi | Bin 0 -> 40110 bytes
icons/obj/playing_cards.dmi | Bin 35270 -> 0 bytes
sound/items/cards/cardflip.ogg | Bin 0 -> 11940 bytes
sound/items/{ => cards}/cardshuffle.ogg | Bin
14 files changed, 334 insertions(+), 115 deletions(-)
create mode 100644 code/modules/games/kotahi.dm
create mode 100644 html/changelogs/wezzy_cards.yml
create mode 100644 icons/obj/item/playing_cards.dmi
delete mode 100644 icons/obj/playing_cards.dmi
create mode 100644 sound/items/cards/cardflip.ogg
rename sound/items/{ => cards}/cardshuffle.ogg (100%)
diff --git a/aurorastation.dme b/aurorastation.dme
index e17fd0c5563..c3eb422abec 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -2254,6 +2254,7 @@
#include "code\modules\games\cardemon.dm"
#include "code\modules\games\cards.dm"
#include "code\modules\games\gamehelm.dm"
+#include "code\modules\games\kotahi.dm"
#include "code\modules\games\spaceball_cards.dm"
#include "code\modules\games\tarot.dm"
#include "code\modules\ghostroles\spawner\base.dm"
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 86af6d8c291..74468334a34 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -36,10 +36,8 @@
#define EQUIP_SOUND_VOLUME 30
#define PICKUP_SOUND_VOLUME 15
#define DROP_SOUND_VOLUME 20
-#define YEET_SOUND_VOLUME 90
#define BLOCK_SOUND_VOLUME 70
-
//default byond sound environments
#define SOUND_ENVIRONMENT_OFF -2
#define SOUND_ENVIRONMENT_NONE -1
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index d70b986fd50..8af3e54e398 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -455,12 +455,12 @@
if(SEND_SIGNAL(hit_atom, COMSIG_ATOM_PREHITBY, src, throwingdatum) & COMSIG_HIT_PREVENTED)
return
+ var/volume = get_volume_by_throwforce_and_or_w_class()
if(isliving(hit_atom)) //Living mobs handle hit sounds differently.
var/mob/living/L = hit_atom
if(L.in_throw_mode)
playsound(hit_atom, pickup_sound, PICKUP_SOUND_VOLUME, TRUE)
else
- var/volume = get_volume_by_throwforce_and_or_w_class()
if(throwforce > 0)
if(mob_throw_hit_sound)
playsound(hit_atom, mob_throw_hit_sound, volume, TRUE, -1)
@@ -471,7 +471,7 @@
else
playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1)
else
- playsound(src, drop_sound, YEET_SOUND_VOLUME)
+ playsound(src, drop_sound, volume)
var/itempush = TRUE
if(w_class < WEIGHT_CLASS_NORMAL)
diff --git a/code/game/objects/items/tajara.dm b/code/game/objects/items/tajara.dm
index e471d09b6dd..5e960c76333 100644
--- a/code/game/objects/items/tajara.dm
+++ b/code/game/objects/items/tajara.dm
@@ -37,7 +37,7 @@
/obj/item/tajcard
name = "collectable tajaran card"
desc = "A collectable card with an illustration of a famous Tajaran figure, usually found inside cigarette packets."
- icon = 'icons/obj/playing_cards.dmi'
+ icon = 'icons/obj/item/playing_cards.dmi'
icon_state = "tajcig"
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
diff --git a/code/modules/battlemonsters/items/deck.dm b/code/modules/battlemonsters/items/deck.dm
index eba49ab9c9a..ca91336e8a8 100644
--- a/code/modules/battlemonsters/items/deck.dm
+++ b/code/modules/battlemonsters/items/deck.dm
@@ -126,7 +126,7 @@
SPAN_NOTICE("You shuffle \the [src].")\
)
- playsound(src.loc, 'sound/items/cardshuffle.ogg', 100, 1, -4)
+ playsound(src.loc, 'sound/items/cards/cardshuffle.ogg', 100, 1, -4)
stored_card_names = shuffle(stored_card_names)
diff --git a/code/modules/client/preference_setup/loadout/items/toy.dm b/code/modules/client/preference_setup/loadout/items/toy.dm
index b348f2c0e62..881a5534bfb 100644
--- a/code/modules/client/preference_setup/loadout/items/toy.dm
+++ b/code/modules/client/preference_setup/loadout/items/toy.dm
@@ -11,6 +11,10 @@
display_name = "deck of cards"
path = /obj/item/deck/cards
+/datum/gear/toy/kotahi
+ display_name = "KOTAHI cards"
+ path = /obj/item/deck/kotahi
+
/datum/gear/toy/tarot
display_name = "deck of tarot cards"
path = /obj/item/deck/tarot
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 541bbb91d35..30cb16fa4f9 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -6,8 +6,23 @@
/obj/item/deck
w_class = WEIGHT_CLASS_SMALL
- icon = 'icons/obj/playing_cards.dmi'
+ icon = 'icons/obj/item/playing_cards.dmi'
var/list/cards = list()
+ 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
@@ -15,9 +30,11 @@
/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()
. = ..()
@@ -27,27 +44,13 @@
var/datum/playingcard/P
for(var/suit in list("spades","clubs","diamonds","hearts"))
- var/colour
- if(suit == "spades" || suit == "clubs")
- colour = "black_"
- else
- colour = "red_"
-
- for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten"))
+ 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 = "[colour]num"
+ P.card_icon = "[number]_[suit]"
P.back_icon = "card_back"
cards += P
- for(var/number in list("jack","queen","king"))
- P = new()
- P.name = "[number] of [suit]"
- P.card_icon = "[colour]col"
- P.back_icon = "card_back"
- cards += P
-
-
for(var/i = 0,i<2,i++)
P = new()
P.name = "joker"
@@ -55,8 +58,8 @@
cards += P
/obj/item/deck/attack_hand(mob/user)
- if(cards.len && (user.l_hand == src || user.r_hand == src))
- draw_card(user, FALSE)
+ if(length(cards) && (user.l_hand == src || user.r_hand == src))
+ deal_card(user, user)
else
..()
@@ -66,24 +69,62 @@
for(var/datum/playingcard/P in H.cards)
cards += P
qdel(attacking_item)
- to_chat(user, SPAN_NOTICE("You place your cards at the bottom of \the [src]."))
return
..()
-/obj/item/deck/verb/draw_card()
+/obj/item/deck/verb/drawcard()
set category = "Object"
set name = "Draw"
- set desc = "Draw a card from a deck."
+ set desc = "Draw a card from the deck."
set src in view(1)
- select_card(usr)
+ draw_card(usr)
-/obj/item/deck/proc/select_card(var/mob/user)
- if(use_check_and_message(user, USE_DISALLOW_SILICONS))
+/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(!cards.len)
+ 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("\The [user] 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
@@ -93,7 +134,7 @@
else if(user.r_hand && istype(user.r_hand,/obj/item/hand))
H = user.r_hand
else
- H = new /obj/item/hand(get_turf(src))
+ H = new hand_type(get_turf(src))
user.put_in_hands(H)
if(!H || !user)
@@ -102,7 +143,7 @@
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 draw?", "Deck of Cards", to_discard)
+ 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
@@ -110,43 +151,60 @@
H.cards += P
cards -= P
H.update_icon()
- user.visible_message("\The [user] draws a card.", SPAN_NOTICE("You draw the [P.name]."))
+ balloon_alert_to_viewers("\The [user] picks out a card.")
+ if(!length(cards))
+ qdel(src)
-/obj/item/deck/verb/deal_card()
+/obj/item/deck/verb/dealcard()
set category = "Object"
set name = "Deal"
- set desc = "Deal a card from a deck."
+ set desc = "Deal a card from the deck."
set src in view(1)
- if(usr.stat || !Adjacent(usr))
+ 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(!cards.len)
- to_chat(usr, SPAN_WARNING("There are no cards in the deck."))
+ 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
- var/list/players = list()
- for(var/mob/living/player in viewers(3))
- if(!player.stat)
- players += player
+ 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
- var/mob/living/M = tgui_input_list(usr, "Who do you wish to deal a card?", "Deal", players)
- if(!usr || !src || !M) return
+ if(!length(cards))
+ to_chat(user, SPAN_WARNING("There are no cards in the deck."))
+ return
- deal_at(usr, M)
+ var/obj/item/hand/H = new hand_type(user.loc)
-/obj/item/deck/proc/deal_at(mob/user, mob/target)
- var/obj/item/hand/H = new(get_step(user, user.dir))
+ H.randpixel = 6
+ H.randpixel_xy()
H.cards += cards[1]
cards -= cards[1]
- H.concealed = 1
+ H.concealed = TRUE
H.update_icon()
- if(user==target)
- user.visible_message("\The [user] deals a card to [user.get_pronoun("himself")].")
- else
- user.visible_message("\The [user] deals a card to \the [target].")
- H.throw_at(get_step(target,target.dir),10,1,H)
+ user.do_attack_animation(src, null)
+ balloon_alert_to_viewers("\The [user] 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))
@@ -158,45 +216,47 @@
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/attack_self(var/mob/user as mob)
+/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 as mob)
+ draw_card(user)
+
+/obj/item/deck/AltClick(var/mob/user as mob)
+ . = ..()
var/list/newcards = list()
- while(cards.len)
+ while(length(cards))
var/datum/playingcard/P = pick(cards)
newcards += P
cards -= P
cards = newcards
- playsound(src.loc, 'sound/items/cardshuffle.ogg', 100, 1, -4)
- user.visible_message("\The [user] shuffles [src].")
+ playsound(src.loc, 'sound/items/cards/cardshuffle.ogg', 100, 1, -4)
+ balloon_alert_to_viewers("\The [user] shuffles [src].")
-/obj/item/deck/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params)
- if(!user || !over)
- return
- if(!Adjacent(user) || !over.Adjacent(user))
- return // should stop you from dragging through windows
-
- if(!ishuman(over) || !(over in viewers(3)))
- return
-
- if(!cards.len)
- to_chat(user, SPAN_WARNING("There are no cards in the deck."))
- return
-
- deal_at(user, over)
-
-/obj/item/pack/
+/obj/item/pack
name = "card pack"
desc = "For those with disposible income."
- icon = 'icons/obj/playing_cards.dmi'
+ 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("\The [user] rips open \the [src]!")
var/obj/item/hand/H = new()
@@ -211,18 +271,22 @@
/obj/item/hand
name = "hand of cards"
desc = "Some playing cards."
- icon = 'icons/obj/playing_cards.dmi'
+ 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 = 0
+ 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(cards.len == 1 && (!concealed || Adjacent(usr)))
+ if(length(cards) == 1 && !concealed)
var/datum/playingcard/P = cards[1]
openToolTip(usr, src, params, P.name)
@@ -230,15 +294,15 @@
. = ..()
closeToolTip(usr)
-/obj/item/hand/verb/discard()
+/obj/item/hand/verb/pickcard()
set category = "Object"
- set name = "Discard"
- set desc = "Place a card from your hand in front of you."
+ set name = "Pick"
+ set desc = "Pick a card from your hand in front of you."
set src in usr
- draw_card(usr)
+ pick_card(usr)
-/obj/item/hand/proc/draw_card(var/mob/user, var/deploy_in_front = TRUE)
+/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
@@ -256,41 +320,57 @@
H.concealed = FALSE
H.update_icon()
src.update_icon()
+ playsound(src, 'sound/items/cards/cardflip.ogg', 50, TRUE)
+ balloon_alert_to_viewers("\The [user] picks out a card.")
if(deploy_in_front)
- user.visible_message("\The [user] plays \the [discarding].")
H.forceMove(get_step(usr, usr.dir))
else
- to_chat(user, SPAN_NOTICE("You draw \the [discarding]."))
user.put_in_hands(H)
- if(!cards.len)
+ if(!length(cards))
qdel(src)
/obj/item/hand/attack_hand(mob/user)
- if(cards.len > 1 && (user.l_hand == src || user.r_hand == src))
- draw_card(user, FALSE)
+ 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
- update_icon()
- user.visible_message("\The [user] [concealed ? "conceals" : "reveals"] their hand.")
+ 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("\The [user] [concealed ? "conceals" : "reveals"] their hand.")
/obj/item/hand/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
- if((!concealed || src.loc == user) && cards.len)
- if(cards.len > 1)
+ 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 ? "[P.desc]" : ""]"
/obj/item/hand/update_icon(var/direction = 0)
+ if(randpixel)
+ randpixel = 0
+ randpixel_xy(0)
- if(!cards.len)
+ if(!length(cards))
qdel(src)
return
- else if(cards.len > 1)
+ else if(length(cards) > 1)
name = "hand of cards"
desc = "Some playing cards."
else
@@ -299,29 +379,25 @@
ClearOverlays()
- if(cards.len == 1)
+ if(length(cards) == 1)
var/datum/playingcard/P = cards[1]
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
- I.pixel_x += (-5+rand(10))
- I.pixel_y += (-5+rand(10))
AddOverlays(I)
return
- var/offset = FLOOR(20/cards.len, 1)
+ var/offset = FLOOR(20/length(cards), 1)
var/matrix/M = matrix()
if(direction)
switch(direction)
if(NORTH)
- M.Translate( 0, 0)
+ M.Turn(0)
if(SOUTH)
- M.Translate( 0, 4)
+ M.Turn(180)
if(WEST)
- M.Turn(90)
- M.Translate( 3, 0)
+ M.Turn(270)
if(EAST)
M.Turn(90)
- M.Translate(-2, 0)
var/i = 0
for(var/datum/playingcard/P in cards)
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
@@ -340,12 +416,42 @@
i++
/obj/item/hand/dropped(mob/user)
- . = ..()
- if(locate(/obj/structure/table, loc))
- src.update_icon(user.dir)
+ ..()
+ if(locate(/obj/structure/table) in get_step(user, user.dir))
+ update_icon(user.dir)
else
- update_icon()
+ update_icon(0)
/obj/item/hand/pickup(mob/user as mob)
..()
- src.update_icon()
+ 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
+ balloon_alert_to_viewers("\The [user] turns his hand into a deck.")
+ qdel(src)
+ user.put_in_hands(D)
diff --git a/code/modules/games/kotahi.dm b/code/modules/games/kotahi.dm
new file mode 100644
index 00000000000..5c40e868f3b
--- /dev/null
+++ b/code/modules/games/kotahi.dm
@@ -0,0 +1,38 @@
+/obj/item/deck/kotahi
+ name = "\improper KOTAHI deck"
+ desc = "A deck of kotahi cards. House rules to argue over not included."
+ icon_state = "deck_kotahi"
+ hand_type = /obj/item/hand/kotahi
+
+/obj/item/hand/kotahi
+ deck_type = /obj/item/deck/kotahi
+
+/obj/item/deck/kotahi/generate_deck()
+ var/datum/playingcard/P
+ for(var/colour in list("red","yellow","green","blue"))
+ P = new()
+ P.name = "[colour] zero"
+ P.card_icon = "kotahi_[colour]_zero"
+ P.back_icon = "kotahi_back"
+ cards += P //kotahi decks have only one colour of each 0, weird huh?
+ for(var/number in list("skip","reverse","draw 2","one","two","three","four","five","six","seven","eight","nine")) //two of each colour of number
+ P = new()
+ P.name = "[colour] [number]"
+ P.card_icon = "kotahi_[colour]_[number]"
+ P.back_icon = "kotahi_back"
+ cards += P
+ cards += P
+
+ for(var/i = 0,i<4,i++) //4 wilds and draw 4s
+ P = new()
+ P.name = "wildcard"
+ P.card_icon = "kotahi_wild"
+ P.back_icon = "kotahi_back"
+ cards += P
+
+ for(var/i = 0,i<4,i++)
+ P = new()
+ P.name = "draw 4"
+ P.card_icon = "kotahi_draw4"
+ P.back_icon = "kotahi_back"
+ cards += P
diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm
index 6944b54c2e7..b3bba9894b4 100644
--- a/code/modules/games/tarot.dm
+++ b/code/modules/games/tarot.dm
@@ -5,6 +5,10 @@
name = "deck of tarot cards"
desc = "For all your occult needs!"
icon_state = "deck_tarot"
+ hand_type = /obj/item/hand/tarot
+
+/obj/item/hand/tarot
+ deck_type = /obj/item/deck/tarot
/obj/item/deck/tarot/generate_deck()
var/datum/playingcard/P
@@ -15,8 +19,6 @@
P.back_icon = "card_back_tarot"
cards += P
for(var/suit in list("wands","pentacles","cups","swords"))
-
-
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king"))
P = new()
P.name = "[number] of [suit]"
@@ -24,7 +26,7 @@
P.back_icon = "card_back_tarot"
cards += P
-/obj/item/deck/tarot/attack_self(var/mob/user as mob)
+/obj/item/deck/tarot/AltClick(var/mob/user as mob)
var/list/newcards = list()
while(cards.len)
var/datum/playingcard/P = pick(cards)
@@ -34,14 +36,18 @@
newcards += P
cards -= P
cards = newcards
- playsound(src.loc, 'sound/items/cardshuffle.ogg', 100, 1, -4)
- user.visible_message("\The [user] shuffles [src].")
+ playsound(src.loc, 'sound/items/cards/cardshuffle.ogg', 100, 1, -4)
+ user.visible_message("\The [user] shuffles \the [src].")
/obj/item/deck/tarot/adhomai
name = "adhomian divination cards deck"
desc = "An adhomian deck of divination cards, used to read the one's fortune or play games."
icon_state = "deck_adhomai"
+ hand_type = /obj/item/hand/tarot/adhomai
+
+/obj/item/hand/tarot/adhomai
+ deck_type = /obj/item/deck/tarot/adhomai
/obj/item/deck/tarot/adhomai/generate_deck()
var/datum/playingcard/P
@@ -119,6 +125,10 @@
name = "qwei'paqui colonist deck"
desc = "A Skrellian deck of tarot cards depicting the local constellations of planets outside Nralakk."
icon_state = "deck_nonnralakk"
+ hand_type = /obj/item/hand/tarot/nonnralakk
+
+/obj/item/hand/tarot/nonnralakk
+ deck_type = /obj/item/deck/tarot/nonnralakk
/obj/item/deck/tarot/nonnralakk/generate_deck()
var/datum/playingcard/P
diff --git a/html/changelogs/wezzy_cards.yml b/html/changelogs/wezzy_cards.yml
new file mode 100644
index 00000000000..2cf59745dee
--- /dev/null
+++ b/html/changelogs/wezzy_cards.yml
@@ -0,0 +1,62 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# - (fixes bugs)
+# wip
+# - (work in progress)
+# qol
+# - (quality of life)
+# soundadd
+# - (adds a sound)
+# sounddel
+# - (removes a sound)
+# rscadd
+# - (adds a feature)
+# rscdel
+# - (removes a feature)
+# imageadd
+# - (adds an image or sprite)
+# imagedel
+# - (removes an image or sprite)
+# spellcheck
+# - (fixes spelling or grammar)
+# experiment
+# - (experimental change)
+# balance
+# - (balance changes)
+# code_imp
+# - (misc internal code change)
+# refactor
+# - (refactors code)
+# config
+# - (makes a change to the config files)
+# admin
+# - (makes changes to administrator tools)
+# server
+# - (miscellaneous changes to server)
+#################################
+
+# Your name.
+author: Wowzewow (Wezzy)
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Streamlines card mechanics. Click on others to deal to them, yourself to draw. Ctrl-click to draw, Alt-click to shuffle."
+ - rscadd: "Adds KOTAHI, the shedding type card game fun for the whole family."
+ - rscadd: "Tweaks throw sound volume."
+ - bugfix: "Fixes some runtimes with cards."
+ - imageadd: "New sprites for playing cards."
diff --git a/icons/obj/item/playing_cards.dmi b/icons/obj/item/playing_cards.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..51bcd5a14cecbf95b53927767358f9b0067608d6
GIT binary patch
literal 40110
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
literal 0
HcmV?d00001
diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi
deleted file mode 100644
index e042e93509cd1fcc81fe09b1a92e48590fbeb815..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 35270
zcmd43c|4TS-#Y*||rN}ulF`opYUY-sk;!e?G+AyQ_QX!0`hh
z5a`e?J?;A-5Zf&4Xa7E+BzUkf6$IK781TT%TifBey_d6xx3jw&2;}#nG`-txLg`>f
zFV1-XhL3QS+vvG;$@ab*v21~$&?I4ta+xd1qKf_$u@6rWPM;4-3UQL~j?n0jgj0=R
zrk_7QVkCVjPV)G+oqQvdHs~UkZ+x<9zRURgN?(Q5duAI4SG&norw8;K-}~jX%LTGC
zx+Oze$z+B5hbtz-R~^E%V&IA=I@peGHjnQS*?TQtx>xy8K^ihn!~WDoinHV~aGlrp
zw};}L-W~?n#U*4yrw0dW&TrLg`uc#M*T@clY$wQv~aFEY0k)Z8_4gA
zPdb+HXLib-3^_F@|Eg>3;+F3s$Tb_iOFNw+=G5xY`LcgcMqG|qTbr7lDz{G0JK<1Q
z&~PZ&b4Vz<=d8q(Z`BB!q9p;ucK^h2QvXdIv{!++WW|DPoutDD^03QA^P1>VKZ*zQ
zQbtG$?uucGQtss^Pa%8acg?%Njt`34x78}2Kw>`|5q@)i?Ne60EXK3Ak6H2)S>A2w
zoVPc7Y)PlK4)?YDV8SJ(q0rtJ%;Prh9lv%S-H43|GfqRjB0tmMh`qA6Eub${N%`b(
z-)`E8+`AkCXw8%&J@t5YdXMX;OHJW1R`KC#z6IVFDIB#AzwHrb*Dk(^kE}CiPYlBC
zkKOGQQqO-2De+eO;r~$)V!i$l#q&J<`|l~0=GyD3x`C;uh2tBqE34-xi#9z`&{!<&
z&q5uz)I}2lQ%8nkbHUgdds4;ks=64d8xH<
z80?pPsSV;+0N-JtPu|9t)6;eVSu7__FpNj
z{+LSK>J(uEwH`;4o?{P%Qmfsj-p`cVM>$hwo5PJvO?`h*C9;MyAdcsQuZHNGsEBVf
zOs)N8v-M;Q29)0&M8%5;1<}A)FTu!u_#Nsnn^^jn1CuZ&orsz7$A}H=*tSN_ed|)-
zo@4@@V!t;+1Rh)NGIrsh_*G#h9?aygcn{TvFts=PuWpSlD;F8+o?(;??PzV=^
zLB;lBN6Xpqm|jlMr1!ubG8vEIY~%yk{JfFK4r0{pqQ~F32%E11ZF&`8Z5M+($At3B
z$`p<=!+ABG-a}VDrAN*~IBll5O$(Wzr%UW1T(O?FW?ytC%7Z}UAn|gugTQZoJ7UDV
zp$wlI{+IF{DCozcS146cg4fbh=hr$?(c=yd3&+z4x=}C^ZDFaP>50fO*RlJ
zLCoTrIF?L7Vx}YoHMR)m7YrGJFpj6Jf#(mL?wpX<@Sx^UH~@pr!`(
z%|q?Tyg<+ljrjt^@69j74&D@x^ZQOE``>OtwIOzXDW8X4{p!;G;@A62@>?=zlij;a
zdpkGm8`2GLiLuC#0$r-l&-NmpahR&VFV{WPoP3o#?&v
zQ|8Qhp*%u%aF7$UpZh3G=XxGkv?oJT5KJysJFv~uSYdORa@}grC2|%XM$9E*+GRwK
zn{QiP6|b=q3y}v+&bykF^{~wVvq?s5*2y#D-Gf*&(eYckx2l7$6Ee>C
zuyWb6jc!HmN=N$mZPsEAhYztiQ+OSaY8?K!&4j+G0N8`0ov>S+3XLSY51vca*9pj4
zA8ycWaa3f)>X3A@+wxCSdmQOE(%SPwNSEw1x2a3VkSQd-1m1X@IQcvgDeD!Y*LZSp
zNH^^z?EChu4_91{LV;_L-K2AF9rnD86`GoJ{*|+D!=zY?BI4&Q;+^Z3`hIok%)LK=3H4dGM
zRLp1>m_{^t?wM{3R(Gpgk&6>kAHIMSr_YAJt!G@Tr>vGtr=ujLRvLkkG^%2YTO?On
z_o8hvUwLmB`q_%f)qmw7p0gIB%sGNs-^2rT%yG6Blhuj`W^?C2G{cF`;kPhna)P->
z5QFzyID)@)`kEBq=D4YE)T)3B(nCEmtEzFqeH5C+RIn_cN}s`9o_+uR_^&Jtk?&8s
z`7i+fk6JjR^#?DgiwF}E
z%4Y{Is@}xV>!UFvKR#z4V#^`CyiqT6(|a4(G9tI56!nm3j;k;RZPc}TDoyB?-{@Cc
z;0rY;w{e3;tOH%0tfUBgz64YR5ollEaB^s9XgEE6+Cu7rXeGYb=+D!M&9f>zTuYjd
zWjm4lDx0xP4+#+WKGMkJgt@`VD=u0G>784EZND?cecBs-Kx6J?w!c6})aZUBfRCQN
z8pK%u6;S{{L~l$~OQ-zQUS$p_PcJR5o^cB1GlADrZ!X99n%Rrar{(K^4hA1|;0ovD
zMZNj1SoJ|X4FZ$*0;&EcHvXiP4z*34a>aU2>c{FLqs
ztU$Z5Zw@Rl;$}uIvhc9U*pD<_pyYg3X(g>0NcN8hH*IH#rDkSbivaod?Ytn0Ud34qo2>CXUqTIT)oTo)+lbi8KtQ<%tBiOM
zFZqX4e?}p|tCW*ZnHhc;pZFl*=?mPT@>F?K$|LdX`?(?j#Q!u;ce|Ew^F<9cCg^Pl
zm*mUW`)6B)fn)6Tew#gVzyT%|!u9s>_5Cp*IUC>@liBl+M*qi^v(be@A&0N?m_WbJ
zzHdwu9_^^s2v`>#Iqjl&54f9&O
zIV4LRX$fNL1_QwIjH|1wYqGH1(Oq-T9M0ezq|;6+
zRtbH^25p!X@BpVs$>Z_8LY5)iiuH$m
ze0%h}
z9{#~pEC#%~4I%WQ&8W?-qeFQ2By#>KWY(R;=?^fnJJya;0h<-cPt;kBl;7^`j=iDZ
zVq_V;H|On3>6*jOND=v4!-^2y;zs%38%)GAYYq_2XQQL?^w_=nJeniCPAHu@4x^*}
zPb92Get76dpW}sXT@mSBrW;uv_M7zV5U@6)wpudRKxh4zJzXZrXB)lg5;#VOO61Zo
zwR(dBx{-MK01NEr!JYv;C-3&o4W#qLw}F+`_kfySw+$tc*k;>SYWqgOIdao8XKUoZ
z-a9G=*}J?!?$ZxRaDUUe_b`$8!9%7C^1aPqRBK;uzIxjSiR=z;ev~v=Gm%EJiDd#K
z=)jiwpZ`XeI3)*h==#++l}G!wDglwUwIcK>fwVLwZvUE~B*7&4n02Es_2}hq$47ae
z(_>Mn`n^MbPAf2*>9Ezl$pGdhrpob&7r}>%EwG8N*xOLKic`;*b-|P$
zAWtE`P&!Qa2u4ZdNj-%Prp`HP;@|aUg8j?I+})L;(Yr8Zy#YH$mJZ`ioJh
zcrk9i52-b?M>Drf+%$7qka8hf(CH|n!9p{_H{kmyV$nD$6>_+WnaJzb8VJ+inW=ZU
zI89yiBuywk45dP*DB|M5ULatOE##&VLRK$_VijK18;Pr+Po729wJXjZuuR}Oj|hCT
zU_Z$`S@u@qy@kw_YPDOl57}Mn;f%n0i^N6-&KzpUMGE5{#2aQnRoYSp6*~@HUJKbu
zOkD2!ZpJhcqf|@1LPa<3Jzm9ZTe*DjS)340bL0jR+H7C5@;SqU9@Zg+%T^6``8ktA
z?-&t{0X9ZF0yZ91A|4>>%dCLQ;HK+lPm+FzWzW7#m1qX0FeH7c$%gi_y(S2^Sc82<
zRbp&+d6MV5&O=+~_0kqgA&uh2hBCHEK?Ob3fI?_a#h*?R*_gl`hd5{yN#be|rdj10wO%5F?#LW|C&BTJ{PXk&w@aElAC;=FD<}F4hs427ZgCZq}mu
zQyx0jGIJ}qBN4#K+WX~!z2qxSDea%Zrf+rw6d^&EH#0zAEP`~Ly0&T&hKe6V4y8=k
zgZJG_?41e@Sau7hqYG%PbD)lLZIGDzTcQ-q=&8ncWZkcyW)u%h9B9Z+NR8hakT@m9
z#ocnZ9{jfCXn?rT-78}|wZb9Ng^TZYJ#Z_!HI{VgfR?pkwzZ1*{{HeahmoFCL(B8X
zKB`64?0QpmGxFl}2cZ!w;lKu4l0*884{)HoK6Ql1gl@N?`?peOIU!0?$zS!FC`RxW
zr~OBhzovzh^9aMTubeJy(+~TD-`o~EWG!>~098`zh
z|GO5}|J*kF@7}3fLvQ}#--QP$0Xx|&aM(3sMIE9pIA#luyJe}OZ(cxHB48z~{iQ)R
z01ts}Hb{EF1{V{@-P=Fwy7w@>x*=Pc5k*aO>Bt5BDkf*(i=zyfs;}iN<1@eM!ptcC
zQQQ}@#x!vKP(zMd7WQvxWNFHX~K*ZUJ5kZU1|XWDQhCQHPq81(?Zg(
z?)b$p`T1v10C(^}Hqv0swnMDr0n{Q78(f3*vU-dJj^y*f<6sadQS&lraj892p*32P
zO!I8LY5NTFS*g^`dyfV6LavO>oa%L04Z|H0$WEbB%Uvf_&N8vgtLvSH%-lKO;Qi(g
z7%XfDwq_9Jcdnb`oJdlTMPmST+0BR%YAXZ+Maq;VwDE#ijQ}9JM-O@L2Lp%$t*?JV
z3Fv?lwfwoK6(gf&Y38Q1PpbgA^ZAzH)Ux)RfSmL*C@&~tUlSgQ;0+mPKbSJ;lRjU}
z-P;nUEEl;dAlxM(Cq-uL!m4bS`*PK&+z_7NV|i!6bgg-eh|<%!_j;3{ErerM2R6%J
ze5P@C9|Z5284?9i>rC%coPYiNA2wVVwi|Kg0Wg_D3>MO&*Qg%zJC;svh&FX#Dd-LP
zvVlH#=yGJetlo7vAfSbf?a~iuy_OHA6%%)POs-o*0==@^S-B-+NKxab8k9IHUv0W%~R^-uI4cO7;hgQxpKP=*YBnOh{^
z-m8h-8LIa9rEay2ih&?m+YwC2NS2RC7K46X?Hkb*KtFWm^x2TaKx>d<^g`fut6)j4
z*f!CNd9)jm5qaNtu*aZ$;*_x~ppLoR?9x_Kq^7vvGt->E=PT=L2VZ1;aMp1p43#_(
zL;U1cDd}PUTp;V`zPeMg4b!NB-hGFy9hAN;5l17sKp=!~qp>9qLDcCKkeQ+Pnr;yp
zuvz;`Y0smS8~D}!bg;{~L@hheEPMl7FFtlb`w;`r=>64NM*~Ytm88KY*FbU+tJC%V
z%9=Alw{7Xj1$*l(c-S;>xcC*Q#Dz&Jne*&ZYjJI9mcJu_LicP7L4;oNKQ2QRG{
zV9lCCSUN#12%pyPhlO{{x%WQUy9x7I3-sIh$@bx%DP$SFT@DoL$%Cj+UeiWKC3pGLA-gZD(4$D~qXda*pYIrd|GQ1Va<(GGfyQJ&T*xc%2wd;*d$Opjq@gL*=Ws;B#*@cvC#==xaW}S~xhhkiR(llW
z(fLExi~zyi>t&ny-3aQcgLLS-*T*(g7R(#-_wMgL1iBFktCeA^Jj6>BU7!7Vi#9*Z
z1c7LzBq7|BjhuUQp!ygU5+w968_5ep5QqA@m4}Ad
zKw$b}7im7d@pv&aDH{^=utbm@1fBUVsyZXQNs-vb8Tm2u2Rx_F8Rl;;z-JpYBm%P1
z*KYKM0kc)=!PbY_)YM3Ro?op%;tHYYDWE7lkKE@tFX#fK
ztu^92%ML#s!yU49w*%cJWEI8?TDJ`%=jrzmN05;xhs`*1R`LCWdTWY@+7?;|6sbGU
z#IJO)gYME$qkU6~%tfD|?FA!JYl=n$5ff2=kfj(M13r%$@#X98GYH~>2LX}d+1#g#
z+pWsXty6WIj83->DBALEi#|eHD9pdw-9>QK!}&I5f_LB8g#ru*vK)NQ!sEqkDwcJC
zn)a$^1U87ti?9=Qtr&%L){$&b55lr1P&6kC=|(f0fi+a#N~%ZxF5+&}%V;VL>_3ll
zBHi8!&pv$pNACWA$dRJl@BhEBZbqhLt?BwCVPB+8d+?S
z1?wbl(t9-(dclMXM8-p+{tg7w3`1x$t;A^~op@!&6!jRBj~)jbVT4OFV|)eio>pWMIkP>;(o_=)bS
zY7E2Hb?RkyT6A3IsG+_k>h5}htb+Z?-2pyq>AU&BlWvpvFPJnx_wF~J_-Nl7fVVS%
zw@WboEw_ly#{9L03q5$$AR;|>qeoQk)yaAsjwBEyMb1c#wu6^z2JUQ*()1Z~%m
z_m7zzazJDD26FHHtU`+rqjd19px;@5v9D$0B+eOiKn59wBTPvN=K5bv_}+@2X2~
z_d|hctPYXhWzBCj7!5Yp0DkDX|7zzE0@*9(!+myDaCvTePp|Gq;uS{Tt};V90w+-p
z-Xiph|5cnFbX)e&;!*RCM+Gxy@J<(@H*-%@8WK^`_E*io`Q<-^c}IGkE?z*f?3_$a$zjdRS8GeJc&{`%TWDSF<}j&q*x4DC)+
zGOODhG-Ez5`%d$vlVy_gX2`Rf7qZ*(fQiopKK*at(_@Vu>hntaCgEC78
zPna~SKy>9VMR)3E!oS~^{V%Q=ifG6@aT0jO1tg}qmy}M@2t|u4fr3Z{*U0fFM}($F
zREO>K-NCCOL$O0o;wBR>JsWPDJR2giTmZh!Oj1`}fKY!FMG$@R?=}sO%xF&)@`FI=
z;*oscwG)&Tunav#?oKC|SWS;0%GXgnOz=)$mN(f!E@s~aXX+MYC|0wpXO`pLU7MG5
zjY&3G@u081ydWED)`p+|)V^QBwa6AY{RWtBM5%V0eo3Qrl)KMB*Cz@nFE;%p*1n6J
zFALD1?@0V+SRr26F6hqORH){yozw(1A?OphqVn)^+ir7;#_Wp9N8fCc!14KPt(nN`
z^K$*s(+>I`i#j8L<{+S#qcmOG;_0}npV-{%tGEhKhAoZjFxy9~r-8b&v;xseF?S96
z#m{mgTLq@RHcn-{f4Z(Qdxj0RL3Okr*mTtk!kX{6j>d)Z67$_#p9JA{)%%p33Jdn;
zWHZ9sVW>y9Kw5MRyiEk|+CpW&T#p-<`=Ij7de)7yk~q%XSsxp%aOO7w6Qm-0--b>h
zUf4hV#)e!I35$%}2Xw!PleV_j7~5}u69l@Mcr5f+>FQoD-pQKDf$M#S%;tHRFGjq+
z!iDW-*6)z~k`kruH~U=38&aY$mqS^Qq|e!m8{@p7e8wk1)-d*oDeo`&o#8Pyn8*ea
zoZ8l*Sj}HyQw&%a1hwD3_W){pjrF-5Ph<9I>B#Pw4Cnz(z?k_4vD>b{UyuUi$Rb
zAiMR>=s7j}^`jq@10-$^W}EwEUaW82PL$R9$GvusrZ4_496%Y7dxhT>B0kf8Zzf{MY#%MB9+79-x!$PhyuqY5foVKOQer6bZuy4Zk+x
z95mk|s-LX-h|_+H|C+Q=9wPWf#Rr<)3RLm|@Tz>1zAgT1%0jtvtN}6|{xk5|=MUIv
zMQrnW91MjF1fwB&%-8YER~j~o@-w~IvrFiJMJfv{uO3oaCjj_Z0}rCnfSpTBP0R*R
z6WzFtV?nI&zu(VMIEe*pCy&nQ{KHUlsfJ6&LD;tVz%0Tf3qHR+2!mDmBANdgSsiK0
z3_7qCr|D5p8ea4-APMxaVV<=AN^R1ai=>Q~_f>$>r2$aM+
zT5|_D@UOe-ZcF-TaG_2mmK&j&g=?J!