initial commit - cross reference with 5th port - obviously has compile errors
This commit is contained in:
@@ -0,0 +1,276 @@
|
||||
/datum/playingcard
|
||||
var/name = "playing card"
|
||||
var/card_icon = "card_back"
|
||||
var/suit
|
||||
var/number
|
||||
|
||||
/* Deck */
|
||||
|
||||
/obj/item/weapon/deck
|
||||
name = "deck of cards"
|
||||
desc = "A simple deck of playing cards."
|
||||
icon = 'playing_cards.dmi'
|
||||
icon_state = "deck"
|
||||
w_class = 2
|
||||
flags = NOBLUDGEON
|
||||
|
||||
var/list/cards = list()
|
||||
|
||||
/obj/item/weapon/deck/New()
|
||||
. = ..()
|
||||
|
||||
var/color
|
||||
var/datum/playingcard/card
|
||||
|
||||
for (var/suit in list("spades", "clubs", "diamonds", "hearts"))
|
||||
if (suit == "spades" || suit == "clubs") color = "black_"
|
||||
else color = "red_"
|
||||
|
||||
for (var/number in list("ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"))
|
||||
card = new()
|
||||
card.name = "[number] of [suit]"
|
||||
card.card_icon = "[color]num"
|
||||
card.suit = suit
|
||||
card.number = number
|
||||
|
||||
src.cards.Add(card)
|
||||
|
||||
for (var/number in list("jack", "queen", "king"))
|
||||
card = new()
|
||||
card.name = "[number] of [suit]"
|
||||
card.card_icon = "[color]col"
|
||||
card.suit = suit
|
||||
card.number = number
|
||||
|
||||
src.cards.Add(card)
|
||||
|
||||
for (var/i = 0, i < 2, i++)
|
||||
card = new()
|
||||
card.name = "joker"
|
||||
card.card_icon = "joker"
|
||||
card.suit = "joker"
|
||||
card.number = ""
|
||||
|
||||
src.cards.Add(card)
|
||||
|
||||
/obj/item/weapon/deck/attackby(obj/O, mob/user)
|
||||
if (istype(O,/obj/item/weapon/hand))
|
||||
var/obj/item/weapon/hand/H = O
|
||||
|
||||
for (var/datum/playingcard/P in H.cards) src.cards.Add(P)
|
||||
|
||||
qdel (O)
|
||||
|
||||
user.show_message("You place your cards on the bottom of the deck.")
|
||||
else return ..()
|
||||
|
||||
/obj/item/weapon/deck/attack_self(mob/user)
|
||||
var/list/newcards = list()
|
||||
var/datum/playingcard/card
|
||||
|
||||
while (cards.len)
|
||||
card = pick(cards)
|
||||
newcards.Add(card)
|
||||
src.cards.Remove(card)
|
||||
|
||||
src.cards = newcards
|
||||
|
||||
user.visible_message("\The [user] shuffles [src].")
|
||||
|
||||
/obj/item/weapon/deck/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
|
||||
if(flag)
|
||||
return //It's adjacent, is the user, or is on the user's person
|
||||
|
||||
if (istype(A, /mob/living))
|
||||
src.dealTo(A, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/deck/attack(mob/living/M, mob/living/user, def_zone)
|
||||
if (istype(M))
|
||||
src.dealTo(M, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/deck/proc/dealTo(mob/living/target, mob/living/source)
|
||||
if (!cards.len)
|
||||
source.show_message("There are no cards in the deck.")
|
||||
return
|
||||
|
||||
var/datum/playingcard/card = src.cards[1]
|
||||
|
||||
src.cards.Remove(card)
|
||||
|
||||
var/obj/item/weapon/hand/H = new(get_turf(src))
|
||||
|
||||
H.concealed = 1
|
||||
H.update_conceal()
|
||||
|
||||
H.cards.Add(card)
|
||||
H.update_icon()
|
||||
|
||||
source.visible_message("\The [source] deals a card to \the [target].")
|
||||
H.throw_at(get_step(target, target.dir), 10, 1, source)
|
||||
|
||||
/* Hand */
|
||||
|
||||
/obj/item/weapon/hand
|
||||
name = "hand of cards"
|
||||
desc = "Some playing cards."
|
||||
icon = 'playing_cards.dmi'
|
||||
icon_state = "empty"
|
||||
w_class = 1
|
||||
|
||||
var/concealed = 0
|
||||
var/blank = 0
|
||||
var/list/cards = list()
|
||||
var/datum/html_interface/hi
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/weapon/hand/New(loc)
|
||||
. = ..()
|
||||
|
||||
src.hi = new/datum/html_interface/cards(src, "Your hand", 540, 302)
|
||||
src.update_conceal()
|
||||
|
||||
/obj/item/weapon/hand/Destroy()
|
||||
if (src.hi)
|
||||
qdel(src.hi)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/hand/attackby(obj/O, mob/user)
|
||||
if(cards.len == 1 && istype(O, /obj/item/weapon/pen))
|
||||
var/datum/playingcard/P = cards[1]
|
||||
if(!blank)
|
||||
user << "You cannot write on that card."
|
||||
return
|
||||
var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Writing") as text|null, 50)
|
||||
if(!cardtext)
|
||||
return
|
||||
P.name = cardtext
|
||||
blank = 0
|
||||
else if(istype(O,/obj/item/weapon/hand))
|
||||
var/obj/item/weapon/hand/H = O
|
||||
|
||||
for(var/datum/playingcard/P in src.cards) H.cards.Add(P)
|
||||
|
||||
H.update_icon()
|
||||
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/hand/verb/discard(datum/playingcard/card in cards)
|
||||
set category = "Object"
|
||||
set name = "Discard"
|
||||
set desc = "Place a card from your hand in front of you."
|
||||
|
||||
if (!card)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/hand/H = new(src.loc)
|
||||
|
||||
H.concealed = 0
|
||||
H.update_conceal()
|
||||
|
||||
H.cards.Add(card)
|
||||
src.cards.Remove(card)
|
||||
|
||||
H.update_icon()
|
||||
|
||||
ASSERT(H)
|
||||
|
||||
usr.visible_message("\The [usr] plays \the [card.name].")
|
||||
H.loc = get_step(usr,usr.dir)
|
||||
|
||||
src.update_icon()
|
||||
|
||||
/obj/item/weapon/hand/verb/toggle_conceal()
|
||||
set category = "Object"
|
||||
set name = "Toggle conceal"
|
||||
set desc = "Toggle concealment of your hand"
|
||||
|
||||
src.concealed = !src.concealed
|
||||
|
||||
src.update_conceal()
|
||||
|
||||
usr.visible_message("\The [usr] [concealed ? "conceals" : "reveals"] their hand.")
|
||||
|
||||
src.update_icon()
|
||||
|
||||
/obj/item/weapon/hand/attack_self(mob/user)
|
||||
src.hi.show(user)
|
||||
|
||||
/obj/item/weapon/hand/examine()
|
||||
. = ..()
|
||||
|
||||
if((!concealed || src.loc == usr) && cards.len)
|
||||
usr.show_message("It contains: ", 1)
|
||||
|
||||
for (var/datum/playingcard/card in cards)
|
||||
usr.show_message("The [card.name].", 1)
|
||||
|
||||
/obj/item/weapon/hand/proc/update_conceal()
|
||||
if (src.concealed)
|
||||
src.hi.updateContent("headbar", "You are currently concealing your hand. <a href=\"byond://?src=\ref[hi]&action=toggle_conceal\">Reveal your hand.</a>")
|
||||
else
|
||||
src.hi.updateContent("headbar", "You are currently revealing your hand. <a href=\"byond://?src=\ref[hi]&action=toggle_conceal\">Conceal your hand.</a>")
|
||||
|
||||
/obj/item/weapon/hand/update_icon()
|
||||
if (!cards.len)
|
||||
qdel (src)
|
||||
else
|
||||
if(cards.len > 1)
|
||||
name = "hand of cards"
|
||||
desc = "Some playing cards."
|
||||
else
|
||||
name = "a playing card"
|
||||
desc = "A playing card."
|
||||
|
||||
overlays.len = 0
|
||||
|
||||
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 = I.pixel_x + (-5 + rand(10))
|
||||
I.pixel_y = I.pixel_y + (-5 + rand(10))
|
||||
|
||||
overlays.Add(I)
|
||||
else
|
||||
var/origin = -12
|
||||
var/offset = round(32 / cards.len)
|
||||
|
||||
var/i = 0
|
||||
var/image/I
|
||||
|
||||
for(var/datum/playingcard/P in cards)
|
||||
I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
|
||||
I.pixel_x = origin + (offset * i)
|
||||
|
||||
overlays.Add(I)
|
||||
|
||||
i = i + 1
|
||||
|
||||
var/html = ""
|
||||
|
||||
for(var/datum/playingcard/card in cards)
|
||||
html = html + "<a href=\"byond://?src=\ref[src.hi]&action=play_card&card=\ref[card]\" class=\"card [card.suit] [card.number]\"></a>"
|
||||
|
||||
src.hi.updateContent("hand", html)
|
||||
|
||||
/obj/item/weapon/hand/Topic(href, href_list[], datum/html_interface_client/hclient)
|
||||
if (istype(hclient))
|
||||
switch (href_list["action"])
|
||||
if ("play_card")
|
||||
var/datum/playingcard/card = locate(href_list["card"])
|
||||
|
||||
if (card in src.cards)
|
||||
src.discard(card)
|
||||
if ("toggle_conceal")
|
||||
src.toggle_conceal()
|
||||
|
||||
// Hook for html_interface module to prevent updates to clients who don't have this in their inventory.
|
||||
/obj/item/weapon/hand/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi)
|
||||
return (hclient.client.mob && hclient.client.mob.stat == 0 && (src in hclient.client.mob.contents))
|
||||
@@ -0,0 +1,149 @@
|
||||
// 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
|
||||
|
||||
var/global/list/cards_against_space
|
||||
|
||||
/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/New()
|
||||
if(!cards_against_space) //saves loading from the files every single time a new deck is created, but still lets each deck have a random assortment, it's purely an optimisation
|
||||
cards_against_space = list("cas_white" = file2list("strings/cas_white.txt"),"cas_black" = 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()
|
||||
while (randomcards.len < decksize)
|
||||
randomcards += pick_n_take(possiblecards)
|
||||
for(var/i=1 to randomcards.len)
|
||||
var/cardtext = randomcards[i]
|
||||
var/datum/playingcard/P
|
||||
P = new()
|
||||
P.name = "[cardtext]"
|
||||
P.card_icon = "[src.card_face]"
|
||||
cards += P
|
||||
if(!blanks)
|
||||
return
|
||||
for(var/x=1 to blanks)
|
||||
var/datum/playingcard/P
|
||||
P = new()
|
||||
P.name = "Blank Card"
|
||||
P.card_icon = "cas_white"
|
||||
cards += P
|
||||
shuffle(cards) // distribute blank cards throughout deck
|
||||
|
||||
/obj/item/toy/cards/deck/cas/attack_hand(mob/user)
|
||||
if(user.lying)
|
||||
return
|
||||
if(cards.len == 0)
|
||||
user << "<span class='warning'>There are no more cards to draw!</span>"
|
||||
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 = src
|
||||
src.cards -= choice
|
||||
H.pickup(user)
|
||||
user.put_in_hands(H)
|
||||
user.visible_message("[user] draws a card from the deck.", "<span class='notice'>You draw a card from the deck.</span>")
|
||||
update_icon()
|
||||
|
||||
/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.unEquip(SC))
|
||||
user << "<span class='warning'>The card is stuck to your hand, you can't add it to the deck!</span>"
|
||||
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("[user] adds a card to the bottom of the deck.","<span class='notice'>You add the card to the bottom of the deck.</span>")
|
||||
qdel(SC)
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/cards/deck/cas/update_icon()
|
||||
if(cards.len < 26)
|
||||
icon_state = "deck_[deckstyle]_low"
|
||||
|
||||
/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)
|
||||
user << "<span class='notice'>The card is face down.</span>"
|
||||
else if (blank)
|
||||
user << "<span class='notice'>The card is blank. Write on it with a pen.</span>"
|
||||
else
|
||||
user << "<span class='notice'>The card reads: [name]</span>"
|
||||
|
||||
/obj/item/toy/cards/singlecard/cas/Flip()
|
||||
set name = "Flip Card"
|
||||
set category = "Object"
|
||||
set src in range(1)
|
||||
if(!usr.canUseTopic(src,1))
|
||||
return
|
||||
if(!flipped)
|
||||
name = "CAS card"
|
||||
else if(flipped)
|
||||
name = buffertext
|
||||
flipped = !flipped
|
||||
update_icon()
|
||||
|
||||
obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user)
|
||||
if(!user.canUseTopic(src,1))
|
||||
return
|
||||
Flip()
|
||||
|
||||
/obj/item/toy/cards/singlecard/cas/update_icon()
|
||||
if(flipped)
|
||||
icon_state = "[card_face]_flipped"
|
||||
else
|
||||
icon_state = "[card_face]"
|
||||
|
||||
/obj/item/toy/cards/singlecard/cas/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weapon/pen))
|
||||
if(!blank)
|
||||
user << "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)
|
||||
return
|
||||
name = cardtext
|
||||
buffertext = cardtext
|
||||
blank = 0
|
||||
Binary file not shown.
Reference in New Issue
Block a user