From 22aa3566ab3ccdfbe85f5c6fc427b5ce753e80af Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 2 May 2022 18:56:30 -0500 Subject: [PATCH] Card Shark DLC - GIMMIE MY MONEY OR I BREAK YOUR KNEECAPS (#64200) Co-authored-by: Seth Scherer Co-authored-by: Kylerace --- _maps/shuttles/whiteship_delta.dmm | 40 +- code/__DEFINES/memory_defines.dm | 36 +- code/_globalvars/lists/maintenance_loot.dm | 1 + code/_globalvars/phobias.dm | 4 +- .../mood_events/generic_negative_events.dm | 5 + .../mood_events/generic_positive_events.dm | 21 + .../effects/spawners/random/entertainment.dm | 10 +- code/game/objects/items/toys.dm | 480 +----------------- code/game/objects/structures/tables_racks.dm | 32 +- code/modules/cards/cardhand.dm | 143 ++++++ code/modules/cards/cards.dm | 114 +++++ code/modules/cards/deck/blank.dm | 21 + code/modules/cards/deck/cas.dm | 38 ++ code/modules/cards/deck/deck.dm | 246 +++++++++ code/modules/cards/deck/kotahi.dm | 21 + code/modules/cards/deck/tarot.dm | 59 +++ code/modules/cards/deck/wizoff.dm | 34 ++ code/modules/cards/singlecard.dm | 242 +++++++++ code/modules/clothing/glasses/_glasses.dm | 15 + code/modules/events/holiday/vday.dm | 4 +- code/modules/games/cas.dm | 157 ------ code/modules/games/kotahi.dm | 20 - code/modules/games/tarot.dm | 25 - code/modules/games/wizoff.dm | 26 - code/modules/holodeck/holo_effect.dm | 37 +- code/modules/holodeck/items.dm | 18 + .../living/simple_animal/guardian/guardian.dm | 2 +- code/modules/surgery/organs/eyes.dm | 8 + code/modules/unit_tests/create_and_destroy.dm | 2 + code/modules/vending/games.dm | 2 + icons/obj/playing_cards.dmi | Bin 0 -> 8456 bytes icons/obj/toy.dmi | Bin 64433 -> 41664 bytes sound/items/cardflip.ogg | Bin 0 -> 13775 bytes strings/cas_white.txt | 1 - strings/memories.json | 26 +- strings/tips.txt | 1 + tgstation.dme | 13 +- 37 files changed, 1112 insertions(+), 792 deletions(-) create mode 100644 code/modules/cards/cardhand.dm create mode 100644 code/modules/cards/cards.dm create mode 100644 code/modules/cards/deck/blank.dm create mode 100644 code/modules/cards/deck/cas.dm create mode 100644 code/modules/cards/deck/deck.dm create mode 100644 code/modules/cards/deck/kotahi.dm create mode 100644 code/modules/cards/deck/tarot.dm create mode 100644 code/modules/cards/deck/wizoff.dm create mode 100644 code/modules/cards/singlecard.dm delete mode 100644 code/modules/games/cas.dm delete mode 100644 code/modules/games/kotahi.dm delete mode 100644 code/modules/games/tarot.dm delete mode 100644 code/modules/games/wizoff.dm create mode 100644 icons/obj/playing_cards.dmi create mode 100644 sound/items/cardflip.ogg diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index a6be9a81cf3..6ed39a4701c 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -1396,22 +1396,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) -"cU" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = 3; - pixel_y = -1 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/medbay) "cV" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt/dust, @@ -1952,6 +1936,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) +"Ch" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/area/shuttle/abandoned/medbay) "DZ" = ( /obj/effect/turf_decal/delivery/white, /obj/effect/decal/cleanable/dirt/dust, @@ -1966,7 +1966,7 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) -"FO" = ( +"IO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/table, /obj/item/toy/cards/deck{ @@ -1974,7 +1974,7 @@ pixel_y = 12 }, /obj/item/toy/cards/cardhand{ - init_cards = list("2 of Diamonds","3 of Clubs"); + cards = list("2 of Diamonds","3 of Clubs"); pixel_x = -5 }, /obj/item/reagent_containers/food/drinks/bottle/beer{ @@ -2366,7 +2366,7 @@ aa aa aa vm -cU +Ch dn vm dS @@ -2450,7 +2450,7 @@ cy "} (20,1,1) = {" af -FO +IO aH bb bu diff --git a/code/__DEFINES/memory_defines.dm b/code/__DEFINES/memory_defines.dm index 7229b70c4da..9eeb823b431 100644 --- a/code/__DEFINES/memory_defines.dm +++ b/code/__DEFINES/memory_defines.dm @@ -53,30 +53,30 @@ ///this memory can be memorized by unconscious people. #define MEMORY_SKIP_UNCONSCIOUS (1<<8) -//These defines are for what notable event happened. they correspond to the json lists related to the memory -///a memory of completing a surgery. +// These defines are for what notable event happened. they correspond to the json lists related to the memory +/// A memory of completing a surgery. #define MEMORY_SUCCESSFUL_SURGERY "surgery" -///a memory of priming a bomb +/// A memory of priming a bomb #define MEMORY_BOMB_PRIMED "bomb" -///a memory of pulling off either a high five or a high ten +/// A memory of pulling off either a high five or a high ten #define MEMORY_HIGH_FIVE "highfive" -///a memory of getting borged +/// A memory of getting borged #define MEMORY_BORGED "borged" -///a memory of dying! includes time of death +/// A memory of dying! includes time of death #define MEMORY_DEATH "death" -///a memory of being creampied! Mentions where +/// A memory of being creampied! Mentions where #define MEMORY_CREAMPIED "creampied" -///a memory of being slipped! Mentions on what +/// A memory of being slipped! Mentions on what #define MEMORY_SLIPPED "slipped" -///A memory of letting my spaghetti spill, how embarrasing! +/// A memory of letting my spaghetti spill, how embarrasing! #define MEMORY_SPAGHETTI_SPILL "spaghetti_spilled" -///A memory of getting a kiss blown. Provides the kisser and kissee. +/// A memory of getting a kiss blown. Provides the kisser and kissee. #define MEMORY_KISS "kiss" -///A memory of a really good meal +/// A memory of a really good meal #define MEMORY_MEAL "meal" -///A memory of a really good drink +/// A memory of a really good drink #define MEMORY_DRINK "drink" -///A memory of being lit +/// A memory of being lit #define MEMORY_FIRE "fire" /// A memory of limb loss #define MEMORY_DISMEMBERED "dismembered" @@ -98,6 +98,11 @@ #define MEMORY_SUPERMATTER_DUSTED "supermatter_dusted" /// Nuke ops nuke code memory #define MEMORY_NUKECODE "nuke_code" +/// A memory of having to play 52 card pickup +#define MEMORY_PLAYING_52_PICKUP "playing_52_pickup" +/// A memory of playing cards with others +#define MEMORY_PLAYING_CARDS "playing_cards" + /** * These are also memories, but they're examples of what I kinda don't want to be memories. They're stuff that I had to port @@ -152,5 +157,10 @@ #define DETAIL_MEDAL_TYPE "MEDAL_TYPE" #define DETAIL_MEDAL_REASON "MEDAL_REASON" #define DETAIL_NUKE_CODE "NUKE_CODE" +// for cardgames +#define DETAIL_PLAYERS "PLAYERS" +#define DETAIL_CARDGAME "CARDGAME" +#define DETAIL_DEALER "DEALER" +#define DETAIL_HELD_CARD_ITEM "HELD_CARD_ITEM" // could either be a singlecard, cardhand, or a deck diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index f68208cf3e8..81224a93dc6 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -354,6 +354,7 @@ GLOBAL_LIST_INIT(oddity_loot, list(//oddity: strange or crazy items /obj/item/instrument/trombone/spectral = 1, /obj/item/instrument/trumpet/spectral = 1, ) = 1, + /obj/item/toy/cards/deck/tarot/haunted = 1, )) //Maintenance loot spawner pools diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index b137ba3779a..2c7c90f70f0 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -309,11 +309,8 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/suit/wizrobe, /obj/item/clothing/under/rank/civilian/chaplain, - /obj/item/clothing/under/rank/civilian/chaplain, /obj/item/cult_bastard, /obj/item/gun/magic/staff, - /obj/item/gun/magic/staff, - /obj/item/gun/magic/wand, /obj/item/gun/magic/wand, /obj/item/melee/cultblade, /obj/item/necromantic_stone, @@ -333,6 +330,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/narsie, /obj/structure/destructible/cult, /obj/structure/spirit_board, + /obj/item/toy/cards/deck/tarot, )), "aliens" = typecacheof(list( diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 8b1073b5d07..9eb1e961bc7 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -370,3 +370,8 @@ description = "If I'm not good at video games, can I truly call myself a gamer?" mood_change = -10 timeout = 10 MINUTES + +/datum/mood_event/lost_52_card_pickup + description = "This is really embarrassing! I'm ashamed to pick up all these cards off the floor..." + mood_change = -3 + timeout = 3 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index fbfdde4d707..44acc5a3228 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -272,3 +272,24 @@ mood_change = 10 timeout = 5 MINUTES +/datum/mood_event/won_52_card_pickup + description = "HA! That loser will be picking cards up for a long time!" + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/playing_cards + description = "I'm enjoying playing cards with other people!" + mood_change = 2 + timeout = 3 MINUTES + +/datum/mood_event/playing_cards/add_effects(param) + var/card_players = 1 + for(var/mob/living/carbon/player in viewers(COMBAT_MESSAGE_RANGE, owner)) + var/player_has_cards = player.is_holding(/obj/item/toy/singlecard) || player.is_holding_item_of_type(/obj/item/toy/cards) + if(player_has_cards) + card_players++ + if(card_players > 5) + break + + mood_change *= card_players + return ..() diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 84d5842a116..fc3b1bbd8cb 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -208,12 +208,10 @@ name = "deck spawner" icon_state = "deck" loot = list( - /obj/item/toy/cards/deck = 10, - /obj/item/toy/cards/deck/kotahi = 3, - /obj/item/toy/cards/deck/wizoff = 3, - /obj/item/toy/cards/deck/tarot = 2, - /obj/item/toy/cards/deck/cas = 1, - /obj/item/toy/cards/deck/cas/black = 1, + /obj/item/toy/cards/deck = 5, + /obj/item/toy/cards/deck/kotahi = 2, + /obj/item/toy/cards/deck/wizoff = 2, + /obj/item/toy/cards/deck/tarot = 1, ) /obj/effect/spawner/random/entertainment/toy_figure diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b980975edcf..60aa2e9f61e 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -10,7 +10,6 @@ * AI core prizes * Toy codex gigas * Skeleton toys - * Cards * Toy nuke * Fake meteor * Foam armblade @@ -27,14 +26,12 @@ * Fake Pierced Reality * Intento */ - /obj/item/toy throwforce = 0 throw_speed = 3 throw_range = 7 force = 0 - /* * Balloons */ @@ -45,7 +42,6 @@ icon_state = "waterballoon-e" inhand_icon_state = "balloon-empty" - /obj/item/toy/waterballoon/Initialize(mapload) . = ..() create_reagents(10) @@ -152,7 +148,6 @@ else return ..() - /obj/item/toy/balloon/proc/pop_balloon(monkey_pop = FALSE) playsound(src, 'sound/effects/cartoon_pop.ogg', 50, vary = TRUE) if(monkey_pop) // Monkeys make money from popping bloons @@ -191,14 +186,12 @@ SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) . = ..() - /obj/item/toy/balloon/syndicate/Destroy() if(ismob(loc)) var/mob/M = loc SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) . = ..() - /obj/item/toy/balloon/arrest name = "arreyst balloon" desc = "A half inflated balloon about a boyband named Arreyst that was popular about ten years ago, famous for making fun of red jumpsuits as unfashionable." @@ -303,8 +296,6 @@ user.death(FALSE) user.ghostize(FALSE) - - /* * Toy gun: Why isn't this an /obj/item/gun? */ @@ -412,7 +403,6 @@ clumsy_check = FALSE) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, .proc/on_transform) - /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. * @@ -473,7 +463,6 @@ w_class = WEIGHT_CLASS_SMALL resistance_flags = FLAMMABLE - /obj/item/toy/windup_toolbox name = "windup toolbox" desc = "A replica toolbox that rumbles when you turn the key." @@ -580,7 +569,6 @@ /* * Snap pops */ - /obj/item/toy/snappop name = "snap pop" desc = "Wow!" @@ -733,462 +721,9 @@ phomeme = "griffin" w_class = WEIGHT_CLASS_SMALL -/* -|| A Deck of Cards for playing various games of chance || -*/ -/obj/item/toy/cards - resistance_flags = FLAMMABLE - max_integrity = 50 - ///The parent deck of the cards - var/datum/weakref/parentdeck - ///Artistic style of the deck - var/deckstyle = "nanotrasen" - var/card_hitsound = null - var/card_force = 0 - var/card_throwforce = 0 - var/card_throw_speed = 3 - var/card_throw_range = 7 - var/list/card_attack_verb_continuous = list("attacks") - var/list/card_attack_verb_simple = list("attack") - - -/obj/item/toy/cards/Initialize(mapload) - . = ..() - if(card_attack_verb_continuous) - card_attack_verb_continuous = string_list(card_attack_verb_continuous) - if(card_attack_verb_simple) - card_attack_verb_simple = string_list(card_attack_verb_simple) - - -/obj/item/toy/cards/suicide_act(mob/living/carbon/user) - user.visible_message(span_suicide("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like [user.p_they()] [user.p_have()] a crummy hand!")) - playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) - return BRUTELOSS - -/** - * ## apply_card_vars - * - * Applies variables for supporting multiple types of card deck - */ -/obj/item/toy/cards/proc/apply_card_vars(obj/item/toy/cards/newobj, obj/item/toy/cards/sourceobj) - if(!istype(sourceobj)) - return - -/** - * ## add_card - * - * Adds a card to the deck (or hand of cards). - * - * Arguments: - * * mob/user - The user adding the card. - * * list/cards - The list of cards the user is adding to. - * * obj/item/toy/cards/card_to_add - The card (or hand of cards) that will be added back into the deck - */ -/obj/item/toy/cards/proc/add_card(mob/user, list/cards, obj/item/toy/cards/card_to_add) - ///Are we adding a hand of cards to the deck? - var/from_cardhand = FALSE - ///Are we adding to a hand of cards? - var/to_cardhand = FALSE - if (istype(card_to_add, /obj/item/toy/cards/cardhand)) - from_cardhand = TRUE - if (istype(src, /obj/item/toy/cards/cardhand)) - to_cardhand = TRUE - - if ((card_to_add.parentdeck != src.parentdeck) && (card_to_add.parentdeck != WEAKREF(src))) - to_chat(user, span_warning("You can't mix cards from other decks!")) - return - if (!user.temporarilyRemoveItemFromInventory(card_to_add)) - to_chat(user, span_warning("The [from_cardhand ? "hand of cards" : "card"] is stuck to your hand, you can't add it to [to_cardhand ? "your hand" : "the deck"]!")) - return - - if (from_cardhand) - var/obj/item/toy/cards/cardhand/cards_to_add = card_to_add - for (var/obj/item/toy/cards/singlecard/card in cards_to_add.cards) - card.loc = src - cards += card - else - var/obj/item/toy/cards/singlecard/card = card_to_add - card.loc = src - cards += card - - user.visible_message(span_notice("[user] adds [from_cardhand ? "the hand of cards" : "a card"] to [to_cardhand ? "[user.p_their()] hand" : "the bottom of the deck"]."), span_notice("You add the [from_cardhand ? "hand of cards" : "card"] to [to_cardhand ? "your hand" : "the bottom of the deck"].")) - update_appearance() - -/** - * ## draw_card - * - * Draws a card from the deck (or hand of cards). - * - * Arguments: - * * mob/user - The user drawing from the deck. - * * list/cards - The list of cards the user is drawing from. - * * obj/item/toy/cards/singlecard/forced_card (optional) - Used to force the card drawn from the deck - */ -/obj/item/toy/cards/proc/draw_card(mob/user, list/cards, obj/item/toy/cards/singlecard/forced_card = null) - if(isliving(user)) - var/mob/living/living_user = user - if(!(living_user.mobility_flags & MOBILITY_PICKUP)) - return - if(cards.len == 0) - to_chat(user, span_warning("There are no more cards to draw!")) - return - - ///Are we drawing from a hand of cards? - var/from_cardhand = FALSE - if (istype(src, /obj/item/toy/cards/cardhand)) - from_cardhand = TRUE - - var/obj/item/toy/cards/singlecard/card_to_draw - if (forced_card) - card_to_draw = forced_card - else - card_to_draw = cards[1] - - cards -= card_to_draw - card_to_draw.pickup(user) - user.put_in_hands(card_to_draw) - user.visible_message(span_notice("[user] draws a card from [from_cardhand ? "[user.p_their()] hand" : "the deck"]."), span_notice("You draw a card from [from_cardhand ? "your hand" : "the deck"].")) - update_appearance() - return card_to_draw - -/obj/item/toy/cards/deck - name = "deck of cards" - desc = "A deck of space-grade playing cards." - icon = 'icons/obj/toy.dmi' - deckstyle = "nanotrasen" - icon_state = "deck_nanotrasen_full" - worn_icon_state = "card" - w_class = WEIGHT_CLASS_SMALL - ///Deck shuffling cooldown. - COOLDOWN_DECLARE(shuffle_cooldown) - ///Tracks holodeck cards, since they shouldn't be infinite - var/obj/machinery/computer/holodeck/holo = null - ///Cards in this deck - var/list/cards = list() - -/obj/item/toy/cards/deck/Initialize(mapload) - . = ..() - AddElement(/datum/element/drag_pickup) - populate_deck() - -/** - * ## generate_card - * - * Generates a new playing card, and assigns all of the necessary variables. - * - * Arguments: - * * name - The name of the playing card. - */ -/obj/item/toy/cards/deck/proc/generate_card(name) - var/obj/item/toy/cards/singlecard/card_to_add = new/obj/item/toy/cards/singlecard() - if(holo) - holo.spawned += card_to_add - card_to_add.cardname = name - card_to_add.parentdeck = WEAKREF(src) - card_to_add.apply_card_vars(card_to_add, src) - return card_to_add - -/** - * ## populate_deck - * - * Generates all the cards within the deck. - */ -/obj/item/toy/cards/deck/proc/populate_deck() - icon_state = "deck_[deckstyle]_full" - for(var/suit in list("Hearts", "Spades", "Clubs", "Diamonds")) - cards += generate_card("Ace of [suit]") - for(var/i in 2 to 10) - cards += generate_card("[i] of [suit]") - for(var/person in list("Jack", "Queen", "King")) - cards += generate_card("[person] of [suit]") - -/obj/item/toy/cards/deck/attack_hand(mob/living/user, list/modifiers) - if (!user.combat_mode) - draw_card(user, cards) - else - return ..() - -/obj/item/toy/cards/deck/update_icon_state() - switch(cards.len) - if(27 to INFINITY) - icon_state = "deck_[deckstyle]_full" - if(11 to 27) - icon_state = "deck_[deckstyle]_half" - if(1 to 11) - icon_state = "deck_[deckstyle]_low" - else - icon_state = "deck_[deckstyle]_empty" - return ..() - -#define DECK_SHUFFLE_COOLDOWN 5 SECONDS -/obj/item/toy/cards/deck/attack_self(mob/user) - if(!COOLDOWN_FINISHED(src, shuffle_cooldown)) - return - COOLDOWN_START(src, shuffle_cooldown, DECK_SHUFFLE_COOLDOWN) - cards = shuffle(cards) - playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) - user.visible_message(span_notice("[user] shuffles the deck."), span_notice("You shuffle the deck.")) -#undef DECK_SHUFFLE_COOLDOWN - -/obj/item/toy/cards/deck/attackby(obj/item/item, mob/living/user, params) - if(istype(item, /obj/item/toy/cards/singlecard) || istype(item, /obj/item/toy/cards/cardhand)) - add_card(user, cards, item) - else - return ..() - -/obj/item/toy/cards/cardhand - name = "hand of cards" - desc = "A number of cards not in a deck, customarily held in ones hand." - icon = 'icons/obj/toy.dmi' - icon_state = "none" - worn_icon_state = "card" - w_class = WEIGHT_CLASS_TINY - ///Cards in this hand of cards. - var/list/cards = list() - ///List of cards to add into the hand on initialization (used for mapping mostly) - var/list/init_cards = list() - -/obj/item/toy/cards/cardhand/Initialize() - . = ..() - if (init_cards.len > 0) - for (var/card in init_cards) - var/obj/item/toy/cards/singlecard/new_card = new /obj/item/toy/cards/singlecard(src) - new_card.cardname = card - new_card.Flip() - cards += new_card - update_sprite() - -/obj/item/toy/cards/cardhand/add_card(mob/user, list/cards, obj/item/toy/cards/card_to_add) - . = ..() - interact(user) - update_sprite() - -/obj/item/toy/cards/cardhand/attack_self(mob/user) - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - if(!(human_user.mobility_flags & MOBILITY_USE)) - return - if(user.stat || !ishuman(user)) - return - interact(user) - - var/list/handradial = list() - for(var/obj/item/toy/cards/singlecard/card in cards) - handradial[card] = image(icon = src.icon, icon_state = "sc_[card.name]_[deckstyle]") - - var/obj/item/toy/cards/singlecard/choice = show_radial_menu(usr, src, handradial, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 36, require_near = TRUE) - if(!choice) - return FALSE - draw_card(user, cards, choice) - - interact(user) - if(length(cards) == 1) - var/obj/item/toy/cards/singlecard/last_card = draw_card(user, cards) - qdel(src) - last_card.pickup(user) - user.put_in_hands(last_card) - to_chat(user, span_notice("You also take [last_card.cardname] and hold it.")) - else - update_sprite() - -/obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/card, mob/living/user, params) - if(istype(card)) - if (!card.flipped) - card.Flip() // flip so that the card appears properly in the hand - add_card(user, cards, card) - else - return ..() - -/obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj, obj/item/toy/cards/sourceobj) - ..() - newobj.deckstyle = sourceobj.deckstyle - update_sprite() - newobj.card_hitsound = sourceobj.card_hitsound - newobj.card_force = sourceobj.card_force - newobj.card_throwforce = sourceobj.card_throwforce - newobj.card_throw_speed = sourceobj.card_throw_speed - newobj.card_throw_range = sourceobj.card_throw_range - newobj.card_attack_verb_continuous = sourceobj.card_attack_verb_continuous //null or unique list made by string_list() - newobj.card_attack_verb_simple = sourceobj.card_attack_verb_simple //null or unique list made by string_list() - newobj.resistance_flags = sourceobj.resistance_flags - -/** - * ## check_menu - * - * Checks if we are allowed to interact with a radial menu - * - * Arguments: - * * user - The mob interacting with a menu - */ -/obj/item/toy/cards/cardhand/proc/check_menu(mob/living/user) - if(!istype(user)) - return FALSE - if(user.incapacitated()) - return FALSE - return TRUE - -/** - * ## update_sprite - * - * This proc updates the sprite for when you create a hand of cards - */ -/obj/item/toy/cards/cardhand/proc/update_sprite() - cut_overlays() - var/overlay_cards = cards.len - - var/k = overlay_cards == 2 ? 1 : overlay_cards - 2 - for(var/i = k; i <= overlay_cards; i++) - var/obj/item/toy/cards/singlecard/card = cards[i] - var/card_overlay = image(icon = src.icon, icon_state = "sc_[card.cardname]_[deckstyle]", pixel_x = (1 - i + k) * 3, pixel_y = (1 - i + k) * 3) - add_overlay(card_overlay) - -/obj/item/toy/cards/singlecard - name = "card" - desc = "A playing card used to play card games like poker." - icon = 'icons/obj/toy.dmi' - icon_state = "singlecard_down_nanotrasen" - worn_icon_state = "card" - w_class = WEIGHT_CLASS_TINY - pixel_x = -5 - ///The name of the card - var/cardname = null - ///is the card facedown (F), or faceup (T)? - var/flipped = FALSE - -/obj/item/toy/cards/singlecard/examine(mob/user) - . = ..() - if(ishuman(user)) - var/mob/living/carbon/human/cardUser = user - if(cardUser.is_holding(src)) - cardUser.visible_message(span_notice("[cardUser] checks [cardUser.p_their()] card."), span_notice("The card reads: [cardname].")) - else - . += span_warning("You need to have the card in your hand to check it!") - -/** - * ## Flip - * - * flips the card over - */ -/obj/item/toy/cards/singlecard/verb/Flip() - set name = "Flip Card" - set category = "Object" - set src in range(1) - if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) - return - if(!flipped) - src.flipped = TRUE - if (cardname) - src.icon_state = "sc_[cardname]_[deckstyle]" - src.name = src.cardname - else - src.icon_state = "sc_Ace of Spades_[deckstyle]" - src.name = "What Card" - src.pixel_x = 5 - else if(flipped) - src.flipped = FALSE - src.icon_state = "singlecard_down_[deckstyle]" - src.name = "card" - src.pixel_x = -5 - -/** - * ## do_cardhand - * - * Creates, or adds to an existing hand of cards - * - * Arguments: - * * mob/living/user - the user - * * list/cards - the list of cards being added together (/obj/item/toy/cards/singlecard) - * * obj/item/toy/cards/cardhand/given_hand (optional) - the cardhand to add said cards into - */ -/obj/item/toy/cards/singlecard/proc/do_cardhand(mob/living/user, list/cards, obj/item/toy/cards/cardhand/given_hand = null) - if (given_hand && (given_hand?.parentdeck != parentdeck)) - to_chat(user, span_warning("You can't mix cards from other decks!")) - return - for (var/obj/item/toy/cards/singlecard/card in cards) - if (card.parentdeck != parentdeck) - to_chat(user, span_warning("You can't mix cards from other decks!")) - return - - var/obj/item/toy/cards/cardhand/new_cardhand = given_hand - var/preexisting = TRUE // does the cardhand already exist, or are we making a new one - if (!new_cardhand) - preexisting = FALSE - new_cardhand = new /obj/item/toy/cards/cardhand(user.loc) - - for (var/obj/item/toy/cards/singlecard/card in cards) - user.dropItemToGround(card) // drop them all so the loc will properly update - if (!card.flipped) - card.Flip() // flip so the card shows up in the cardhand properly - new_cardhand.cards += card - - if (preexisting) - new_cardhand.interact(user) - new_cardhand.update_sprite() - - user.visible_message(span_notice("[user] adds a card to [user.p_their()] hand."), span_notice("You add the [cardname] to your hand.")) - else - new_cardhand.parentdeck = parentdeck - new_cardhand.apply_card_vars(new_cardhand, src) - to_chat(user, span_notice("You combine the cards into a hand.")) - - new_cardhand.pickup(user) - user.put_in_active_hand(new_cardhand) - - for (var/obj/item/toy/cards/singlecard/card in cards) - card.loc = new_cardhand // move the cards into the cardhand - -/obj/item/toy/cards/singlecard/attackby(obj/item/item, mob/living/user, params) - if(istype(item, /obj/item/toy/cards/singlecard/)) - do_cardhand(user, list(src, item)) - if(istype(item, /obj/item/toy/cards/cardhand/)) - do_cardhand(user, list(src), item) - else - return ..() - -/obj/item/toy/cards/singlecard/attack_self(mob/living/carbon/human/user) - if(!ishuman(user) || !(user.mobility_flags & MOBILITY_USE)) - return - Flip() - -/obj/item/toy/cards/singlecard/apply_card_vars(obj/item/toy/cards/singlecard/newobj,obj/item/toy/cards/sourceobj) - ..() - newobj.deckstyle = sourceobj.deckstyle - newobj.icon_state = "singlecard_down_[deckstyle]" // Without this the card is invisible until flipped. It's an ugly hack, but it works. - newobj.card_hitsound = sourceobj.card_hitsound - newobj.hitsound = newobj.card_hitsound - newobj.card_force = sourceobj.card_force - newobj.force = newobj.card_force - newobj.card_throwforce = sourceobj.card_throwforce - newobj.throwforce = newobj.card_throwforce - newobj.card_throw_speed = sourceobj.card_throw_speed - newobj.throw_speed = newobj.card_throw_speed - newobj.card_throw_range = sourceobj.card_throw_range - newobj.throw_range = newobj.card_throw_range - newobj.attack_verb_continuous = newobj.card_attack_verb_continuous = sourceobj.card_attack_verb_continuous //null or unique list made by string_list() - newobj.attack_verb_simple = newobj.card_attack_verb_simple = sourceobj.card_attack_verb_simple //null or unique list made by string_list() - -/* -|| Syndicate playing cards, for pretending you're Gambit and playing poker for the nuke disk. || -*/ - -/obj/item/toy/cards/deck/syndicate - name = "suspicious looking deck of cards" - desc = "A deck of space-grade playing cards. They seem unusually rigid." - icon_state = "deck_syndicate_full" - deckstyle = "syndicate" - card_hitsound = 'sound/weapons/bladeslice.ogg' - card_force = 5 - card_throwforce = 10 - card_throw_speed = 3 - card_throw_range = 7 - card_attack_verb_continuous = list("attacks", "slices", "dices", "slashes", "cuts") - card_attack_verb_simple = list("attack", "slice", "dice", "slash", "cut") - resistance_flags = NONE - /* * Fake nuke */ - /obj/item/toy/nuke name = "\improper Nuclear Fission Explosive toy" desc = "A plastic model of a Nuclear Fission Explosive." @@ -1222,16 +757,15 @@ to_chat(user, span_alert("Nothing happens, and '[round(timeleft/10)]' appears on the small display.")) sleep(5) - /obj/item/toy/nuke/emag_act(mob/user) if (obj_flags & EMAGGED) return to_chat(user, span_warning("You short-circuit \the [src].")) obj_flags |= EMAGGED + /* * Fake meteor */ - /obj/item/toy/minimeteor name = "\improper Mini-Meteor" desc = "Relive the excitement of a meteor shower! SweetMeat-eor Co. is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor." @@ -1286,7 +820,6 @@ /* * Snowballs */ - /obj/item/toy/snowball name = "snowball" desc = "A compact ball of snow. Good for throwing at people." @@ -1322,7 +855,6 @@ /* * Clockwork Watch */ - /obj/item/toy/clockwork_watch name = "steampunk watch" desc = "A stylish steampunk watch made out of thousands of tiny cogwheels." @@ -1348,7 +880,6 @@ /* * Toy Dagger */ - /obj/item/toy/toy_dagger name = "toy dagger" desc = "A cheap plastic replica of a dagger. Produced by THE ARM Toys, Inc." @@ -1362,7 +893,6 @@ /* * Xenomorph action figure */ - /obj/item/toy/toy_xeno icon = 'icons/obj/toy.dmi' icon_state = "toy_xeno" @@ -1387,7 +917,6 @@ return // TOY MOUSEYS :3 :3 :3 - /obj/item/toy/cattoy name = "toy mouse" desc = "A colorful toy mouse!" @@ -1401,7 +930,6 @@ /* * Action Figures */ - /obj/item/toy/figure name = "\improper Non-Specific Action Figure action figure" icon = 'icons/obj/toy.dmi' @@ -1624,7 +1152,6 @@ icon_state = "warden" toysay = "Seventeen minutes for coughing at an officer!" - /obj/item/toy/dummy name = "ventriloquist dummy" desc = "It's a dummy, dummy." @@ -1697,11 +1224,9 @@ cooldown = (world.time + 10) addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/blobattack.ogg', 50, FALSE), 0.5 SECONDS) - /* * Eldritch Toys */ - /obj/item/toy/eldritch_book name = "Codex Cicatrix" desc = "A toy book that closely resembles the Codex Cicatrix. Covered in fake polyester human flesh and has a huge goggly eye attached to the cover. The runes are gibberish and cannot be used to summon demons... Hopefully?" @@ -1724,7 +1249,6 @@ /* * Fake tear */ - /obj/item/toy/reality_pierce name = "Pierced reality" desc = "Hah. You thought it was the real deal!" @@ -1795,7 +1319,6 @@ GLOBAL_LIST_EMPTY(intento_players) #define TIME_PER_DEMO_STEP 0.6 SECONDS #define TIME_TO_RESET_ICON 0.5 SECONDS - /obj/item/toy/intento name = "\improper Intento" desc = "Fundamentally useless for all intentsive purposes." @@ -1877,7 +1400,6 @@ GLOBAL_LIST_EMPTY(intento_players) state = STATE_STARTING COOLDOWN_START(src, next_process, TIME_TO_BEGIN) - /obj/item/toy/intento/process() if(next_icon_reset && next_icon_reset <= world.time) icon_state = initial(icon_state) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 51b6e811129..9b863f7ce69 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -60,6 +60,7 @@ ) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + register_context() /obj/structure/table/examine(mob/user) . = ..() @@ -114,11 +115,9 @@ user.stop_pulling() return ..() - /obj/structure/table/attack_tk(mob/user) return - /obj/structure/table/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) @@ -215,6 +214,14 @@ return // If the tray IS empty, continue on (tray will be placed on the table like other items) + if(istype(I, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = I + if(dealer_deck.wielded) // deal a card facedown on the table + var/obj/item/toy/singlecard/card = dealer_deck.draw(user) + if(card) + attackby(card, user, params) + return + if(istype(I, /obj/item/riding_offhand)) var/obj/item/riding_offhand/riding_item = I var/mob/living/carried_mob = riding_item.rider @@ -252,6 +259,27 @@ else return ..() +/obj/structure/table/attackby_secondary(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = weapon + if(dealer_deck.wielded) // deal a card faceup on the table + var/obj/item/toy/singlecard/card = dealer_deck.draw(user) + if(card) + card.Flip() + attackby(card, user, params) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + ..() + return SECONDARY_ATTACK_CONTINUE_CHAIN + +/obj/structure/table/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(istype(held_item, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = held_item + if(dealer_deck.wielded) + context[SCREENTIP_CONTEXT_LMB] = "Deal card" + context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" + return CONTEXTUAL_SCREENTIP_SET + return NONE + /obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) return diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm new file mode 100644 index 00000000000..a2606ae3b1f --- /dev/null +++ b/code/modules/cards/cardhand.dm @@ -0,0 +1,143 @@ +/obj/item/toy/cards/cardhand + name = "hand of cards" + desc = "A number of cards not in a deck, customarily held in ones hand." + icon = 'icons/obj/playing_cards.dmi' + icon_state = "none" + w_class = WEIGHT_CLASS_TINY + worn_icon_state = "card" + +/obj/item/toy/cards/cardhand/Initialize(mapload, list/cards_to_combine) + . = ..() + + if(!LAZYLEN(cards_to_combine) && (mapload && !LAZYLEN(cards))) + CRASH("[src] is being made into a cardhand without a list of cards to combine") + + if(mapload && LAZYLEN(cards)) // these cards have not been initialized + for(var/card_name in cards) + var/obj/item/toy/singlecard/new_card = new (loc, card_name) + new_card.update_appearance() + cards_to_combine += new_card + cards = list() // reset our cards to an empty list + + for(var/obj/item/toy/singlecard/new_card in cards_to_combine) + new_card.forceMove(src) + cards += new_card + + register_context() + update_appearance() + +/obj/item/toy/cards/cardhand/suicide_act(mob/living/carbon/user) + user.visible_message(span_suicide("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like [user.p_they()] [user.p_have()] a crummy hand!")) + playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) + return BRUTELOSS + +/obj/item/toy/cards/cardhand/examine(mob/user) + . = ..() + for(var/obj/item/toy/singlecard/card in cards) + if(HAS_TRAIT(user, TRAIT_XRAY_VISION)) + . += span_notice("You scan the cardhand with your x-ray vision and there is a: [card.cardname]") + var/marked_color = card.getMarkedColor(user) + if(marked_color) + . += span_notice("There is a [marked_color] mark on the corner of a card in the cardhand!") + +/obj/item/toy/cards/cardhand/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(istype(held_item, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = held_item + if(dealer_deck.wielded) + context[SCREENTIP_CONTEXT_LMB] = "Deal card" + context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" + return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_LMB] = "Recycle cards" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/singlecard)) + context[SCREENTIP_CONTEXT_LMB] = "Combine cards" + context[SCREENTIP_CONTEXT_RMB] = "Combine cards faceup" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/obj/item/toy/cards/cardhand/attack_self(mob/living/user) + if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK)) + return + + var/list/handradial = list() + for(var/obj/item/toy/singlecard/card in cards) + handradial[card] = image(icon = src.icon, icon_state = card.icon_state) + + var/obj/item/toy/singlecard/choice = show_radial_menu(usr, src, handradial, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 36, require_near = TRUE) + if(!choice) + return FALSE + + var/obj/item/toy/singlecard/selected_card = draw(user, choice) + selected_card.pickup(user) + user.put_in_hands(selected_card) + + if(cards.len == 1) + user.temporarilyRemoveItemFromInventory(src, TRUE) + var/obj/item/toy/singlecard/last_card = draw(user) + last_card.pickup(user) + user.put_in_hands(last_card) + qdel(src) // cardhand is empty now so delete it + +/obj/item/toy/cards/cardhand/proc/check_menu(mob/living/user) + return isliving(user) && !user.incapacitated() + +/obj/item/toy/cards/cardhand/attackby(obj/item/weapon, mob/living/user, params, flip_card = FALSE) + var/obj/item/toy/singlecard/card + + if(istype(weapon, /obj/item/toy/singlecard)) + card = weapon + + if(istype(weapon, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = weapon + if(!dealer_deck.wielded) // recycle cardhand into deck (if unwielded) + dealer_deck.insert(src) + user.balloon_alert_to_viewers("puts card in deck") + return + card = dealer_deck.draw(user) + + if(card) + if(flip_card) + card.Flip() + insert(card) + return + + return ..() + +/obj/item/toy/cards/cardhand/attackby_secondary(obj/item/weapon, mob/user, params) + attackby(weapon, user, params, flip_card = TRUE) + return SECONDARY_ATTACK_CONTINUE_CHAIN + +#define CARDS_MAX_DISPLAY_LIMIT 5 // the amount of cards that are displayed in a hand +#define CARDS_PIXEL_X_OFFSET -5 // start out displaying the 1st card -5 pixels left +#define CARDS_ANGLE_OFFSET -45 // start out displaying the 1st card -45 degrees counter clockwise + +/obj/item/toy/cards/cardhand/update_overlays() + . = ..() + cut_overlays() + if(cards.len <= 1) + icon_state = null // we want an error icon to appear if this doesn't get qdel + return + + var/starting_card_pos = max(1, cards.len - CARDS_MAX_DISPLAY_LIMIT) // only display the top cards in the cardhand + var/cards_to_display = min(CARDS_MAX_DISPLAY_LIMIT, cards.len) + // 90 degrees from the 1st card to the last, so split the divider by total cards displayed + var/angle_divider = round(90/(cards_to_display - 1)) + // 10 pixels from the 1st card to the last, so split the divider by total cards displayed + var/pixel_divider = round(10/(cards_to_display - 1)) + + // starting from the 1st card to last, we want to slowly increase the angle and pixel_x offset + // to spread the cards out using our dividers + for(var/i in 0 to cards_to_display - 1) + var/obj/item/toy/singlecard/card = cards[starting_card_pos + i] + var/image/card_overlay = image(icon, icon_state = card.icon_state, pixel_x = CARDS_PIXEL_X_OFFSET + (i * pixel_divider)) + var/rotation_angle = CARDS_ANGLE_OFFSET + (i * angle_divider) + var/matrix/M = matrix() + M.Turn(rotation_angle) + card_overlay.transform = M + add_overlay(card_overlay) + +#undef CARDS_MAX_DISPLAY_LIMIT +#undef CARDS_PIXEL_X_OFFSET +#undef CARDS_ANGLE_OFFSET diff --git a/code/modules/cards/cards.dm b/code/modules/cards/cards.dm new file mode 100644 index 00000000000..ce5e9c88a5f --- /dev/null +++ b/code/modules/cards/cards.dm @@ -0,0 +1,114 @@ +/* +** The base card class that is used by decks and cardhands +*/ +/obj/item/toy/cards + resistance_flags = FLAMMABLE + max_integrity = 50 + /// Do all the cards drop to the floor when thrown at a person + var/can_play_52_card_pickup = TRUE + /// List of cards for a hand or deck + var/list/cards = list() + +/obj/item/toy/cards/Destroy() + if(LAZYLEN(cards)) + QDEL_LIST(cards) + return ..() + +/// This is how we play 52 card pickup +/obj/item/toy/cards/throw_impact(mob/living/target, datum/thrownthing/throwingdatum) + . = ..() + if(. || !istype(target)) // was it caught or is the target not a living mob + return . + + if(!throwingdatum?.thrower) // if a mob didn't throw it (need two people to play 52 pickup) + return + + var/has_no_cards = !LAZYLEN(cards) + if(has_no_cards) + return + + for(var/obj/item/toy/singlecard/card in cards) + cards -= card + card.forceMove(target.drop_location()) + if(prob(50)) + card.Flip() + card.pixel_x = rand(-16, 16) + card.pixel_y = rand(-16, 16) + var/matrix/Matrix = matrix() + var/angle = pick(0, 90, 180, 270) + Matrix.Turn(angle) + card.transform = Matrix + card.update_appearance() + + playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) + + if(istype(src, /obj/item/toy/cards/cardhand)) + qdel(src) + return + + update_appearance() + +/** + * This is used to insert a list of cards into a deck or cardhand + * + * All cards that are inserted have their angle and pixel offsets reset to zero however their + * flip state does not change unless it's being inserted into a deck which is always facedown + * (see the deck/insert proc) + * + * Arguments: + * * card_item - Either a singlecard or cardhand that gets inserted into the src + */ +/obj/item/toy/cards/proc/insert(obj/item/toy/card_item) + var/cards_to_add = list() + var/obj/item/toy/cards/cardhand/recycled_cardhand + + if(istype(card_item, /obj/item/toy/singlecard)) + cards_to_add += card_item + + if(istype(card_item, /obj/item/toy/cards/cardhand)) + recycled_cardhand = card_item + + for(var/obj/item/toy/singlecard/card in recycled_cardhand.cards) + cards_to_add += card + recycled_cardhand.cards -= card + card.moveToNullspace() + qdel(recycled_cardhand) + + for(var/obj/item/toy/singlecard/card in cards_to_add) + card.forceMove(src) + // reset the position and angle + card.pixel_x = 0 + card.pixel_y = 0 + var/matrix/M = matrix() + M.Turn(0) + card.transform = M + card.update_appearance() + cards += card + cards_to_add -= card + update_appearance() + +/** + * Draws a card from the deck or hand of cards. + * + * Draws the top card unless a card arg is supplied then it picks that specific card + * and returns it (the card arg is used by the radial menu for cardhands to select + * specific cards out of the cardhand) + * Arguments: + * * mob/living/user - The user drawing the card. + * * obj/item/toy/singlecard/card (optional) - The card drawn from the hand +**/ +/obj/item/toy/cards/proc/draw(mob/living/user, obj/item/toy/singlecard/card) + if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK)) + return + + var/has_no_cards = !LAZYLEN(cards) + if(has_no_cards) + to_chat(user, span_warning("There are no more cards to draw!")) + return + + card = card || cards[1] //draw the card on top + cards -= card + + update_appearance() + playsound(src, 'sound/items/cardflip.ogg', 50, TRUE) + return card diff --git a/code/modules/cards/deck/blank.dm b/code/modules/cards/deck/blank.dm new file mode 100644 index 00000000000..2a47588adef --- /dev/null +++ b/code/modules/cards/deck/blank.dm @@ -0,0 +1,21 @@ +/obj/item/toy/cards/deck/blank + name = "custom deck of cards" + desc = "A deck of playing cards that can be customized with writing." + cardgame_desc = "custom card game" + icon_state = "deck_white_full" + deckstyle = "white" + has_unique_card_icons = FALSE + is_standard_deck = FALSE + decksize = 25 + can_play_52_card_pickup = FALSE + +/obj/item/toy/cards/deck/blank/black + icon_state = "deck_black_full" + deckstyle = "black" + +/obj/item/toy/cards/deck/blank/Initialize(mapload) + . = ..() + for(var/i in 1 to decksize) + var/obj/item/toy/singlecard/blank_card = new (src, "blank card", src) + blank_card.blank = TRUE + cards += blank_card diff --git a/code/modules/cards/deck/cas.dm b/code/modules/cards/deck/cas.dm new file mode 100644 index 00000000000..bb39a9802a0 --- /dev/null +++ b/code/modules/cards/deck/cas.dm @@ -0,0 +1,38 @@ +// CARDS AGAINST SPESS +// This is a parody of Cards Against Humanity (https://en.wikipedia.org/wiki/Cards_Against_Humanity) +// which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL: +// https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode +// Original code by Zuhayr, Polaris Station, ported with modifications +/obj/item/toy/cards/deck/cas + name = "\improper CAS deck (white)" + desc = "A deck for the game Cards Against Spess, still popular after all these centuries. Warning: may include traces of broken fourth wall. This is the white deck." + cardgame_desc = "Cards Against Spess game" + icon_state = "deck_white_full" + deckstyle = "white" + has_unique_card_icons = FALSE + is_standard_deck = FALSE + decksize = 150 + can_play_52_card_pickup = FALSE + +/obj/item/toy/cards/deck/cas/black + name = "\improper CAS deck (black)" + desc = "A deck for the game Cards Against Spess, still popular after all these centuries. Warning: may include traces of broken fourth wall. This is the black deck." + icon_state = "deck_black_full" + deckstyle = "black" + decksize = 50 + +GLOBAL_LIST_INIT(card_decks, list( + black = world.file2list("strings/cas_black.txt"), + white = world.file2list("strings/cas_white.txt") +)) + +/obj/item/toy/cards/deck/cas/Initialize(mapload) + . = ..() + var/list/cards_against_space = GLOB.card_decks[deckstyle] + var/list/possible_cards = cards_against_space.Copy() + var/list/random_cards = list() + + for(var/i in 1 to decksize) + random_cards += pick_n_take(possible_cards) + for(var/card in random_cards) + cards += new /obj/item/toy/singlecard(src, card, src) diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm new file mode 100644 index 00000000000..f42c2f786ee --- /dev/null +++ b/code/modules/cards/deck/deck.dm @@ -0,0 +1,246 @@ +#define DECK_SHUFFLE_TIME (5 SECONDS) +#define DECK_SYNDIE_SHUFFLE_TIME (3 SECONDS) + +/obj/item/toy/cards/deck + name = "deck of cards" + desc = "A deck of space-grade playing cards." + icon = 'icons/obj/playing_cards.dmi' + icon_state = "deck_nanotrasen_full" + w_class = WEIGHT_CLASS_SMALL + worn_icon_state = "card" + hitsound = null + attack_verb_continuous = list("attacks") + attack_verb_simple = list("attack") + /// The amount of time it takes to shuffle + var/shuffle_time = DECK_SHUFFLE_TIME + /// Deck shuffling cooldown. + COOLDOWN_DECLARE(shuffle_cooldown) + /// If the deck is the standard 52 playing card deck (used for poker and blackjack) + var/is_standard_deck = TRUE + /// The amount of cards to spawn in the deck (optional) + var/decksize = INFINITY + /// The description of the cardgame that is played with this deck (used for memories) + var/cardgame_desc = "card game" + /// Wielding status for holding with two hands + var/wielded = FALSE + /// The holodeck computer used to spawn a holographic deck (see /obj/item/toy/cards/deck/syndicate/holographic) + var/obj/machinery/computer/holodeck/holodeck + /// If the cards in the deck have different card faces icons (blank and CAS decks do not) + var/has_unique_card_icons = TRUE + /// The art style of deck used (determines both deck and card icons used) + var/deckstyle = "nanotrasen" + +/obj/item/toy/cards/deck/Initialize(mapload) + . = ..() + AddElement(/datum/element/drag_pickup) + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + AddComponent(/datum/component/two_handed, attacksound='sound/items/cardflip.ogg') + register_context() + + if(!is_standard_deck) + return + + // generate a normal playing card deck + cards += new /obj/item/toy/singlecard(src, "Joker Clown", src) + cards += new /obj/item/toy/singlecard(src, "Joker Mime", src) + for(var/suit in list("Hearts", "Spades", "Clubs", "Diamonds")) + cards += new /obj/item/toy/singlecard(src, "Ace of [suit]", src) + for(var/i in 2 to 10) + cards += new /obj/item/toy/singlecard(src, "[i] of [suit]", src) + for(var/person in list("Jack", "Queen", "King")) + cards += new /obj/item/toy/singlecard(src, "[person] of [suit]", src) + +/// triggered on wield of two handed item +/obj/item/toy/cards/deck/proc/on_wield(obj/item/source, mob/user) + SIGNAL_HANDLER + + wielded = TRUE + +/// triggered on unwield of two handed item +/obj/item/toy/cards/deck/proc/on_unwield(obj/item/source, mob/user) + SIGNAL_HANDLER + + wielded = FALSE + +/obj/item/toy/cards/deck/suicide_act(mob/living/carbon/user) + user.visible_message(span_suicide("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like their luck ran out!")) + playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) + return BRUTELOSS + +/obj/item/toy/cards/deck/examine(mob/user) + . = ..() + + if(cards.len > 0) + var/obj/item/toy/singlecard/card = cards[1] + if(HAS_TRAIT(user, TRAIT_XRAY_VISION)) + . += span_notice("You scan the deck with your x-ray vision and the top card reads: [card.cardname].") + var/marked_color = card.getMarkedColor(user) + if(marked_color) + . += span_notice("The top card of the deck has a [marked_color] mark on the corner!") + . += span_notice("Click and drag the deck to yourself to pickup.") // This should be a context screentip + +/obj/item/toy/cards/deck/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(src == held_item) + var/obj/item/toy/cards/deck/dealer_deck = held_item + context[SCREENTIP_CONTEXT_LMB] = dealer_deck.wielded ? "Recycle mode" : "Dealer mode" + context[SCREENTIP_CONTEXT_ALT_LMB] = "Shuffle" + return CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Draw card" + context[SCREENTIP_CONTEXT_RMB] = "Draw card faceup" + // add drag & drop screentip here in the future + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/singlecard)) + context[SCREENTIP_CONTEXT_LMB] = "Recycle card" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/cards/cardhand)) + context[SCREENTIP_CONTEXT_LMB] = "Recycle cards" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/** + * Shuffles the cards in the deck + * + * Arguments: + * * user - The person shuffling the cards. + */ +/obj/item/toy/cards/deck/proc/shuffle_cards(mob/living/user) + if(!COOLDOWN_FINISHED(src, shuffle_cooldown)) + return + COOLDOWN_START(src, shuffle_cooldown, shuffle_time) + cards = shuffle(cards) + playsound(src, 'sound/items/cardshuffle.ogg', 50, TRUE) + user.balloon_alert_to_viewers("shuffles the deck") + addtimer(CALLBACK(src, .proc/CardgameEvent, user), 60 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) + +/// This checks if nearby mobs are playing a cardgame and triggers a mood and memory +/obj/item/toy/cards/deck/proc/CardgameEvent(mob/living/dealer) + var/card_players = list() + for(var/mob/living/carbon/person in viewers(loc, COMBAT_MESSAGE_RANGE)) + var/obj/item/toy/held_card_item = person.is_holding_item_of_type(/obj/item/toy/singlecard) || person.is_holding_item_of_type(/obj/item/toy/cards/deck) || person.is_holding_item_of_type(/obj/item/toy/cards/cardhand) + if(held_card_item) + card_players[person] = held_card_item + + if(length(card_players) >= 2) // need at least 2 people to play a cardgame, duh! + for(var/mob/living/carbon/player in card_players) + var/other_players = english_list(card_players - player) + var/obj/item/toy/held_card_item = card_players[player] + + SEND_SIGNAL(player, COMSIG_ADD_MOOD_EVENT, "playing_cards", /datum/mood_event/playing_cards) + player.mind?.add_memory( + MEMORY_PLAYING_CARDS, + list( + DETAIL_PROTAGONIST = player, + DETAIL_PLAYERS = other_players, + DETAIL_CARDGAME = cardgame_desc, + DETAIL_DEALER = dealer, + DETAIL_HELD_CARD_ITEM = held_card_item, + ), + story_value = STORY_VALUE_OKAY, + memory_flags = MEMORY_CHECK_BLINDNESS + ) + + +/obj/item/toy/cards/deck/attack_hand(mob/living/user, list/modifiers, flip_card = FALSE) + if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + return + + var/obj/item/toy/singlecard/card = draw(user) + if(!card) + return + if(flip_card) + card.Flip() + card.pickup(user) + user.put_in_hands(card) + user.balloon_alert_to_viewers("draws a card") + +/obj/item/toy/cards/deck/attack_hand_secondary(mob/living/user, list/modifiers) + attack_hand(user, modifiers, flip_card = TRUE) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/toy/cards/deck/AltClick(mob/living/user) + if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + if(wielded) + shuffle_cards(user) + else + to_chat(user, span_notice("You must hold the [src] with both hands to shuffle.")) + return ..() + +/obj/item/toy/cards/deck/update_icon_state() + switch(cards.len) + if(27 to INFINITY) + icon_state = "deck_[deckstyle]_full" + if(11 to 27) + icon_state = "deck_[deckstyle]_half" + if(1 to 11) + icon_state = "deck_[deckstyle]_low" + else + icon_state = "deck_[deckstyle]_empty" + return ..() + +/obj/item/toy/cards/deck/insert(obj/item/toy/card_item) + // any card inserted into the deck is always facedown + if(istype(card_item, /obj/item/toy/singlecard)) + var/obj/item/toy/singlecard/card = card_item + card.Flip(CARD_FACEDOWN) + if(istype(card_item, /obj/item/toy/cards/cardhand)) + var/obj/item/toy/cards/cardhand/cardhand = card_item + for(var/obj/item/toy/singlecard/card in cardhand.cards) + card.Flip(CARD_FACEDOWN) + . = ..() + +/obj/item/toy/cards/deck/attackby(obj/item/item, mob/living/user, params) + if(istype(item, /obj/item/toy/singlecard) || istype(item, /obj/item/toy/cards/cardhand)) + insert(item) + var/card_grammar = istype(item, /obj/item/toy/singlecard) ? "card" : "cards" + user.balloon_alert_to_viewers("puts [card_grammar] in deck") + return + return ..() + +/// This is how we play 52 card pickup +/obj/item/toy/cards/deck/throw_impact(mob/living/target, datum/thrownthing/throwingdatum) + . = ..() + if(. || !istype(target)) // was it caught or is the target not a living mob + return . + + if(!throwingdatum?.thrower) // if a mob didn't throw it (need two people to play 52 pickup) + return + + var/mob/living/thrower = throwingdatum.thrower + + target.visible_message(span_warning("[target] is forced to play 52 card pickup!"), span_warning("You are forced to play 52 card pickup.")) + SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "lost_52_card_pickup", /datum/mood_event/lost_52_card_pickup) + SEND_SIGNAL(thrower, COMSIG_ADD_MOOD_EVENT, "won_52_card_pickup", /datum/mood_event/won_52_card_pickup) + add_memory_in_range( + target, + 7, + MEMORY_PLAYING_52_PICKUP, + list(DETAIL_PROTAGONIST = thrower, DETAIL_DEUTERAGONIST = target, DETAIL_WHAT_BY = src), + story_value = STORY_VALUE_OKAY, + memory_flags = MEMORY_CHECK_BLINDNESS + ) + +/* +|| Syndicate playing cards, for pretending you're Gambit and playing poker for the nuke disk. || +*/ +/obj/item/toy/cards/deck/syndicate + name = "suspicious looking deck of cards" + desc = "A deck of space-grade playing cards. They seem unusually rigid." + cardgame_desc = "suspicious card game" + icon_state = "deck_syndicate_full" + deckstyle = "syndicate" + hitsound = 'sound/weapons/bladeslice.ogg' + force = 5 + throwforce = 10 + attack_verb_continuous = list("attacks", "slices", "dices", "slashes", "cuts") + attack_verb_simple = list("attack", "slice", "dice", "slash", "cut") + resistance_flags = NONE + shuffle_time = DECK_SYNDIE_SHUFFLE_TIME + +#undef DECK_SHUFFLE_TIME +#undef DECK_SYNDIE_SHUFFLE_TIME diff --git a/code/modules/cards/deck/kotahi.dm b/code/modules/cards/deck/kotahi.dm new file mode 100644 index 00000000000..19e832f1d28 --- /dev/null +++ b/code/modules/cards/deck/kotahi.dm @@ -0,0 +1,21 @@ +/obj/item/toy/cards/deck/kotahi + name = "\improper KOTAHI deck" + desc = "A deck of kotahi cards. House rules to argue over not included." + cardgame_desc = "KOTAHI game" + icon_state = "deck_kotahi_full" + deckstyle = "kotahi" + is_standard_deck = FALSE + +/obj/item/toy/cards/deck/kotahi/Initialize(mapload) + . = ..() + for(var/colour in list("Red","Yellow","Green","Blue")) + cards += new /obj/item/toy/singlecard(src, "[colour] 0", src) //kotahi decks have only one colour of each 0, weird huh? + for(var/k in 0 to 1) //two of each colour of number + cards += new /obj/item/toy/singlecard(src, "[colour] skip", src) + cards += new /obj/item/toy/singlecard(src, "[colour] reverse", src) + cards += new /obj/item/toy/singlecard(src, "[colour] draw 2", src) + for(var/i in 1 to 9) + cards += new /obj/item/toy/singlecard(src, "[colour] [i]", src) + for(var/k in 0 to 3) //4 wilds and draw 4s + cards += new /obj/item/toy/singlecard(src, "Wildcard", src) + cards += new /obj/item/toy/singlecard(src, "Draw 4", src) diff --git a/code/modules/cards/deck/tarot.dm b/code/modules/cards/deck/tarot.dm new file mode 100644 index 00000000000..eb56c320cf6 --- /dev/null +++ b/code/modules/cards/deck/tarot.dm @@ -0,0 +1,59 @@ +#define TAROT_GHOST_TIMER (666 SECONDS) // this translates into 11 mins and 6 seconds + +//These cards certainly won't tell the future, but you can play some nice games with them. +/obj/item/toy/cards/deck/tarot + name = "tarot game deck" + desc = "A full 78 card game deck of tarot cards. Complete with 4 suites of 14 cards, and a full suite of trump cards." + cardgame_desc = "tarot card reading" + icon_state = "deck_tarot_full" + deckstyle = "tarot" + is_standard_deck = FALSE + +/obj/item/toy/cards/deck/tarot/Initialize(mapload) + . = ..() + for(var/suit in list("Hearts", "Pikes", "Clovers", "Tiles")) + for(var/i in 1 to 10) + cards += new /obj/item/toy/singlecard(src, "[i] of [suit]", src) + for(var/person in list("Valet", "Chevalier", "Dame", "Roi")) + cards += new /obj/item/toy/singlecard(src, "[person] of [suit]", src) + for(var/trump in list("The Magician", "The High Priestess", "The Empress", "The Emperor", "The Hierophant", "The Lover", "The Chariot", "Justice", "The Hermit", "The Wheel of Fortune", "Strength", "The Hanged Man", "Death", "Temperance", "The Devil", "The Tower", "The Star", "The Moon", "The Sun", "Judgement", "The World", "The Fool")) + cards += new /obj/item/toy/singlecard(src, trump, src) + +/obj/item/toy/cards/deck/tarot/draw(mob/user) + . = ..() + if(prob(50)) + var/obj/item/toy/singlecard/card = . + var/matrix/M = matrix() + M.Turn(180) + card.transform = M + +/obj/item/toy/cards/deck/tarot/haunted + name = "haunted tarot game deck" + desc = "A spooky looking tarot deck. You can sense a supernatural presence linked to the cards..." + /// ghost notification cooldown + COOLDOWN_DECLARE(ghost_alert_cooldown) + +/obj/item/toy/cards/deck/tarot/haunted/on_wield(obj/item/source, mob/living/carbon/user) + . = ..() + ADD_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) + to_chat(user, span_notice("The veil to the underworld is opened. You can sense the dead souls calling out...")) + + if(!COOLDOWN_FINISHED(src, ghost_alert_cooldown)) + return + + COOLDOWN_START(src, ghost_alert_cooldown, TAROT_GHOST_TIMER) + notify_ghosts( + "Someone has begun playing with a [src.name] in [get_area(src)]!", + source = src, + header = "Haunted Tarot Deck", + ghost_sound = 'sound/effects/ghost2.ogg', + notify_volume = 75, + action = NOTIFY_ORBIT, + ) + +/obj/item/toy/cards/deck/tarot/haunted/on_unwield(obj/item/source, mob/living/carbon/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_SIXTHSENSE, MAGIC_TRAIT) + to_chat(user, span_notice("The veil to the underworld closes shut. You feel your senses returning to normal.")) + +#undef TAROT_GHOST_TIMER diff --git a/code/modules/cards/deck/wizoff.dm b/code/modules/cards/deck/wizoff.dm new file mode 100644 index 00000000000..ab6cb2e6f45 --- /dev/null +++ b/code/modules/cards/deck/wizoff.dm @@ -0,0 +1,34 @@ +//It's Wiz-Off, the wizard themed card game! It's modular too, in case you might want to make it Syndie, Sec and Clown themed or something stupid like that. +/obj/item/toy/cards/deck/wizoff + name = "\improper Wiz-Off deck" + desc = "A Wiz-Off deck. Fight an arcane battle for the fate of the universe: Draw 5! Play 5! Best of 5! A rules card is attached." + cardgame_desc = "Wiz-Off game" + icon_state = "deck_wizoff_full" + deckstyle = "wizoff" + is_standard_deck = FALSE + +/obj/item/toy/cards/deck/wizoff/Initialize(mapload) + . = ..() + var/card_list = strings("wizoff.json", "wizard") + cards += new /obj/item/toy/singlecard/wizoff_ruleset(src) // ruleset should be the top card + for(var/card in card_list) + cards += new /obj/item/toy/singlecard(src, card, src) + +/obj/item/toy/singlecard/wizoff_ruleset + desc = "A ruleset for the playing card game Wiz-Off." + cardname = "Wizoff Ruleset" + deckstyle = "black" + has_unique_card_icons = FALSE + icon_state = "singlecard_down_black" + +/obj/item/toy/singlecard/wizoff_ruleset/examine(mob/living/carbon/human/user) + . = ..() + . += span_notice("Remember the rules of Wiz-Off!") + . += span_info("Each player draws 5 cards.") + . += span_info("There are five rounds. Each round, a player selects a card to play, and the winner is selected based on the following rules:") + . += span_info("Defensive beats Offensive!") + . += span_info("Offensive beats Utility!") + . += span_info("Utility beats Defensive!") + . += span_info("If both players play the same type of spell, the higher number wins!") + . += span_info("The player who wins the most of the 5 rounds wins the game!") + . += span_notice("Now get ready to battle for the fate of the universe: Wiz-Off!") diff --git a/code/modules/cards/singlecard.dm b/code/modules/cards/singlecard.dm new file mode 100644 index 00000000000..457561b76c5 --- /dev/null +++ b/code/modules/cards/singlecard.dm @@ -0,0 +1,242 @@ +#define CARD_FACEDOWN 0 +#define CARD_FACEUP 1 + +/obj/item/toy/singlecard + name = "card" + desc = "A playing card used to play card games like poker." + icon = 'icons/obj/playing_cards.dmi' + icon_state = "sc_Ace of Spades_nanotrasen" + w_class = WEIGHT_CLASS_TINY + worn_icon_state = "card" + pixel_x = -5 + resistance_flags = FLAMMABLE + max_integrity = 50 + force = 0 + throwforce = 0 + throw_speed = 3 + throw_range = 7 + attack_verb_continuous = list("attacks") + attack_verb_simple = list("attack") + /// Artistic style of the deck + var/deckstyle = "nanotrasen" + /// If the cards in the deck have different icon states (blank and CAS decks do not) + var/has_unique_card_icons = TRUE + /// The name of the card + var/cardname = "Ace of Spades" + /// Is the card flipped facedown (FALSE) or flipped faceup (TRUE) + var/flipped = FALSE + /// The card is blank and can be written on with a pen. + var/blank = FALSE + /// The color used to mark a card for cheating (by pens or crayons) + var/marked_color + +/obj/item/toy/singlecard/Initialize(mapload, cardname, obj/item/toy/cards/deck/parent_deck) + . = ..() + src.cardname = cardname || src.cardname + if(istype(parent_deck)) + deckstyle = parent_deck.deckstyle + has_unique_card_icons = parent_deck.has_unique_card_icons + icon_state = "singlecard_down_[parent_deck.deckstyle]" + hitsound = parent_deck.hitsound + force = parent_deck.force + throwforce = parent_deck.throwforce + throw_speed = parent_deck.throw_speed + throw_range = parent_deck.throw_range + attack_verb_continuous = parent_deck.attack_verb_continuous + attack_verb_simple = parent_deck.attack_verb_simple + + if(parent_deck.holodeck) + flags_1 |= HOLOGRAM_1 + parent_deck.holodeck.spawned += src + + register_context() + + +/obj/item/toy/singlecard/examine(mob/living/carbon/human/user) + . = ..() + if(!ishuman(user)) + return + + if(user.is_holding(src)) + user.visible_message(span_notice("[user] checks [user.p_their()] card."), span_notice("The card reads: [cardname].")) + if(blank) + . += span_notice("The card is blank. Write on it with a pen.") + else if(HAS_TRAIT(user, TRAIT_XRAY_VISION)) + . += span_notice("You scan the card with your x-ray vision and it reads: [cardname].") + else + . += span_warning("You need to have the card in your hand to check it!") + + var/marked_color = getMarkedColor(user) + if(marked_color) + . += span_notice("The card has a [marked_color] mark on the corner!") + +/obj/item/toy/singlecard/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(isnull(held_item) || src == held_item) + context[SCREENTIP_CONTEXT_ALT_LMB] = "Rotate counter-clockwise" // add a ALT_RMB screentip to rotate clockwise + context[SCREENTIP_CONTEXT_RMB] = "Flip card" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = held_item + if(dealer_deck.wielded) + context[SCREENTIP_CONTEXT_LMB] = "Deal card" + context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" + return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_LMB] = "Recycle card" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/singlecard)) + context[SCREENTIP_CONTEXT_LMB] = "Combine cards" + context[SCREENTIP_CONTEXT_RMB] = "Combine cards faceup" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/cards/cardhand)) + context[SCREENTIP_CONTEXT_LMB] = "Combine cards" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/toy/crayon) || istype(held_item, /obj/item/pen)) + context[SCREENTIP_CONTEXT_LMB] = blank ? "Write on card" : "Mark card" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/obj/item/toy/singlecard/suicide_act(mob/living/carbon/user) + user.visible_message(span_suicide("[user] is slitting [user.p_their()] wrists with \the [src]! It looks like [user.p_they()] [user.p_have()] an unlucky card!")) + playsound(src, 'sound/weapons/bladeslice.ogg', 50, TRUE) + return BRUTELOSS + +/** + * Flips the card over + * + * * Arguments: + * * orientation (optional) - Sets flipped state to CARD_FACEDOWN or CARD_FACEUP if given orientation (otherwise just invert the flipped state) + */ +/obj/item/toy/singlecard/proc/Flip(orientation) + if(!isnull(orientation)) + flipped = orientation + else + flipped = !flipped + + name = flipped ? cardname : "card" + update_appearance() + +/** + * Returns a color if a card is marked and the user can see it + * + * * Arguments: + * * user - We need to check if the user see the marked card + */ +/obj/item/toy/singlecard/proc/getMarkedColor(mob/living/carbon/user) + if(!istype(user)) + return + var/is_marked_with_visible_color = (marked_color && marked_color != "invisible") + if(is_marked_with_visible_color || (marked_color == "invisible" && HAS_TRAIT(user, TRAIT_REAGENT_SCANNER))) + return marked_color + +/obj/item/toy/singlecard/update_icon_state() + if(!flipped) + icon_state = "singlecard_down_[deckstyle]" + else if(has_unique_card_icons) // each card in a deck has a different icon + icon_state = "sc_[cardname]_[deckstyle]" + else // all cards are the same icon state (blank or scribble) + icon_state = blank ? "sc_blank_[deckstyle]" : "sc_scribble_[deckstyle]" + return ..() + +/obj/item/toy/singlecard/update_name() + name = flipped ? cardname : "card" + return ..() + +/obj/item/toy/singlecard/attackby(obj/item/item, mob/living/user, params, flip_card=FALSE) + var/obj/item/toy/singlecard/card + + if(istype(item, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = item + if(!dealer_deck.wielded) // recycle card into deck (if unwielded) + dealer_deck.insert(src) + user.balloon_alert_to_viewers("puts card in deck") + return + card = dealer_deck.draw(user) + + if(istype(item, /obj/item/toy/singlecard)) + card = item + + if(card) // card + card = combine into cardhand + if(flip_card) + card.Flip() + + if(istype(item, /obj/item/toy/cards/deck)) + // only decks cause a balloon alert + user.balloon_alert_to_viewers("deals a card") + + var/obj/item/toy/cards/cardhand/new_cardhand = new (drop_location(), list(src, card)) + new_cardhand.pixel_x = pixel_x + new_cardhand.pixel_y = pixel_y + + if(!isturf(loc)) // make a cardhand in our active hand + user.temporarilyRemoveItemFromInventory(src, TRUE) + new_cardhand.pickup(user) + user.put_in_active_hand(new_cardhand) + return + + if(istype(item, /obj/item/toy/cards/cardhand)) // insert into cardhand + var/obj/item/toy/cards/cardhand/target_cardhand = item + target_cardhand.insert(src) + return + + var/can_item_write + var/marked_cheating_color + + if(istype(item, /obj/item/pen)) + var/obj/item/pen/pen = item + can_item_write = TRUE + marked_cheating_color = (pen.colour == "white" && "invisible") || pen.colour + + if(istype(item, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/crayon = item + can_item_write = TRUE + marked_cheating_color = (crayon.crayon_color == "mime" && "invisible") || crayon.crayon_color + + if(can_item_write && !blank) // You cheated not only the game, but yourself + marked_color = marked_cheating_color + to_chat(user, span_notice("You put a [marked_color] mark in the corner of [src] with the [item]. Cheat to win!")) + return + + if(can_item_write) + if(!user.is_literate()) + to_chat(user, span_notice("You scribble illegibly on [src]!")) + return + + var/cardtext = stripped_input(user, "What do you wish to write on the card?", "Card Writing", "", 50) + if(!cardtext || !user.canUseTopic(src, BE_CLOSE)) + return + + cardname = cardtext + blank = FALSE + update_appearance() + return + return ..() + +/obj/item/toy/singlecard/attackby_secondary(obj/item/item, mob/living/user, modifiers) + attackby(item, user, modifiers, flip_card=TRUE) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/toy/singlecard/attack_hand_secondary(mob/living/carbon/human/user, modifiers) + attack_self(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/toy/singlecard/attack_self_secondary(mob/living/carbon/human/user, modifiers) + attack_self(user) + +/obj/item/toy/singlecard/attack_self(mob/living/carbon/human/user) + if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + return + + Flip() + if(isturf(src.loc)) // only display tihs message when flipping in a visible spot like on a table + user.balloon_alert_to_viewers("flips a card") + +/obj/item/toy/singlecard/AltClick(mob/living/carbon/human/user) + if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + transform = turn(transform, 90) + // use the simple_rotation component to make this turn with Alt+RMB & Alt+LMB at some point in the future - TimT + return ..() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 8670f9344fc..9afebfa4371 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -448,6 +448,16 @@ desc = "A pair of xray goggles manufactured by the Syndicate." vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS +/obj/item/clothing/glasses/thermal/xray/equipped(mob/living/carbon/human/user, slot) + . = ..() + if(slot != ITEM_SLOT_EYES || !istype(user)) + return + ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) + +/obj/item/clothing/glasses/thermal/xray/dropped(mob/living/carbon/human/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) + /obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete name = "chameleon thermals" desc = "A pair of thermal optic goggles with an onboard chameleon generator." @@ -551,11 +561,14 @@ H.add_hud_to(user) ADD_TRAIT(user, TRAIT_MEDICAL_HUD, GLASSES_TRAIT) ADD_TRAIT(user, TRAIT_SECURITY_HUD, GLASSES_TRAIT) + if(xray) + ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) /obj/item/clothing/glasses/debug/dropped(mob/user) . = ..() REMOVE_TRAIT(user, TRAIT_MEDICAL_HUD, GLASSES_TRAIT) REMOVE_TRAIT(user, TRAIT_SECURITY_HUD, GLASSES_TRAIT) + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) if(ishuman(user)) for(var/hud in hudlist) var/datum/atom_hud/H = GLOB.huds[hud] @@ -566,8 +579,10 @@ if(ishuman(user)) if(xray) vision_flags -= SEE_MOBS|SEE_OBJS + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) else vision_flags += SEE_MOBS|SEE_OBJS + ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT) xray = !xray var/mob/living/carbon/human/H = user H.update_sight() diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index bf1c0d51c23..23dc60ef6e0 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -55,8 +55,8 @@ /obj/item/valentine name = "valentine" desc = "A Valentine's card! Wonder what it says..." - icon = 'icons/obj/toy.dmi' - icon_state = "sc_Ace of Hearts_syndicate" // shut up + icon = 'icons/obj/playing_cards.dmi' + icon_state = "sc_Ace of Hearts_syndicate" // shut up // bye felicia var/message = "A generic message of love or whatever." resistance_flags = FLAMMABLE w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm deleted file mode 100644 index d4738889162..00000000000 --- a/code/modules/games/cas.dm +++ /dev/null @@ -1,157 +0,0 @@ -// CARDS AGAINST SPESS -// This is a parody of Cards Against Humanity (https://en.wikipedia.org/wiki/Cards_Against_Humanity) -// which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL: -// https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode -// Original code by Zuhayr, Polaris Station, ported with modifications -/datum/playingcard - var/name = "playing card" - var/card_icon = "card_back" - var/suit - var/number - -/obj/item/toy/cards/deck/cas - name = "\improper CAS deck (white)" - desc = "A deck for the game Cards Against Spess, still popular after all these centuries. Warning: may include traces of broken fourth wall. This is the white deck." - icon = 'icons/obj/toy.dmi' - icon_state = "deck_caswhite_full" - deckstyle = "caswhite" - var/card_face = "cas_white" - var/blanks = 25 - var/decksize = 150 - var/card_text_file = "strings/cas_white.txt" - var/list/allcards = list() - -/obj/item/toy/cards/deck/cas/black - name = "\improper CAS deck (black)" - desc = "A deck for the game Cards Against Spess, still popular after all these centuries. Warning: may include traces of broken fourth wall. This is the black deck." - icon_state = "deck_casblack_full" - deckstyle = "casblack" - card_face = "cas_black" - blanks = 0 - decksize = 50 - card_text_file = "strings/cas_black.txt" - -/obj/item/toy/cards/deck/cas/populate_deck() - var/static/list/cards_against_space = list("cas_white" = world.file2list("strings/cas_white.txt"),"cas_black" = world.file2list("strings/cas_black.txt")) - allcards = cards_against_space[card_face] - var/list/possiblecards = allcards.Copy() - if(possiblecards.len < decksize) // sanity check - decksize = (possiblecards.len - 1) - var/list/randomcards = list() - for(var/x in 1 to decksize) - randomcards += pick_n_take(possiblecards) - for(var/x in 1 to randomcards.len) - var/cardtext = randomcards[x] - var/datum/playingcard/P - P = new() - P.name = "[cardtext]" - P.card_icon = "[src.card_face]" - cards += P - if(!blanks) - return - for(var/x in 1 to blanks) - var/datum/playingcard/P - P = new() - P.name = "Blank Card" - P.card_icon = "cas_white" - cards += P - shuffle_inplace(cards) // distribute blank cards throughout deck - -/obj/item/toy/cards/deck/cas/draw_card(mob/user) - if(isliving(user)) - var/mob/living/L = user - if(!(L.mobility_flags & MOBILITY_PICKUP)) - return - if(cards.len == 0) - to_chat(user, span_warning("There are no more cards to draw!")) - return - var/obj/item/toy/cards/singlecard/cas/H = new/obj/item/toy/cards/singlecard/cas(user.loc) - var/datum/playingcard/choice = cards[1] - if (choice.name == "Blank Card") - H.blank = 1 - H.name = choice.name - H.buffertext = choice.name - H.icon_state = choice.card_icon - H.card_face = choice.card_icon - H.parentdeck = WEAKREF(src) - src.cards -= choice - H.pickup(user) - user.put_in_hands(H) - user.visible_message(span_notice("[user] draws a card from the deck."), span_notice("You draw a card from the deck.")) - update_appearance() - -/obj/item/toy/cards/deck/cas/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/toy/cards/singlecard/cas)) - var/obj/item/toy/cards/singlecard/cas/SC = I - if(!user.temporarilyRemoveItemFromInventory(SC)) - to_chat(user, span_warning("The card is stuck to your hand, you can't add it to the deck!")) - return - var/datum/playingcard/RC // replace null datum for the re-added card - RC = new() - RC.name = "[SC.name]" - RC.card_icon = SC.card_face - cards += RC - user.visible_message(span_notice("[user] adds a card to the bottom of the deck."),span_notice("You add the card to the bottom of the deck.")) - qdel(SC) - update_appearance() - -/obj/item/toy/cards/deck/cas/update_icon_state() - if(cards.len < 26) - icon_state = "deck_[deckstyle]_low" - return ..() - -/obj/item/toy/cards/singlecard/cas - name = "CAS card" - desc = "A CAS card." - icon_state = "cas_white" - flipped = 0 - var/card_face = "cas_white" - var/blank = 0 - var/buffertext = "A funny bit of text." - -/obj/item/toy/cards/singlecard/cas/examine(mob/user) - . = ..() - if (flipped) - . += span_notice("The card is face down.") - else if (blank) - . += span_notice("The card is blank. Write on it with a pen.") - else - . += span_notice("The card reads: [name]") - . += span_notice("Alt-click to flip it.") - -/obj/item/toy/cards/singlecard/cas/Flip() - set name = "Flip Card" - set category = "Object" - set src in range(1) - if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) - return - if(!flipped) - name = "CAS card" - else if(flipped) - name = buffertext - flipped = !flipped - update_appearance() - -/obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user) - if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE)) - return - Flip() - -/obj/item/toy/cards/singlecard/cas/update_icon_state() - icon_state = "[card_face][flipped ? "_flipped" : null]" - return ..() - -/obj/item/toy/cards/singlecard/cas/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/pen)) - if(!user.is_literate()) - to_chat(user, span_notice("You scribble illegibly on [src]!")) - return - if(!blank) - to_chat(user, span_warning("You cannot write on that card!")) - return - var/cardtext = stripped_input(user, "What do you wish to write on the card?", "Card Writing", "", 50) - if(!cardtext || !user.canUseTopic(src, BE_CLOSE)) - return - name = cardtext - buffertext = cardtext - blank = 0 diff --git a/code/modules/games/kotahi.dm b/code/modules/games/kotahi.dm deleted file mode 100644 index d435d68905a..00000000000 --- a/code/modules/games/kotahi.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/item/toy/cards/deck/kotahi - name = "\improper KOTAHI deck" - desc = "A deck of kotahi cards. House rules to argue over not included." - icon = 'icons/obj/toy.dmi' - icon_state = "deck_kotahi_full" - deckstyle = "kotahi" - -//Populate the deck. -/obj/item/toy/cards/deck/kotahi/populate_deck() - for(var/colour in list("Red","Yellow","Green","Blue")) - cards += generate_card("[colour] 0") //kotahi decks have only one colour of each 0, weird huh? - for(var/k in 0 to 1) //two of each colour of number - cards += generate_card("[colour] skip") - cards += generate_card("[colour] reverse") - cards += generate_card("[colour] draw 2") - for(var/i in 1 to 9) - cards += generate_card("[colour] [i]") - for(var/k in 0 to 3) //4 wilds and draw 4s - cards += generate_card("Wildcard") - cards += generate_card("Draw 4") diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm deleted file mode 100644 index 91ef92c41ea..00000000000 --- a/code/modules/games/tarot.dm +++ /dev/null @@ -1,25 +0,0 @@ -//These cards certainly won't tell the future, but you can play some nice games with them. -/obj/item/toy/cards/deck/tarot - name = "tarot game deck" - desc = "A full 78 card game deck of tarot cards. Complete with 4 suites of 14 cards, and a full suite of trump cards." - icon = 'icons/obj/toy.dmi' - icon_state = "deck_tarot_full" - deckstyle = "tarot" - -/obj/item/toy/cards/deck/tarot/populate_deck() - for(var/suit in list("Hearts", "Pikes", "Clovers", "Tiles")) - for(var/i in 1 to 10) - cards += generate_card("[i] of [suit]") - for(var/person in list("Valet", "Chevalier", "Dame", "Roi")) - cards += generate_card("[person] of [suit]") - for(var/trump in list("The Magician", "The High Priestess", "The Empress", "The Emperor", "The Hierophant", "The Lover", "The Chariot", "Justice", "The Hermit", "The Wheel of Fortune", "Strength", "The Hanged Man", "Death", "Temperance", "The Devil", "The Tower", "The Star", "The Moon", "The Sun", "Judgement", "The World", "The Fool")) - cards += generate_card("[trump]") - -/obj/item/toy/cards/deck/tarot/draw_card(mob/user, list/cards, obj/item/toy/cards/singlecard/forced_card = null) - . = ..() - var/obj/item/toy/cards/singlecard/C = . - var/matrix/M = matrix() - M.Turn(180) - if(prob(50)) - C.transform = M - return diff --git a/code/modules/games/wizoff.dm b/code/modules/games/wizoff.dm deleted file mode 100644 index 73be649593a..00000000000 --- a/code/modules/games/wizoff.dm +++ /dev/null @@ -1,26 +0,0 @@ -//It's Wiz-Off, the wizard themed card game! It's modular too, in case you might want to make it Syndie, Sec and Clown themed or something stupid like that. -/obj/item/toy/cards/deck/wizoff - name = "\improper Wiz-Off deck" - desc = "A Wiz-Off deck. Fight an arcane battle for the fate of the universe: Draw 5! Play 5! Best of 5! A rules card is attached." - icon = 'icons/obj/toy.dmi' - icon_state = "deck_wizoff_full" - deckstyle = "wizoff" - var/theme = "wizard" - -/obj/item/toy/cards/deck/wizoff/populate_deck() - var/card_list = strings("wizoff.json", theme) - for(var/card in card_list) - cards += generate_card("[card]") - -/obj/item/toy/cards/deck/wizoff/examine_more(mob/user) - . = ..() - . += span_notice("Remember the rules of Wiz-Off!") - . += "\t[span_info("Each player draws 5 cards.")]" - . += "\t[span_info("There are five rounds. Each round, a player selects a card to play, and the winner is selected based on the following rules:")]" - . += "\t[span_info("Defensive beats Offensive!")]" - . += "\t[span_info("Offensive beats Utility!")]" - . += "\t[span_info("Utility beats Defensive!")]" - . += "\t[span_info("If both players play the same type of spell, the higher number wins!")]" - . += "\t[span_info("The player who wins the most of the 5 rounds wins the game!")]" - . += "\t[span_notice("Now get ready to battle for the fate of the universe: Wiz-Off!")]" - return . diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index f86c2ee27de..279c771a211 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -23,43 +23,16 @@ /obj/effect/holodeck_effect/proc/safety(active) return - // Generates a holodeck-tracked card deck /obj/effect/holodeck_effect/cards - icon = 'icons/obj/toy.dmi' - icon_state = "deck_nanotrasen_full" - var/obj/item/toy/cards/deck/deck + icon = 'icons/obj/playing_cards.dmi' + icon_state = "deck_syndicate_full" -/obj/effect/holodeck_effect/cards/activate(obj/machinery/computer/holodeck/HC) - deck = new(loc) - safety(!(HC.obj_flags & EMAGGED)) - deck.holo = HC - RegisterSignal(deck, COMSIG_PARENT_QDELETING, .proc/handle_card_delete) +/obj/effect/holodeck_effect/cards/activate(obj/machinery/computer/holodeck/holodeck) + var/obj/item/toy/cards/deck/syndicate/holographic/deck = new(loc, holodeck) + deck.flags_1 |= HOLOGRAM_1 return deck -/obj/effect/holodeck_effect/cards/proc/handle_card_delete(datum/source) - SIGNAL_HANDLER - deck = null - -/obj/effect/holodeck_effect/cards/safety(active) - if(!deck) - return - if(active) - deck.card_hitsound = null - deck.card_force = 0 - deck.card_throwforce = 0 - deck.card_throw_speed = 3 - deck.card_throw_range = 7 - deck.card_attack_verb_continuous = string_list(list("attacks")) - else - deck.card_hitsound = 'sound/weapons/bladeslice.ogg' - deck.card_force = 5 - deck.card_throwforce = 10 - deck.card_throw_speed = 3 - deck.card_throw_range = 7 - deck.card_attack_verb_continuous = string_list(list("attacks", "slices", "dices", "slashes", "cuts")) - - /obj/effect/holodeck_effect/sparks/activate(obj/machinery/computer/holodeck/HC) var/turf/T = get_turf(src) if(T) diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index c5113edac1f..1000d0e29a8 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -32,6 +32,24 @@ /obj/item/melee/energy/sword/holographic/red sword_color_icon = "red" +/obj/item/toy/cards/deck/syndicate/holographic + desc = "A deck of holographic playing cards." + +/obj/item/toy/cards/deck/syndicate/holographic/Initialize(mapload, obj/machinery/computer/holodeck/holodeck) + src.holodeck = holodeck + RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/handle_card_delete) + . = ..() + +/obj/item/toy/cards/deck/syndicate/holographic/proc/handle_card_delete(datum/source) + SIGNAL_HANDLER + + //if any REAL cards have been inserted into the deck they are moved outside before destroying it + for(var/obj/item/toy/singlecard/card in cards) + if(card.flags_1 & HOLOGRAM_1) + continue + cards -= card + card.forceMove(drop_location()) + //BASKETBALL OBJECTS /obj/item/toy/beach_ball/holoball diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1befcfa7a4f..3e807015109 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -508,7 +508,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /obj/item/guardiancreator name = "enchanted deck of tarot cards" desc = "An enchanted deck of tarot cards, rumored to be a source of unimaginable power." - icon = 'icons/obj/toy.dmi' + icon = 'icons/obj/playing_cards.dmi' icon_state = "deck_tarot_full" var/used = FALSE var/theme = "magic" diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 44c9dbee9f1..fa9897a4417 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -193,6 +193,14 @@ see_in_dark = NIGHTVISION_FOV_RANGE sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS +/obj/item/organ/eyes/robotic/xray/Insert(mob/living/carbon/eye_owner, special = FALSE) + . = ..() + ADD_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) + +/obj/item/organ/eyes/robotic/xray/Remove(mob/living/carbon/eye_owner, special = FALSE) + REMOVE_TRAIT(eye_owner, TRAIT_XRAY_VISION, ORGAN_TRAIT) + return ..() + /obj/item/organ/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 087a81b31d0..d678d0a5d77 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -86,6 +86,8 @@ ignore += typesof(/obj/effect/skyfall_landingzone) //Expects a mob to holderize, we have nothing to give ignore += typesof(/obj/item/clothing/head/mob_holder) + //Needs cards passed into the initilazation args + ignore += typesof(/obj/item/toy/cards/cardhand) var/list/cached_contents = spawn_at.contents.Copy() var/baseturf_count = length(spawn_at.baseturfs) diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 6e4b7727022..4839620c8cb 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -8,6 +8,8 @@ /obj/item/storage/crayons = 2, /obj/item/toy/cards/deck = 5, /obj/item/storage/dice = 10, + /obj/item/toy/cards/deck/blank = 3, + /obj/item/toy/cards/deck/blank/black = 3, /obj/item/toy/cards/deck/cas = 3, /obj/item/toy/cards/deck/cas/black = 3, /obj/item/toy/cards/deck/kotahi = 3, diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi new file mode 100644 index 0000000000000000000000000000000000000000..37fc465eab74d7855262f89132481748ee8df224 GIT binary patch literal 8456 zcmb7o2T+sS)^;EmR04>oNkAYf3N~5*r6wREO+gVsH1r545Ra5ds1XoU5Tq+gf>K3_ z6p<1@K)MimCn6xd6G}poKY0GR^PM~QyEEUO$-HlNd-q=DS*?G80Ju?{AAB#6(_@)`%8K)-HZi(+nayUO;;9UjmOd#diP*#T4z9m<@L-^dim<*X zi_HdHd~oQ{A?)Ko%5SE#zWr>Ccume%Rhr|;jtZ*Fc*AP`*f^^Xt;K|w)WNIwA3 zDy`BuH8sTs0AgH@JT-im<|nb2mzVREtLLyQK%fsAVt2tk%^UjGykvE3j7p_0o>ykG z`2lPM;x%Ux0)xSf35z3<$nP~Z05)K9A{Pt>ducycLIoS#F1h12#%WkMysqNRCk2I` zA2QR=TUt5i-=+W==4FcLx99rJP=?{(Umx6~|MC@!e*OJ?z4+7Fx5I~?wKN?6zSfL) zEy0opLXE8}z1Om3GmHz|Vo#H)8tf8WhSZ(7;!-B&kv~4#u(TX5;?)d1evd;m2Uieju7usb+He^y8S)-S9-o@d1ar^kqwY&Gu6h{IK z>CW|e(-|-_iO6HoK3H_zyxI;V=YJ9iC5PLp=RZw5veCX`_;9=-uR21447hMKk*#cQ zl03Y%vW6SK(oW^){Y`y7SX8|;@~@sNZB=wzafw&_4*~sLy!BXuDAJ8T;*7av`ujF< zg~IdJcl-UXc7?jPtK*4jnM0shVM}@u*a_CD@E&8-5*+WiKmc;md=h4SZJj_9dMj>2jxRa={6oB+l16vy#f0GWIE|jye zZLA3kk>?XWQr3@nlz^{aywv^^{TrsHlWduHyJgUzBIMz!!Qq2XuDG_a7Wj%D5Pk-S zXz~G%JUtg~0WFlX9n&h|Zu)Rf1FJ3~@m=s{v+j*YY^2k%$aihOh6%x@kIC$0SA%4yWz{tNIx zwOQow)JuB-+zG^z*hLojXn?>=V&J&nLtns4!EY-<7d1f*Qa`uu<(!FfDDJOe+-h0O zK77z5z|i$9&;FmND6jy}?KV`DqyW#paa5GL0MD}tRMbt*zu%}R7XhB|Dbmki0Rh38 zj541EErnU0gV&{^CNC0ry7x&EufbP5xb-uH^)9|c70mD)yed`gpvuGBC9j@ z=M$J(z}t8OALvlPt0(CbD9L%ieF7&w^XeVtjD6;{f%*U)Kbt>3v=rAyFK=IQ7`^Jc z(@1_cU|LUnfsXPao>2)6qGyBFspoo-iS5B%t|`(@|q31=-5ikH?e^ zJDk1UxRU0zvth`V{ib{Vx6ADL{e|&iDnvY@1&d!y^z2r|XyihS<=67BFNK{u%fvC5O8VHnpvSe|n^q}pi^edk8$VapRT$%AWe zo)?to?$bNv^)V;QrThkbYMSm+QpYFy0rW~);KkMJiJeLM`}C87mvoUsJ2zE+xg2rB zdVJypVwR-OTO%;-gPu?$V%Gj32r2Q z>V3iC4s!Idf}vG|)Pmw;a|YSPdBkQoBw4L|^F@*WVx__(w5*UbE+E~kR5yHNGcQg5 zn6TIBu7ZLGml8)dUY|i=ZIv4+ll`8))1yemOH}?~uwRc^ zC!D)1a`51nOaK5jqpzcN^YPn-x9qCnqPVA5@51+V#dDXRD@9NYy#~%TxgH}+@;7a; z*?GNGKgR93ikgP!6R)RUt2GHOHFj=QXhv&9f833u|7iPv2feyWLy9z+1!zQPvx3&X z@m4)x4{nBf&jzedf7rx1e11sdjAcQnZ;-1Hi%aYqGF2%Y*?Nf^r+^jxbVudR}l@J z%~uCfULW(sdMJpm8!75?b;mcgxE&Abgf(OGWpynXpB&+FDZjyoGJTp%=ID0$)m-<2 za#{>QgXzYg!i6$V4-JT`#~PKXO5`QeGAPWSt-7^mtDM7?T{ap`}E502V_BfH|0cK z&{hf*WibT=hLl79d(ad#_;HsT{iEGIOg(ouRlq9Q=+j54uRG$i2;sxr&&j5xQ@6wv z-?2>@mi&}&p34UxkYe^yv^_cTnf4-?bo>a295A@p{!Nn7Fp00{~QljKI!(XMm z1cN|;bx_pk9z4efyx}mcQgc*?QFh?nw+j1D754BrtyF?9XR(f>bmX_=;G$Y|bRJ&} zs2Gu|9QEJ@qUZY-A~q*mK3okrFlkQ&J_G;iWJc~&mZ-Xf{p+5{Jd#%%b3!4u-G;4n zpqul81j0b7&&o;mbL;{FJ8jrMbPK2+Yt#?}FsJbY!ts=r-ohnW;p|Onbtm5l`Bx`xp3zb_+l(q5!sXz- zc(2UWpazC;Y54A%!mh9M0QbNXUXgmyv{omE`5z;y=pmM1*g4 zjy~C>p4QM*Q=*i64c)c$dGjSBpLcA?)Agq>V<}dgs1ky4{n-RYg%i}#-Az=M$DiKD zvqkG*hj?>p-ZT?u5ZNws`i2*my|6ku3|gBAS_SpHl3MLau`2_Z*gVn4Yu%y%;}$tXgg|AV^K7z+I*`ufz>MVaD<0SNY2kl1oh2{Gu6aE0_I`40T5bB$y4k_7_&J;?L>45u-3D}^l4 z^-uVem1k}?U5e8%+Kq8x^5Vx*p~EDpZc!Mq6{ZKxEF{voPkUmSAthBXv4T>j6;rn; z4<>LxIm!Yy5WaMjKRkWY8B^{T%JIvM~dW=|e?$6Y8LiT|mX;4Rfl|&{AT# z$49NZWguP5#iEZc*o01}hKje@e5`1eyIo}+On5VMic8}~rHLKGPDDDnmXy(B z=KIKzlooRN8U!VKCvSgZRItB;*gx$P;3c)`5op+VIP!=<)>Lwo#|%AaFHg6la5hmI zZJlm3$TuZpU8VoQJW}(Gg$CQy_u9e(rNEH6ma-!+@r5T7>sh+(K7Xtt~UN<5*gh4ESlm4+;&`OlQi zZH>d77Wj0|FI=raMvPX#7g%cdZS4bmA2=5lbD28A+ZSe2)chnIr8(o%(-7O^A7g_uL##3 zg^w>B9|1M1gQA0eing=V7H|yW#$*%93!<#j2-RWKORENXH&_VS!_|WN+x6|h(#_?Z z3@Q#gg4h{&PJ*KoHp_h-W-%PXe_BtS z_aLk;jUgeN2)bXlPxGmpL)hM+bl<3pnpZgYl3aY!+`H>h6MZpAy+b(L@kt2*n-07R zOp>^$px2GH-3Y2Xt=a2}|BT<55lG0j-tl-jFPtlbHlIj7@VkfWpL(~!Ju>D+A;lnz+9s94!KIO3)A$W0W}`EX@Tg?z25nwo^eP0@JX*=ugS-9MOT?Uw6?j;; zD0Di~dX=S?*5H_smY4BYkkDB`<#_gj;k>ZN#2--cxlh6^d@1$$?mU=WBOZ+HD<*U; zRGH#^p90nW&X_vf0={bn?0VDXcRLH4t}jg<`Mz&}HngGcdDEB$i@P&N4WGxNtDS_5 zA;;_G(g_t@UZT=#&_-e6w5&8Y>000!_8(|!9tp@;-gBnC3?ND3zc~tE{lgr_ z*g{+Oj&*wQAYc2_6BhWOWV7}|M2ziQclNt&x{3d(T(b z?cuKp^JnXNs{P9Jrl8WNs&xUFr()-$?}Jl+jh6y8VgDOexk_-?joia;X8iT?x}8G! z6ps(qJ&r3~tF;$gTFb#Jwe>}yP`Py?&N)JQsc%6zwvx4(5{gJXlc!+RxncenW61(^ zKRtNerAKv426^A-Jfg!m(eRL}sj3;B$V_Cfk9&wtu4p#R-)7gsJi z5Aru`E#T2ZLLcWOq@H&toPM=Yb8+3#dHtJ8q*^afzn2INh>#scwOly& zsH`?^E|l2z%1^tec&=0`*!w>!loFYnpkaHO%<|>-3rhAgaPVSobJMYXYrGEy$t`(L zt?rbY9}*{Z(iFf4Y!BQqFE_LyrGh?wKYaA_qYh_)&tCx=cz9+XZDYZhjzFxhKXoJ8 zaFjt%PVDT_7g3S#sSnd=STl@xDWh(X+U~ujr!=CC!L+y8>rczi67-#Nm2m z!PCxc7XSvH@a-`8U@q*7tTAXemSZr451X@jK5JcUGDcpM%)!2v{2m;xzIs}9|7Qlem?4P1DbFfmtC zu@EU|ler^aGSG=?k^uGx&1dlr`HD((eb4-x5c@V<7&NaB(k5#9^vjv_2QJkDAfFO! z02!Jut6En#Tz#9k&Y)$h0p$*)G3WL8)ezoH4|3qlp;Fr94vFpc-~5iFri|pMbvtgd z9@EV(CfVO$;>DhIZd!TBdHj08L3ea?vCrj2VGn*hMB-9jgJNtOs@M`I2}!mk)qy_K zSnX$s-Ka}mSwWzgwMeqU4X9o+V4SZ$u7n2pV)f#zg#`5hz*J)JmMH%08`yM+oQX!b z2Y5u8;%-Z7I&M264*aon-dgTsMH#nsKjox;hRe*+=~naD^vxQIg`?2 z6u=G<1Q(4{)io$t2X7b$=b}Yg(`4Vp+QM6^zlhtC)LcoQPgwR$F(Yf}kHdmNs~*>j z&q&1B-d%VxUE>0b@K)Vowys@}IR1`MFUi@<2pDn7z!7f#^y4J7;WdYU6weXYGE_j( z5EE74)gedM0D*4Nb7_QhX;;n4W}9oklbo}@OYHDp+v)af21_p0B)`zw*dlm<2FGNY z`a-;iBy3SN^>$=Hb!(8cr@*Z<}NTQ8SfseJBHOgnK<&WupW zil6UM9r4mb zQ#}GM*zz(x?aXpMR$b*;ubU*BigbjGu9*5k6e&M`L^zYGSn8j}zg3M~`=kc<+@6=( z+KY$Wy_6R*au&}n0+k^UCR4}39(T#NhLXZUa9;@iv-}ouw_0roRRbvS?+Mu&L`uENcN1~i*wO_uyZzufgwacodwCJ@T+uM;tpDNM zK}b+!?ktnnazKG%XiL)dvPFirEZM=0A!gaD@-STw+e(?Hw+U#-jdZJ0?F*s%@b6wu=Ih(A`DLl?r~~y!ElJ6*za(|jxF1y?Y0H{I zL2Ni_Z(-<#5eFTSOtzB!sU97t3Va#;2@nxM7*=Ge-xcj8cYF|IKKsu@e=6{vl<_ zCaEt2ke})M)?0dMvGr@RRXfXuY^(DDmB@F4Rf~RAgMjrHy&Q4WZtaITDLUnIO+!9i zfjYG!t9A~^QEKo&N}Rt4_1h{Ml;12^kd`#5u@E_1qYDNOSd-!wgysBgvKQ4^&UDoD z{A=JWLF=)MEKb~%99pV~Xm^GC zi3VUV0GM_(KXFM_Q$_qeGzNZ&I+YQw87dN4(;<6{I@Qpf5^Vyc$XetjwhB3b;A6YQVoI^{su(}%1>i4wyx#tFy$(r&fn^R3WS8_g8 ztfzf%MhS6prOk0O@$RHC;4v}`nQyjvR022y5S%&LuUW+zO+k$FQ1N;tsNN;!& zVFJ1rD5eVB_f7^3ECnC3KLF}T7EUb-n*sb@sWso4(JUr7Fie-)V+K)P+hKH9;8hoI zPX0ZDA3hwGYyp9hY{<>zDlonesTi?ss{IWg=Mw;1zXz>JMBaDGFov*@}jETG#2-xt_X@|mdbjw zVVpc@_js45YxT9Mr2pgPT1#Ec85ed!{V(ob)oAEb)6Z$%?(rj|pOJ!iRHTB*ue9%% zMBB$!nS0wjx!b;I9`!HR>^&eOJ2=Jkw|}#jh%Dc^UCh=Tu1wrjXN5m@P6fPsf_%VlN?+ll^u>4((&$KK^Vk0meHhW^!`c#RP-w-}yyl2xE$Q=KHY!&wXj^FUS zTuPGxj(lO27AsJaE@1!kc6Z)7O!5!D&%5jri=@6N9$HiL*eSGleLoh9FnN%?co{VK zhC}MRe*=U-iv01TsHfjT!5$ABNl$=@cOubu+(eziqv8lgK_6GW7&pDUexgAl2cupQ ztg3{9TIYIBlmpxYUhn0UEZ@O6+#;7xBq9o%&&?qsXnNlmu-$uS&1#FZ)2Z7v$^7lb)-c9N3}>c zo?czX!uz|b_|KzbodHwmyBk{Td9H#R*{=z52igfwK*xd3z>vB2$|@r_4L7jI0!RTt z@h)qUdBlD_!5GrniG4Nt2L)&=L7+Di3m{eF&D-B3PRLqBZp-(S@s)aUN_WqP@!vfJ z609&pO57bzWg*|J>_3x-4qAcKxs-&QNYf)!0U}CpdWiz0FB3}Gj9&HX;<-J%awS%} zfd+l-?M31=)Txk_3)FBSm59}Ik~&!x;6yJUEHyqiK@HTD13Abc{Es+N#^o95{P9^| zM)OgJN-+-p;l$Ys>jY2c!p`8Zre{c{sOEvA!7u-oh}*72+&B`^1l6FRjaYcOKlo6t z1n?E%WfUiN%FOjO2#PpG8!AVkHQ)RD?T`qk1~4RZFJMOpkW)heaBwP{`;=sg#O?o& b;eiF)Nay$p^v;mdpC0|o*K~5VZJzu;!kPY6 literal 0 HcmV?d00001 diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index ce211baf91ecff6e9d7022a27fa4f72f2b7c7137..ea545d7132cb85849fd3ef1747f23f375d41bade 100644 GIT binary patch literal 41664 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ⅆCP(U%Wm6)n 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

Vil05|uw|#jWr8H&gyoEW8LkCJ=%={Pg6+um2%) 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 Unq`^x24+K(W9CQmj$F9;U*w>)761SM diff --git a/sound/items/cardflip.ogg b/sound/items/cardflip.ogg new file mode 100644 index 0000000000000000000000000000000000000000..88e909cdc1062428dfc8f2181940419ed758a3e2 GIT binary patch literal 13775 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 is heavy."). You can also escape these emphasizers by appending backslashes before them (e.g. say"1\+2\+3" will come out as "1+2+3" and not "1\2\3"). If you knock into somebody while doing a wicked grind on a skateboard, they will be floored for double the time. Radical! +You can cheat games by baking dice in microwaves to make them loaded. Cards can be seen with x-ray vision or be marked with either a pen or crayon to gain an edge. diff --git a/tgstation.dme b/tgstation.dme index a7d59786db7..e43c5515a11 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2395,6 +2395,15 @@ #include "code\modules\capture_the_flag\ctf_panel.dm" #include "code\modules\capture_the_flag\medieval_sim\medisim_classes.dm" #include "code\modules\capture_the_flag\medieval_sim\medisim_game.dm" +#include "code\modules\cards\cardhand.dm" +#include "code\modules\cards\cards.dm" +#include "code\modules\cards\singlecard.dm" +#include "code\modules\cards\deck\blank.dm" +#include "code\modules\cards\deck\cas.dm" +#include "code\modules\cards\deck\deck.dm" +#include "code\modules\cards\deck\kotahi.dm" +#include "code\modules\cards\deck\tarot.dm" +#include "code\modules\cards\deck\wizoff.dm" #include "code\modules\cargo\bounty.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\coupon.dm" @@ -2824,10 +2833,6 @@ #include "code\modules\food_and_drinks\restaurant\custom_order.dm" #include "code\modules\food_and_drinks\restaurant\generic_venues.dm" #include "code\modules\food_and_drinks\restaurant\customers\_customer.dm" -#include "code\modules\games\cas.dm" -#include "code\modules\games\kotahi.dm" -#include "code\modules\games\tarot.dm" -#include "code\modules\games\wizoff.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm"