mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-26 18:13:11 +00:00
274 lines
6.2 KiB
Plaintext
274 lines
6.2 KiB
Plaintext
/datum/playingcard
|
|
var/name = "playing card"
|
|
var/card_icon = "card_back"
|
|
|
|
/obj/item/weapon/deck
|
|
name = "deck of cards"
|
|
desc = "A simple deck of playing cards."
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "deck"
|
|
w_class = 2
|
|
|
|
var/list/cards = list()
|
|
|
|
/obj/item/weapon/deck/New()
|
|
..()
|
|
|
|
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"
|
|
cards += P
|
|
|
|
for(var/number in list("jack","queen","king"))
|
|
P = new()
|
|
P.name = "[number] of [suit]"
|
|
P.card_icon = "[colour]col"
|
|
cards += P
|
|
|
|
|
|
for(var/i = 0,i<2,i++)
|
|
P = new()
|
|
P.name = "joker"
|
|
P.card_icon = "joker"
|
|
cards += P
|
|
|
|
/obj/item/weapon/deck/attackby(obj/O as obj, mob/user as mob)
|
|
if(istype(O,/obj/item/weapon/hand))
|
|
var/obj/item/weapon/hand/H = O
|
|
for(var/datum/playingcard/P in H.cards)
|
|
cards += P
|
|
qdel(O)
|
|
user << "You place your cards on the bottom of the deck."
|
|
return
|
|
..()
|
|
|
|
/obj/item/weapon/deck/verb/draw_card()
|
|
|
|
set category = "Object"
|
|
set name = "Draw"
|
|
set desc = "Draw a card from a deck."
|
|
set src in view(1)
|
|
|
|
if(usr.stat || !Adjacent(usr)) return
|
|
|
|
if(!istype(usr,/mob/living/carbon))
|
|
return
|
|
|
|
var/mob/living/carbon/user = usr
|
|
|
|
if(!cards.len)
|
|
usr << "There are no cards in the deck."
|
|
return
|
|
|
|
var/obj/item/weapon/hand/H
|
|
if(user.l_hand && istype(user.l_hand,/obj/item/weapon/hand))
|
|
H = user.l_hand
|
|
else if(user.r_hand && istype(user.r_hand,/obj/item/weapon/hand))
|
|
H = user.r_hand
|
|
else
|
|
H = new(get_turf(src))
|
|
user.put_in_hands(H)
|
|
|
|
if(!H || !user) return
|
|
|
|
var/datum/playingcard/P = cards[1]
|
|
H.cards += P
|
|
cards -= P
|
|
H.update_icon()
|
|
user.visible_message("\The [user] draws a card.")
|
|
user << "It's the [P]."
|
|
|
|
/obj/item/weapon/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)
|
|
usr << "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
|
|
//players -= usr
|
|
|
|
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/weapon/deck/proc/deal_at(mob/user, mob/target)
|
|
var/obj/item/weapon/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("\The [user] deals a card to \himself.")
|
|
else
|
|
user.visible_message("\The [user] deals a card to \the [target].")
|
|
H.throw_at(get_step(target,target.dir),10,1,H)
|
|
|
|
/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob)
|
|
if(istype(O,/obj/item/weapon/hand))
|
|
var/obj/item/weapon/hand/H = O
|
|
for(var/datum/playingcard/P in H.cards)
|
|
cards += P
|
|
src.concealed = H.concealed
|
|
qdel(O)
|
|
user.put_in_hands(src)
|
|
update_icon()
|
|
return
|
|
..()
|
|
|
|
/obj/item/weapon/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
|
|
user.visible_message("\The [user] shuffles [src].")
|
|
|
|
/obj/item/weapon/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)
|
|
usr << "There are no cards in the deck."
|
|
return
|
|
|
|
deal_at(usr, over)
|
|
|
|
/obj/item/weapon/hand
|
|
name = "hand of cards"
|
|
desc = "Some playing cards."
|
|
icon = 'icons/obj/playing_cards.dmi'
|
|
icon_state = "empty"
|
|
w_class = 1
|
|
|
|
var/concealed = 0
|
|
var/list/cards = list()
|
|
|
|
/obj/item/weapon/hand/verb/discard()
|
|
|
|
set category = "Object"
|
|
set name = "Discard"
|
|
set desc = "Place a card from your hand in front of you."
|
|
|
|
var/list/to_discard = list()
|
|
for(var/datum/playingcard/P in cards)
|
|
to_discard[P.name] = P
|
|
var/discarding = input("Which card do you wish to put down?") as null|anything in to_discard
|
|
|
|
if(!discarding || !to_discard[discarding] || !usr || !src) return
|
|
|
|
var/datum/playingcard/card = to_discard[discarding]
|
|
qdel(to_discard)
|
|
|
|
var/obj/item/weapon/hand/H = new(src.loc)
|
|
H.cards += card
|
|
cards -= card
|
|
H.concealed = 0
|
|
H.update_icon()
|
|
src.update_icon()
|
|
usr.visible_message("\The [usr] plays \the [discarding].")
|
|
H.loc = get_step(usr,usr.dir)
|
|
|
|
if(!cards.len)
|
|
qdel(src)
|
|
|
|
/obj/item/weapon/hand/attack_self(var/mob/user as mob)
|
|
concealed = !concealed
|
|
update_icon()
|
|
user.visible_message("\The [user] [concealed ? "conceals" : "reveals"] their hand.")
|
|
|
|
/obj/item/weapon/hand/examine(mob/user)
|
|
..(user)
|
|
if((!concealed || src.loc == user) && cards.len)
|
|
user << "It contains: "
|
|
for(var/datum/playingcard/P in cards)
|
|
user << "The [P.name]."
|
|
|
|
/obj/item/weapon/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 = "a playing card"
|
|
desc = "A playing card."
|
|
|
|
overlays.Cut()
|
|
|
|
|
|
if(cards.len == 1)
|
|
var/datum/playingcard/P = cards[1]
|
|
var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
|
|
I.pixel_x += (-5+rand(10))
|
|
I.pixel_y += (-5+rand(10))
|
|
overlays += 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 ? "card_back" : "[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
|
|
overlays += I
|
|
i++
|
|
|
|
/obj/item/weapon/hand/dropped(mob/user as mob)
|
|
if(locate(/obj/structure/table, loc))
|
|
src.update_icon(user.dir)
|
|
else
|
|
update_icon()
|
|
|
|
/obj/item/weapon/hand/pickup(mob/user as mob)
|
|
src.update_icon() |