From 38b3f89d333ed5c16df7a90f664cc89614f9ad37 Mon Sep 17 00:00:00 2001 From: SonfiveTV Date: Fri, 15 May 2026 23:19:25 +0100 Subject: [PATCH 1/5] Added Cetoddle line Cetoddle and Cetitan eat ice, this is close enough It is essentially Glass Joker, but Cetitan scores double in Hail (we dont have weather yet so for now that is all glass cards held in hand) --- localization/en-us.lua | 27 +- pokemon/pokejokers_33.lua | 753 ++++++++++++++++++++++---------------- 2 files changed, 467 insertions(+), 313 deletions(-) diff --git a/localization/en-us.lua b/localization/en-us.lua index aeb8b93b..fedf2832 100644 --- a/localization/en-us.lua +++ b/localization/en-us.lua @@ -516,13 +516,6 @@ return { "and earn {C:money}$#1#{}", }, }, - c_poke_berry_juice_mega = { - name = "Mega Berry Juice", - text = { - "{C:attention}Mega Evolves{} leftmost", - "or selected Joker", - }, - }, c_poke_berry_juice_mystery = { name = "Mystery Berry Juice", text = { @@ -5552,6 +5545,26 @@ return { "contains a scoring {C:attention}5{}, {C:attention}6{}, or {C:attention}7{}", } }, + j_poke_cetoddle = { + name = 'Cetoddle', + text = { + "Gains {X:red,C:white}X#1#{} Mult for every", + "{C:attention}Glass Card{} that is destroyed", + "{C:inactive}(Currently {}{X:red,C:white}X#2#{}{C:inactive} Mult){}", + "{C:inactive,s:0.8}(Evolves with an {C:attention,s:0.8}Ice Stone{C:inactive,s:0.8})" + } + }, + j_poke_cetitan = { + name = 'Cetitan', + text = { + "Gains {X:red,C:white}X#1#{} Mult for every", + "{C:attention}Glass Card{} that is destroyed", + "{br:4}text needs to be here to work", + "Scores double if every card", + "held in hand is {C:attention}Glass{}", + "{C:inactive}(Currently {}{X:red,C:white}X#2#{}{C:inactive} Mult){}", + } + }, j_poke_annihilape = { name = 'Annihilape', text = { diff --git a/pokemon/pokejokers_33.lua b/pokemon/pokejokers_33.lua index 58388668..100f846e 100644 --- a/pokemon/pokejokers_33.lua +++ b/pokemon/pokejokers_33.lua @@ -1,306 +1,447 @@ --- Wugtrio 961 -local wugtrio={ - name = "wugtrio", - pos = {x = 4, y = 4}, - config = {extra = {chips = 120, Xmult = 1.5}}, - loc_vars = function(self, info_queue, center) - type_tooltip(self, info_queue, center) - return {vars = {center.ability.extra.Xmult, center.ability.extra.chips}} - end, - rarity = 2, - cost = 6, - stage = "One", - atlas = "Pokedex9", - gen = 9, - ptype = "Water", - blueprint_compat = true, - calculate = function(self, card, context) - if context.cardarea == G.jokers and context.scoring_hand then - if context.joker_main then - local score_chips = false - local score_mult = false - if next(context.poker_hands['Three of a Kind']) then score_mult = true end - for k, v in ipairs(context.scoring_hand) do - if v:get_id() == 5 or v:get_id() == 6 or v:get_id() == 7 then - score_chips = true - break - end - end - if score_mult and score_chips then - return { - message = localize('poke_dig_ex'), - colour = G.C.MULT, - chip_mod = card.ability.extra.chips, - Xmult_mod = card.ability.extra.Xmult, - card = card - } - elseif score_chips then - return { - message = localize{type = 'variable', key = 'a_chips', vars = {card.ability.extra.chips}}, - colour = G.C.CHIPS, - chip_mod = card.ability.extra.chips, - card = card - } - elseif score_mult then - return { - message = localize{type = 'variable', key = 'a_xmult', vars = {card.ability.extra.Xmult}}, - colour = G.C.MULT, - Xmult_mod = card.ability.extra.Xmult, - card = card - } - end - end - end - end, - attributes = {"xmult", "chips", "hand_type", "rank", "five", "six", "seven"}, -} --- Bombirdier 962 --- Finizen 963 --- Palafin 964 --- Varoom 965 --- Revavroom 966 --- Cyclizar 967 --- Orthworm 968 --- Glimmet 969 --- Glimmora 970 --- Greavard 971 --- Houndstone 972 --- Flamigo 973 --- Cetoddle 974 --- Cetitan 975 --- Veluza 976 --- Dondozo 977 --- Tatsugiri 978 --- Annihilape 979 -local annihilape={ - name = "annihilape", - pos = {x = 2, y = 6}, - config = {extra = {mult_mod = 5, chip_mod = 7}}, - loc_vars = function(self, info_queue, center) - type_tooltip(self, info_queue, center) - return {vars = {center.ability.extra.mult_mod, center.ability.extra.chip_mod, center.ability.extra.mult_mod * (1 + G.GAME.current_round.hands_played), - center.ability.extra.chip_mod * (1 + G.GAME.current_round.hands_played)}} - end, - rarity = "poke_safari", - cost = 11, - stage = "Two", - ptype = "Fighting", - atlas = "Pokedex9", - gen = 9, - blueprint_compat = true, - calculate = function(self, card, context) - if context.individual and context.cardarea == G.play and not context.other_card.debuff then - if context.other_card:get_id() == 2 or - context.other_card:get_id() == 3 or - context.other_card:get_id() == 5 or - context.other_card:get_id() == 7 then - return { - chips = card.ability.extra.chip_mod * (1 + G.GAME.current_round.hands_played), - mult = card.ability.extra.mult_mod * (1 + G.GAME.current_round.hands_played), - card = card - } - end - end - end, - attributes = {"chips", "mult", "rank", "two", "three", "five", "seven"}, -} --- Clodsire 980 --- Farigiraf 981 -local farigiraf={ - name = "farigiraf", - pos = {x = 4, y = 6}, - config = {extra = {Xmult_multi = 2.2, score = false}}, - loc_vars = function(self, info_queue, center) - type_tooltip(self, info_queue, center) - if pokermon_config.detailed_tooltips then - info_queue[#info_queue+1] = {set = 'Other', key = 'holding', vars = {"Cryptid"}} - info_queue[#info_queue+1] = { set = 'Spectral', key = 'c_cryptid', vars = {2}} - end - return {vars = {center.ability.extra.Xmult_multi}} - end, - rarity = "poke_safari", - cost = 8, - stage = "One", - ptype = "Psychic", - atlas = "Pokedex9", - gen = 9, - perishable_compat = true, - blueprint_compat = true, - eternal_compat = true, - calculate = function(self, card, context) - if context.cardarea == G.jokers and context.scoring_hand then - if context.before and next(context.poker_hands['Two Pair']) and not context.blueprint then - card.ability.extra.score = true - end - if context.after then - card.ability.extra.score = false - end - end - if context.individual and not context.end_of_round and context.cardarea == G.play and card.ability.extra.score then - local first_face = nil - local last_face = nil - for i = 1, #context.scoring_hand do - if context.scoring_hand[i]:is_face() then - first_face = context.scoring_hand[i]; - break - end - end - for i = #context.scoring_hand, 1, -1 do - if context.scoring_hand[i]:is_face() and context.scoring_hand[i] ~= first_face then - last_face = context.scoring_hand[i]; - break - end - end - if context.other_card == first_face or context.other_card == last_face then - return { - x_mult = card.ability.extra.Xmult_multi, - colour = G.C.RED, - card = card - } - end - end - end, - add_to_deck = function(self, card, from_debuff) - if not from_debuff then - if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then - local _card = create_card('Spectral', G.consumeables, nil, nil, nil, nil, 'c_cryptid') - _card:add_to_deck() - G.consumeables:emplace(_card) - card_eval_status_text(_card, 'extra', nil, nil, nil, {message = localize('k_plus_spectral'), colour = G.C.SECONDARY_SET.Spectral}) - end - end - end, - attributes = {"holding", "face", "xmult", "hand_type"}, -} --- Dudunsparce 982 -local dudunsparce={ - name = "dudunsparce", - pos = {x = 5, y = 6}, - config = {extra = {card_slots = 1, pack_slots = 1, voucher_slots = 1, form = 0}}, - loc_vars = function(self, info_queue, center) - type_tooltip(self, info_queue, center) - local alt_key = nil - if center.ability.extra.form == 1 then - alt_key = "j_poke_dudunsparce2" - if pokermon_config.detailed_tooltips then - info_queue[#info_queue+1] = {key = 'tag_coupon', set = 'Tag'} - info_queue[#info_queue+1] = {set = 'Other', key = 'holding', vars = {"Coupon Tag"}} - end - end - return {vars = {center.ability.extra.card_slots, center.ability.extra.pack_slots, center.ability.extra.voucher_slots}, key = alt_key} - end, - rarity = "poke_safari", - cost = 9, - stage = "One", - ptype = "Colorless", - atlas = "Pokedex9", - gen = 9, - perishable_compat = true, - blueprint_compat = false, - eternal_compat = true, - set_ability = function(self, card, initial, delay_sprites) - if initial then - if pseudorandom('dudunsparce') < (1/6) then - card.ability.extra.form = 1 - self:set_sprites(card) - end - end - end, - set_sprites = function(self, card, front) - if card.ability and card.ability.extra and card.ability.extra.form == 1 then - card.children.center:set_sprite_pos({x = 8, y = 3}) - else - card.children.center:set_sprite_pos({x = 6, y = 3}) - end - end, - add_to_deck = function(self, card, from_debuff) - change_shop_size(card.ability.extra.card_slots) - SMODS.change_booster_limit(card.ability.extra.pack_slots) - SMODS.change_voucher_limit(card.ability.extra.voucher_slots) - if card.ability.extra.form == 1 then - self:set_sprites(card) - if not from_debuff then - G.E_MANAGER:add_event(Event({ - func = (function() - add_tag(Tag('tag_coupon')) - play_sound('generic1', 0.9 + math.random()*0.1, 0.8) - play_sound('holo1', 1.2 + math.random()*0.1, 0.4) - return true - end) - })) - card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('poke_wowthree')}) - end - end - end, - remove_from_deck = function(self, card, from_debuff) - change_shop_size(-card.ability.extra.card_slots) - SMODS.change_booster_limit(-card.ability.extra.card_slots) - SMODS.change_voucher_limit(-card.ability.extra.card_slots) - end, - attributes = {"passive"}, -} --- Kingambit 983 -local kingambit={ - name = "kingambit", - pos = {x = 0, y = 0}, - config = {extra = {Xmult = 2,}}, - loc_vars = function(self, info_queue, center) - type_tooltip(self, info_queue, center) - return {vars = {center.ability.extra.Xmult, }} - end, - rarity = "poke_safari", - cost = 11, - gen = 9, - stage = "Two", - ptype = "Metal", - atlas = "Pokedex9", - perishable_compat = true, - blueprint_compat = true, - eternal_compat = true, - calculate = function(self, card, context) - if context.cardarea == G.jokers and context.scoring_hand then - if context.joker_main then - return { - message = localize{type = 'variable', key = 'a_xmult', vars = {card.ability.extra.Xmult}}, - colour = G.C.XMULT, - Xmult_mod = card.ability.extra.Xmult - } - end - end - if context.individual and not context.end_of_round and context.cardarea == G.play then - local king_count = 0 - for _, playing_card in ipairs(G.playing_cards) do - if playing_card:get_id() == 13 then king_count = king_count + 1 end - end - if king_count == 1 then - local has_king = nil - for k, v in pairs(context.full_hand) do - if v:get_id() == 13 then - has_king = true - break - end - end - if has_king and not context.other_card:is_face() then - local Xmult = card.ability.extra.Xmult/2 - if Xmult > 1 then - return { - x_mult = Xmult, - card = card - } - end - end - end - end - end, - attributes = {"xmult", "rank", "king", "face", "full_deck"}, -} --- Great Tusk 984 --- Scream Tail 985 --- Brute Bonnet 986 --- Flutter Mane 987 --- Slither Wing 988 --- Sandy Shocks 989 --- Iron Treads 990 -return {name = "Pokemon Jokers 961-990", - list = {wugtrio, annihilape, farigiraf, dudunsparce, kingambit}, -} +-- Wugtrio 961 +local wugtrio={ + name = "wugtrio", + pos = {x = 4, y = 4}, + config = {extra = {chips = 120, Xmult = 1.5}}, + loc_vars = function(self, info_queue, center) + type_tooltip(self, info_queue, center) + return {vars = {center.ability.extra.Xmult, center.ability.extra.chips}} + end, + rarity = 2, + cost = 6, + stage = "One", + atlas = "Pokedex9", + gen = 9, + ptype = "Water", + blueprint_compat = true, + calculate = function(self, card, context) + if context.cardarea == G.jokers and context.scoring_hand then + if context.joker_main then + local score_chips = false + local score_mult = false + if next(context.poker_hands['Three of a Kind']) then score_mult = true end + for k, v in ipairs(context.scoring_hand) do + if v:get_id() == 5 or v:get_id() == 6 or v:get_id() == 7 then + score_chips = true + break + end + end + if score_mult and score_chips then + return { + message = localize('poke_dig_ex'), + colour = G.C.MULT, + chip_mod = card.ability.extra.chips, + Xmult_mod = card.ability.extra.Xmult, + card = card + } + elseif score_chips then + return { + message = localize{type = 'variable', key = 'a_chips', vars = {card.ability.extra.chips}}, + colour = G.C.CHIPS, + chip_mod = card.ability.extra.chips, + card = card + } + elseif score_mult then + return { + message = localize{type = 'variable', key = 'a_xmult', vars = {card.ability.extra.Xmult}}, + colour = G.C.MULT, + Xmult_mod = card.ability.extra.Xmult, + card = card + } + end + end + end + end, + attributes = {"xmult", "chips", "hand_type", "rank", "five", "six", "seven"}, +} +-- Bombirdier 962 +-- Finizen 963 +-- Palafin 964 +-- Varoom 965 +-- Revavroom 966 +-- Cyclizar 967 +-- Orthworm 968 +-- Glimmet 969 +-- Glimmora 970 +-- Greavard 971 +-- Houndstone 972 +-- Flamigo 973 +-- Cetoddle 974 +local cetoddle = { + name = "cetoddle", + config = {extra = {Xmult_mod = 0.25, Xmult = 1}}, + loc_vars = function(self, info_queue, card) + type_tooltip(self, info_queue, card) + return {vars = {card.ability.extra.Xmult_mod, card.ability.extra.Xmult}} + end, + designer = "Sonfive", + rarity = 2, + cost = 6, + enhancement_gate = 'm_glass', + item_req = "icestone", + stage = "Basic", + ptype = "Water", + gen = 9, + blueprint_compat = true, + perishable_compat = false, + calculate = function(self, card, context) + if context.remove_playing_cards and not context.blueprint then + local glass_cards = 0 + for _, removed_card in ipairs(context.removed) do + if removed_card.shattered then glass_cards = glass_cards + 1 end + end + if glass_cards > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + card.ability.extra.Xmult = card.ability.extra.Xmult + + card.ability.extra.Xmult_mod * glass_cards + return true + end + })) + SMODS.calculate_effect( + { + message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult + + card.ability.extra.Xmult_mod * glass_cards } } + }, card) + return true + end + })) + return nil, true + end + end + if context.using_consumeable and not context.blueprint and context.consumeable.config.center.key == 'c_hanged_man' then + -- Glass Joker updates on Hanged Man and no other destroy consumable + local glass_cards = 0 + for _, removed_card in ipairs(G.hand.highlighted) do + if SMODS.has_enhancement(removed_card, 'm_glass') then glass_cards = glass_cards + 1 end + end + if glass_cards > 0 then + card.ability.extra.Xmult = card.ability.extra.Xmult + + card.ability.extra.Xmult_mod * glass_cards + return { + message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult } } + } + end + end + if context.joker_main then + return { xmult = card.ability.extra.Xmult } + end + return item_evo(self, card, context, "j_sonfive_cetitan") + end, +} +-- Cetitan 975 +local cetitan = { + name = "cetitan", + config = {extra = {Xmult_mod = 0.5, Xmult = 1}}, + loc_vars = function(self, info_queue, card) + type_tooltip(self, info_queue, card) + return {vars = {card.ability.extra.Xmult_mod, card.ability.extra.Xmult}} + end, + designer = "Sonfive", + rarity = "poke_safari", + cost = 8, + enhancement_gate = 'm_glass', + stage = "One", + ptype = "Water", + gen = 9, + blueprint_compat = true, + perishable_compat = false, + calculate = function(self, card, context) + if context.remove_playing_cards and not context.blueprint then + local glass_cards = 0 + for _, removed_card in ipairs(context.removed) do + if removed_card.shattered then glass_cards = glass_cards + 1 end + end + if glass_cards > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + card.ability.extra.Xmult = card.ability.extra.Xmult + + card.ability.extra.Xmult_mod * glass_cards + return true + end + })) + SMODS.calculate_effect( + { + message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult + + card.ability.extra.Xmult_mod * glass_cards } } + }, card) + return true + end + })) + return nil, true -- This is for Joker retrigger purposes + end + end + if context.using_consumeable and not context.blueprint and context.consumeable.config.center.key == 'c_hanged_man' then + -- Glass Joker updates on Hanged Man and no other destroy consumable + local glass_cards = 0 + for _, removed_card in ipairs(G.hand.highlighted) do + if SMODS.has_enhancement(removed_card, 'm_glass') then glass_cards = glass_cards + 1 end + end + if glass_cards > 0 then + card.ability.extra.Xmult = card.ability.extra.Xmult + + card.ability.extra.Xmult_mod * glass_cards + return { + message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult } } + } + end + end + + if context.joker_main then + local count = 0 + local hail = false + for i=1, #G.hand.cards do + if SMODS.has_enhancement(G.hand.cards[i], 'm_glass') then + count = count + 1 + end + end + if count == #G.hand.cards then + hail = true + end + if hail then + return { xmult = (card.ability.extra.Xmult * 2) } + else + return { xmult = card.ability.extra.Xmult } + end + end + end, +} +-- Veluza 976 +-- Dondozo 977 +-- Tatsugiri 978 +-- Annihilape 979 +local annihilape={ + name = "annihilape", + pos = {x = 2, y = 6}, + config = {extra = {mult_mod = 5, chip_mod = 7}}, + loc_vars = function(self, info_queue, center) + type_tooltip(self, info_queue, center) + return {vars = {center.ability.extra.mult_mod, center.ability.extra.chip_mod, center.ability.extra.mult_mod * (1 + G.GAME.current_round.hands_played), + center.ability.extra.chip_mod * (1 + G.GAME.current_round.hands_played)}} + end, + rarity = "poke_safari", + cost = 11, + stage = "Two", + ptype = "Fighting", + atlas = "Pokedex9", + gen = 9, + blueprint_compat = true, + calculate = function(self, card, context) + if context.individual and context.cardarea == G.play and not context.other_card.debuff then + if context.other_card:get_id() == 2 or + context.other_card:get_id() == 3 or + context.other_card:get_id() == 5 or + context.other_card:get_id() == 7 then + return { + chips = card.ability.extra.chip_mod * (1 + G.GAME.current_round.hands_played), + mult = card.ability.extra.mult_mod * (1 + G.GAME.current_round.hands_played), + card = card + } + end + end + end, + attributes = {"chips", "mult", "rank", "two", "three", "five", "seven"}, +} +-- Clodsire 980 +-- Farigiraf 981 +local farigiraf={ + name = "farigiraf", + pos = {x = 4, y = 6}, + config = {extra = {Xmult_multi = 2.2, score = false}}, + loc_vars = function(self, info_queue, center) + type_tooltip(self, info_queue, center) + if pokermon_config.detailed_tooltips then + info_queue[#info_queue+1] = {set = 'Other', key = 'holding', vars = {"Cryptid"}} + info_queue[#info_queue+1] = { set = 'Spectral', key = 'c_cryptid', vars = {2}} + end + return {vars = {center.ability.extra.Xmult_multi}} + end, + rarity = "poke_safari", + cost = 8, + stage = "One", + ptype = "Psychic", + atlas = "Pokedex9", + gen = 9, + perishable_compat = true, + blueprint_compat = true, + eternal_compat = true, + calculate = function(self, card, context) + if context.cardarea == G.jokers and context.scoring_hand then + if context.before and next(context.poker_hands['Two Pair']) and not context.blueprint then + card.ability.extra.score = true + end + if context.after then + card.ability.extra.score = false + end + end + if context.individual and not context.end_of_round and context.cardarea == G.play and card.ability.extra.score then + local first_face = nil + local last_face = nil + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:is_face() then + first_face = context.scoring_hand[i]; + break + end + end + for i = #context.scoring_hand, 1, -1 do + if context.scoring_hand[i]:is_face() and context.scoring_hand[i] ~= first_face then + last_face = context.scoring_hand[i]; + break + end + end + if context.other_card == first_face or context.other_card == last_face then + return { + x_mult = card.ability.extra.Xmult_multi, + colour = G.C.RED, + card = card + } + end + end + end, + add_to_deck = function(self, card, from_debuff) + if not from_debuff then + if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + local _card = create_card('Spectral', G.consumeables, nil, nil, nil, nil, 'c_cryptid') + _card:add_to_deck() + G.consumeables:emplace(_card) + card_eval_status_text(_card, 'extra', nil, nil, nil, {message = localize('k_plus_spectral'), colour = G.C.SECONDARY_SET.Spectral}) + end + end + end, + attributes = {"holding", "face", "xmult", "hand_type"}, +} +-- Dudunsparce 982 +local dudunsparce={ + name = "dudunsparce", + pos = {x = 5, y = 6}, + config = {extra = {card_slots = 1, pack_slots = 1, voucher_slots = 1, form = 0}}, + loc_vars = function(self, info_queue, center) + type_tooltip(self, info_queue, center) + local alt_key = nil + if center.ability.extra.form == 1 then + alt_key = "j_poke_dudunsparce2" + if pokermon_config.detailed_tooltips then + info_queue[#info_queue+1] = {key = 'tag_coupon', set = 'Tag'} + info_queue[#info_queue+1] = {set = 'Other', key = 'holding', vars = {"Coupon Tag"}} + end + end + return {vars = {center.ability.extra.card_slots, center.ability.extra.pack_slots, center.ability.extra.voucher_slots}, key = alt_key} + end, + rarity = "poke_safari", + cost = 9, + stage = "One", + ptype = "Colorless", + atlas = "Pokedex9", + gen = 9, + perishable_compat = true, + blueprint_compat = false, + eternal_compat = true, + set_ability = function(self, card, initial, delay_sprites) + if initial then + if pseudorandom('dudunsparce') < (1/6) then + card.ability.extra.form = 1 + self:set_sprites(card) + end + end + end, + set_sprites = function(self, card, front) + if card.ability and card.ability.extra and card.ability.extra.form == 1 then + card.children.center:set_sprite_pos({x = 8, y = 3}) + else + card.children.center:set_sprite_pos({x = 6, y = 3}) + end + end, + add_to_deck = function(self, card, from_debuff) + change_shop_size(card.ability.extra.card_slots) + SMODS.change_booster_limit(card.ability.extra.pack_slots) + SMODS.change_voucher_limit(card.ability.extra.voucher_slots) + if card.ability.extra.form == 1 then + self:set_sprites(card) + if not from_debuff then + G.E_MANAGER:add_event(Event({ + func = (function() + add_tag(Tag('tag_coupon')) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('poke_wowthree')}) + end + end + end, + remove_from_deck = function(self, card, from_debuff) + change_shop_size(-card.ability.extra.card_slots) + SMODS.change_booster_limit(-card.ability.extra.card_slots) + SMODS.change_voucher_limit(-card.ability.extra.card_slots) + end, + attributes = {"passive"}, +} +-- Kingambit 983 +local kingambit={ + name = "kingambit", + pos = {x = 0, y = 0}, + config = {extra = {Xmult = 2,}}, + loc_vars = function(self, info_queue, center) + type_tooltip(self, info_queue, center) + return {vars = {center.ability.extra.Xmult, }} + end, + rarity = "poke_safari", + cost = 11, + gen = 9, + stage = "Two", + ptype = "Metal", + atlas = "Pokedex9", + perishable_compat = true, + blueprint_compat = true, + eternal_compat = true, + calculate = function(self, card, context) + if context.cardarea == G.jokers and context.scoring_hand then + if context.joker_main then + return { + message = localize{type = 'variable', key = 'a_xmult', vars = {card.ability.extra.Xmult}}, + colour = G.C.XMULT, + Xmult_mod = card.ability.extra.Xmult + } + end + end + if context.individual and not context.end_of_round and context.cardarea == G.play then + local king_count = 0 + for _, playing_card in ipairs(G.playing_cards) do + if playing_card:get_id() == 13 then king_count = king_count + 1 end + end + if king_count == 1 then + local has_king = nil + for k, v in pairs(context.full_hand) do + if v:get_id() == 13 then + has_king = true + break + end + end + if has_king and not context.other_card:is_face() then + local Xmult = card.ability.extra.Xmult/2 + if Xmult > 1 then + return { + x_mult = Xmult, + card = card + } + end + end + end + end + end, + attributes = {"xmult", "rank", "king", "face", "full_deck"}, +} +-- Great Tusk 984 +-- Scream Tail 985 +-- Brute Bonnet 986 +-- Flutter Mane 987 +-- Slither Wing 988 +-- Sandy Shocks 989 +-- Iron Treads 990 +return {name = "Pokemon Jokers 961-990", + list = {wugtrio, cetoddle, cetitan, annihilape, farigiraf, dudunsparce, kingambit}, +} From 8b93f3fad41504256e6244ca08d9fdad5c3318af Mon Sep 17 00:00:00 2001 From: SonfiveTV Date: Fri, 15 May 2026 23:22:22 +0100 Subject: [PATCH 2/5] re-added mega berry description --- localization/en-us.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/localization/en-us.lua b/localization/en-us.lua index fedf2832..0cda8842 100644 --- a/localization/en-us.lua +++ b/localization/en-us.lua @@ -516,6 +516,13 @@ return { "and earn {C:money}$#1#{}", }, }, + c_poke_berry_juice_mega = { + name = "Mega Berry Juice", + text = { + "{C:attention}Mega Evolves{} leftmost", + "or selected Joker", + }, + }, c_poke_berry_juice_mystery = { name = "Mystery Berry Juice", text = { From 3053260e714d2ca91e3daef5a090f3bb4ac06ec2 Mon Sep 17 00:00:00 2001 From: SonfiveTV Date: Sat, 16 May 2026 09:51:44 +0100 Subject: [PATCH 3/5] added family --- functions/pokefamily.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/functions/pokefamily.lua b/functions/pokefamily.lua index befe931d..cd878238 100644 --- a/functions/pokefamily.lua +++ b/functions/pokefamily.lua @@ -185,6 +185,7 @@ local default_family_list = { { "bramblin", "brambleghast" }, { "tinkatink", "tinkatuff", "tinkaton" }, { "wiglett", "wugtrio" }, + { "cetoddle", "cetitan" }, { "gimmighoul", "gholdengo", "gimmighoulr" }, { "ruins_of_alph" }, {{key = "imposter_professor", form = 0}, {key = "imposter_professor", form = 1}}, From 180afcb37c55ab535e9d307f748e2643b39ca75f Mon Sep 17 00:00:00 2001 From: SonfiveTV Date: Sun, 17 May 2026 11:15:44 +0100 Subject: [PATCH 4/5] Add files via upload --- functions/pokefunctions.lua | 67 ++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/functions/pokefunctions.lua b/functions/pokefunctions.lua index 68ed268c..19da9600 100644 --- a/functions/pokefunctions.lua +++ b/functions/pokefunctions.lua @@ -35,8 +35,73 @@ find_pokemon_type = function(target_type, exclude_card, exclude_name) return found end +quantum_type_check = function(card, target_type) + if not card then return false end + + local card_type = get_type(card) + local groups = {} + + -- collect all quantum groups + for _, joker in ipairs(G.jokers.cards) do + if joker:has_attribute("quantum_types") then + local targets = joker.ability.extra.targets or {} + local group = {} + + for _, t in ipairs(targets) do + group[t.type] = true + end + + table.insert(groups, group) + end + end + + -- merge overlapping groups + local changed = true + while changed do + changed = false + + for i = #groups, 1, -1 do + for j = i - 1, 1, -1 do + local overlap = false + + for k in pairs(groups[i]) do + if groups[j][k] then + overlap = true + break + end + end + + if overlap then + for k in pairs(groups[i]) do + groups[j][k] = true + end + + table.remove(groups, i) + changed = true + break + end + end + end + end + + -- check merged groups + for _, group in ipairs(groups) do + if group[target_type] + and group[card_type] + and target_type ~= card_type + then + return true + end + end + + return false +end + is_type = function(card, target_type) - return card and get_type(card) == target_type + return card and ( + get_type(card) == target_type + or quantum_type_check(card, target_type) + ) end get_type = function(card) From 53990c349062f646be53350d1bb9003b757c07ee Mon Sep 17 00:00:00 2001 From: SonfiveTV Date: Sun, 17 May 2026 11:24:17 +0100 Subject: [PATCH 5/5] committed to wrong branch Removed the quantum_type_check function and simplified is_type function. --- functions/pokefunctions.lua | 67 +------------------------------------ 1 file changed, 1 insertion(+), 66 deletions(-) diff --git a/functions/pokefunctions.lua b/functions/pokefunctions.lua index 19da9600..68ed268c 100644 --- a/functions/pokefunctions.lua +++ b/functions/pokefunctions.lua @@ -35,73 +35,8 @@ find_pokemon_type = function(target_type, exclude_card, exclude_name) return found end -quantum_type_check = function(card, target_type) - if not card then return false end - - local card_type = get_type(card) - local groups = {} - - -- collect all quantum groups - for _, joker in ipairs(G.jokers.cards) do - if joker:has_attribute("quantum_types") then - local targets = joker.ability.extra.targets or {} - local group = {} - - for _, t in ipairs(targets) do - group[t.type] = true - end - - table.insert(groups, group) - end - end - - -- merge overlapping groups - local changed = true - while changed do - changed = false - - for i = #groups, 1, -1 do - for j = i - 1, 1, -1 do - local overlap = false - - for k in pairs(groups[i]) do - if groups[j][k] then - overlap = true - break - end - end - - if overlap then - for k in pairs(groups[i]) do - groups[j][k] = true - end - - table.remove(groups, i) - changed = true - break - end - end - end - end - - -- check merged groups - for _, group in ipairs(groups) do - if group[target_type] - and group[card_type] - and target_type ~= card_type - then - return true - end - end - - return false -end - is_type = function(card, target_type) - return card and ( - get_type(card) == target_type - or quantum_type_check(card, target_type) - ) + return card and get_type(card) == target_type end get_type = function(card)