diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index e1532b50bc6..e08f602b17f 100755
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -258,7 +258,8 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
contains = list(/obj/item/seeds/bloodtomatoseed,
/obj/item/weapon/storage/pill_bottle/zoom,
/obj/item/weapon/storage/pill_bottle/happy,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe)
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,
+ /obj/item/weapon/storage/bag/wiz_cards/frog)
name = "Contraband crate"
cost = 30
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 6210e5e642b..bb289c6c11d 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1167,7 +1167,8 @@
/obj/item/clothing/suit/wizrobe/clown = 1,
/obj/item/clothing/mask/gas/clown_hat/wiz = 1,
/obj/item/clothing/shoes/sandal = 1,
- /obj/item/weapon/staff = 2)
+ /obj/item/weapon/staff = 2,
+ /obj/item/weapon/storage/bag/wiz_cards/full = 1)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
pack = /obj/structure/vendomatpack/magivend //Who's laughing now? - Deity Link
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index a7a3798bb7a..b6a3fad55e7 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -622,271 +622,6 @@
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
-
-
-/*
- * Taken from /tg/
- */
-/obj/item/toy/cards
- name = "deck of cards"
- desc = "A deck of space-grade playing cards."
- icon = 'icons/obj/toy.dmi'
- icon_state = "deck_full"
-
- var/list/cards = list()
-
-/obj/item/toy/cards/New()
- ..()
- for(var/i = 2; i <= 10; i++)
- cards += "[i] of Hearts"
- cards += "[i] of Spades"
- cards += "[i] of Clubs"
- cards += "[i] of Diamonds"
-
- cards += "King of Hearts"
- cards += "King of Spades"
- cards += "King of Clubs"
- cards += "King of Diamonds"
- cards += "Queen of Hearts"
- cards += "Queen of Spades"
- cards += "Queen of Clubs"
- cards += "Queen of Diamonds"
- cards += "Jack of Hearts"
- cards += "Jack of Spades"
- cards += "Jack of Clubs"
- cards += "Jack of Diamonds"
- cards += "Ace of Hearts"
- cards += "Ace of Spades"
- cards += "Ace of Clubs"
- cards += "Ace of Diamonds"
-
-/obj/item/toy/cards/attack_hand(mob/user as mob)
- var/choice = null
- if(!cards.len)
- src.icon_state = "deck_empty"
- user << "There are no more cards to draw."
- return
- var/obj/item/toy/singlecard/H = new/obj/item/toy/singlecard(user.loc)
- choice = cards[1]
- H.cardname = choice
- H.parentdeck = src
- src.cards -= choice
- H.pickup(user)
- user.put_in_active_hand(H)
- src.visible_message("[user] draws a card from the deck.",
- "You draw a card from the deck.")
- if(cards.len > 26)
- src.icon_state = "deck_full"
- else if(cards.len > 10)
- src.icon_state = "deck_half"
- else if(cards.len > 1)
- src.icon_state = "deck_low"
-
-/obj/item/toy/cards/attack_self(mob/user as mob)
- cards = shuffle(cards)
- playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
- user.visible_message("[user] shuffles the deck.",
- "You shuffle the deck.")
-
-/obj/item/toy/cards/attackby(obj/item/toy/singlecard/C, mob/living/user)
- ..()
- if(istype(C))
- if(C.parentdeck == src)
- src.cards += C.cardname
- user.u_equip(C,0)
- user.visible_message("[user] adds a card to the bottom of the deck.",
- "You add the card to the bottom of the deck.")
- qdel(C)
- else
- user << "You can't mix cards from other decks."
- if(cards.len > 26)
- src.icon_state = "deck_full"
- else if(cards.len > 10)
- src.icon_state = "deck_half"
- else if(cards.len > 1)
- src.icon_state = "deck_low"
-
-/obj/item/toy/cards/attackby(obj/item/toy/cardhand/C, mob/living/user)
- ..()
- if(istype(C))
- if(C.parentdeck == src)
- src.cards += C.currenthand
- user.u_equip(C,0)
- user.visible_message("[user] puts their hand of cards into the deck.",
- "You put the hand into the deck.")
- qdel(C)
- else
- user << "You can't mix cards from other decks."
- if(cards.len > 26)
- src.icon_state = "deck_full"
- else if(cards.len > 10)
- src.icon_state = "deck_half"
- else if(cards.len > 1)
- src.icon_state = "deck_low"
-
-/obj/item/toy/cards/MouseDrop(atom/over_object)
- var/mob/M = usr
- if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
- return
- if(Adjacent(usr))
- if(over_object == M)
- M.put_in_hands(src)
- usr << "You pick up the deck."
- else if(istype(over_object, /obj/screen))
- switch(over_object.name)
- if("r_hand")
- M.u_equip(src, 0)
- M.put_in_r_hand(src)
- usr << "You pick up the deck."
- if("l_hand")
- M.u_equip(src, 0)
- M.put_in_l_hand(src)
- usr << "You pick up the deck."
- else
- usr << "You can't reach it from here."
-
-/obj/item/toy/cardhand
- name = "hand of cards"
- desc = "A nmber of cards not in a deck, customarily held in ones hand."
- icon = 'icons/obj/toy.dmi'
- icon_state = "hand2"
- var/list/currenthand = list()
- var/obj/item/toy/cards/parentdeck = null
- var/choice = null
-
-/obj/item/toy/cardhand/attack_self(mob/user as mob)
- user.set_machine(src)
- interact(user)
-
-/obj/item/toy/cardhand/interact(mob/user)
- var/dat = "You have:
"
- for(var/t in currenthand)
- dat += "A [t].
"
- dat += "Which card will you remove next?"
- var/datum/browser/popup = new(user, "cardhand", "Hand of Cards", 400, 240)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.set_content(dat)
- popup.open()
-
-/obj/item/toy/cardhand/Topic(href, href_list)
- if(..())
- return
- if(usr.stat || !ishuman(usr) || !usr.canmove)
- return
- var/mob/living/carbon/cardUser = usr
- if(href_list["pick"])
- if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
- var/choice = href_list["pick"]
- var/obj/item/toy/singlecard/C = new/obj/item/toy/singlecard(cardUser.loc)
- src.currenthand -= choice
- C.parentdeck = src.parentdeck
- C.cardname = choice
- C.pickup(cardUser)
- cardUser.put_in_any_hand_if_possible(C)
- cardUser.visible_message("[cardUser] draws a card from \his hand.",
- "You take the [C.cardname] from your hand.")
- interact(cardUser)
-
- if(src.currenthand.len < 3)
- src.icon_state = "hand2"
- else if(src.currenthand.len < 4)
- src.icon_state = "hand3"
- else if(src.currenthand.len < 5)
- src.icon_state = "hand4"
-
- if(src.currenthand.len == 1)
- var/obj/item/toy/singlecard/N = new/obj/item/toy/singlecard(src.loc)
- N.parentdeck = src.parentdeck
- N.cardname = src.currenthand[1]
- cardUser.u_equip(src,0)
- N.pickup(cardUser)
- cardUser.put_in_any_hand_if_possible(N)
- cardUser << "You also take [currenthand[1]] and hold it."
- cardUser << browse(null, "window=cardhand")
- qdel(src)
- return
-
-/obj/item/toy/cardhand/attackby(obj/item/toy/singlecard/C, mob/living/user)
- if(istype(C))
- if(C.parentdeck == src.parentdeck)
- src.currenthand += C.cardname
- user.u_equip(C, 0)
- user.visible_message("[user] adds a card to their hand.",
- "You add the [C.cardname] to your hand.")
- interact(user)
- if(currenthand.len > 4)
- src.icon_state = "hand5"
- if(currenthand.len > 3)
- src.icon_state = "hand4"
- if(currenthand.len > 2)
- src.icon_state = "hand3"
- qdel(C)
- else
- user << "span class = 'warning'> You can't mix cards from other decks."
-
-
-/obj/item/toy/singlecard
- name = "card"
- desc = "\a card"
- icon = 'icons/obj/toy.dmi'
- icon_state = "singlecard_down"
- var/cardname = null
- var/obj/item/toy/cards/parentdeck = null
- var/flipped = 0
- pixel_x = -5
-
-/obj/item/toy/singlecard/examine(mob/user)
- if(ishuman(user))
- var/mob/living/carbon/human/cardUser = user
- if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
- cardUser.visible_message("[cardUser] checks \his card.",
- "The card reads: [src.cardname]")
- else
- cardUser << "You need to have the card in your hand to check it."
-
-/obj/item/toy/singlecard/verb/Flip()
- set name = "Flip Card"
- set category = "Object"
- set src in range(1)
- if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained() || (usr.status_flags & FAKEDEATH))
- return
- if(!flipped)
- src.flipped = 1
- if(cardname)
- src.icon_state = "sc_[cardname]"
- src.name = src.cardname
- else
- src.icon_state = "sc_Ace of Spades"
- src.name = "What Card"
- src.pixel_x = 5
- else if(flipped)
- src.flipped = 0
- src.icon_state = "singlecard_down"
- src.name = "card"
- src.pixel_x = -5
-
-/obj/item/toy/singlecard/attackby(obj/item/I, mob/living/user)
- if(istype(I, /obj/item/toy/singlecard/))
- var/obj/item/toy/singlecard/C = I
- if(C.parentdeck == src.parentdeck)
- var/obj/item/toy/cardhand/H = new/obj/item/toy/cardhand(user.loc)
- H.currenthand += C.cardname
- H.currenthand += src.cardname
- H.parentdeck = C.parentdeck
- user.u_equip(C,0)
- H.pickup(user)
- user.put_in_active_hand(H)
- user << "You combine the [C.cardname] and the [src.cardname] into a hand."
- qdel(C)
- qdel(src)
- else
- user << "You can't mix cards from other decks."
-
-/obj/item/toy/singlecard/attack_self(mob/user)
- if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
- return
- Flip()
-
/*
* OMG THEIF
*/
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index a3d4992ccb0..3a3dfd3dbfb 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -115,12 +115,12 @@
max_w_class = 3
w_class = 3
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks")
-
+
/obj/item/weapon/storage/bag/food/update_icon()
if(contents.len < 1)
icon_state = "foodbag0"
else icon_state = "foodbag1"
-
+
// -----------------------------
// Pill Collector
// -----------------------------
@@ -136,7 +136,6 @@
w_class = 1
can_hold = list("/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/pill","/obj/item/weapon/reagent_containers/syringe")
-
// -----------------------------
// Sheet Snatcher
// -----------------------------
diff --git a/code/modules/games/cards/playing_cards.dm b/code/modules/games/cards/playing_cards.dm
new file mode 100644
index 00000000000..52a95a582b3
--- /dev/null
+++ b/code/modules/games/cards/playing_cards.dm
@@ -0,0 +1,291 @@
+#define CARD_DISPLACE 9
+#define CARD_WIDTH 7 //width of the icon
+
+/*
+ * Taken from /tg/
+ */
+
+/datum/context_click/cardhand/return_clicked_id(x_pos, y_pos)
+ var/obj/item/toy/cardhand/hand = holder
+
+ var/card_distance = CARD_DISPLACE - hand.currenthand.len //how far apart each card is
+ var/starting_card_x = hand.currenthand.len * (CARD_DISPLACE - hand.currenthand.len) - CARD_DISPLACE
+
+ if(x_pos < starting_card_x + CARD_WIDTH)
+ return 1
+ else
+ return round( ( x_pos - (starting_card_x + CARD_WIDTH) ) / card_distance ) + 2 //+2, because we floor, and because we skipped the first card
+
+/datum/context_click/cardhand/action(obj/item/used_item, mob/user, params)
+ var/obj/item/toy/cardhand/hand = holder
+ if(!used_item)
+ var/index = Clamp(return_clicked_id_by_params(params), 1, hand.currenthand.len)
+ var/obj/item/toy/singlecard/card = hand.currenthand[index]
+ hand.currenthand.Remove(card)
+ user.put_in_hands(card)
+ hand.update_icon()
+ else if(istype(used_item, /obj/item/toy/singlecard))
+ var/index = Clamp(return_clicked_id_by_params(params), 1, hand.currenthand.len)
+ hand.currenthand.Insert(index, used_item) //we put it where we specified
+ hand.update_icon()
+
+
+
+/obj/item/toy/cards
+ name = "deck of cards"
+ desc = "A deck of space-grade playing cards."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "deck_full"
+
+ var/list/cards = list() //list of the singlecard items we carry
+ var/strict_deck = 1 //if we only accept cards that came from us
+
+/obj/item/toy/cards/New()
+ ..()
+ generate_cards()
+ update_icon()
+
+/obj/item/toy/cards/proc/generate_cards()
+ for(var/i = 2; i <= 10; i++)
+ cards += new/obj/item/toy/singlecard(src, src, "[i] of Hearts")
+ cards += new/obj/item/toy/singlecard(src, src, "[i] of Spades")
+ cards += new/obj/item/toy/singlecard(src, src, "[i] of Clubs")
+ cards += new/obj/item/toy/singlecard(src, src, "[i] of Diamonds")
+
+ cards += new/obj/item/toy/singlecard(src, src, "King of Hearts")
+ cards += new/obj/item/toy/singlecard(src, src, "King of Spades")
+ cards += new/obj/item/toy/singlecard(src, src, "King of Clubs")
+ cards += new/obj/item/toy/singlecard(src, src, "King of Diamonds")
+ cards += new/obj/item/toy/singlecard(src, src, "Queen of Hearts")
+ cards += new/obj/item/toy/singlecard(src, src, "Queen of Spades")
+ cards += new/obj/item/toy/singlecard(src, src, "Queen of Clubs")
+ cards += new/obj/item/toy/singlecard(src, src, "Queen of Diamonds")
+ cards += new/obj/item/toy/singlecard(src, src, "Jack of Hearts")
+ cards += new/obj/item/toy/singlecard(src, src, "Jack of Spades")
+ cards += new/obj/item/toy/singlecard(src, src, "Jack of Clubs")
+ cards += new/obj/item/toy/singlecard(src, src, "Jack of Diamonds")
+ cards += new/obj/item/toy/singlecard(src, src, "Ace of Hearts")
+ cards += new/obj/item/toy/singlecard(src, src, "Ace of Spades")
+ cards += new/obj/item/toy/singlecard(src, src, "Ace of Clubs")
+ cards += new/obj/item/toy/singlecard(src, src, "Ace of Diamonds")
+
+/obj/item/toy/cards/attack_hand(mob/user as mob)
+ var/choice = null
+ if(!cards.len)
+ src.icon_state = "deck_empty"
+ user << "There are no more cards to draw."
+ return
+ choice = cards[1]
+ src.cards -= choice
+ user.put_in_active_hand(choice)
+ src.visible_message("[user] draws a card from the deck.",
+ "You draw a card from the deck.")
+
+ update_icon()
+
+/obj/item/toy/cards/attack_self(mob/user as mob)
+ cards = shuffle(cards)
+ playsound(user, 'sound/items/cardshuffle.ogg', 50, 1)
+ user.visible_message("[user] shuffles the deck.",
+ "You shuffle the deck.")
+
+/obj/item/toy/cards/attackby(obj/item/I, mob/living/user)
+ ..()
+ if(istype(I, /obj/item/toy/singlecard))
+ var/obj/item/toy/singlecard/C = I
+ if((!C.parentdeck && !strict_deck) || C.parentdeck == src)
+ src.cards += C
+ user.drop_item(C, src)
+ user.visible_message("[user] adds a card to the bottom of the deck.",
+ "You add the card to the bottom of the deck.")
+ else
+ user << "You can't mix cards from other decks."
+ update_icon()
+
+ if(istype(I, /obj/item/toy/cardhand))
+ var/obj/item/toy/cardhand/C = I
+ if((!C.parentdeck && !strict_deck) || C.parentdeck == src)
+ for(var/obj/item/toy/singlecard/card in C.currenthand)
+ card.loc = src
+ cards += card
+ user.drop_item(C)
+ user.visible_message("[user] puts their hand of cards into the deck.",
+ "You put the hand into the deck.")
+ qdel(C)
+ else
+ user << "You can't mix cards from other decks."
+ update_icon()
+
+/obj/item/toy/cards/update_icon()
+ if(cards.len > 26)
+ src.icon_state = "deck_full"
+ else if(cards.len > 10)
+ src.icon_state = "deck_half"
+ else if(cards.len > 1)
+ src.icon_state = "deck_low"
+
+/obj/item/toy/cards/MouseDrop(atom/over_object)
+ var/mob/M = usr
+ if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
+ return
+ if(Adjacent(usr))
+ if(over_object == M)
+ M.put_in_hands(src)
+ usr << "You pick up the deck."
+ else if(istype(over_object, /obj/screen))
+ switch(over_object.name)
+ if("r_hand")
+ M.u_equip(src, 0)
+ M.put_in_r_hand(src)
+ usr << "You pick up the deck."
+ if("l_hand")
+ M.u_equip(src, 0)
+ M.put_in_l_hand(src)
+ usr << "You pick up the deck."
+ else
+ usr << "You can't reach it from here."
+
+////////////////////////////
+/////////CARD HANDS/////////
+////////////////////////////
+
+/obj/item/toy/cardhand
+ name = "hand of cards"
+ desc = "A nmber of cards not in a deck, customarily held in ones hand."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "handbase"
+ var/list/currenthand = list()
+ var/obj/item/toy/cards/parentdeck = null
+ var/max_hand_size = 5
+
+ var/datum/context_click/cardhand/hand_click
+
+/obj/item/toy/cardhand/New()
+ ..()
+ hand_click = new(src)
+
+/obj/item/toy/cardhand/examine(mob/user)
+ ..()
+ var/name_list = list()
+ for(var/obj/item/toy/singlecard/card in currenthand)
+ name_list += card.name //we don't use cardname because they might be flipped
+ user.show_message("It holds [english_list(name_list)]", 1)
+
+/obj/item/toy/cardhand/attackby(obj/item/toy/singlecard/C, mob/living/user, params)
+ if(istype(C))
+ if(!(C.parentdeck || src.parentdeck) || C.parentdeck == src.parentdeck)
+ if(currenthand.len >= max_hand_size)
+ user << " You can't add any more cards to this hand."
+ return
+ hand_click.action(C, user, params)
+ user.drop_item(C, src)
+ user.visible_message("[user] adds a card to their hand.",
+ "You add the [C.cardname] to your hand.")
+ update_icon()
+ else
+ user << " You can't mix cards from other decks."
+ return 1
+ if(istype(C, /obj/item/toy/cards)) //shuffle us in
+ return C.attackby(src, user)
+ return ..()
+
+/obj/item/toy/cardhand/attack_self(mob/user)
+ for(var/obj/item/toy/singlecard/card in currenthand)
+ card.Flip()
+ update_icon()
+ return ..()
+
+/obj/item/toy/cardhand/attack_hand(mob/user, params)
+ if(user.get_inactive_hand() == src)
+ return hand_click.action(null, user, params)
+ return ..()
+
+/obj/item/toy/cardhand/update_icon()
+ overlays.len = 0
+ for(var/i = currenthand.len; i >= 1; i--)
+ var/obj/item/toy/singlecard/card = currenthand[i]
+ if(card)
+ card.layer = FLOAT_LAYER
+ card.pixel_x = i * (CARD_DISPLACE - currenthand.len) - CARD_DISPLACE
+ overlays += card
+
+/*
+/obj/item/toy/cardhand/pickup(mob/user)
+ update_icon()
+
+/obj/item/toy/cardhand/dropped(mob/user)
+ update_icon()
+*/
+
+///////////////////////////
+/////////CARD ITEMS////////
+///////////////////////////
+
+/obj/item/toy/singlecard
+ name = "card"
+ desc = "\a card"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "singlecard_down"
+ var/cardname = null
+ var/obj/item/toy/cards/parentdeck = null
+ var/flipped = 0
+ pixel_x = -5
+
+/obj/item/toy/singlecard/New(NewLoc, cardsource, newcardname)
+ ..(NewLoc)
+ if(cardsource)
+ parentdeck = cardsource
+ if(newcardname)
+ cardname = newcardname
+ name = cardname
+ update_icon()
+
+/obj/item/toy/singlecard/update_icon()
+ if(flipped)
+ icon_state = "singlecard_down"
+ pixel_x = -5
+ name = "card"
+ else
+ if(cardname)
+ src.icon_state = "sc_[cardname]"
+ src.name = src.cardname
+ else
+ src.icon_state = "sc_Ace of Spades"
+ src.name = "What Card"
+ src.pixel_x = 5
+
+/obj/item/toy/singlecard/examine(mob/user)
+ ..()
+ if(ishuman(user))
+ var/mob/living/carbon/human/cardUser = user
+ if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src)
+ cardUser.visible_message("[cardUser] checks \his card.",
+ "The card reads: [src.name]")
+ else
+ cardUser << "You need to have the card in your hand to check it."
+
+/obj/item/toy/singlecard/proc/Flip()
+ flipped = !flipped
+ update_icon()
+
+/obj/item/toy/singlecard/attackby(obj/item/I, mob/living/user)
+ if(istype(I, /obj/item/toy/singlecard))
+ var/obj/item/toy/singlecard/C = I
+ if(!(C.parentdeck || src.parentdeck) || C.parentdeck == src.parentdeck)
+ var/obj/item/toy/cardhand/H = new/obj/item/toy/cardhand(user.loc)
+ H.parentdeck = C.parentdeck
+ user.put_in_active_hand(H)
+ user << "You combine \the [C] and \the [src] into a hand."
+ user.drop_item(C, H)
+ user.remove_from_mob(src) //we could be anywhere!
+ src.forceMove(H)
+ H.currenthand += C
+ H.currenthand += src
+ H.update_icon()
+ user.put_in_hands(H)
+ else
+ user << "You can't mix cards from other decks."
+
+/obj/item/toy/singlecard/attack_self(mob/user)
+ Flip()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/games/cards/wizard_cards.dm b/code/modules/games/cards/wizard_cards.dm
new file mode 100644
index 00000000000..fe14b1053f6
--- /dev/null
+++ b/code/modules/games/cards/wizard_cards.dm
@@ -0,0 +1,308 @@
+var/global/list/wizard_cards_rare = list(
+ /obj/item/toy/singlecard/wizard/legendary/honkmother,
+ /obj/item/toy/singlecard/wizard/legendary/singularity,
+ /obj/item/toy/singlecard/wizard/legendary/jew,
+ /obj/item/toy/singlecard/wizard/legendary/narsie,
+ /obj/item/toy/singlecard/wizard/legendary/pomf
+ )
+
+var/global/list/wizard_cards_normal = list(
+ /obj/item/toy/singlecard/wizard/clown,
+ /obj/item/toy/singlecard/wizard/bomberman,
+ /obj/item/toy/singlecard/wizard/captain,
+ /obj/item/toy/singlecard/wizard/hos,
+ /obj/item/toy/singlecard/wizard/scientist,
+ /obj/item/toy/singlecard/wizard/assistant,
+ /obj/item/toy/singlecard/wizard/secborg,
+ /obj/item/toy/singlecard/wizard/nukeop,
+ /obj/item/toy/singlecard/wizard/engineer,
+ /obj/item/toy/singlecard/wizard/chef,
+ /obj/item/toy/singlecard/wizard/changeling,
+ /obj/item/toy/singlecard/wizard/mime,
+ /obj/item/toy/singlecard/wizard/mommi,
+ /obj/item/toy/singlecard/wizard/AI,
+ /obj/item/toy/singlecard/wizard/vox,
+ /obj/item/toy/singlecard/wizard/doctor,
+ /obj/item/toy/singlecard/wizard/tator,
+ /obj/item/toy/singlecard/wizard/borer,
+ /obj/item/toy/singlecard/wizard/ian
+ )
+
+#define CARD_PORTRAIT "portrait"
+#define CARD_FLIP "flip"
+
+/datum/context_click/wizard_card/return_clicked_id(x_pos, y_pos)
+ if(14 <= x_pos && x_pos <= 19)
+ if(7 <= y_pos && y_pos <= 20)
+ return CARD_PORTRAIT
+ return CARD_FLIP
+
+/datum/context_click/wizard_card/action(obj/item/used_item, mob/user, params)
+ var/obj/item/toy/singlecard/wizard/card = holder
+ if(!used_item)
+ switch(return_clicked_id_by_params(params))
+ if(CARD_PORTRAIT)
+ return card.special_effect()
+ else
+ return card.Flip()
+
+
+/obj/item/toy/singlecard/wizard
+ name = "wizard trading card"
+ desc = "A trading card."
+ icon = 'icons/obj/wiz_cards.dmi'
+ icon_state = "card"
+ var/image/char_image
+ var/ability_cd = 0
+
+ var/datum/context_click/wizard_card/card_use
+
+/obj/item/toy/singlecard/wizard/New()
+ .=..()
+
+ card_use = new(src)
+
+ char_image = image('icons/obj/wiz_cards.dmi',cardname)
+ update_icon()
+
+/obj/item/toy/singlecard/wizard/update_icon()
+ if(flipped)
+ overlays -= char_image
+ icon_state = "wizcard_down"
+ name = "card"
+ else
+ src.icon_state = initial(icon_state)
+ src.name = initial(src.name)
+ src.overlays += char_image
+
+/obj/item/toy/singlecard/wizard/attack_self(mob/user, params)
+ return card_use.action(null, user, params)
+
+/obj/item/toy/singlecard/wizard/proc/special_effect(mob/user)
+ if(!ability_cd)
+ ability_cd = 1
+ spawn(50)
+ ability_cd = 0
+ return 1
+ return 0
+
+/obj/item/toy/singlecard/wizard/legendary
+ icon_state = "card_legendary"
+
+/obj/item/toy/singlecard/wizard/legendary/honkmother
+ name = "rare Honkmother wizard card"
+ desc = "Honkmother is a legendary chaos entity. Sweet heavens."
+ icon_state = "card_clown"
+ cardname = "honkmother"
+
+/obj/item/toy/singlecard/wizard/legendary/honkmother/special_effect(mob/user)
+ if(!..())
+ user << "Honkmother is not ready yet!"
+ return
+
+ playsound(get_turf(src), 'sound/items/AirHorn.ogg', 50, 1)
+
+/obj/item/toy/singlecard/wizard/legendary/honkmother/pickup(mob/living/user as mob)
+ if(user.mind && user.mind.assigned_role == "Clown")
+ user << "You feel Honkmother's presence as you pick up the card."
+
+/obj/item/toy/singlecard/wizard/legendary/singularity
+ name = "rare singularity wizard card"
+ desc = "The singularity is a legendary neutral entity. Gods help you if you fail to contain it."
+ cardname = "singulo"
+
+/obj/item/toy/singlecard/wizard/legendary/jew
+ name = "rare Agent Aronowicz wizard card"
+ desc = "Agent Aronowicz is a legendary order entity. Never forget the six billion."
+ icon_state = "card_rich"
+ cardname = "jew"
+
+/obj/item/toy/singlecard/wizard/legendary/narsie
+ name = "rare Nar-Sie wizard card"
+ desc = "Nar-Sie is a legendary destruction entity. It can destroy bluespace itself."
+ icon_state = "card_evil"
+ cardname = "narsie"
+
+/obj/item/toy/singlecard/wizard/legendary/pomf
+ name = "rare Pomf chicken wizard card"
+ desc = "Pomf chicken is a legendary order entity. Despite holding great power, it is easily intimidated."
+ icon_state = "card_rich"
+ cardname = "chicken"
+
+/obj/item/toy/singlecard/wizard/clown
+ name = "clown wizard card"
+ desc = "The clown is a strong chaos entity. It's incredibly powerful, but never predictable."
+ cardname = "clown"
+
+/obj/item/toy/singlecard/wizard/clown/special_effect(mob/user)
+ if(!..())
+ user << "The clown is not ready yet!"
+ return
+
+ playsound(get_turf(src), 'sound/items/bikehorn.ogg', 50, 1)
+
+/obj/item/toy/singlecard/wizard/bomberman
+ name = "bomberman wizard card"
+ desc = "The bomberman is a strong destruction entity. Nothing can match it in terms of wrecking havoc and carnage, but it is often caught in its own explosions."
+ cardname = "bomberman"
+
+/obj/item/toy/singlecard/wizard/captain
+ name = "captain wizard card"
+ desc = "The captain is a medium chaos entity. Let the dice decide whether it will be good or bad for you!"
+ cardname = "captain"
+
+/obj/item/toy/singlecard/wizard/hos
+ name = "HoS wizard card"
+ desc = "The head of security is a medium order entity. It keeps everything under control and in strict order, even when you don't want it to."
+ cardname = "hos"
+
+/obj/item/toy/singlecard/wizard/scientist
+ name = "scientist wizard card"
+ desc = "The scientist is a medium destruction entity. Give it some time to prepare, and you won't be disappointed."
+ cardname = "scientist"
+
+/obj/item/toy/singlecard/wizard/assistant
+ name = "assistant wizard card"
+ desc = "The assistant is a weak chaos entity. What side is it even on? Who knows."
+ cardname = "assistant"
+
+/obj/item/toy/singlecard/wizard/secborg
+ name = "cyborg wizard card"
+ desc = "The cyborg is a weak order entity. While powerful in theory, its asimov lawset often makes it more of a hinderance."
+ cardname = "cyborg"
+
+/obj/item/toy/singlecard/wizard/nukeop
+ name = "syndicate wizard card"
+ desc = "The syndicate operative is a weak destruction entity. While not really powerful by itself, it is a force to be reckoned with when in large numbers. Explodes on death."
+ cardname = "nukeop"
+
+/obj/item/toy/singlecard/wizard/engineer
+ name = "engineer wizard card"
+ desc = "The engineer is a weak order entity. It is weak in fights and powercreeped by MoMMIs."
+ cardname = "engineer"
+
+/obj/item/toy/singlecard/wizard/chef
+ name = "chef wizard card"
+ desc = "The chef is a weak order entity. It has both the ability to be deadly in a fight, and it can keep everybody fed!"
+ cardname = "cook"
+
+/obj/item/toy/singlecard/wizard/changeling
+ name = "changeling wizard card"
+ desc = "The changeling is a medium destruction entity. It is very hard to get rid of."
+ cardname = "changeling"
+
+/obj/item/toy/singlecard/wizard/mime
+ name = "mime wizard card"
+ desc = "The mime is a weak chaos entity, and the clown's mortal enemy."
+ cardname = "mime"
+
+/obj/item/toy/singlecard/wizard/mommi
+ name = "MoMMI wizard card"
+ desc = "The MoMMI is a weak order entity. It can't do anything in fights, but who else can keep an entire space station maintained and powered better than the MoMMI?"
+ cardname = "mommi"
+
+/obj/item/toy/singlecard/wizard/AI
+ name = "AI wizard card"
+ desc = "The AI is a medium order entity. While useless in fights, it can control the cyborgs and the battlefield's environment."
+ cardname = "ai"
+
+/obj/item/toy/singlecard/wizard/vox
+ name = "vox wizard card"
+ desc = "The vox is a medium chaos entity. Time to steal the station's engineering department!"
+ cardname = "vox"
+
+/obj/item/toy/singlecard/wizard/doctor
+ name = "doctor wizard card"
+ desc = "The doctor is a weak order entity. In addition to being robust, the doctor can provide first aid to his injured allies, and even clone the dead ones."
+ cardname = "doc"
+
+/obj/item/toy/singlecard/wizard/tator
+ name = "traitor wizard card"
+ desc = "The traitor is a weak destruction entity. It grows in power with time, and once it gained enough momentum it is very hard to stop."
+ cardname = "tator"
+
+/obj/item/toy/singlecard/wizard/borer
+ name = "borer wizard card"
+ desc = "The borer is a weak chaos entity. It can gain control of a human and produce more borers to completely overtake the station."
+ cardname = "borer"
+
+/obj/item/toy/singlecard/wizard/borer/small
+ name = "borer token card"
+ desc = "The borer is a weak chaos entity. It can gain control of a human, but it can't reproduce."
+ icon_state = "card_gray"
+
+/obj/item/toy/singlecard/wizard/borer/special_effect(mob/user)
+ if(!..())
+ user << "The borer is not yet ready."
+ return
+
+ new /obj/item/toy/singlecard/wizard/borer/small(get_turf(src.loc))
+ user << "You create a borer token card!"
+
+/obj/item/toy/singlecard/wizard/borer/small/special_effect()
+ return
+
+/obj/item/toy/singlecard/wizard/ian
+ name = "Ian wizard card"
+ desc = "Ian is a strong neutral entity. Legends say that the one who kills Ian will forever be cursed."
+ cardname = "ian"
+
+/obj/item/weapon/storage/bag/wiz_cards
+ icon = 'icons/obj/wiz_cards.dmi'
+ icon_state = "cardpack"
+ name = "Wizard Card Pack"
+ storage_slots = 50
+ max_combined_w_class = 200
+ max_w_class = 3
+ w_class = 1
+ can_hold = list("/obj/item/toy/wizard_card","/obj/item/weapon/reagent_containers/food/snacks/chocofrog")
+
+/obj/item/weapon/storage/bag/wiz_cards/full/New()
+ ..()
+ new /obj/item/toy/cards/wizard/full(src)
+
+/obj/item/toy/cards/wizard
+ icon = 'icons/obj/wiz_cards.dmi'
+ icon_state = "wizdeck_low"
+ strict_deck = 0
+
+/obj/item/toy/cards/wizard/generate_cards()
+ return
+
+/obj/item/toy/cards/update_icon()
+ if(cards.len > 15)
+ src.icon_state = "wizdeck_full"
+ else if(cards.len > 8)
+ src.icon_state = "wizdeck_half"
+ else if(cards.len > 1)
+ src.icon_state = "wizdeck_low"
+ else
+ src.icon_state = "wizdeck_empty"
+
+/obj/item/toy/cards/wizard/full/generate_cards()
+ for(var/card in wizard_cards_normal)
+ var/newcard = new card(src)
+ cards += newcard
+ for(var/card in wizard_cards_rare)
+ var/newcard = new card(src)
+ cards += newcard
+
+/obj/item/weapon/storage/bag/wiz_cards/attack_self(mob/user)
+ icon_state = "cardpack_open"
+ .=..()
+
+/obj/item/weapon/storage/bag/wiz_cards/show_to(mob/user as mob)
+ icon_state = "cardpack_open"
+ .=..()
+
+/obj/item/weapon/storage/bag/wiz_cards/frog/New()
+ ..()
+ contents += new /obj/item/weapon/reagent_containers/food/snacks/chocofrog
+ var/card
+ if(prob(80)) //80% chance for a classic card, 20% for a legendary
+ card=pick(wizard_cards_normal)
+ new card(src)
+ else
+ card=pick(wizard_cards_rare)
+ new card(src)
+
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards_html.dm
similarity index 98%
rename from code/modules/games/cards.dm
rename to code/modules/games/cards_html.dm
index e5c31c027cc..4935fa52162 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards_html.dm
@@ -9,7 +9,7 @@
/obj/item/weapon/deck
name = "deck of cards"
desc = "A simple deck of playing cards."
- icon = 'playing_cards.dmi'
+ icon = 'playing_cards_html.dmi'
icon_state = "deck"
w_class = 2
@@ -112,7 +112,7 @@
/obj/item/weapon/hand
name = "hand of cards"
desc = "Some playing cards."
- icon = 'playing_cards.dmi'
+ icon = 'playing_cards_html.dmi'
icon_state = "empty"
w_class = 1
diff --git a/code/modules/games/playing_cards.dmi b/code/modules/games/playing_cards_html.dmi
similarity index 100%
rename from code/modules/games/playing_cards.dmi
rename to code/modules/games/playing_cards_html.dmi
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 5127f93cfed..c16e2340abe 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -3427,4 +3427,48 @@
reagents.add_reagent("nutriment", 10)
if(10)
desc += " Just a dollop of garnishes."
- reagents.add_reagent("nutriment", 10)
\ No newline at end of file
+ reagents.add_reagent("nutriment", 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/chocofrog
+ name = "chocolate frog"
+ desc = "An exotic snack originating from the Space Wizard Federation. Very slippery!"
+ icon = 'icons/obj/wiz_cards.dmi'
+ icon_state = "frog"
+
+ var/jump_cd
+ New()
+ ..()
+ reagents.add_reagent("nutriment",2)
+ reagents.add_reagent("hyperzine",1)
+
+/obj/item/weapon/reagent_containers/food/snacks/chocofrog/HasProximity(atom/movable/AM as mob|obj)
+ if(!jump_cd)
+ jump()
+ return ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/chocofrog/proc/jump()
+ if(!istype(src.loc,/turf)) return
+ jump_cd=1
+ spawn(50)
+ jump_cd=0
+
+ var/list/escape_paths=list()
+
+ for(var/turf/T in view(7,src))
+ escape_paths |= T
+
+ var/turf/T = pick(escape_paths)
+ src.throw_at(T, 10, 2)
+ return 1
+
+/obj/item/weapon/reagent_containers/food/snacks/chocofrog/pickup(mob/living/user as mob)
+ var/mob/living/carbon/human/H = user
+ if(!H) return 1
+
+ spawn(0)
+ if(((M_CLUMSY in H.mutations)) || prob(25))
+ user.visible_message("[src] escapes from [H]'s hands!","[src] escapes from your grasp!")
+ H.drop_item()
+
+ jump()
+ return 1
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 9ee85f3965e..faa7e1e1f2b 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/wiz_cards.dmi b/icons/obj/wiz_cards.dmi
new file mode 100644
index 00000000000..e12ac29d286
Binary files /dev/null and b/icons/obj/wiz_cards.dmi differ
diff --git a/vgstation13.dme b/vgstation13.dme
index 910fd96d676..892f02a412f 100644
--- a/vgstation13.dme
+++ b/vgstation13.dme
@@ -1044,7 +1044,9 @@
#include "code\modules\food\customizables.dm"
#include "code\modules\food\icecreamvat.dm"
#include "code\modules\food\recipes_microwave.dm"
-#include "code\modules\games\cards.dm"
+#include "code\modules\games\cards_html.dm"
+#include "code\modules\games\cards\playing_cards.dm"
+#include "code\modules\games\cards\wizard_cards.dm"
#include "code\modules\genetics\side_effects.dm"
#include "code\modules\html_interface\html_interface.dm"
#include "code\modules\html_interface\html_interface_client.dm"