mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-09 16:07:40 +00:00
Merge pull request #14186 from SmArtKar/trading_card_game
[READY][PORT] Codename: Blue Eyes White Jumpsuit, the Citadel TCG. Part 1
This commit is contained in:
@@ -139,6 +139,7 @@
|
||||
dir = 4;
|
||||
name = "shrine of the liberator"
|
||||
},
|
||||
/obj/item/tcg_card/special/golem,
|
||||
/turf/open/floor/mineral/titanium/purple,
|
||||
/area/ruin/powered/golem_ship)
|
||||
"v" = (
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
},
|
||||
/turf/open/floor/plating/beach/sand,
|
||||
/area/icemoon/surface/outdoors)
|
||||
"l" = (
|
||||
/obj/item/tcg_card/special/morph,
|
||||
/turf/open/floor/plating/beach/sand,
|
||||
/area/icemoon/surface/outdoors)
|
||||
"I" = (
|
||||
/turf/closed/indestructible/fakeglass,
|
||||
/area/icemoon/surface/outdoors)
|
||||
@@ -72,7 +76,7 @@ L
|
||||
c
|
||||
c
|
||||
c
|
||||
U
|
||||
l
|
||||
U
|
||||
a
|
||||
b
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
},
|
||||
/turf/open/floor/mineral/diamond,
|
||||
/area/icemoon/surface/outdoors)
|
||||
"f" = (
|
||||
/obj/item/tcg_card/special/xenomaid,
|
||||
/turf/open/floor/mineral/diamond,
|
||||
/area/icemoon/surface/outdoors)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -65,7 +69,7 @@ a
|
||||
a
|
||||
a
|
||||
b
|
||||
c
|
||||
f
|
||||
c
|
||||
c
|
||||
b
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
/area/ruin/unpowered)
|
||||
"k" = (
|
||||
/obj/structure/closet/crate/freezer,
|
||||
/obj/item/tcg_card/special/demonic_miner,
|
||||
/turf/open/floor/wood,
|
||||
/area/ruin/unpowered)
|
||||
"l" = (
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
"N" = (
|
||||
/turf/open/indestructible/necropolis/ice,
|
||||
/area/icemoon/underground/explored)
|
||||
"S" = (
|
||||
/obj/item/tcg_card/special/wendigo,
|
||||
/turf/open/indestructible/necropolis/ice,
|
||||
/area/icemoon/underground/explored)
|
||||
"U" = (
|
||||
/obj/item/paper/crumpled/bloody{
|
||||
info = "for your own sake, do not enter"
|
||||
@@ -451,7 +455,7 @@ a
|
||||
N
|
||||
N
|
||||
N
|
||||
N
|
||||
S
|
||||
N
|
||||
N
|
||||
N
|
||||
|
||||
@@ -862,6 +862,7 @@
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 10
|
||||
},
|
||||
/obj/item/tcg_card/special/honk,
|
||||
/turf/open/floor/plating,
|
||||
/area/ruin/powered/clownplanet)
|
||||
"bF" = (
|
||||
|
||||
@@ -155,6 +155,12 @@
|
||||
/obj/item/stack/tile/brass/fifty,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/unexplored)
|
||||
"Y" = (
|
||||
/obj/item/tcg_card/special/ratvar,
|
||||
/turf/open/floor/clockwork{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/area/lavaland/surface/outdoors/unexplored)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -484,7 +490,7 @@ h
|
||||
h
|
||||
h
|
||||
h
|
||||
h
|
||||
Y
|
||||
h
|
||||
l
|
||||
l
|
||||
@@ -709,7 +715,7 @@ b
|
||||
l
|
||||
l
|
||||
b
|
||||
h
|
||||
Y
|
||||
h
|
||||
t
|
||||
b
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
},
|
||||
/turf/open/indestructible/hierophant/two,
|
||||
/area/ruin/unpowered/hierophant)
|
||||
"s" = (
|
||||
/obj/item/tcg_card/special/hierophant,
|
||||
/turf/open/indestructible/hierophant,
|
||||
/area/ruin/unpowered/hierophant)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -494,7 +498,7 @@ b
|
||||
b
|
||||
b
|
||||
c
|
||||
b
|
||||
s
|
||||
a
|
||||
a
|
||||
b
|
||||
|
||||
@@ -11,6 +11,13 @@
|
||||
"d" = (
|
||||
/turf/closed/wall/mineral/abductor,
|
||||
/area/ruin/unpowered)
|
||||
"h" = (
|
||||
/obj/structure/closet/abductor,
|
||||
/obj/item/tcg_card/special/abductor,
|
||||
/turf/open/floor/plating/abductor{
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
},
|
||||
/area/ruin/unpowered)
|
||||
"j" = (
|
||||
/obj/machinery/abductor/experiment{
|
||||
team_number = 100
|
||||
@@ -188,7 +195,7 @@ a
|
||||
a
|
||||
c
|
||||
d
|
||||
q
|
||||
h
|
||||
t
|
||||
q
|
||||
d
|
||||
|
||||
@@ -567,6 +567,7 @@
|
||||
"bm" = (
|
||||
/obj/structure/closet/wardrobe/science_white,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/item/tcg_card/special/space_carp,
|
||||
/turf/open/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
/area/template_noop)
|
||||
"ae" = (
|
||||
/obj/structure/fluff/broken_flooring{
|
||||
icon_state = "plating";
|
||||
dir = 4
|
||||
dir = 4;
|
||||
icon_state = "plating"
|
||||
},
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
@@ -66,8 +66,8 @@
|
||||
"an" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/structure/fluff/broken_flooring{
|
||||
icon_state = "plating";
|
||||
dir = 4
|
||||
dir = 4;
|
||||
icon_state = "plating"
|
||||
},
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
@@ -78,8 +78,8 @@
|
||||
"ap" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/structure/fluff/broken_flooring{
|
||||
icon_state = "pile";
|
||||
dir = 8
|
||||
dir = 8;
|
||||
icon_state = "pile"
|
||||
},
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
@@ -133,8 +133,8 @@
|
||||
/area/template_noop)
|
||||
"aE" = (
|
||||
/obj/structure/fluff/broken_flooring{
|
||||
icon_state = "pile";
|
||||
dir = 4
|
||||
dir = 4;
|
||||
icon_state = "pile"
|
||||
},
|
||||
/turf/template_noop,
|
||||
/area/template_noop)
|
||||
@@ -1054,6 +1054,7 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/closet/crate/secure/weapon,
|
||||
/obj/item/gun/ballistic/automatic/pistol/APS,
|
||||
/obj/item/tcg_card/special/spess_pirate,
|
||||
/turf/open/floor/plasteel/airless/dark,
|
||||
/area/shuttle/caravan/freighter2)
|
||||
"js" = (
|
||||
|
||||
@@ -91,6 +91,10 @@
|
||||
},
|
||||
/turf/open/floor/plating/asteroid/airless,
|
||||
/area/ruin/space/has_grav)
|
||||
"Y" = (
|
||||
/obj/item/tcg_card/special/gondola,
|
||||
/turf/open/floor/plating/asteroid/airless,
|
||||
/area/ruin/space/has_grav)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -339,7 +343,7 @@ b
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
Y
|
||||
o
|
||||
c
|
||||
r
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
/area/ruin/space/has_grav/powered/mechtransport)
|
||||
"g" = (
|
||||
/obj/structure/closet/crate/secure/loot,
|
||||
/obj/item/tcg_card/special/phazon,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/ruin/space/has_grav/powered/mechtransport)
|
||||
"h" = (
|
||||
|
||||
@@ -490,6 +490,28 @@ SUBSYSTEM_DEF(job)
|
||||
job.after_spawn(H, M, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not.
|
||||
equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works
|
||||
|
||||
if(ishuman(H) && H.client && N)
|
||||
if(H.client && H.client.prefs && length(H.client.prefs.tcg_cards))
|
||||
var/obj/item/tcgcard_binder/binder = new(get_turf(H))
|
||||
if(!H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
|
||||
qdel(binder)
|
||||
else
|
||||
for(var/card_type in H.client.prefs.tcg_cards)
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, H.client.prefs.tcg_cards[card_type])
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
binder.check_for_exodia()
|
||||
else
|
||||
if(H && N.client.prefs && length(N.client.prefs.tcg_cards))
|
||||
var/obj/item/tcgcard_binder/binder = new(get_turf(H))
|
||||
if(!H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
|
||||
qdel(binder)
|
||||
else
|
||||
for(var/card_type in N.client.prefs.tcg_cards)
|
||||
var/obj/item/tcg_card/card = new(get_turf(H), card_type, H.client.prefs.tcg_cards[card_type])
|
||||
card.forceMove(binder)
|
||||
binder.cards.Add(card)
|
||||
|
||||
return H
|
||||
/*
|
||||
/datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank)
|
||||
|
||||
@@ -88,6 +88,7 @@ SUBSYSTEM_DEF(persistence)
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
SavePaintings()
|
||||
SaveScars()
|
||||
SaveTCGCards()
|
||||
|
||||
/**
|
||||
* Loads persistent data relevant to the current map: Objects, etc.
|
||||
@@ -349,3 +350,25 @@ SUBSYSTEM_DEF(persistence)
|
||||
if(!ending_human.client)
|
||||
return
|
||||
ending_human.client.prefs.save_character()
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/SaveTCGCards()
|
||||
for(var/i in GLOB.joined_player_list)
|
||||
var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i)
|
||||
if(!istype(ending_human) || !ending_human.mind || !ending_human.client || !ending_human.client.prefs || !ending_human.client.prefs.tcg_cards)
|
||||
continue
|
||||
|
||||
var/mob/living/carbon/human/original_human = ending_human.mind.original_character
|
||||
if(!original_human || original_human.stat == DEAD || !(original_human == ending_human))
|
||||
continue
|
||||
|
||||
var/obj/item/tcgcard_binder/binder = locate() in ending_human
|
||||
if(!binder || !length(binder.cards))
|
||||
continue
|
||||
|
||||
var/list/card_types = list()
|
||||
for(var/obj/item/tcg_card/card in binder.cards)
|
||||
//if(!card.illegal) //Uncomment if you want to block syndie cards from saving
|
||||
card_types[card.datum_type] = card.illegal
|
||||
|
||||
ending_human.client.prefs.tcg_cards = card_types
|
||||
ending_human.client.prefs.save_character(TRUE)
|
||||
|
||||
49
code/datums/components/storage/concrete/tcg.dm
Normal file
49
code/datums/components/storage/concrete/tcg.dm
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
*A storage component to be used on card piles, for use as hands/decks/discard piles. Don't use on something that's not a card pile!
|
||||
*/
|
||||
/datum/component/storage/concrete/tcg
|
||||
display_numerical_stacking = FALSE
|
||||
max_w_class = WEIGHT_CLASS_TINY
|
||||
max_items = 30
|
||||
max_combined_w_class = WEIGHT_CLASS_TINY * 30
|
||||
///The deck that the card pile is using for FAIR PLAY.
|
||||
|
||||
/datum/component/storage/concrete/tcg/can_be_inserted(obj/item/I, stop_messages, mob/M)
|
||||
. = ..()
|
||||
return istype(I, /obj/item/tcg_card)
|
||||
|
||||
/datum/component/storage/concrete/tcg/PostTransfer()
|
||||
. = ..()
|
||||
handle_empty_deck()
|
||||
|
||||
/datum/component/storage/concrete/tcg/remove_from_storage(atom/movable/AM, atom/new_location)
|
||||
. = ..()
|
||||
handle_empty_deck()
|
||||
|
||||
/datum/component/storage/concrete/tcg/ui_show(mob/M)
|
||||
. = ..()
|
||||
M.visible_message("<span class='notice'>[M] starts to look through the contents of \the [parent]!</span>", \
|
||||
"<span class='notice'>You begin looking into the contents of \the [parent]!</span>")
|
||||
|
||||
/datum/component/storage/concrete/tcg/close(mob/M)
|
||||
. = ..()
|
||||
var/list/card_contents = contents()
|
||||
var/obj/temp_parent = parent
|
||||
temp_parent.visible_message("<span class='notice'>\the [parent] is shuffled after looking through it.</span>")
|
||||
card_contents = shuffle(card_contents)
|
||||
|
||||
/datum/component/storage/concrete/tcg/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found)
|
||||
. = ..()
|
||||
if(!things.len)
|
||||
qdel(parent)
|
||||
|
||||
/datum/component/storage/concrete/tcg/proc/handle_empty_deck()
|
||||
var/list/contents = contents()
|
||||
//You can't have a deck of one card!
|
||||
if(contents.len == 1)
|
||||
var/obj/item/tcgcard_deck/deck = parent
|
||||
var/obj/item/tcg_card/card = contents[1]
|
||||
remove_from_storage(card, card.drop_location())
|
||||
card.flipped = deck.flipped
|
||||
card.update_icon_state()
|
||||
qdel(parent)
|
||||
@@ -466,6 +466,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
|
||||
new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \
|
||||
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
|
||||
new/datum/stack_recipe("folder", /obj/item/folder), \
|
||||
new/datum/stack_recipe("cardboard card", /obj/item/cardboard_card, 1), \
|
||||
// holy fuck why are there so many boxes
|
||||
new/datum/stack_recipe_list("fancy boxes", list ( \
|
||||
new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box), \
|
||||
|
||||
@@ -526,3 +526,8 @@
|
||||
new /obj/item/book/granter/martial/carp(src)
|
||||
new /obj/item/clothing/suit/hooded/carp_costume(src)
|
||||
new /obj/item/staff/bostaff(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/sleepytime/cardpack/PopulateContents()
|
||||
. = ..()
|
||||
new /obj/item/cardpack/syndicate(src)
|
||||
new /obj/item/cardpack/syndicate(src)
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
/obj/item/clothing/under/suit/white, // white is a weird color for a groom but some people are weird
|
||||
/obj/item/clothing/under/suit/polychromic,
|
||||
/obj/item/clothing/under/suit/polychromic, // in case you can't be satisfied with the most fitting choices, of course.
|
||||
/obj/item/clothing/under/dress/wedding,
|
||||
/obj/item/clothing/under/dress/wedding,
|
||||
/obj/item/clothing/under/dress/wedding, // this is what you actually bought the crate for. You can't get these anywhere else.
|
||||
/obj/item/clothing/under/dress/wedding/orange,
|
||||
/obj/item/clothing/under/dress/wedding/orange,
|
||||
@@ -333,4 +333,23 @@
|
||||
/obj/item/storage/fancy/ringbox/silver,
|
||||
/obj/item/storage/fancy/ringbox/silver) //diamond rings cost the same price as this crate via cargo so we're not giving you two for free. Wedding rings are traditionally less valuable anyway.
|
||||
crate_name = "wedding crate"
|
||||
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised/tcg
|
||||
name = "Big-Ass Booster Pack Pack"
|
||||
desc = "A bumper load of NT TCG Booster Packs of varying series. Collect them all!"
|
||||
cost = 3000
|
||||
contains = list()
|
||||
crate_name = "booster pack pack"
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised/tcg/generate()
|
||||
. = ..()
|
||||
var/cardpacktype
|
||||
var/list/cardtypes = subtypesof(/obj/item/cardpack)
|
||||
for(var/cardtype in cardtypes)
|
||||
var/obj/item/cardpack/pack = new cardtype(.)
|
||||
if(pack.illegal)
|
||||
cardtypes.Remove(cardtype)
|
||||
qdel(pack)
|
||||
for(var/i in 1 to 10)
|
||||
cardpacktype = pick(cardtypes)
|
||||
new cardpacktype(.)
|
||||
|
||||
@@ -220,6 +220,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
var/hide_ckey = FALSE //pref for hiding if your ckey shows round-end or not
|
||||
|
||||
var/list/tcg_cards = list()
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
|
||||
|
||||
@@ -658,6 +658,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
modified_limbs = safe_json_decode(limbmodstr)
|
||||
else
|
||||
modified_limbs = list()
|
||||
|
||||
var/tcgcardstr
|
||||
S["tcg_cards"] >> tcgcardstr
|
||||
if(length(tcgcardstr))
|
||||
tcg_cards = safe_json_decode(tcgcardstr)
|
||||
else
|
||||
tcg_cards = list()
|
||||
|
||||
S["chosen_limb_id"] >> chosen_limb_id
|
||||
S["hide_ckey"] >> hide_ckey //saved per-character
|
||||
|
||||
@@ -1095,6 +1103,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
else
|
||||
S["loadout"] << safe_json_encode(list())
|
||||
|
||||
if(length(tcg_cards))
|
||||
S["tcg_cards"] << safe_json_encode(tcg_cards)
|
||||
else
|
||||
S["tcg_cards"] << safe_json_encode(list())
|
||||
|
||||
cit_character_pref_save(S)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -2663,3 +2663,32 @@
|
||||
M.SetSleeping(0, 0)
|
||||
..()
|
||||
|
||||
//Nerdy card reagents
|
||||
|
||||
/datum/reagent/card_powder
|
||||
var/rarity = "Stoopid"
|
||||
|
||||
/datum/reagent/card_powder/blue
|
||||
name = "Blue Card Powder"
|
||||
rarity = "Rare"
|
||||
color = "#00B7EF" // blue
|
||||
|
||||
/datum/reagent/card_powder/purple
|
||||
name = "Purple Card Powder"
|
||||
rarity = "Epic"
|
||||
color = "#DA00FF" // purple
|
||||
|
||||
/datum/reagent/card_powder/yellow
|
||||
name = "Yellow Crayon Powder"
|
||||
rarity = "Legendary"
|
||||
color = "#FFF200" // yellow
|
||||
|
||||
/datum/reagent/card_powder/green
|
||||
name = "Green Crayon Powder"
|
||||
rarity = "Common"
|
||||
color = "#A8E61D" // green
|
||||
|
||||
/datum/reagent/card_powder/black
|
||||
name = "Black Crayon Powder"
|
||||
rarity = "Exodia"
|
||||
color = "#1C1C1C" // not quite black
|
||||
|
||||
@@ -881,3 +881,29 @@
|
||||
results = list(/datum/reagent/carbon = 1)
|
||||
required_reagents = list(/datum/reagent/cellulose = 1)
|
||||
required_temp = 512
|
||||
|
||||
//Nerdy card shit
|
||||
|
||||
/datum/chemical_reaction/card_powder/blue
|
||||
name = "Blue Card Powder"
|
||||
id = /datum/reagent/card_powder/blue
|
||||
results = list(/datum/reagent/card_powder/blue = 1)
|
||||
required_reagents = list(/datum/reagent/card_powder/green = 12)
|
||||
|
||||
/datum/chemical_reaction/card_powder/purple
|
||||
name = "Purple Card Powder"
|
||||
id = /datum/reagent/card_powder/purple
|
||||
results = list(/datum/reagent/card_powder/purple = 1)
|
||||
required_reagents = list(/datum/reagent/card_powder/blue = 12)
|
||||
|
||||
/datum/chemical_reaction/card_powder/yellow
|
||||
name = "Yellow Card Powder"
|
||||
id = /datum/reagent/card_powder/yellow
|
||||
results = list(/datum/reagent/card_powder/yellow = 1)
|
||||
required_reagents = list(/datum/reagent/card_powder/purple = 12)
|
||||
|
||||
/datum/chemical_reaction/card_powder/black
|
||||
name = "Black Card Powder"
|
||||
id = /datum/reagent/card_powder/black
|
||||
results = list(/datum/reagent/card_powder/black = 1)
|
||||
required_reagents = list(/datum/reagent/card_powder/yellow = 12)
|
||||
|
||||
714
code/modules/tcg/cards.dm
Normal file
714
code/modules/tcg/cards.dm
Normal file
@@ -0,0 +1,714 @@
|
||||
#define TAPPED_ANGLE 90
|
||||
#define UNTAPPED_ANGLE 0
|
||||
|
||||
#define COMMON_SERIES list(/datum/tcg_card/pack_1, /datum/tcg_card/exodia) //So star cards don't drop
|
||||
|
||||
/datum/tcg_card
|
||||
var/name = "Stupid Coder"
|
||||
var/desc = "A coder that fucked up this card. Report if you see this."
|
||||
var/rules = "Tap this card. It will ahelp itself"
|
||||
var/icon_state = "cardback"
|
||||
var/pack = 'icons/obj/tcg/pack_1.dmi'
|
||||
|
||||
var/mana_cost = 0
|
||||
var/attack = 0
|
||||
var/health = 0
|
||||
|
||||
var/faction = "Coderbus"
|
||||
var/rarity = "Stoopid"
|
||||
var/card_type = "Unit"
|
||||
|
||||
var/obj/item/tcg_card/card
|
||||
|
||||
/*Uncomment if you want to make the game automatic
|
||||
|
||||
/datum/tcg_card/proc/Use(datum/tcg_card/affected_card, mob/living/user)
|
||||
if(card_type == "Equipment")
|
||||
affected_card.health += health
|
||||
affected_card.attack += attack
|
||||
to_chat(user, "<span class ='notice'>You use [card] on [affected_card.card], upgrading it's stats.</span>")
|
||||
user.emote("uses [card] on [affected_card.card], upgrading it's stats.") //To get that visible emote. Useful if you want nice gameplay
|
||||
else if (card_type == "Unit")
|
||||
affected_card.health -= attack
|
||||
health -= affected_card.attack
|
||||
var/flavortext = "."
|
||||
if(affected_card.health <= 0)
|
||||
flavortext = ", killing [affected_card.card]!"
|
||||
if(health <= 0)
|
||||
flavortext = ", killing both [affected_card.card] and [card]!"
|
||||
else
|
||||
flavortext = ", killing [card] in the process!"
|
||||
to_chat(user, "<span class ='notice'>You attack [affected_card.card] with [card][flavortext]</span>")
|
||||
user.emote("attacks [affected_card.card] with [card][flavortext]")
|
||||
|
||||
*/
|
||||
|
||||
/datum/tcg_card/proc/UseSelf(mob/living/user)
|
||||
return
|
||||
|
||||
/datum/tcg_card/proc/Tap(mob/living/user) //Actually runtimes on tap! Tapping is basically disabling a card for a turn in exchange for special effects
|
||||
if(type == /datum/tcg_card)
|
||||
log_runtime("[user] managed to get a blank TCG card.")
|
||||
|
||||
/datum/tcg_card/proc/Untap(mob/living/user)
|
||||
return
|
||||
|
||||
/datum/tcg_card/proc/Reset(mob/living/user)
|
||||
to_chat(user, "<span class ='notice'>You reset [card]'s stats to original.</span>")
|
||||
mana_cost = initial(mana_cost)
|
||||
rules = initial(rules)
|
||||
health = initial(health)
|
||||
attack = initial(attack)
|
||||
faction = initial(faction)
|
||||
|
||||
/obj/item/tcg_card
|
||||
name = "TCG card"
|
||||
desc = "A flipped TCG-branded card."
|
||||
icon_state = "cardback"
|
||||
icon = 'icons/obj/tcg/pack_1.dmi'
|
||||
|
||||
var/datum_type = /datum/tcg_card
|
||||
var/datum/tcg_card/card_datum
|
||||
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
var/flipped = FALSE
|
||||
var/tapped = FALSE
|
||||
var/special = FALSE
|
||||
var/illegal = FALSE
|
||||
|
||||
/obj/item/tcg_card/special
|
||||
special = TRUE
|
||||
|
||||
/obj/item/tcg_card/examine(mob/user)
|
||||
. = ..()
|
||||
sleep(2) //So it prints this shit after the examine
|
||||
if(flipped)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>This card has following stats:</span>")
|
||||
to_chat(user, "<span class='notice'>Mana cost: [card_datum.mana_cost]</span>")
|
||||
to_chat(user, "<span class='notice'>Health: [card_datum.health]</span>")
|
||||
to_chat(user, "<span class='notice'>Attack: [card_datum.attack]</span>")
|
||||
to_chat(user, "<span class='notice'>Faction: [card_datum.faction]</span>")
|
||||
to_chat(user, "<span class='notice'>Rarity: [card_datum.rarity]</span>")
|
||||
to_chat(user, "<span class='notice'>Card Type: [card_datum.card_type]</span>")
|
||||
to_chat(user, "<span class='notice'>It's effect is: [card_datum.rules]</span>")
|
||||
if(illegal)
|
||||
to_chat(user, "<span class='warning'>It's a low-quality copy of a real card. TCG Gaming Community won't probably accept it.</span>") //Doesn't do crap, just for lulz
|
||||
|
||||
/obj/item/tcg_card/openTip(location, control, params, user) //Overriding for nice UI
|
||||
if(flipped)
|
||||
return ..()
|
||||
var/desc_content = "[desc] <br> \
|
||||
<span class='notice'>This card has following stats:</span> <br> \
|
||||
<span class='notice'>Mana cost: [card_datum.mana_cost]</span> <br> \
|
||||
<span class='notice'>Health: [card_datum.health]</span> <br> \
|
||||
<span class='notice'>Attack: [card_datum.attack]</span> <br> \
|
||||
<span class='notice'>Faction: [card_datum.faction]</span> <br> \
|
||||
<span class='notice'>Rarity: [card_datum.rarity]</span> <br> \
|
||||
<span class='notice'>Card Type: [card_datum.card_type]</span> <br> \
|
||||
<span class='notice'>It's effect is: [card_datum.rules]</span>"
|
||||
openToolTip(user,src,params,title = name,content = desc_content,theme = "")
|
||||
|
||||
/obj/item/tcg_card/New(loc, new_datum, illegal_card = FALSE)
|
||||
. = ..()
|
||||
if(!special)
|
||||
datum_type = new_datum
|
||||
card_datum = new datum_type
|
||||
icon = card_datum.pack
|
||||
icon_state = card_datum.icon_state
|
||||
name = card_datum.name
|
||||
desc = card_datum.desc
|
||||
illegal = illegal_card
|
||||
|
||||
switch(card_datum.rarity)
|
||||
if("Common")
|
||||
grind_results = list(/datum/reagent/card_powder/green = 1)
|
||||
if("Rare")
|
||||
grind_results = list(/datum/reagent/card_powder/blue = 1)
|
||||
if("Epic")
|
||||
grind_results = list(/datum/reagent/card_powder/purple = 1)
|
||||
if("Legendary")
|
||||
grind_results = list(/datum/reagent/card_powder/yellow = 1)
|
||||
if("Exodia")
|
||||
grind_results = list(/datum/reagent/card_powder/black = 1)
|
||||
|
||||
/obj/item/tcg_card/attack_hand(mob/user)
|
||||
var/list/possible_actions = list(
|
||||
"Pick Up" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup"),
|
||||
"Tap" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_tap"),
|
||||
"Flip" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_flip")
|
||||
)
|
||||
var/result = show_radial_menu(user, src, possible_actions, require_near = TRUE, tooltips = TRUE)
|
||||
switch(result)
|
||||
if("Pick Up")
|
||||
. = ..()
|
||||
if("Flip")
|
||||
flipped = !flipped
|
||||
if(flipped)
|
||||
icon_state = "cardback"
|
||||
name = "TCG card"
|
||||
desc = "A flipped TCG-branded card."
|
||||
else
|
||||
name = card_datum.name
|
||||
desc = card_datum.desc
|
||||
icon_state = card_datum.icon_state
|
||||
if("Tap")
|
||||
var/matrix/ntransform = matrix(transform)
|
||||
if(tapped)
|
||||
ntransform.TurnTo(TAPPED_ANGLE , UNTAPPED_ANGLE)
|
||||
else
|
||||
ntransform.TurnTo(UNTAPPED_ANGLE , TAPPED_ANGLE)
|
||||
tapped = !tapped
|
||||
animate(src, transform = ntransform, time = 2, easing = (EASE_IN|EASE_OUT))
|
||||
if(tapped)
|
||||
card_datum.Tap(user)
|
||||
else
|
||||
card_datum.Untap(user)
|
||||
|
||||
/obj/item/tcg_card/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/tcg_card))
|
||||
var/obj/item/tcg_card/second_card = I
|
||||
if(loc == user && second_card.loc == user)
|
||||
var/obj/item/tcgcard_hand/hand = new(get_turf(user))
|
||||
src.forceMove(hand)
|
||||
second_card.forceMove(hand)
|
||||
hand.cards.Add(src)
|
||||
hand.cards.Add(second_card)
|
||||
user.put_in_hands(hand)
|
||||
hand.update_icon()
|
||||
return ..()
|
||||
var/obj/item/tcgcard_deck/new_deck = new /obj/item/tcgcard_deck(drop_location())
|
||||
new_deck.flipped = flipped
|
||||
user.transferItemToLoc(second_card, new_deck)//Start a new pile with both cards, in the order of card placement.
|
||||
user.transferItemToLoc(src, new_deck)
|
||||
new_deck.update_icon_state()
|
||||
user.put_in_hands(new_deck)
|
||||
new_deck.update_icon()
|
||||
if(istype(I, /obj/item/tcgcard_deck))
|
||||
var/obj/item/tcgcard_deck/old_deck = I
|
||||
if(length(old_deck.contents) >= 30)
|
||||
to_chat(user, "<span class='notice'>This pile has too many cards for a regular deck!</span>")
|
||||
return
|
||||
user.transferItemToLoc(src, old_deck)
|
||||
flipped = old_deck.flipped
|
||||
old_deck.update_icon()
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/item/tcg_card/attack_self(mob/user)
|
||||
var/list/possible_actions = list(
|
||||
"Reset to Default" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_reset"),
|
||||
"Change stats" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_change_stats")
|
||||
)
|
||||
var/result = show_radial_menu(user, src, possible_actions, require_near = TRUE, tooltips = TRUE)
|
||||
switch(result)
|
||||
if("Reset to Default")
|
||||
card_datum.Reset(user)
|
||||
user.visible_message("<span class='notice'>[user] resets [src]'s stats.</span>")
|
||||
if("Change stats")
|
||||
possible_actions = list(
|
||||
"Health" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_health"),
|
||||
"Attack" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_attack"),
|
||||
"Mana" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_mana")
|
||||
)
|
||||
result = show_radial_menu(user, src, possible_actions, require_near = TRUE, tooltips = TRUE)
|
||||
switch(result)
|
||||
if("Health")
|
||||
card_datum.health = input(user, "What do you want health to be?", "Changing [src]'s health") as num|null
|
||||
if("Attack")
|
||||
card_datum.attack = input(user, "What do you want attack to be?", "Changing [src]'s attack") as num|null
|
||||
if("Mana")
|
||||
card_datum.mana_cost = input(user, "What do you want mana cost to be?", "Changing [src]'s mana cost") as num|null
|
||||
user.visible_message("<span class='notice'>[user] changes [src]'s [result].</span>")
|
||||
|
||||
/obj/item/tcg_card/equipped(mob/user, slot, initial)
|
||||
. = ..()
|
||||
transform = matrix()
|
||||
|
||||
/obj/item/tcg_card/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
transform = matrix(0.5,0,0,0,0.5,0)
|
||||
|
||||
/obj/item/cardpack
|
||||
name = "Trading Card Pack: Coder"
|
||||
desc = "Contains six complete fuckups by the coders. Report this on github please!"
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "cardpack"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
///The card series to look in
|
||||
var/list/series = list(/datum/tcg_card/pack_1, /datum/tcg_card/exodia)
|
||||
///Chance of the pack having a coin in it out of 10
|
||||
var/contains_coin = -1
|
||||
///The amount of cards to draw from the rarity table
|
||||
var/card_count = 5
|
||||
///The rarity table, the set must contain at least one of each
|
||||
var/list/rarity_table = list(
|
||||
"Common" = 900,
|
||||
"Rare" = 300,
|
||||
"Epic" = 50,
|
||||
"Legendary" = 3,
|
||||
"Exodia" = 1) //Basically 0.1%, it doesn't have guar. rarity
|
||||
///The amount of cards to draw from the guarenteed rarity table
|
||||
var/guaranteed_count = 1
|
||||
///The guaranteed rarity table, acts about the same as the rarity table. it can have as many or as few raritys as you'd like
|
||||
var/list/guar_rarity = list(
|
||||
"Legendary" = 1,
|
||||
"Epic" = 9,
|
||||
"Rare" = 30)
|
||||
|
||||
var/illegal = FALSE //Can cargo get it?
|
||||
|
||||
custom_price = PRICE_EXPENSIVE
|
||||
|
||||
/obj/item/cardpack/series_one
|
||||
name = "Trading Card Pack: 2560 Core Set"
|
||||
desc = "Contains six cards of varying rarity from the 2560 Core Set. Collect them all!"
|
||||
icon_state = "cardpack"
|
||||
series = list(/datum/tcg_card/pack_1, /datum/tcg_card/exodia)
|
||||
contains_coin = 10
|
||||
|
||||
/obj/item/cardpack/syndicate //More cards. Perfect stuff for gaming gang
|
||||
name = "Trading Card Pack: Nuclear Danger"
|
||||
desc = "Contains twelve cards of varying rarity from 2560 Core Set and 2560 Nuclear Danger. This pack was stamped by Waffle Co."
|
||||
icon_state = "cardpack_syndicate"
|
||||
series = list(/datum/tcg_card/pack_1, /datum/tcg_card/pack_nuclear)
|
||||
contains_coin = 100
|
||||
|
||||
card_count = 9
|
||||
guaranteed_count = 3
|
||||
|
||||
guar_rarity = list( //Better chances
|
||||
"Legendary" = 5,
|
||||
"Epic" = 10,
|
||||
"Rare" = 30)
|
||||
|
||||
/obj/item/cardpack/equipped(mob/user, slot, initial)
|
||||
. = ..()
|
||||
transform = matrix()
|
||||
|
||||
/obj/item/cardpack/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
transform = matrix(0.5,0,0,0,0.5,0)
|
||||
|
||||
/obj/item/cardpack/attack_self(mob/user)
|
||||
. = ..()
|
||||
var/list/cards = buildCardListWithRarity(card_count, guaranteed_count)
|
||||
var/obj/item/tcgcard_hand/hand = new(get_turf(user))
|
||||
for(var/template in cards)
|
||||
var/obj/item/tcg_card/card = new(hand, template, illegal)
|
||||
hand.cards.Add(card)
|
||||
user.put_in_hands(hand)
|
||||
hand.update_icon()
|
||||
to_chat(user, "<span_class='notice'>Wow! Check out these cards!</span>")
|
||||
playsound(loc, 'sound/items/poster_ripped.ogg', 20, TRUE)
|
||||
if(prob(contains_coin))
|
||||
to_chat(user, "<span_class='notice'>...and it came with a flipper, too!</span>")
|
||||
new /obj/item/coin/thunderdome(get_turf(user))
|
||||
new /obj/item/tcg_rules(get_turf(user))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/cardpack/proc/buildCardListWithRarity(card_cnt, rarity_cnt)
|
||||
var/list/return_cards = list()
|
||||
|
||||
var/list/cards = list()
|
||||
for(var/card_type in series)
|
||||
for(var/card in subtypesof(card_type))
|
||||
var/datum/tcg_card/new_card = new card()
|
||||
if(new_card.name == "Stupid Coder")
|
||||
continue
|
||||
cards.Add(card)
|
||||
qdel(new_card)
|
||||
var/list/possible_cards = list()
|
||||
var/list/rarity_cards = list("Exodia" = list(), "Legendary" = list(), "Epic" = list(), "Rare" = list(), "Common" = list())
|
||||
for(var/card in cards)
|
||||
var/datum/tcg_card/new_card = new card()
|
||||
if(new_card.name == "Stupid Coder")
|
||||
continue
|
||||
possible_cards[card] = rarity_table[new_card.rarity]
|
||||
var/list/rarity_card_type = rarity_cards[new_card.rarity]
|
||||
if(!rarity_card_type)
|
||||
rarity_card_type = list()
|
||||
rarity_card_type.Add(card)
|
||||
rarity_cards[new_card.rarity] = rarity_card_type //FUCK CI
|
||||
qdel(new_card)
|
||||
|
||||
for(var/card_counter = 1 to card_count)
|
||||
var/cardtype = pickweight(possible_cards)
|
||||
return_cards.Add(cardtype)
|
||||
|
||||
for(var/card_counter = 1 to guaranteed_count)
|
||||
var/card_list = pickweight(guar_rarity)
|
||||
return_cards.Add(pick(rarity_cards[card_list]))
|
||||
|
||||
return return_cards
|
||||
|
||||
/obj/item/coin/thunderdome
|
||||
name = "Thunderdome Flipper"
|
||||
desc = "A Thunderdome TCG flipper, for deciding who gets to go first. Also conveniently acts as a counter, for various purposes."
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "coin_nanotrasen"
|
||||
custom_materials = list(/datum/material/plastic = 400)
|
||||
material_flags = NONE
|
||||
sideslist = list("nanotrasen", "syndicate")
|
||||
|
||||
/obj/item/coin/thunderdome/Initialize()
|
||||
. = ..()
|
||||
transform = matrix(0.5,0,0,0,0.5,0)
|
||||
|
||||
/obj/item/coin/thunderdome/equipped(mob/user, slot, initial)
|
||||
. = ..()
|
||||
transform = matrix()
|
||||
|
||||
/obj/item/coin/thunderdome/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
transform = matrix(0.5,0,0,0,0.5,0)
|
||||
|
||||
/obj/item/tcgcard_deck
|
||||
name = "Trading Card Pile"
|
||||
desc = "A stack of TCG cards."
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "deck_up"
|
||||
|
||||
var/flipped = FALSE
|
||||
|
||||
var/static/radial_draw = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_draw")
|
||||
var/static/radial_shuffle = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_shuffle")
|
||||
var/static/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup")
|
||||
|
||||
/obj/item/tcgcard_deck/Initialize()
|
||||
. = ..()
|
||||
LoadComponent(/datum/component/storage/concrete/tcg)
|
||||
|
||||
/obj/item/tcgcard_deck/update_icon_state()
|
||||
. = ..()
|
||||
if(flipped)
|
||||
switch(contents.len)
|
||||
if(1 to 10)
|
||||
icon_state = "deck_tcg_low"
|
||||
if(11 to 20)
|
||||
icon_state = "deck_tcg_half"
|
||||
if(21 to INFINITY)
|
||||
icon_state = "deck_tcg_full"
|
||||
else
|
||||
icon_state = "deck_up"
|
||||
|
||||
/obj/item/tcgcard_deck/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>\The [src] has [contents.len] cards inside.</span>"
|
||||
|
||||
/obj/item/tcgcard_deck/attack_hand(mob/user)
|
||||
var/list/choices = list(
|
||||
"Draw" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_draw"),
|
||||
"Shuffle" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_shuffle"),
|
||||
"Pickup" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup"),
|
||||
"Flip" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_flip"),
|
||||
)
|
||||
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(choice)
|
||||
if("Draw")
|
||||
draw_card(user)
|
||||
if("Shuffle")
|
||||
shuffle_deck(user)
|
||||
if("Pickup")
|
||||
user.put_in_hands(src)
|
||||
if("Flip")
|
||||
flip_deck()
|
||||
|
||||
/obj/item/tcgcard_deck/Destroy()
|
||||
for(var/card in 1 to contents.len)
|
||||
var/obj/item/tcg_card/stored_card = contents[card]
|
||||
stored_card.forceMove(drop_location())
|
||||
. = ..()
|
||||
|
||||
/obj/item/tcgcard_deck/proc/check_menu(mob/living/user)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(user.incapacitated() || !user.Adjacent(src))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/tcgcard_deck/attackby(obj/item/I, mob/living/user, params)
|
||||
. = ..()
|
||||
if(istype(I, /obj/item/tcg_card))
|
||||
if(contents.len > 30)
|
||||
to_chat(user, "<span class='notice'>This pile has too many cards for a regular deck!</span>")
|
||||
return FALSE
|
||||
var/obj/item/tcg_card/new_card = I
|
||||
new_card.flipped = flipped
|
||||
new_card.forceMove(src)
|
||||
|
||||
/obj/item/tcgcard_deck/attack_self(mob/living/carbon/user)
|
||||
shuffle_deck(user)
|
||||
return ..()
|
||||
|
||||
/obj/item/tcgcard_deck/proc/draw_card(mob/user)
|
||||
if(!contents.len)
|
||||
CRASH("A TCG deck was created with no cards inside of it.")
|
||||
var/obj/item/tcg_card/drawn_card = contents[contents.len]
|
||||
user.put_in_hands(drawn_card)
|
||||
drawn_card.flipped = flipped //If it's a face down deck, it'll be drawn face down, if it's a face up pile you'll draw it face up.
|
||||
drawn_card.update_icon_state()
|
||||
user.visible_message("<span class='notice'>[user] draws a card from \the [src]!</span>", \
|
||||
"<span class='notice'>You draw a card from \the [src]!</span>")
|
||||
if(contents.len <= 1)
|
||||
var/obj/item/tcg_card/final_card = contents[1]
|
||||
user.transferItemToLoc(final_card, drop_location())
|
||||
qdel(src)
|
||||
|
||||
/obj/item/tcgcard_deck/proc/shuffle_deck(mob/user, visable = TRUE)
|
||||
if(!contents)
|
||||
return
|
||||
contents = shuffle(contents)
|
||||
if(user.active_storage)
|
||||
user.active_storage.close(user)
|
||||
if(visable)
|
||||
user.visible_message("<span class='notice'>[user] shuffles \the [src]!</span>", \
|
||||
"<span class='notice'>You shuffle \the [src]!</span>")
|
||||
|
||||
/obj/item/tcgcard_deck/proc/flip_deck()
|
||||
flipped = !flipped
|
||||
var/list/temp_deck = contents.Copy()
|
||||
contents = reverseRange(temp_deck)
|
||||
//Now flip the cards to their opposite positions.
|
||||
for(var/a in 1 to contents.len)
|
||||
var/obj/item/tcg_card/nu_card = contents[a]
|
||||
nu_card.flipped = flipped
|
||||
nu_card.update_icon_state()
|
||||
update_icon_state()
|
||||
|
||||
/obj/item/tcgcard_hand
|
||||
name = "Trading Card Hand"
|
||||
desc = "A hand full of TCG cards."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "nothing"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/list/cards = list()
|
||||
|
||||
/obj/item/tcgcard_hand/update_icon()
|
||||
. = ..()
|
||||
cut_overlays()
|
||||
var/angular = length(cards) / 2 * -30 + 15
|
||||
for(var/obj/item/tcg_card/card in cards)
|
||||
var/image/I = image(icon = card.icon, icon_state = card.icon_state)
|
||||
var/matrix/ntransform = matrix(I.transform)
|
||||
ntransform.TurnTo(angular, 0)
|
||||
ntransform.Translate(sin(angular) * -15, cos(angular) * 15)
|
||||
I.transform = ntransform
|
||||
angular += 30
|
||||
overlays += I
|
||||
|
||||
/obj/item/tcgcard_hand/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/tcg_card))
|
||||
var/obj/item/tcg_card/card = I
|
||||
if(loc == user && card.loc == user)
|
||||
card.forceMove(src)
|
||||
cards.Add(card)
|
||||
update_icon()
|
||||
. = ..()
|
||||
|
||||
/obj/item/tcgcard_hand/attack_hand(mob/living/carbon/user)
|
||||
if(loc == user)
|
||||
var/list/choices = list()
|
||||
for(var/obj/item/tcg_card/card in cards)
|
||||
choices[card] = image(icon = card.icon, icon_state = card.icon_state)
|
||||
var/obj/item/tcg_card/choice = show_radial_menu(user, src, choices, require_near = TRUE, tooltips = TRUE)
|
||||
if(choice)
|
||||
choice.forceMove(get_turf(src))
|
||||
user.put_in_hands(choice)
|
||||
cards.Remove(choice)
|
||||
update_icon()
|
||||
if(length(cards) == 0)
|
||||
qdel(src)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/item/tcgcard_binder
|
||||
name = "Trading Card Binder"
|
||||
desc = "A TCG-branded card binder, specifically for your infinite collection of TCG cards!"
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "binder"
|
||||
|
||||
var/list/cards = list()
|
||||
var/mode = 0 //If 1, will show all the cards even if you don't have em
|
||||
|
||||
/obj/item/tcgcard_binder/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/tcg_card))
|
||||
var/obj/item/tcg_card/card = I
|
||||
card.forceMove(src)
|
||||
cards.Add(card)
|
||||
. = ..()
|
||||
|
||||
/obj/item/tcgcard_binder/attack_self(mob/living/carbon/user)
|
||||
mode = !mode
|
||||
to_chat(user, "<span class='notice'>[src] now shows you [mode ? "all the different cards" : "the cards you already have"].")
|
||||
|
||||
/obj/item/tcgcard_binder/attack_hand(mob/living/carbon/user)
|
||||
if(loc == user)
|
||||
var/list/choices = list()
|
||||
if(mode)
|
||||
var/card_types = list()
|
||||
|
||||
for(var/obj/item/tcg_card/card in cards)
|
||||
card_types[card.datum_type] = card
|
||||
|
||||
for(var/card_type in subtypesof(/datum/tcg_card))
|
||||
if(card_type in card_types)
|
||||
var/obj/item/tcg_card/card = card_types[card_type]
|
||||
choices[card] = image(icon = card.icon, icon_state = card.icon_state)
|
||||
continue
|
||||
|
||||
var/datum/tcg_card/card_dat = new card_type
|
||||
if(card_dat.name == "Stupid Coder")
|
||||
continue
|
||||
var/image/I = image(icon = card_dat.pack, icon_state = card_dat.icon_state)
|
||||
I.color = "#999999"
|
||||
choices[card_dat.name] = I
|
||||
qdel(card_dat)
|
||||
else
|
||||
for(var/obj/item/tcg_card/card in cards)
|
||||
choices[card] = image(icon = card.icon, icon_state = card.icon_state)
|
||||
var/obj/item/tcg_card/choice = show_radial_menu(user, src, choices, require_near = TRUE, tooltips = TRUE)
|
||||
if(choice && (choice in cards))
|
||||
choice.forceMove(get_turf(src))
|
||||
user.put_in_hands(choice)
|
||||
cards.Remove(choice)
|
||||
|
||||
if(choice)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/item/tcgcard_binder/proc/check_for_exodia()
|
||||
var/list/card_types = list()
|
||||
for(var/obj/item/tcg_card/card in cards)
|
||||
card_types.Add(card.datum_type)
|
||||
|
||||
for(var/card_type in subtypesof(/datum/tcg_card))
|
||||
var/datum/tcg_card/card_dat = new card_type
|
||||
|
||||
if(card_dat.name == "Eldritch Horror" && (card_type in card_types)) //We already have Exodia saved
|
||||
qdel(card_dat)
|
||||
return
|
||||
|
||||
if(card_dat.name == "Stupid Coder" || card_dat.name == "Eldritch Horror") //It would be stupid if we require exodia or system cards to get exodia
|
||||
continue
|
||||
qdel(card_dat)
|
||||
if(!(card_type in card_types))
|
||||
return
|
||||
|
||||
var/obj/item/tcg_card/card = new(get_turf(src), /datum/tcg_card/exodia/exodia)
|
||||
card.forceMove(src)
|
||||
cards.Add(card)
|
||||
|
||||
/obj/item/tcgcard_binder/full/Initialize() //For admemes.
|
||||
. = ..()
|
||||
for(var/cardtype in subtypesof(/datum/tcg_card))
|
||||
var/obj/item/tcg_card/card = new(get_turf(src), cardtype)
|
||||
if(card.card_datum.name == "Stupid Coder")
|
||||
qdel(card)
|
||||
continue
|
||||
card.forceMove(src)
|
||||
cards.Add(card)
|
||||
|
||||
/obj/item/tcg_rules
|
||||
name = "TCG Rulebook"
|
||||
desc = "A small rulebook containing a starter guide for TCG."
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "deck_low"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
/obj/item/tcg_rules/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>*---------* \n\
|
||||
<span class='boldnotice'>Welcome to the Exciting world of Tactical Card Game!</span> <span clas='smallnotice'>Sponsored by Nanotrasen Edu-tainment Devision.</span> \n \
|
||||
<span class='boldnotice'>Core Rules:</span> \n \
|
||||
Tactical Card Game (Also known as TCG) is a traditional trading card game. It's played between two players, each with a deck or collection of cards. \n \
|
||||
|
||||
Each player's deck contains up to 30 cards. Each player's hand can hold a maximum of 7 cards. At the end of your turn, if you have more than 7 cards, you must choose cards to discard to your discard pile until you have 7 cards. \n \
|
||||
To begin a match, both players must flip a coin to decide who goes first. The winner of the coin toss then decides if they go first or second. Before the match begins each player draws 5 cards each with the ability to mulligan cards from their hand facedown once (Basically, you get a first pass where you can replace cards in your hands back into your deck, shuffle your deck, then draw until you're back to 5). \n \
|
||||
Each player begins with 1 Max Mana to start with, which serves as the cost to playing cards. \n \
|
||||
|
||||
In order to play the TCG, a deck is required. As stated above, decks must contain up to 30 cards. \n \
|
||||
Additionally, to save cards you need to have a card binder on yourself to store the cards. When the shift ends, your cards will be automatically saved by integrated scanners in your card binder. \n \
|
||||
Finally, a stock of Thunderdome Flippers to use for coin tosses and counter effects is recommended- these can be obtained occasionally from cardpacks, but any coin will do. \n \
|
||||
|
||||
Win condition is simple - kill your opponent's hero by depleting all of their 20 lifeshards. \n \
|
||||
|
||||
<span class='boldnotice'>Gameplay Phases:</span> \n \
|
||||
|
||||
A single turn of the game goes as follows, and the order of card effects is very similar to other card games. Within a single turn, the following phases are gone through, in order, unless otherwise altered by a card effect. Turn Phases are the Draw Phase, Effect Phase 1, Play Phase, Combat Phase, Effect Phase 2, and the End Phase. \n \
|
||||
|
||||
During the draw phase, the player whose turn it is untaps all their cards, then draws a single card. They gain 1 Max Mana, and their Mana is refilled. Cards with missing health due to defending, attacking, or damage effects return to max health at the end of the draw phase. \n \
|
||||
During the First Effect Phase, this is when effects that take place at the start of your turn would occur. If an opponent's effect takes place at the start of your turn, their effects will always take place first, then yours, unless otherwise stated by a card effect. If an opponent's effect would cause you to lose the game, and your effects would prevent that condition from happening afterwards, you would lose the game. As a general roll, when it's your turn, your opponent's effects take place FIRST, then yours. \n \
|
||||
|
||||
During the Play Phase, this is when you can play, summon, or activate your own cards. Card Effects that don't state when they're activated MUST be activated during the Play Phase. Your opponent can also activate their own card effects in response to one of your actions during your play phase, if able. Any card played during the play phase can activate its effect as soon as it's played. More details within the Card Breakdown section. \n \
|
||||
|
||||
During the Battle Phase, a Unit Card is able to battle other Unit Cards, or attack their opponent once per turn. Neither player can attack on their first turn, and all cards that enter the field can attack as soon as they can, unless it is that player's first turn, or they are prevented by a card effect. More details within the Card Combat section. \n \
|
||||
|
||||
During the End Phase, end of turn effects will occur. If the active player has more than 7 cards in their hand by this point, this is when they must discard cards. All of the player's cards who used an effect at any point in the turn are refreshed, and able to use their effect again going into the opponent's turn. By the end of their turn, if the player has more than 7 cards, they must discard cards from their hand until 7 remain. \n \
|
||||
After all 5 phases have passed, the players turn officially ends, and the opponent begins their turn, starting anew from the draw phase. \n \
|
||||
|
||||
Card effects are typically limited to the turn that that card is played. For example, a card effect that provides a card +1/+1 attack/health would only last until the end of the turn, unless otherwise stated, OR if the card is an Equipment Card. More on those below. \n \
|
||||
|
||||
<span class='boldnotice'>Card Breakdown:</span> \n \
|
||||
|
||||
Within the game, there are 3 kinds of cards (So far), Unit, Equipment and Spell cards. \n \
|
||||
|
||||
Unit Cards. All Unit Cards have 4 core values to keep in mind, Attack, Health, Faction, and Summoning Cost. Attack serves as a card's offensive value in combat. Health serves as a card's defensive value in combat, and doubles as a card's health. Factions are groupings of cards that can often share effects and traits together. Summoning Cost is how much mana a card needs in order to be summoned. \n \
|
||||
|
||||
Equipment Cards. All Equipment Cards similarly to Unit Cards have Attack, Health, and Summon Cost values, but for equipment, these values are added to the attached card's values. Equipment can only be attached (Equip) to units, and they last until the unit dies, or otherwise leaves the field, following it's equipt card. If returned to the hand, send to the discard pile, or otherwise leaves the field, it is detatched from the equipt card. When a Equipment Card increases a card's attack or health, those effects stay on the equip card until the equipment is unequip or removed from the parent card. \n \
|
||||
If a card would have it's health decreased by having it's equip card removed, it's handled by having it's maximum health decreased, not it's current health. For example, lets say you had a card with 1/1 attack/health, and give it an equipment giving it +1/+2, then that card enters combat, dropping it down to 2/1. If by an opponent's card effect it lost that +1/+2 equipment now, it's stats would be 1/1 once again. If an equip card explicitly lowers a card's stats, it is possible for a card to be killed as a result, but drops in attack will always bottom out at 0 attack at any given time. \n \
|
||||
|
||||
Spell Cards. Spell Cards don't have attack or health values, instead, they activate their effects as soon as they are summoned and leave the field afterwards(if not stated otherwise). \n \
|
||||
|
||||
<span class='boldnotice'>Card Subtypes:</span> \n \
|
||||
|
||||
Card effects: \n \
|
||||
Asimov - Unit cannot attack units with Human subtype \n \
|
||||
Changeling - Unit posesses all the subtypes at the same time \n \
|
||||
Greytide - On summon, unit gains amount of power equal to amount of other units with Greytide for 1 turn \n \
|
||||
Holy - Unit can't be targeted by spells \n \
|
||||
Taunt - All opposing unit attacks must be directed towards the unit with Taunt. \n \
|
||||
First Strike - This unit attacks first. If attacked unit is dead, unit doesn't recieve damage from it. \n \
|
||||
Deadeye - This unit can always hit opponents, regardless of effects or immunities. \n \
|
||||
Squad Tactics - When this unit attacks an opponent's unit and defeats it in combat, the owner of the defeated card takes 1 lifeshard of damage from combat. \n \
|
||||
Immunity - The unit cannot be affected by card effects or combat of its immunity type. This includes both friendly and opposing effects. \n \
|
||||
Fury - The unit must attack at every possibility. \n \
|
||||
Blocker - The unit cannot declare attacks, but can defend. \n \
|
||||
Hivemind - The unit enters combat with a hivemind token on it. The first time this card would take damage, remove that token instead. This does not apply to instant removal effects, only points of damage. \n \
|
||||
Clockwork - The unit can copy a single keyword on another unit on the field, until they lose the clockwork keyword or leave the field. \n \
|
||||
|
||||
<span class='boldnotice'>Card Combat:</span> \n \
|
||||
|
||||
Card combat is determined as follows. On your turn, any non-tapped unit card with a positive attack power is capable of declaring an attack. Upon declaring an attack, you must state if you're attacking your opponent directly, or if you're going to attack a specific opponent's unit. Unless otherwise stated, cards can only attack or defend one time per turn. \n \
|
||||
|
||||
An attack against a unit healths as follows: Both units will do their power as damage to the opponent's unit's health. Damage is typically dealt at the same time, and if both units would kill each other through combat, both are destroyed at the same time. If One or both units would not be destroyed by combat, they would have their health reduced by the difference of their health minus their opponent's power, until the start of your next turn. If the attacker or defender has a keyword or effect that prevents them from attacking their opponent (Like silicon, immunity), then they are not able to attack, but may still defend against the opponent's attack. Once combat has healthd, all remaining participants become tapped. \n \
|
||||
|
||||
A direct attack healths as follows: The attacking unit declares an attack against the opponent's lifeshards. Your opponent may then declare a defender if one is available, who will then turn the combat into an attack against a unit for the purposes of combat that turn. If the attack is not blocked, and the direct attack connects, then your opponent loses a number of lifeshards equal to the attacking units power. </span>"
|
||||
|
||||
/obj/item/cardboard_card
|
||||
name = "cardboard card cutout"
|
||||
desc = "A small piece of cardboard shaped as a TCG card."
|
||||
icon = 'icons/obj/tcg/misc.dmi'
|
||||
icon_state = "template"
|
||||
|
||||
/datum/reagent/card_powder/reaction_obj(obj/O, reac_volume)
|
||||
if(istype(O, /obj/item/cardboard_card))
|
||||
var/list/possible_cards = list()
|
||||
for(var/card_series in COMMON_SERIES)
|
||||
for(var/card_type in subtypesof(card_series))
|
||||
var/datum/tcg_card/card = new card_type
|
||||
if(card.rarity == rarity)
|
||||
possible_cards.Add(card_type)
|
||||
qdel(card)
|
||||
if(length(possible_cards))
|
||||
new /obj/item/tcg_card(get_turf(O), pick(possible_cards), TRUE)
|
||||
qdel(O)
|
||||
|
||||
. = ..()
|
||||
|
||||
#undef COMMON_SERIES
|
||||
#undef TAPPED_ANGLE
|
||||
#undef UNTAPPED_ANGLE
|
||||
1431
code/modules/tcg/pack_1.dm
Normal file
1431
code/modules/tcg/pack_1.dm
Normal file
File diff suppressed because it is too large
Load Diff
483
code/modules/tcg/pack_nuclear.dm
Normal file
483
code/modules/tcg/pack_nuclear.dm
Normal file
@@ -0,0 +1,483 @@
|
||||
/datum/tcg_card/pack_nuclear
|
||||
pack = 'icons/obj/tcg/pack_nuclear.dmi'
|
||||
|
||||
/datum/tcg_card/pack_nuclear/cayenne
|
||||
name = "Cayenne"
|
||||
desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot."
|
||||
rules = "Only playable when there are other Syndicate units on the field."
|
||||
icon_state = "cayenne"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 4
|
||||
health = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/esword
|
||||
name = "Energy Sword"
|
||||
desc = "Hard-light sword that doesn't leave burns. Don't ask questions."
|
||||
rules = ""
|
||||
icon_state = "esword"
|
||||
|
||||
mana_cost = 3
|
||||
attack = 2
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/stechkin
|
||||
name = "Stechkin Pistol"
|
||||
desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
|
||||
rules = "When equipping this card, flip it so opponent won't see it. Flip the card after the first attack."
|
||||
icon_state = "stechkin"
|
||||
|
||||
mana_cost = 2
|
||||
attack = 2
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/c20r
|
||||
name = "C-20R SMG"
|
||||
desc = "A bullpup two-round burst .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
|
||||
rules = "After attack, flip a coin. If heads, leave the weapon. If tails, unequip this card."
|
||||
icon_state = "c20r"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 4
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/l6saw
|
||||
name = "L6 Saw LMG"
|
||||
desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
|
||||
rules = "After equipped unit dies, this card goes to the bottom of draw deck"
|
||||
icon_state = "l6saw"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 6
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/bulldog
|
||||
name = "Bulldog Shotgun"
|
||||
desc = "A semi-auto, mag-fed shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines."
|
||||
rules = "After attack, deal 1 damage to enemy units next to the attacked one."
|
||||
icon_state = "bulldog"
|
||||
|
||||
mana_cost = 3
|
||||
attack = 3
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/nuke_op_leader
|
||||
name = "Nuclear Team Commander"
|
||||
desc = "All commanders of elite nuclear teams are equipped with high-tier gear and weaponery. And, sometimes, gaming cards."
|
||||
rules = "Squad Tactics. Give all Syndicate units on your side +1/0."
|
||||
icon_state = "nuke_op_leader"
|
||||
|
||||
mana_cost = 5
|
||||
attack = 3
|
||||
health = 4
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/nuke_op
|
||||
name = "Nuclear Team Commander"
|
||||
desc = "An unequipped nuclear operative, ready to buy some gear and go full ham!"
|
||||
rules = "Squad Tactics. On summon: Search your deck for Syndicate equipment. Equip it on this unit. Shuffle it afterwards."
|
||||
icon_state = "nuke_op"
|
||||
|
||||
mana_cost = 3
|
||||
attack = 2
|
||||
health = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/dark_gygax
|
||||
name = "Dark Gygax"
|
||||
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
|
||||
rules = "Squad Tactics."
|
||||
icon_state = "dark_gygax"
|
||||
|
||||
mana_cost = 6
|
||||
attack = 8
|
||||
health = 4
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/mauler
|
||||
name = "Mauler"
|
||||
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model. A perfect killing machine equipped with best weaponery in the world."
|
||||
rules = "Squad Tactics. Deadeye."
|
||||
icon_state = "mauler"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 8
|
||||
health = 8
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Legendary"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/saboteur
|
||||
name = "Syndicate Saboteur Cyborg"
|
||||
desc = "A streamlined engineering cyborg, equipped with covert modules. Allows to sabotage all the systems you want without being suspicious."
|
||||
rules = "Block the first spell your opponent plays against your hero."
|
||||
icon_state = "saboteur"
|
||||
|
||||
mana_cost = 3
|
||||
attack = 1
|
||||
health = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/medic
|
||||
name = "Syndicate Medical Cyborg"
|
||||
desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities."
|
||||
rules = "Each turn you can give one of your units 0/+1."
|
||||
icon_state = "medic"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 1
|
||||
health = 2
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/combat
|
||||
name = "Syndicate Assault Cyborg"
|
||||
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel."
|
||||
rules = "Squad Tactics. Fury."
|
||||
icon_state = "combat"
|
||||
|
||||
mana_cost = 5
|
||||
attack = 4
|
||||
health = 4
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/emag
|
||||
name = "Cryptographic Sequencer"
|
||||
desc = "It's a card with a magnetic strip attached to some circuitry."
|
||||
rules = "Convert an enemy silicon unit to your side."
|
||||
icon_state = "emag"
|
||||
|
||||
mana_cost = 4
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/bomb
|
||||
name = "Syndicate Bomb"
|
||||
desc = "A large and menacing device. Can be bolted down with a wrench."
|
||||
rules = "Deal 6 damage to all units on the field after 2 turns."
|
||||
icon_state = "bomb"
|
||||
|
||||
mana_cost = 6
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/honkbomb
|
||||
name = "H.O.N.K. Bomb"
|
||||
desc = "A bomb filled to the brim with bananium and dehydrated clowns!"
|
||||
rules = "Search your deck for up to 3 Clowns. Play them for free. Shuffle the deck afterwards."
|
||||
icon_state = "honkbomb"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/assault_pod
|
||||
name = "Assault Pod"
|
||||
desc = "Raining Steel. Nothing personnel, just disky."
|
||||
rules = "Summon up to 3 units from your hand with 4 mana discount each."
|
||||
icon_state = "assault_pod"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/c4
|
||||
name = "C4"
|
||||
desc = "A bunch of plastic explosives wired together."
|
||||
rules = "Deal 2 damage to an enemy unit."
|
||||
icon_state = "c4"
|
||||
|
||||
mana_cost = 1
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/emp
|
||||
name = "EMP Grenade"
|
||||
desc = "A modern-looking grenade which creates a powerful EMP upon activation. Do not eat."
|
||||
rules = "Deal 2 damage to an enemy silicon unit."
|
||||
icon_state = "emp"
|
||||
|
||||
mana_cost = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/zombie
|
||||
name = "Romerol Zombie"
|
||||
desc = "A horrible abomination, resembling a dead human. Has green skin and red claws. Wait, is it blood dripping from them?"
|
||||
rules = "After killing an enemy unit, search your deck for a Zombie and summon it for free."
|
||||
icon_state = "zombie"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 4
|
||||
health = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/north_star
|
||||
name = "North Star Armbands"
|
||||
desc = "The armbands of a deadly martial artist. Makes you pretty keen to put an end to evil in an extremely violent manner."
|
||||
rules = "Equipped unit can attack twice per turn."
|
||||
icon_state = "north_star"
|
||||
|
||||
mana_cost = 4
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/fastdetonation
|
||||
name = "Big-Ass Red Button"
|
||||
desc = "A menacing red button. What could it do?"
|
||||
rules = "Activate all spells that require several turns to occur."
|
||||
icon_state = "fastdetonation"
|
||||
|
||||
mana_cost = 2
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/rpg
|
||||
name = "PML-9 Rocket Launcher"
|
||||
desc = "A reusable rocket propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel."
|
||||
rules = "When equipped unit attacks enemy units, flip a coin. If heads, destroy the unit. If tails, deal 1/2 damage instead of the full blow."
|
||||
icon_state = "rpg"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 6
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Legendary"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/darkhonk
|
||||
name = "Dark H.O.N.K. Mech"
|
||||
desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. This one was painted black for maximum HONKing!"
|
||||
rules = "Taunt. Squad Tactics. Blocker."
|
||||
icon_state = "darkhonk"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 6
|
||||
health = 8
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/shielded_hardsuit
|
||||
name = "Shielded Blood-red Hardsuit"
|
||||
desc = "An advanced version of Gorlex Maradeurs' hardsuit with built-in energy shielding."
|
||||
rules = "Give equipped unit First Strike."
|
||||
icon_state = "shielded_hardsuit"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 0
|
||||
health = 4
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/nuclear_disk
|
||||
name = "Nuclear Authentication Disk"
|
||||
desc = "Better keep this safe."
|
||||
rules = "Give equipped unit Taunt. After the equipped unit dies, re-equip this card to the killer."
|
||||
icon_state = "nuclear_disk"
|
||||
|
||||
mana_cost = 0
|
||||
attack = 1
|
||||
health = 1
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/buzzkill
|
||||
name = "Buzzkill grenade"
|
||||
desc = "A whole swarm of angry bees filled with deadly toxins. Nasty!"
|
||||
rules = "Hivemind."
|
||||
icon_state = "buzzkill"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 1
|
||||
health = 5
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/syndicate_minibomb
|
||||
name = "Syndicate Minibomb"
|
||||
desc = "A syndicate manufactured explosive used to sow destruction and chaos."
|
||||
rules = "Deal 3 damage to an enemy unit and units adjacent to it."
|
||||
icon_state = "syndicate_minibomb"
|
||||
|
||||
mana_cost = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/viscerator
|
||||
name = "Viscerator"
|
||||
desc = "A small yet deadly machine, designed to rip it's targets apart."
|
||||
rules = "Gain +1/+1 for every other viscerator on field."
|
||||
icon_state = "viscerator"
|
||||
|
||||
mana_cost = 2
|
||||
attack = 3
|
||||
health = 1
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/cqc
|
||||
name = "CQC Manual"
|
||||
desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing."
|
||||
rules = "Give equipped unit Deadeye and First Strike."
|
||||
icon_state = "cqc"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 4
|
||||
health = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/holoparasite
|
||||
name = "Holoparasite"
|
||||
desc = "A mysterious being that stands by its charge, ever vigilant."
|
||||
rules = "On summon: \"Link\" this unit to another unit. Whenever this unit takes damage, instead, transfer all damage to the linked unit."
|
||||
icon_state = "holoparasite"
|
||||
|
||||
mana_cost = 6
|
||||
attack = 8
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Legendary"
|
||||
card_type = "Unit"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/rapier
|
||||
name = "Rapier"
|
||||
desc = "An elegant plastitanium rapier with a diamond tip and coated in a specialized knockout poison."
|
||||
rules = ""
|
||||
icon_state = "rapier"
|
||||
|
||||
mana_cost = 2
|
||||
attack = 3
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Rare"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/sniper
|
||||
name = "Sniper Rifle"
|
||||
desc = "A long ranged weapon that does significant damage. No, you can't quickscope."
|
||||
rules = "Give equipped unit Deadeye."
|
||||
icon_state = "sniper"
|
||||
|
||||
mana_cost = 6
|
||||
attack = 5
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/honksword
|
||||
name = "Bananium Sword"
|
||||
desc = "An elegant weapon, for a more \"civilized\" age."
|
||||
rules = "Equipped unit does not deal damage. Instead, it taps the attacked card without activating it's effects."
|
||||
icon_state = "honksword"
|
||||
|
||||
mana_cost = 3
|
||||
attack = 0
|
||||
health = 0
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Equipment"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/mustache
|
||||
name = "Mustache Grenade"
|
||||
desc = "A handsomely-attired teargas grenade."
|
||||
rules = "Unequip all enemy units. Unequipped equipment cards must be discarded."
|
||||
icon_state = "mustache"
|
||||
|
||||
mana_cost = 5
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Common"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/pack_nuclear/taeclowndo
|
||||
name = "Tae-Clown-Do"
|
||||
desc = "A pair of clown shoes, infused with bananium. Rumors say that these can teach their wearer the art of Tae-Clown-Do."
|
||||
rules = "Flip a coin. If heads, your enemy skips a turn. If tails, you skip a turn instead."
|
||||
icon_state = "taeclowndo"
|
||||
|
||||
mana_cost = 3
|
||||
|
||||
faction = "Syndicate"
|
||||
rarity = "Epic"
|
||||
card_type = "Spell"
|
||||
304
code/modules/tcg/pack_star.dm
Normal file
304
code/modules/tcg/pack_star.dm
Normal file
@@ -0,0 +1,304 @@
|
||||
/datum/tcg_card/pack_star
|
||||
pack = 'icons/obj/tcg/pack_star.dmi'
|
||||
|
||||
/datum/tcg_card/pack_star/golem
|
||||
name = "Adamantine Golem"
|
||||
desc = "An adamantine golem, immune to magic and being able to coordinate other golems, has a great power in combat."
|
||||
rules = "Holy. Taunt."
|
||||
icon_state = "golem"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 4
|
||||
health = 5
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/golem
|
||||
datum_type = /datum/tcg_card/pack_star/golem
|
||||
|
||||
/datum/tcg_card/pack_star/xenomaid
|
||||
name = "Lusty Xenomorph Maid"
|
||||
desc = "Just a lusty xenomorph maid, nothing to see here."
|
||||
rules = "Blocker. Each turn, gain -1/-1."
|
||||
icon_state = "xenomaid"
|
||||
|
||||
mana_cost = 3
|
||||
attack = 6
|
||||
health = 6
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/xenomaid
|
||||
datum_type = /datum/tcg_card/pack_star/xenomaid
|
||||
|
||||
/datum/tcg_card/pack_star/morph
|
||||
name = "Morph"
|
||||
desc = "A revolting, pulsating pile of flesh that can mimic everything it sees."
|
||||
rules = "On summon: Copy stats of an opponent's card."
|
||||
icon_state = "morph"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 0
|
||||
health = 1
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Common"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/morph
|
||||
datum_type = /datum/tcg_card/pack_star/morph
|
||||
|
||||
/datum/tcg_card/pack_star/demonic_miner
|
||||
name = "Demonic Miner"
|
||||
desc = "An soul of extremely geared miner, driven crazy or possessed by the demonic forces here, either way a terrifying enemy."
|
||||
rules = "Each turn: Deal 1 damage to all the creatures on the field."
|
||||
icon_state = "demonic_miner"
|
||||
|
||||
mana_cost = 7
|
||||
attack = 4
|
||||
health = 5
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/demonic_miner
|
||||
datum_type = /datum/tcg_card/pack_star/demonic_miner
|
||||
|
||||
/datum/tcg_card/pack_star/wendigo
|
||||
name = "Wendigo"
|
||||
desc = "A mythological man-eating legendary creature, you probably aren't going to survive this."
|
||||
rules = ""
|
||||
icon_state = "wendigo"
|
||||
|
||||
mana_cost = 6
|
||||
attack = 5
|
||||
health = 3
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Common"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/wendigo
|
||||
datum_type = /datum/tcg_card/pack_star/wendigo
|
||||
|
||||
/datum/tcg_card/pack_star/honk
|
||||
name = "H.O.N.K. Mech"
|
||||
desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!"
|
||||
rules = "Taunt."
|
||||
icon_state = "honk"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 6
|
||||
health = 8
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/honk
|
||||
datum_type = /datum/tcg_card/pack_star/honk
|
||||
|
||||
/datum/tcg_card/pack_star/ratvar
|
||||
name = "Clockwork Slab"
|
||||
desc = "A link between clockwork servants and the Celestial Derelict. It contains information, recites scripture, and is Servant's most vital tool."
|
||||
rules = "Equipped unit gains Clockwork and can't attack units with Holy."
|
||||
icon_state = "ratvar"
|
||||
|
||||
mana_cost = 2
|
||||
attack = 3
|
||||
health = 0
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Common"
|
||||
card_type = "Equipment"
|
||||
|
||||
/obj/item/tcg_card/special/ratvar
|
||||
datum_type = /datum/tcg_card/pack_star/ratvar
|
||||
|
||||
/datum/tcg_card/pack_star/hierophant
|
||||
name = "Hierophant Club"
|
||||
desc = "The strange technology of this large club allows various nigh-magical feats. It used to beat you, but now you can set the beat."
|
||||
rules = "Give equipped unit First Strike."
|
||||
icon_state = "hierophant"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 2
|
||||
health = 0
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Rare"
|
||||
card_type = "Equipment"
|
||||
|
||||
/obj/item/tcg_card/special/hierophant
|
||||
datum_type = /datum/tcg_card/pack_star/hierophant
|
||||
|
||||
/datum/tcg_card/pack_star/abductor
|
||||
name = "Alien Gland"
|
||||
desc = "A nausea-inducing hunk of twisting flesh and metal. These things are often found after people were abducted by grey-skinned aliens."
|
||||
rules = "Each turn: Flip a coin. If heads, unit gain +1/+1. If tails, unit gains -2/-1."
|
||||
icon_state = "abductor"
|
||||
|
||||
mana_cost = 2
|
||||
attack = 0
|
||||
health = 0
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Common"
|
||||
card_type = "Equipment"
|
||||
|
||||
/obj/item/tcg_card/special/abductor
|
||||
datum_type = /datum/tcg_card/pack_star/abductor
|
||||
|
||||
/datum/tcg_card/pack_star/space_carp
|
||||
name = "Space Carp"
|
||||
desc = "A failed weaponery experiment, looking like a ferocious, fang-bearing creature that resembles a fish."
|
||||
rules = ""
|
||||
icon_state = "space_carp"
|
||||
|
||||
mana_cost = 1
|
||||
attack = 2
|
||||
health = 1
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Common"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/space_carp
|
||||
datum_type = /datum/tcg_card/pack_star/space_carp
|
||||
|
||||
/datum/tcg_card/pack_star/spess_pirate
|
||||
name = "Space Pirate"
|
||||
desc = "Space Pirate does whatever he wants because he is free. Sadly, Space Rum insn't free."
|
||||
rules = "On summon: Draw 2 cards. If there are no spells, discard them."
|
||||
icon_state = "spess_pirate"
|
||||
|
||||
mana_cost = 4
|
||||
attack = 3
|
||||
health = 2
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/spess_pirate
|
||||
datum_type = /datum/tcg_card/pack_star/spess_pirate
|
||||
|
||||
/datum/tcg_card/pack_star/gondola
|
||||
name = "Gondola"
|
||||
desc = "Gondola is the silent walker. Having no hands he embodies the Taoist principle of wu-wei (non-action) while his smiling facial expression shows his utter and complete acceptance of the world as it is. Its hide is extremely valuable."
|
||||
rules = "Taunt. Holy."
|
||||
icon_state = "gondola"
|
||||
|
||||
mana_cost = 6
|
||||
attack = 0
|
||||
health = 6
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Epic"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/gondola
|
||||
datum_type = /datum/tcg_card/pack_star/gondola
|
||||
|
||||
/datum/tcg_card/pack_star/phazon
|
||||
name = "Phazon"
|
||||
desc = "The pinnacle of scientific research and pride of Nanotrasen, Phazon uses cutting edge bluespace technology and expensive materials."
|
||||
rules = "Whenever this unit takes damage, flip a coin. If heads, take no damage. If tails, take double damage."
|
||||
icon_state = "phazon"
|
||||
|
||||
mana_cost = 8
|
||||
attack = 5
|
||||
health = 7
|
||||
|
||||
faction = "Unique"
|
||||
rarity = "Rare"
|
||||
card_type = "Unit"
|
||||
|
||||
/obj/item/tcg_card/special/phazon
|
||||
datum_type = /datum/tcg_card/pack_star/phazon
|
||||
|
||||
//Ultimate Exodia cards. I really, really doubt that someone will ever find them.
|
||||
|
||||
/datum/tcg_card/exodia
|
||||
pack = 'icons/obj/tcg/pack_star.dmi'
|
||||
|
||||
/datum/tcg_card/exodia/exodia_singulo
|
||||
name = "Singularity"
|
||||
desc = "A monstrous gravitational singularity, pitch black(but not quiet) and very menacings."
|
||||
rules = "This card doesn't leave field. At the end of each turn: Remove all the cards(except other Exodia cards) from the field."
|
||||
icon_state = "exodia_singularity"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Exodia"
|
||||
rarity = "Exodia"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/exodia/exodia_tesla
|
||||
name = "Energy Orb"
|
||||
desc = "An orb made out of hypercharged plasma. An ultimate bug zapper."
|
||||
rules = "This card doesn't leave field. Every turn all units take 4 damage."
|
||||
icon_state = "exodia_tesla"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Exodia"
|
||||
rarity = "Exodia"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/exodia/exodia_narie
|
||||
name = "Nar-Sie"
|
||||
desc = "An avatar of the Nar-Sie, one of the Eldritch Gods."
|
||||
rules = "This card doesn't leave field. Every turn all units take 1 damage and you restore 1 lifeshard."
|
||||
icon_state = "exodia_narsie"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Exodia"
|
||||
rarity = "Exodia"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/exodia/exodia_ratvar
|
||||
name = "Ratvar"
|
||||
desc = "Ratvar, the god of cogs and clockwork mechanisms, was trapped by Nar-Sie a long ago."
|
||||
rules = "This card doesn't leave field. Every turn enemy hero recieves 2 lifeshard damage."
|
||||
icon_state = "exodia_ratvar"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Exodia"
|
||||
rarity = "Exodia"
|
||||
card_type = "Spell"
|
||||
|
||||
/datum/tcg_card/exodia/exodia
|
||||
name = "Eldritch Horror"
|
||||
desc = "The Eldritch Horror is a long forgotten demon that was the beginning of everything. Afterwards, his creations revolted and left him abadoned in endless void."
|
||||
rules = "This card doesn't leave field. If all other 4 Exodia cards are on the field(Singularity, Energy Orb, Nar-Sie and Ratvar), the game is won."
|
||||
icon_state = "exodia_eldritch"
|
||||
|
||||
mana_cost = 8
|
||||
|
||||
faction = "Exodia"
|
||||
rarity = "Unique" //No drop lads
|
||||
card_type = "Spell"
|
||||
|
||||
/obj/item/tcg_card/special/exodia_singulo
|
||||
datum_type = /datum/tcg_card/exodia/exodia_singulo
|
||||
|
||||
/obj/item/tcg_card/special/exodia_tesla
|
||||
datum_type = /datum/tcg_card/exodia/exodia_tesla
|
||||
|
||||
/obj/item/tcg_card/special/exodia_narie
|
||||
datum_type = /datum/tcg_card/exodia/exodia_narie
|
||||
|
||||
/obj/item/tcg_card/special/exodia_ratvar
|
||||
datum_type = /datum/tcg_card/exodia/exodia_ratvar
|
||||
|
||||
/obj/item/tcg_card/special/exodia
|
||||
datum_type = /datum/tcg_card/exodia/exodia
|
||||
|
||||
@@ -78,3 +78,16 @@
|
||||
limited_stock = 1
|
||||
cant_discount = TRUE
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/badass/gaming_cardpack
|
||||
name = "TCG Card Operatives Bundle"
|
||||
desc = "A bundle full of goodies required to work as a TCG Card Operative. A warm pajama, a mug of cocoa, a plushie and a two packs full of rare 2560 Core Set cards!"
|
||||
item = /obj/item/storage/box/syndie_kit/sleepytime/cardpack
|
||||
cost = 20
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/badass/cardpack
|
||||
name = "TCG Nuclear Cardpack"
|
||||
desc = "A cardpack filled with top-tier TCG cards."
|
||||
item = /obj/item/cardpack/syndicate
|
||||
cost = 4
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
/obj/item/storage/dice = 10,
|
||||
/obj/item/toy/cards/deck/cas = 3,
|
||||
/obj/item/toy/cards/deck/cas/black = 3,
|
||||
/obj/item/toy/cards/deck/unum = 3)
|
||||
/obj/item/toy/cards/deck/unum = 3,
|
||||
/obj/item/cardpack/series_one = 10,
|
||||
/obj/item/tcgcard_binder = 5)
|
||||
contraband = list(/obj/item/dice/fudge = 9)
|
||||
premium = list(/obj/item/melee/skateboard/pro = 3,
|
||||
/obj/item/melee/skateboard/hoverboard = 1)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 18 KiB |
BIN
icons/obj/tcg/misc.dmi
Normal file
BIN
icons/obj/tcg/misc.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
BIN
icons/obj/tcg/pack_1.dmi
Normal file
BIN
icons/obj/tcg/pack_1.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
BIN
icons/obj/tcg/pack_nuclear.dmi
Normal file
BIN
icons/obj/tcg/pack_nuclear.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
BIN
icons/obj/tcg/pack_star.dmi
Normal file
BIN
icons/obj/tcg/pack_star.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -538,6 +538,7 @@
|
||||
#include "code\datums\components\storage\concrete\rped.dm"
|
||||
#include "code\datums\components\storage\concrete\special.dm"
|
||||
#include "code\datums\components\storage\concrete\stack.dm"
|
||||
#include "code\datums\components\storage\concrete\tcg.dm"
|
||||
#include "code\datums\diseases\_disease.dm"
|
||||
#include "code\datums\diseases\_MobProcs.dm"
|
||||
#include "code\datums\diseases\anxiety.dm"
|
||||
@@ -3493,6 +3494,10 @@
|
||||
#include "code\modules\surgery\organs\tails.dm"
|
||||
#include "code\modules\surgery\organs\tongue.dm"
|
||||
#include "code\modules\surgery\organs\vocal_cords.dm"
|
||||
#include "code\modules\tcg\cards.dm"
|
||||
#include "code\modules\tcg\pack_1.dm"
|
||||
#include "code\modules\tcg\pack_nuclear.dm"
|
||||
#include "code\modules\tcg\pack_star.dm"
|
||||
#include "code\modules\tgchat\message.dm"
|
||||
#include "code\modules\tgchat\to_chat.dm"
|
||||
#include "code\modules\tgs\includes.dm"
|
||||
|
||||
Reference in New Issue
Block a user