Files
Aurora.3/code/modules/games/cards.dm
2022-05-17 02:44:34 +02:00

347 lines
8.6 KiB
Plaintext

/datum/playingcard
var/name = "playing card"
var/desc = null
var/card_icon = "card_back"
var/back_icon = "card_back"
/obj/item/deck
w_class = ITEMSIZE_SMALL
icon = 'icons/obj/playing_cards.dmi'
var/list/cards = list()
/obj/item/deck/proc/generate_deck() //the procs that creates the cards
return
/obj/item/deck/cards
name = "deck of cards"
desc = "A simple deck of playing cards."
icon_state = "deck"
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
/obj/item/deck/Initialize()
. = ..()
generate_deck()
/obj/item/deck/cards/generate_deck()
var/datum/playingcard/P
for(var/suit in list("spades","clubs","diamonds","hearts"))
var/colour
if(suit == "spades" || suit == "clubs")
colour = "black_"
else
colour = "red_"
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[colour]num"
P.back_icon = "card_back"
cards += P
for(var/number in list("jack","queen","king"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[colour]col"
P.back_icon = "card_back"
cards += P
for(var/i = 0,i<2,i++)
P = new()
P.name = "joker"
P.card_icon = "joker"
cards += P
/obj/item/deck/attack_hand(mob/user)
if(cards.len && (user.l_hand == src || user.r_hand == src))
draw_card(user, FALSE)
else
..()
/obj/item/deck/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/hand))
var/obj/item/hand/H = O
for(var/datum/playingcard/P in H.cards)
cards += P
qdel(O)
to_chat(user, SPAN_NOTICE("You place your cards at the bottom of \the [src]."))
return
..()
/obj/item/deck/verb/draw_card()
set category = "Object"
set name = "Draw"
set desc = "Draw a card from a deck."
set src in view(1)
select_card(usr)
/obj/item/deck/proc/select_card(var/mob/user)
if(use_check_and_message(user, USE_DISALLOW_SILICONS))
return
if(!iscarbon(user))
to_chat(user, SPAN_WARNING("Your simple form can't operate \the [src]."))
if(!cards.len)
to_chat(usr, SPAN_WARNING("There are no cards in \the [src]."))
return
var/obj/item/hand/H
if(user.l_hand && istype(user.l_hand,/obj/item/hand))
H = user.l_hand
else if(user.r_hand && istype(user.r_hand,/obj/item/hand))
H = user.r_hand
else
H = new /obj/item/hand(get_turf(src))
user.put_in_hands(H)
if(!H || !user)
return
var/list/to_discard = list()
for(var/datum/playingcard/P in cards)
to_discard[P.name] = P
var/discarding = input(user, "Which card do you wish to draw?", "Deck of Cards") as null|anything in to_discard
if(!discarding || !to_discard[discarding] || !user || !src)
return
var/datum/playingcard/P = to_discard[discarding]
H.cards += P
cards -= P
H.update_icon()
user.visible_message("<b>\The [user]</b> draws a card.", SPAN_NOTICE("You draw the [P.name]."))
/obj/item/deck/verb/deal_card()
set category = "Object"
set name = "Deal"
set desc = "Deal a card from a deck."
set src in view(1)
if(usr.stat || !Adjacent(usr))
return
if(!cards.len)
to_chat(usr, SPAN_WARNING("There are no cards in the deck."))
return
var/list/players = list()
for(var/mob/living/player in viewers(3))
if(!player.stat)
players += player
var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players
if(!usr || !src || !M) return
deal_at(usr, M)
/obj/item/deck/proc/deal_at(mob/user, mob/target)
var/obj/item/hand/H = new(get_step(user, user.dir))
H.cards += cards[1]
cards -= cards[1]
H.concealed = 1
H.update_icon()
if(user==target)
user.visible_message("<b>\The [user]</b> deals a card to [user.get_pronoun("himself")].")
else
user.visible_message("<b>\The [user]</b> deals a card to \the [target].")
H.throw_at(get_step(target,target.dir),10,1,H)
/obj/item/hand/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/hand))
var/obj/item/hand/H = O
user.visible_message("<b>\The [user]</b> adds \the [H] to their hand.", SPAN_NOTICE("You add \the [H] to your hand."))
for(var/datum/playingcard/P in cards)
H.cards += P
H.concealed = src.concealed
qdel(src)
H.update_icon()
return
..()
/obj/item/deck/attack_self(var/mob/user as mob)
var/list/newcards = list()
while(cards.len)
var/datum/playingcard/P = pick(cards)
newcards += P
cards -= P
cards = newcards
playsound(src.loc, 'sound/items/cardshuffle.ogg', 100, 1, -4)
user.visible_message("<b>\The [user]</b> shuffles [src].")
/obj/item/deck/MouseDrop(atom/over)
if(!usr || !over) return
if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows
if(!ishuman(over) || !(over in viewers(3))) return
if(!cards.len)
to_chat(usr, SPAN_WARNING("There are no cards in the deck."))
return
deal_at(usr, over)
/obj/item/pack/
name = "card pack"
desc = "For those with disposible income."
icon = 'icons/obj/playing_cards.dmi'
icon_state = "card_pack"
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
w_class = ITEMSIZE_TINY
var/list/cards = list()
/obj/item/pack/attack_self(var/mob/user as mob)
user.visible_message("<b>\The [user]</b> rips open \the [src]!")
var/obj/item/hand/H = new()
H.cards += cards
cards.Cut();
user.drop_from_inventory(src,get_turf(src))
H.update_icon()
user.put_in_active_hand(H)
qdel(src)
/obj/item/hand
name = "hand of cards"
desc = "Some playing cards."
icon = 'icons/obj/playing_cards.dmi'
icon_state = null
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
w_class = ITEMSIZE_TINY
var/concealed = 0
var/list/cards = list()
/obj/item/hand/MouseEntered(location, control, params)
. = ..()
if(cards.len == 1 && (!concealed || Adjacent(usr)))
var/datum/playingcard/P = cards[1]
openToolTip(usr, src, params, P.name)
/obj/item/hand/MouseExited(location, control, params)
. = ..()
closeToolTip(usr)
/obj/item/hand/verb/discard()
set category = "Object"
set name = "Discard"
set desc = "Place a card from your hand in front of you."
draw_card(usr)
/obj/item/hand/proc/draw_card(var/mob/user, var/deploy_in_front = TRUE)
var/list/to_discard = list()
for(var/datum/playingcard/P in cards)
to_discard[P.name] = P
var/input_text = "Which card do you wish to [deploy_in_front ? "put down" : "draw"]?"
var/discarding = input(user, input_text, "Hand of Cards") as null|anything in to_discard
if(!discarding || !to_discard[discarding] || !user || !src)
return
var/datum/playingcard/card = to_discard[discarding]
qdel(to_discard)
var/obj/item/hand/H = new /obj/item/hand(src.loc)
H.cards += card
cards -= card
H.concealed = FALSE
H.update_icon()
src.update_icon()
if(deploy_in_front)
user.visible_message("<b>\The [user]</b> plays \the [discarding].")
H.forceMove(get_step(usr, usr.dir))
else
to_chat(user, SPAN_NOTICE("You draw \the [discarding]."))
user.put_in_hands(H)
if(!cards.len)
qdel(src)
/obj/item/hand/attack_hand(mob/user)
if(cards.len > 1 && (user.l_hand == src || user.r_hand == src))
draw_card(user, FALSE)
else
..()
/obj/item/hand/attack_self(var/mob/user as mob)
concealed = !concealed
update_icon()
user.visible_message("\The [user] [concealed ? "conceals" : "reveals"] their hand.")
/obj/item/hand/examine(mob/user)
..(user)
if((!concealed || src.loc == user) && cards.len)
if(cards.len > 1)
to_chat(user, "It contains: ")
for(var/datum/playingcard/P in cards)
to_chat(user, "The [P.name]. [P.desc ? "<i>[P.desc]</i>" : ""]")
/obj/item/hand/update_icon(var/direction = 0)
if(!cards.len)
qdel(src)
return
else if(cards.len > 1)
name = "hand of cards"
desc = "Some playing cards."
else
name = "playing card"
desc = "A playing card."
cut_overlays()
if(cards.len == 1)
var/datum/playingcard/P = cards[1]
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
I.pixel_x += (-5+rand(10))
I.pixel_y += (-5+rand(10))
add_overlay(I)
return
var/offset = Floor(20/cards.len)
var/matrix/M = matrix()
if(direction)
switch(direction)
if(NORTH)
M.Translate( 0, 0)
if(SOUTH)
M.Translate( 0, 4)
if(WEST)
M.Turn(90)
M.Translate( 3, 0)
if(EAST)
M.Turn(90)
M.Translate(-2, 0)
var/i = 0
for(var/datum/playingcard/P in cards)
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
//I.pixel_x = origin+(offset*i)
switch(direction)
if(SOUTH)
I.pixel_x = 8-(offset*i)
if(WEST)
I.pixel_y = -6+(offset*i)
if(EAST)
I.pixel_y = 8-(offset*i)
else
I.pixel_x = -7+(offset*i)
I.transform = M
add_overlay(I)
i++
/obj/item/hand/dropped(mob/user as mob)
if(locate(/obj/structure/table, loc))
src.update_icon(user.dir)
else
update_icon()
/obj/item/hand/pickup(mob/user as mob)
..()
src.update_icon()