Files
2016-03-06 20:52:14 +01:00

928 lines
34 KiB
Plaintext

/* ._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._. */
/*-=-=-=-=-=-=-=-=-=-=-=-=-=-+CARDS+-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/* '~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~' */
/* ----- TO DO -----
- throwing a hand/stack/deck scatters the cards
- throwing a card has a chance of being a good throw and doing a little damage
- cheaty stuff
- uno?
- add cards to hats (fedoras?) (lol)
----------------- */
/datum/playing_card
var/card_name = "playing card"
var/card_desc = "A card, for playing some kinda game with."
var/card_face = "blank"
var/card_back = "suit"
var/card_foil = 0
var/card_data = null
var/card_reversible = 0 // can the card be drawn reversed? ie for tarot
var/card_reversed = 0 // IS it reversed?
var/card_tappable = 1 // tap 2 islands for mana
var/card_tapped = 0 // summon Fog Bank, laugh
var/card_spooky = 0
New(cardname, carddesc, cardback, cardface, cardfoil, carddata, cardreversible, cardreversed, cardtappable, cardtapped, cardspooky)
if (cardname) src.card_name = cardname
if (carddesc) src.card_desc = carddesc
if (cardback) src.card_back = cardback
if (cardface) src.card_face = cardface
if (cardfoil) src.card_foil = cardfoil
if (carddata) src.card_data = carddata
if (cardreversible) src.card_reversible = cardreversible
if (cardreversed) src.card_reversed = cardreversed
if (cardtappable) src.card_tappable = cardtappable
if (cardtapped) src.card_tapped = cardtapped
if (cardspooky) src.card_spooky = cardspooky
proc/examine_data()
return card_data
/obj/item/playing_cards
name = "deck of cards"
desc = "Some cards, all in a neat stack, for playing some kinda game with."
icon = 'icons/obj/playing_card.dmi'
icon_state = "deck-suit"
w_class = 1.0
force = 0
throwforce = 0
burn_point = 220
burn_output = 500
burn_possible = 1
health = 10
var/list/cards = list()
var/face_up = 0
var/card_name = "blank card"
var/card_desc = "A playing card."
var/card_face = "blank"
var/card_back = "suit"
var/card_foil = 0
var/card_data = null
var/last_shown_off = null
var/spooky = 0
var/card_reversible = 0 // can it be drawn reversed?
var/card_reversed = 0 // IS it reversed?
var/card_tappable = 1 // tap dat shit
var/card_tapped = 0
New()
..()
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
proc/update_cards()
if (!src.cards.len)
qdel(src)
return
src.overlays = null
switch (src.cards.len)
if (-INFINITY to 0)
qdel(src)
return
if (1)
for (var/datum/playing_card/Card in src.cards)
src.card_name = Card.card_name
src.card_desc = Card.card_desc
src.card_face = Card.card_face
src.card_back = Card.card_back
src.card_foil = Card.card_foil
src.card_data = Card.examine_data()
src.card_reversible = Card.card_reversible
src.card_reversed = Card.card_reversed
src.spooky = Card.card_spooky
if (src.face_up)
if (src.card_reversible && src.card_reversed)
src.name = "reversed [src.card_name]"
src.dir = NORTH
else if (src.card_tappable && src.card_tapped)
src.name = "tapped [src.card_name]"
if (src.card_tapped == EAST)
src.dir = EAST
else if (src.card_tapped == WEST)
src.dir = WEST
else
src.dir = pick(EAST, WEST)
src.card_tapped = src.dir
else
src.name = src.card_name
src.dir = SOUTH
src.desc = "[src.card_desc] It's \an [src.name]."
src.icon_state = "card-[src.card_face]"
if (src.card_foil)
src.overlays += "card-foil"
else
src.desc = src.card_desc
src.icon_state = "back-[src.card_back]"
if (src.card_tappable && src.card_tapped)
src.name = "tapped playing card"
if (src.card_tapped == EAST)
src.dir = EAST
else if (src.card_tapped == WEST)
src.dir = WEST
else
src.dir = pick(EAST, WEST)
src.card_tapped = src.dir
else
src.name = "playing card"
src.dir = SOUTH
if (2 to 4)
src.name = "hand of cards"
src.desc = "Some cards, for playing some kinda game with."
src.icon_state = "hand-[src.card_back][src.cards.len]"
if (src.face_up)
src.face_up = 0
if (5 to 10)
src.name = "hand of cards"
src.desc = "Some cards, for playing some kinda game with."
src.icon_state = "hand-[src.card_back]5"
if (src.face_up)
src.face_up = 0
if (11 to 19)
src.name = "stack of cards"
src.desc = "Some cards, all in a neat stack, for playing some kinda game with."
src.icon_state = "stack-[src.card_back]"
if (src.face_up)
src.face_up = 0
if (20 to INFINITY)
src.name = "deck of cards"
src.desc = "Some cards, all in a neat stack, for playing some kinda game with."
src.icon_state = "deck-[src.card_back]"
if (src.face_up)
src.face_up = 0
proc/draw_card(var/obj/item/playing_cards/CardStack, var/atom/target as turf|obj|mob, var/draw_face_up = 0, var/datum/playing_card/Card)
if (!src.cards.len)
qdel(src)
return null
if (!CardStack || !istype(CardStack, /obj/item/playing_cards))
CardStack = new /obj/item/playing_cards(src.loc)
CardStack.face_up = draw_face_up
if (target)
if (ismob(target))
target:put_in_hand_or_drop(CardStack)
else
CardStack.set_loc(target.loc)
if (!Card || !istype(Card, /datum/playing_card))
Card = src.cards[1]
CardStack.cards += Card
src.cards -= Card
CardStack.update_cards()
src.update_cards()
return CardStack
proc/add_cards(var/obj/item/playing_cards/CardStack)
if (!CardStack)
return
if (!CardStack.cards.len)
qdel(CardStack)
return
for (var/datum/playing_card/Card in CardStack.cards)
Card = CardStack.cards[1]
src.cards += Card
CardStack.cards -= Card
CardStack.update_cards()
src.update_cards()
get_desc(dist)
src.update_cards()
if (dist <= 0 && src.cards.len == 1 && !src.face_up)
. += "It's \an [src.card_name]."
if (src.cards.len == 1 && src.face_up)
var/datum/playing_card/Card = src.cards[1]
. += Card.examine_data()
if (dist <= 0 && src.cards.len >= 2 && src.cards.len <= 10)
var/seen_hand = ""
for (var/datum/playing_card/Card in src.cards)
seen_hand += "\an [Card.card_name], "
var/final_seen_hand = copytext(seen_hand, 1, -2)
. += "It has [src.cards.len] cards: [final_seen_hand]."
if (dist <= 0 && src.cards.len >= 11)
. += "There's [src.cards.len] cards in the [src.cards.len <= 19 ? "stack" : "deck"]."
MouseDrop(var/atom/target as obj|mob)
if (!src.cards.len)
qdel(src)
return
if (!target)
return
if (usr.stat == 2 && !src.spooky)
boutput(usr, "<span style=\"color:red\">Ghosts dealing cards? That's too spooky!</span>")
return
if (get_dist(usr, src) > 1)
boutput(usr, "<span style=\"color:red\">You're too far from [src] to draw a card!</span>")
return
if (get_dist(usr, target) > 1)
if (istype(target, /obj/screen/hud))
var/obj/screen/hud/hud = target
if (istype(hud.master, /datum/hud/human))
var/datum/hud/human/h_hud = hud.master // all this just to see if you're trying to deal to someone's hand, ffs
if (h_hud.master && h_hud.master == usr) // or their face, I guess. it'll apply to any attempts to deal to your hud
target = usr
else
boutput(usr, "<span style=\"color:red\">You're too far away from [target] to deal a card!</span>")
return
else
boutput(usr, "<span style=\"color:red\">You're too far away from [target] to deal a card!</span>")
return
else
boutput(usr, "<span style=\"color:red\">You're too far away from [target] to deal a card!</span>")
return
var/deal_face_up = 0
var/datum/playing_card/Card = src.cards[1]
if (usr.a_intent != INTENT_HELP)
deal_face_up = 1
if (usr.a_intent == INTENT_GRAB && src.cards.len > 1)
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> looks through [src].</span>",\
"<span style=\"color:blue\">You look through [src].</span>")
deal_face_up = 0
var/list/availableCards = list()
for (var/datum/playing_card/listCard in src.cards)
availableCards += "[listCard.card_name]"
boutput(usr, "<span style=\"color:blue\">What card would you like to deal from [src]?</span>")
var/chosenCard = input("Select a card to deal.", "Choose Card") as null|anything in availableCards
if (!chosenCard)
return
for (var/datum/playing_card/findCard in src.cards)
if (findCard.card_name == chosenCard)
Card = findCard
break
var/stupid_var = "[deal_face_up ? "\an [Card.card_name]" : "[src]"]"
var/other_stupid_var = "[deal_face_up ? " \an [Card.card_name]." : "a card"]"
if (src.cards.len == 1)
if (target == src && src.card_tappable)
if (src.card_tapped)
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> untaps [src].</span>",\
"<span style=\"color:blue\">You untap [src].</span>")
src.card_tapped = null
src.update_cards()
else
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> taps [src].</span>",\
"<span style=\"color:blue\">You tap [src].</span>")
src.card_tapped = pick(EAST, WEST)
src.update_cards()
else if (ismob(target))
usr.tri_message("<span style=\"color:blue\"><b>[usr]</b> takes [stupid_var][usr == target ? "." : " and deals it to [target]."]</span>",\
usr, "<span style=\"color:blue\">You take [stupid_var][usr == target ? "." : " and deal it to [target]."]</span>", \
target, "<span style=\"color:blue\">[target == usr ? "You take" : "<b>[usr]</b> takes"] [stupid_var][target == usr ? "." : " and deals it to you."]</span>")
src.draw_card(null, target, deal_face_up, Card)
else if (istype(target, /obj/table))
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> takes [stupid_var] and places it on [target].</span>",\
"<span style=\"color:blue\">You take [stupid_var] and place it on [target].</span>")
src.draw_card(null, target, deal_face_up, Card)
else if (istype(target, /obj/item/playing_cards))
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> takes [stupid_var] and adds it to [target].</span>",\
"<span style=\"color:blue\">You take [stupid_var] and add it to [target].</span>")
src.draw_card(target, null, deal_face_up, Card)
else
boutput(usr, "<span style=\"color:red\">What exactly are you trying to accomplish by giving [target] a card? [target] can't use it!</span>")
return
else
if (ismob(target))
usr.tri_message("<span style=\"color:blue\"><b>[usr]</b> draws [other_stupid_var] from [src][usr == target ? "." : " and deals it to [target]."]</span>",\
usr, "<span style=\"color:blue\">You draw [other_stupid_var] from [src][usr == target ? "." : " and deal it to [target]."]</span>", \
target, "<span style=\"color:blue\">[target == usr ? "You draw" : "<b>[usr]</b> draws"] a card from [src][target == usr ? "." : " and deals it to you."]</span>")
src.draw_card(null, target, deal_face_up, Card)
else if (istype(target, /obj/table))
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> draws [other_stupid_var] from [src] and places it on [target].</span>",\
"<span style=\"color:blue\">You draw [other_stupid_var] from [src] and place it on [target].[other_stupid_var]</span>")
src.draw_card(null, target, deal_face_up, Card)
else if (istype(target, /obj/item/playing_cards))
usr.visible_message("<span style=\"color:blue\"><b>[usr]</b> draws [other_stupid_var] from [src] and adds it to [target].</span>",\
"<span style=\"color:blue\">You draw [other_stupid_var] from [src] and add it to [target].</span>")
src.draw_card(target, null, deal_face_up, Card)
else
boutput(usr, "<span style=\"color:red\">What exactly are you trying to accomplish by dealing [target] a card? [target] can't use it!</span>")
return
attack_hand(mob/user as mob)
if (get_dist(user, src) <= 0 && src.cards.len)
if (user.l_hand == src || user.r_hand == src)
var/draw_face_up = 0
if (user.a_intent != INTENT_HELP)
draw_face_up = 1
if (user.a_intent == INTENT_GRAB && src.cards.len > 1)
user.visible_message("<span style=\"color:blue\"><b>[user]</b> looks through [src].</span>",\
"<span style=\"color:blue\">You look through [src].</span>")
var/list/availableCards = list()
for (var/datum/playing_card/Card in src.cards)
availableCards += "[Card.card_name]"
boutput(user, "<span style=\"color:blue\">What card would you like to draw from [src]?</span>")
var/chosenCard = input("Select a card to draw.", "Choose Card") as null|anything in availableCards
if (!chosenCard)
return
var/datum/playing_card/cardToGive
for (var/datum/playing_card/Card in src.cards) // this is so shitty and janky but idgaf right now -barf-
if (Card.card_name == chosenCard)
cardToGive = Card
break
if (!cardToGive)
return
user.visible_message("<span style=\"color:blue\"><b>[usr]</b> draws a card from [src].</span>",\
"<span style=\"color:blue\">You draw \an [chosenCard] from [src].</span>")
src.draw_card(null, user, draw_face_up, cardToGive)
else
var/datum/playing_card/Card = src.cards[1]
user.visible_message("<span style=\"color:blue\"><b>[usr]</b> draws [draw_face_up ? "\an [Card.card_name]" : "a card"] from [src].</span>",\
"<span style=\"color:blue\">You draw [draw_face_up ? "\an [Card.card_name]" : "a card"] from [src].</span>")
src.draw_card(null, user, draw_face_up)
else return ..(user)
else return ..(user)
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/playing_cards))
var/obj/item/playing_cards/C = W
src.add_cards(C)
user.visible_message("<span style=\"color:blue\"><b>[user]</b> adds [C] to the bottom of [src].</span>",\
"<span style=\"color:blue\">You add [C] to the bottom of [src].</span>")
else return ..()
attack_self(mob/user as mob)
if (!src.cards.len)
qdel(src)
return
if ((src.last_shown_off + 10) > world.time)
return
switch (src.cards.len)
if (1)
src.face_up = !(src.face_up)
src.update_cards()
user.visible_message("<span style=\"color:blue\"><b>[user]</b> flips the card [src.face_up ? "face up. It's \an [src.name]." : "face down."]</span>",\
"<span style=\"color:blue\">You flip the card [src.face_up ? "face up. It's \an [src.name]." : "face down."]</span>")
src.last_shown_off = world.time
if (2 to 10)
var/shown_hand = ""
for (var/datum/playing_card/Card in src.cards)
shown_hand += "\an [Card.card_name], "
var/final_shown_hand = copytext(shown_hand, 1, -2)
user.visible_message("<span style=\"color:blue\"><b>[user]</b> shows their hand: [final_shown_hand].</span>",\
"<span style=\"color:blue\">You show your hand: [final_shown_hand].</span>")
src.last_shown_off = world.time
if (11 to INFINITY)
src.cards = shuffle(src.cards)
for (var/datum/playing_card/Card in src.cards)
if (Card.card_reversible)
Card.card_reversed = rand(0, 1)
user.visible_message("<span style=\"color:blue\"><b>[user]</b> shuffles [src].</span>",\
"<span style=\"color:blue\">You shuffle [src].</span>")
src.last_shown_off = world.time
/obj/item/playing_cards/suit
desc = "Some playing cards, all in a neat stack. Each belongs to one of four suits and has a number. Collect all 52!"
icon_state = "deck-suit"
card_back = "suit"
var/list/card_suits = list("hearts", "diamonds", "clubs", "spades")
var/list/card_numbers = list("ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king")
New()
..()
var/datum/playing_card/Card
for (var/suit in src.card_suits)
for (var/num in src.card_numbers)
Card = new()
Card.card_name = "[num] of [suit]"
Card.card_desc = "A classic playing card."
Card.card_back = "suit"
if (suit == "hearts" || suit == "diamonds")
if (num == "jack" || num == "queen" || num == "king")
Card.card_face = "R-face"
else
Card.card_face = "R-[num]"
else
if (num == "jack" || num == "queen" || num == "king")
Card.card_face = "B-face"
else
Card.card_face = "B-[num]"
src.cards += Card
src.update_cards()
/obj/item/playing_cards/tarot
desc = "Some tarot cards, all in a neat stack. What will the cards tell you?"
icon_state = "deck-tarot"
card_back = "tarot"
var/list/card_major_arcana = list("The Fool", "The Magician", "The High Priestess", "The Empress", "The Emperor", "The Hierophant",\
"The Lovers", "The Chariot", "Justice", "The Hermit", "Wheel of Fortune", "Strength", "The Hanged Man", "Death", "Temperance",\
"The Devil", "The Tower", "The Star", "The Moon", "The Sun", "Judgement", "The World")
var/list/card_minor_arcana_suits = list("wands", "coins", "cups", "swords")
var/list/card_minor_arcana_numbers = list("ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "page", "knight", "queen", "king")
New()
..()
var/datum/playing_card/Card
for (var/major in src.card_major_arcana)
Card = new()
Card.card_name = "[major]"
Card.card_desc = "A tarot card."
Card.card_back = "tarot"
Card.card_face = "tarot[rand(1, 10)]"
Card.card_reversible = 1
if (src.spooky) Card.card_spooky = 1
src.cards += Card
for (var/minor in src.card_minor_arcana_suits)
for (var/num in src.card_minor_arcana_numbers)
Card = new()
Card.card_name = "[num] of [minor]"
Card.card_desc = "A tarot card."
Card.card_back = "tarot"
Card.card_reversible = 1
if (src.spooky) Card.card_spooky = 1
if (minor == "cups" || minor == "coins")
if (num == "page" || num == "knight" || num == "queen" || num == "king")
Card.card_face = "R-face"
else
Card.card_face = "R-[num]"
else
if (num == "page" || num == "knight" || num == "queen" || num == "king")
Card.card_face = "B-face"
else
Card.card_face = "B-[num]"
src.cards += Card
/obj/item/playing_cards/tarot/spooky
spooky = 1
// Traitor Trading Triumvirate?
/obj/item/playing_cards/trading
name = "\improper Spacemen the Grifening deck"
desc = "Some trading cards, all in a neat stack. Buy a booster brick today!"
icon_state = "deck-trade"
card_back = "trade"
var/cards_to_generate = 40
var/list/card_human = list()
var/list/card_cyborg = list()
var/list/card_ai = list()
var/list/card_type_mob = list()
var/list/card_type_friend = list()
var/list/card_type_effect = list()
var/list/card_type_area = list()
/*var/list/card_nonhuman = list("Changeling", "Wraith")
var/list/card_antag = list("Traitor", "Nuclear Operative", "Vampire", "Wizard", "Spy", "Revolutionary")
var/list/card_friend = list("Hooty McJudgementowl", "Heisenbee", "THE OVERBEE", "Dr. Acula", "Jones", "boogiebot", "George", "automaton",\
"Murray", "Marty", "Remy", "Mr. Muggles", "Mrs. Muggles", "Mr. Rathen", "????", "Klaus", "Ol' Harner", "Officer Beepsky", "Tanhony",\
"Krimpus", "Albert", "fat and sassy space bee", "Bombini")
var/list/card_weapon = list("cyalume saber", "Russian revolver", "emergency toolbox", "mechanical toolbox", "electrical toolbox", "artistic toolbox",\
"His Grace", "wrestling belt", "sleepy pen", "energy gun", "riot shotgun", "welding tool", "staple gun", "scalpel", "circular saw", "wrench",\
"red chainsaw", "chainsaw", "stun baton", "phaser gun", "mini rad-poison-crossbow", "suppressed .22 pistol", "fire extinguisher", "crowbar",\
"laser gun", "screwdriver", "riot launcher", "grenade", "rolling pin", "beaker full of hellchems", "canister bomb", "tank transfer valve bomb",\
"broken bottle", "glass shard", "metal rods", "axe", "butcher's knife")
var/list/card_armor = list("bio suit", "bio hood", "armored bio suit", "paramedic suit", "armored paramedic suit", "firesuit", "gas mask",\
"emergency gas mask", "hard hat", "emergency suit", "emergency hood", "space suit", "labcoat", "armor vest", "Head of Security's beret",\
"Head of Security's hat", "captain's armor", "captain's hat", "captain's space suit", "red space suit", "helmet", "bomb disposal suit",\
"sunglasses", "prescription glasses", "ProDoc Healthgoggles", "Spectroscopic Scanner Goggles", "Optical Meson Scanner", "Optical Thermal Scanner",\
"latex gloves", "insulated gloves", "bedsheet", "bedsheet cape")*/
booster
name = "\improper Spacemen the Grifening booster pack"
desc = "10 trading cards, in a neat little pack. Collect them all today!"
icon_state = "pack-trade"
cards_to_generate = 10
New()
..()
src.generate_lists() // generate lists to make cards out of
for (var/i=0, i < src.cards_to_generate, i++) // try to make cards
switch(rand(1,10))
if (1 to 4)
generate_mob_card()
if (5 to 7)
generate_effect_card()
if (8 to 9)
generate_friend_card()
if (10)
generate_area_card()
src.update_cards() // update the appearance of the deck
proc/generate_lists()
src.card_human = list()
src.card_cyborg = list()
src.card_ai = list()
for (var/mob/living/carbon/human/H in mobs)
if (ismonkey(H))
continue
if (iswizard(H))
continue
if (isnukeop(H))
continue
src.card_human += H
for (var/mob/living/silicon/robot/R in mobs)
src.card_cyborg += R
for (var/mob/living/silicon/ai/A in mobs)
src.card_ai += A
card_type_mob = typesof(/datum/playing_card/griffening/creature/mob) - /datum/playing_card/griffening/creature/mob
card_type_friend = typesof(/datum/playing_card/griffening/creature/friend) - /datum/playing_card/griffening/creature/friend
card_type_effect = typesof(/datum/playing_card/griffening/effect) - /datum/playing_card/griffening/effect
card_type_area = typesof(/datum/playing_card/griffening/area) - /datum/playing_card/griffening/area
proc/generate_mob_card()
if (!src.card_human.len || !src.card_ai.len || !src.card_cyborg.len)
src.generate_lists()
if (!src.card_human.len)
return 0
var/card_type = null
if (prob(20))
card_type = /datum/playing_card/griffening/creature/mob/assistant
else
card_type = pick(card_type_mob)
card_type_mob -= card_type
var/datum/playing_card/griffening/creature/mob/Card = new card_type()
Card.card_back = "trade"
if (prob(10))
Card.card_foil = 1
if (istype(Card, /datum/playing_card/griffening/creature/mob/ai))
Card.card_face = "trade-ai[rand(1, 2)]"
var/mob/living/silicon/ai/A
if (card_ai.len)
A = pick(card_ai)
var/ai_name
if (!A)
ai_name = pick("SHODAN", "GLADOS", "HAL-9000")
else
card_ai -= A
ai_name = A.name
Card.card_name = "[Card.card_foil ? "foil " : null]AI [ai_name]"
else if (istype(Card, /datum/playing_card/griffening/creature/mob/cyborg))
Card.card_face = "trade-borg[rand(1,2)]"
var/mob/living/silicon/robot/A
if (card_cyborg.len)
A = pick(card_cyborg)
var/robot_name
if (!A)
robot_name = "Cyborg [pick("Alpha", "Beta", "Gamma", "Delta", "Xi", "Pi", "Theta")]-[rand(10,99)]"
else
card_cyborg -= A
robot_name = A.name
if (copytext(robot_name, 1, 8) == "Cyborg ")
robot_name = copytext(robot_name, 8)
Card.card_name = "[Card.card_foil ? "foil " : null]Cyborg [robot_name]"
else
Card.card_face = "trade-person[rand(1, 10)]"
var/mob/living/carbon/human/A
if (card_human.len)
A = pick(card_human)
var/human_name
if (!A)
human_name = "[pick("Pubbie", "Robust", "Shitty", "Father", "Mother", "Handsome")] [pick("Joe", "Jack", "Bill", "Robert", "Luis", "Damian", "Mike", "Jason", "Jane", "Janet", "Oprah", "Angelina", "Megan", "Jennifer", "Anna")]"
else
card_human -= A
human_name = A.name
Card.card_name = "[Card.card_foil ? "foil " : null][Card.card_name] [human_name]"
if (Card.randomized_stats)
// TODO: This will be unbalanced.
Card.LVL = rand(0, 10)
Card.ATK = rand(0, 10) * Card.LVL
Card.DEF = rand(0, 10) * Card.LVL
src.cards += Card
// I'm temporarily disabling a lot of this until I get everything set up. - Marq
/*
var/datum/playing_card/griffening/mob/Card = new()
Card.card_desc = "A trading card."
Card.card_back = "trade"
Card.card_face = "trade-person[rand(1, 10)]"
var/LVL = rand(0, 10)
var/ATK = rand(0, 10) * max(LVL, 1) // if the level's 0 we want the stats to not all be 0
var/DEF = rand(0, 10) * max(LVL, 1)
Card.LVL = LVL
Card.ATK = ATK
Card.DEF = DEF
Card.attributes = ATTRIBUTE_DEFAULT
Card.card_data += "ATK [ATK] | DEF [DEF]"
if (prob(10))
Card.card_foil = 1
var/mob/living/carbon/human/H = pick(src.card_human)
var/job_name
var/is_human = 1
if (prob(5))
var/nonhuman_chance = 100 * (card_nonhuman.len / (card_nonhuman.len + card_antag.len))
if (prob(nonhuman_chance))
job_name = pick(src.card_nonhuman)
is_human = 0
else
job_name = pick(src.card_antag)
else
var/datum/job/J
if (prob(10))
J = pick(job_controls.special_jobs)
else
J = pick(job_controls.staple_jobs)
job_name = J.name
if (is_human)
Card.template = generate_human_image(H)
else
Card.template = generate_special_mob_image(H, job_name)
Card.human = 0
Card.card_name = "[Card.card_foil ? "foil " : ""]LVL [LVL] [job_name] [H.real_name]"
src.cards += Card
src.card_human -= H*/
return 1
proc/generate_human_image(var/mob/living/carbon/human/H)
// Human images are obnoxious.
var/image/ret = image('icons/mob/human.dmi', "blank", MOB_LIMB_LAYER)
var/image/human_image = H.human_image
var/skin_tone = H.bioHolder.mobAppearance.s_tone
human_image.color = rgb(skin_tone + 220, skin_tone + 220, skin_tone + 220)
var/gender_t = H.gender == FEMALE ? "f" : "m"
human_image.icon_state = "chest_[gender_t]"
ret.overlays += human_image
human_image.icon_state = "groin_[gender_t]"
ret.overlays += human_image
human_image.icon_state = "head"
ret.overlays += human_image
human_image.icon_state = "l_arm"
ret.overlays += human_image
human_image.icon_state = "r_arm"
ret.overlays += human_image
human_image.icon_state = "l_leg"
ret.overlays += human_image
human_image.icon_state = "r_leg"
ret.overlays += human_image
human_image.icon_state = "hand_right"
ret.overlays += human_image
human_image.icon_state = "hand_left"
ret.overlays += human_image
human_image.icon_state = "foot_left"
ret.overlays += human_image
human_image.icon_state = "foot_right"
ret.overlays += human_image
var/image/he_image = image('icons/mob/human_hair.dmi', layer = MOB_FACE_LAYER)
var/image/bd_image = image('icons/mob/human_hair.dmi', layer = MOB_FACE_LAYER)
he_image.icon_state = "eyes"
he_image.color = H.bioHolder.mobAppearance.e_color
ret.overlays += he_image
he_image.layer = MOB_HAIR_LAYER2
he_image.icon_state = "[H.cust_one_state]"
he_image.color = H.bioHolder.mobAppearance.customization_first_color
ret.overlays += he_image
bd_image.icon_state = "[H.cust_two_state]"
bd_image.color = H.bioHolder.mobAppearance.customization_second_color
ret.overlays += bd_image
bd_image.layer = MOB_HAIR_LAYER2
bd_image.icon_state = "[H.cust_three_state]"
bd_image.color = H.bioHolder.mobAppearance.customization_third_color
ret.overlays += bd_image
return ret
proc/generate_special_mob_image(var/mob/living/carbon/human/H, var/job_name)
switch (job_name)
if ("Wraith")
return image('icons/mob/mob.dmi', "wraith")
if ("Changeling")
return generate_human_image(H)
/*proc/generate_cyborg_card()
if (!src.card_cyborg.len)
return 0
var/datum/playing_card/griffening/mob/Card = new()
Card.card_desc = "A trading card."
Card.card_back = "trade"
Card.card_face = "trade-borg[rand(1, 2)]"
var/LVL = rand(0, 10)
var/ATK = rand(0, 10) * max(LVL, 1)
var/DEF = rand(0, 10) * max(LVL, 1)
Card.card_data += "ATK [ATK] | DEF [DEF]"
if (prob(10))
Card.card_foil = 1
var/mob/living/silicon/robot/R = pick(src.card_cyborg)
if (prob(5))
Card.card_name = "[Card.card_foil ? "foil " : ""]LVL [LVL] Emagged Cyborg [R.name]"
else
Card.card_name = "[Card.card_foil ? "foil " : ""]LVL [LVL] Cyborg [R.name]"
src.cards += Card
src.card_cyborg -= R
return 1
proc/generate_ai_card()
if (!src.card_ai.len)
return 0
var/datum/playing_card/Card = new()
Card.card_desc = "A trading card."
Card.card_back = "trade"
Card.card_face = "trade-ai[rand(1, 2)]"
var/LVL = rand(0, 10)
var/ATK = rand(0, 10) * max(LVL, 1)
var/DEF = rand(0, 10) * max(LVL, 1)
Card.card_data += "ATK [ATK] | DEF [DEF]"
if (prob(10))
Card.card_foil = 1
var/mob/living/silicon/ai/A = pick(src.card_ai)
if (prob(5))
Card.card_name = "[Card.card_foil ? "foil " : ""]LVL [LVL] Subverted AI [A.name]"
else
Card.card_name = "[Card.card_foil ? "foil " : ""]LVL [LVL] AI [A.name]"
src.cards += Card
src.card_ai -= A
return 1*/
proc/generate_friend_card()
if (!src.card_type_friend.len)
return 0
var/card_type = pick(card_type_friend)
var/datum/playing_card/griffening/creature/friend/Card = new card_type()
Card.card_back = "trade"
Card.card_face = "trade-general[rand(1, 8)]"
Card.LVL = rand(0, 10)
Card.ATK = rand(0, 10) * max(Card.LVL, 1)
Card.DEF = rand(0, 10) * max(Card.LVL, 1)
if (prob(10))
Card.card_foil = 1
Card.card_name = "[Card.card_foil ? "foil " : ""][Card.card_name]"
src.cards += Card
src.card_type_friend -= card_type
return 1
proc/generate_area_card()
if (!src.card_type_area.len)
return 0
var/card_type = pick(card_type_area)
var/datum/playing_card/griffening/area/Card = new card_type()
Card.card_back = "trade"
Card.card_face = "trade-general[rand(1, 8)]"
if (prob(10))
Card.card_foil = 1
Card.card_name = "[Card.card_foil ? "foil " : ""][Card.card_name]"
src.cards += Card
return 1
proc/generate_effect_card()
if (!src.card_type_effect.len)
return 0
var/card_type = pick(card_type_effect)
var/datum/playing_card/griffening/effect/Card = new card_type()
Card.card_back = "trade"
Card.card_face = "trade-general[rand(1, 8)]"
if (prob(10))
Card.card_foil = 1
Card.card_name = "[Card.card_foil ? "foil " : ""][Card.card_name]"
src.cards += Card
return 1
/obj/item/card_box
name = "deck box"
desc = "A little cardboard box for keeping card decks in. Woah! We're truly in the future with technology like this."
icon = 'icons/obj/playing_card.dmi'
icon_state = "box"
force = 1
throwforce = 1
w_class = 2
var/obj/item/playing_cards/Cards
var/open = 0
var/icon_closed = "box"
var/icon_open = "box-open"
var/icon_empty = "box-empty"
var/reusable = 1
suit
name = "box of playing cards"
desc = "A little cardboard box with a standard 52-card deck in it."
icon_state = "box-suit"
icon_closed = "box-suit"
icon_open = "box-suit-open"
icon_empty = "box-suit-empty"
New()
..()
src.Cards = new /obj/item/playing_cards/suit(src)
tarot
name = "box of tarot cards"
desc = "A little cardboard box with a 78-card tarot deck in it."
icon_state = "box-tarot"
icon_closed = "box-tarot"
icon_open = "box-tarot-open"
icon_empty = "box-tarot-empty"
New()
..()
src.Cards = new /obj/item/playing_cards/tarot(src)
trading
name = "\improper Spacemen the Grifening deck box"
desc = "A little cardboard box with an StG deck in it! Wow!"
icon_state = "box-trade"
icon_closed = "box-trade"
icon_open = "box-trade-open"
icon_empty = "box-trade-empty"
New()
..()
src.Cards = new /obj/item/playing_cards/trading(src)
booster
name = "\improper Spacemen the Grifening booster pack"
desc = "A little pack that has more cards to perfect your StG decks with!"
icon_state = "pack-trade"
icon_closed = "pack-trade"
icon_open = "pack-trade-open"
icon_empty = "pack-trade-empty"
reusable = 0
New()
..()
src.Cards = new /obj/item/playing_cards/trading/booster(src)
attack_self(mob/user as mob)
if (src.reusable)
src.open = !src.open
else if (!src.open)
src.open = 1
else
boutput(user, "<span style=\"color:red\">[src] is already open!</span>")
src.update_icon()
return
attackby(obj/item/W as obj, mob/living/user as mob)
if (src.reusable)
if (istype(W, /obj/item/playing_cards))
var/obj/item/playing_cards/C = W
if (!src.open)
boutput(user, "<span style=\"color:red\">[src] isn't open, you goof!</span>")
return
if (src.Cards)
if (src.Cards.cards.len + C.cards.len > 60)
boutput(user, "<span style=\"color:red\">You try your best to stuff more cards into [src], but there's just not enough room!</span>")
return
else
boutput(user, "<span style=\"color:blue\">You add [C] to the cards in [src].</span>")
src.Cards.add_cards(C)
return
if (C.cards.len > 60)
boutput(user, "<span style=\"color:red\">You try your best to stuff the cards into [src], but there's just not enough room for all of them!</span>")
return
user.u_equip(W)
W.layer = initial(W.layer)
src.Cards = W
W.set_loc(src)
src.update_icon()
boutput(user, "You stuff [W] into [src].")
else
return ..()
attack_hand(mob/user as mob)
if (src.loc == user && src.Cards && src.open)
user.put_in_hand_or_drop(src.Cards)
boutput(user, "You take [src.Cards] out of [src].")
src.Cards = null
src.add_fingerprint(user)
src.update_icon()
return
return ..()
proc/update_icon()
if (src.open && !src.Cards)
src.icon_state = src.icon_empty
else if (src.open && src.Cards)
src.icon_state = src.icon_open
else
src.icon_state = src.icon_closed
/obj/item/paper/card_manual
name = "paper - 'Playing Card Tips & Tricks'"
info = {"<ul>
<li>Click on a card in-hand to flip it over.</li>
<li>Click on a hand in-hand to show it.</li>
<li>Click on a deck in-hand to shuffle the cards.</li>
<li>Click-drag a card, hand or deck onto yourself or someone else to deal a card.</li>
<li>Click-drag a card, hand or deck onto another set of cards to combine them.</li>
<li>To draw or deal a card face-up, use any intent other than help.</li>
<li>To draw or deal a specific card, use grab intent.</li>
<li>To tap or untap a card, click-drag the card onto itself.</li>
</ul>"}