From 756be084bcf059805883b1c227816ffbff757f42 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 17 Feb 2021 18:50:23 +0300 Subject: [PATCH] Decks are saveable! --- code/controllers/subsystem/job.dm | 47 +++++++++++------ .../subsystem/persistence/_persistence.dm | 12 +---- code/game/machinery/cryopod.dm | 6 +++ code/modules/cargo/packs/costumes_toys.dm | 3 +- code/modules/tcg/cards.dm | 50 ++++++++++++++++--- 5 files changed, 84 insertions(+), 34 deletions(-) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 7dae0d0126..84a9fc0e17 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -493,24 +493,41 @@ SUBSYSTEM_DEF(job) 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() + H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE) + for(var/card_type in H.client.prefs.tcg_cards) + if(card_type == "decks") + for(var/deck in H.client.prefs.tcg_cards["decks"]) + var/obj/item/tcgcard_deck/new_deck = new(get_turf(H)) + new_deck.forceMove(binder) + binder.decks.Add(new_deck) + for(var/cardy in deck) + var/obj/item/tcg_card/card = new(get_turf(H), cardy, deck[cardy]) + card.forceMove(new_deck) + new_deck.contents.Add(card) + continue + 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) + H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE) + for(var/card_type in N.client.prefs.tcg_cards) + if(card_type == "decks") + for(var/deck in N.client.prefs.tcg_cards["decks"]) + var/obj/item/tcgcard_deck/new_deck = new(get_turf(H)) + new_deck.forceMove(binder) + binder.decks.Add(new_deck) + for(var/cardy in deck) + var/obj/item/tcg_card/card = new(get_turf(H), cardy, deck[cardy]) + card.forceMove(new_deck) + new_deck.contents.Add(card) + continue + 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() return H /* diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm index a3be7b9c51..9b2c019db4 100644 --- a/code/controllers/subsystem/persistence/_persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -361,14 +361,4 @@ SUBSYSTEM_DEF(persistence) 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) + ending_human.SaveTCGCards() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ea41d77e2a..5be3e2a3a5 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -296,6 +296,12 @@ AM.forceMove(src) R.module.remove_module(I, TRUE) else + + if(ishuman(mob_occupant)) + var/mob/living/carbon/human/H = mob_occupant + if(H.mind && H.client && H.client.prefs && H == H.mind.original_character) + H.SaveTCGCards() + var/list/gear = list() if(iscarbon(mob_occupant)) // sorry simp-le-mobs deserve no mercy var/mob/living/carbon/C = mob_occupant diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index c0bd25b028..6a37ef80a9 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -343,7 +343,6 @@ /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(.) @@ -351,5 +350,5 @@ cardtypes.Remove(cardtype) qdel(pack) for(var/i in 1 to 10) - cardpacktype = pick(cardtypes) + var/cardpacktype = pick(cardtypes) new cardpacktype(.) diff --git a/code/modules/tcg/cards.dm b/code/modules/tcg/cards.dm index 95bb1be7d0..34fd10d787 100644 --- a/code/modules/tcg/cards.dm +++ b/code/modules/tcg/cards.dm @@ -278,6 +278,8 @@ card_count = 9 guaranteed_count = 3 + illegal = TRUE + guar_rarity = list( //Better chances "Legendary" = 5, "Epic" = 10, @@ -391,7 +393,7 @@ if(21 to INFINITY) icon_state = "deck_tcg_full" else - icon_state = "deck_up" + icon_state = "deck_tcg_full" /obj/item/tcgcard_deck/examine(mob/user) . = ..() @@ -549,7 +551,8 @@ icon_state = "binder" var/list/cards = list() - var/mode = 0 //If 1, will show all the cards even if you don't have em + var/list/decks = 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)) @@ -564,10 +567,8 @@ qdel(I) if(istype(I, /obj/item/tcgcard_deck)) var/obj/item/tcgcard_deck/deck = I - for(var/obj/item/tcg_card/card in deck.contents) - card.forceMove(src) - cards.Add(card) - qdel(I) + deck.forceMove(src) + decks.Add(deck) . = ..() /obj/item/tcgcard_binder/attack_self(mob/living/carbon/user) @@ -609,6 +610,19 @@ return . = ..() +/obj/item/tcgcard_binder/AltClick(mob/user) + var/list/choices = list() + + for(var/obj/item/tcgcard_deck/deck in decks) + var/obj/item/tcgcard_deck/first_card = locate() in deck + choices[deck] = image(icon = first_card.icon, icon_state = first_card.icon_state) + + var/obj/item/tcgcard_deck/choice = show_radial_menu(user, src, choices, require_near = TRUE, tooltips = TRUE) + if(choice && (choice in decks)) + choice.forceMove(get_turf(src)) + user.put_in_hands(choice) + decks.Remove(choice) + /obj/item/tcgcard_binder/proc/check_for_exodia() var/list/card_types = list() for(var/obj/item/tcg_card/card in cards) @@ -738,6 +752,30 @@ . = ..() +/mob/living/carbon/human/proc/SaveTCGCards() + if(!client) + return + + var/obj/item/tcgcard_binder/binder = locate() in src + if(!binder || !length(binder.cards)) + return + + 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 + + card_types["decks"] = list() + + for(var/obj/item/tcgcard_deck/deck in binder.decks) + var/list/cardlist = list() + for(var/obj/item/tcg_card/card in deck.contents) + cardlist[card.datum_type] = card.illegal + card_types["decks"].Add(cardlist) + + client.prefs.tcg_cards = card_types + client.prefs.save_character(TRUE) + #undef COMMON_SERIES #undef TAPPED_ANGLE #undef UNTAPPED_ANGLE