Jane/src/misprintize.lua

311 lines
10 KiB
Lua

-- The following code is slightly adapted from
-- https://github.com/MathIsFun0/Cryptid/blob/main/lib/misprintize.lua
local base_values = {}
local big_num_allowlist = {
j_egg = true,
j_wee = true,
j_flash = true,
j_ramen = true,
j_glass = true,
j_caino = true,
j_cry_m = true,
j_runner = true,
j_square = true,
j_castle = true,
j_yorick = true,
j_madness = true,
j_vampire = true,
j_obelisk = true,
j_popcorn = true,
j_red_card = true,
j_hologram = true,
j_trousers = true,
j_campfire = true,
j_cry_whip = true,
j_ice_cream = true,
j_lucky_cat = true,
j_throwback = true,
j_cry_hugem = true,
j_cry_pickle = true,
j_cry_cursor = true,
j_cry_primus = true,
j_cry_mprime = true,
j_green_joker = true,
j_turtle_bean = true,
j_cry_wee_fib = true,
j_cry_jimball = true,
j_ride_the_bus = true,
j_hit_the_road = true,
j_cry_dropshot = true,
j_cry_fspinner = true,
j_cry_mondrian = true,
j_constellation = true,
j_cry_crustulum = true,
j_cry_spaceglobe = true,
j_cry_exponentia = true,
j_cry_chili_pepper = true,
j_cry_eternalflame = true,
j_cry_stella_mortis = true,
j_cry_krustytheclown = true,
j_cry_antennastoheaven = true,
}
local function check(v, is_big)
if is_big then
if not v or type(v) == "number" and (v ~= v or v > 1e300 or v < -1e300) then
v = 1e300
end
if type(v) == "table" then
return v
end
if v > 1e100 or v < -1e100 then
return to_big(v)
end
end
return not v or type(v) == "number" and (v ~= v or v > 1e300 or v < -1e300) and 1e300 or v
end
local function deep_copy(obj, seen)
if type(obj) ~= "table" then
return obj
end
if seen and seen[obj] then
return seen[obj]
end
local s = seen or {}
local res = setmetatable({}, getmetatable(obj))
s[obj] = res
for k, v in pairs(obj) do
res[deep_copy(k, s)] = deep_copy(v, s)
end
return res
end
local function format(number, str)
return math.abs(to_big(number)) >= to_big(1e300) and number
or tonumber(str:format((Big and to_number(to_big(number)) or number)))
end
local function is_card_big(joker)
local center = joker.config and joker.config.center
if not center then
return false
end
return big_num_allowlist[center.key or "Nope!"]
end
local function log_random(seed, min, max)
math.randomseed(seed)
local lmin = math.log(min, 2.718281828459045)
local lmax = math.log(max, 2.718281828459045)
local poll = math.random() * (lmax - lmin) + lmin
return math.exp(poll)
end
function Jane.misprintize_val(val, override, big)
return is_number(val) and check(
format(
val * log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
),
big
) or val
end
function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big)
if name and ref_tbl and ref_value then
local tbl = deep_copy(ref_tbl[ref_value])
for k, v in pairs(tbl) do
if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then
if is_number(tbl[k]) and not
(k == "id") and not
(k == "colour") and not
(k == "suit_nominal") and not
(k == "base_nominal") and not
(k == "face_nominal") and not
(k == "qty") and not
(k == "x_mult" and v == 1 and not tbl.override_x_mult_check) and not
(k == "selected_d6_face") then
if not base_values[name] then
base_values[name] = {}
end
if not base_values[name][k] then
base_values[name][k] = tbl[k]
end
tbl[k] = check(
clear and base_values[name][k]
or format(
(stack and tbl[k] or base_values[name][k])
* log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
),
big
)
end
else
for _k, _ in pairs(tbl[k]) do
if is_number(tbl[k][_k]) and not
(_k == "id") and not
(k == "perish_tally") and not
(k == "colour") and not
(_k == "suit_nominal") and not
(_k == "base_nominal") and not
(_k == "face_nominal") and not
(_k == "qty") and not
(k == "x_mult" and v == 1 and not tbl[k].override_x_mult_check) and not
(_k == "selected_d6_face") then
if not base_values[name] then
base_values[name] = {}
end
if not base_values[name][k] then
base_values[name][k] = {}
end
if not base_values[name][k][_k] then
base_values[name][k][_k] = tbl[k][_k]
end
tbl[k][_k] = check(
clear and base_values[name][k][_k]
or format(
(stack and tbl[k][_k] or base_values[name][k][_k]) *
log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
),
big
)
end
end
end
end
ref_tbl[ref_value] = tbl
end
end
function Jane.misprintize(card, override, force_reset, stack)
local function no(self, m, no_no)
if no_no then
if self.infinifusion then
for i = 1, #self.infinifusion do
if G.P_CENTERS[self.infinifusion[i].key][m] or
(G.GAME and G.GAME[m] and G.GAME[m][self.infinifusion[i].key]) then
return true
end
end
return false
end
if not self.config then
return G.P_CENTERS[self.key][m] or (G.GAME and G.GAME[m] and G.GAME[m][self.key])
end
return self.config.center[m] or (G.GAME and G.GAME[m] and G.GAME[m][self.config.center_key]) or false
end
return no(self, "no_" .. m, true)
end
if no(card, "immutable", true) then
force_reset = true
end
if card.infinifusion then
if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then
---@diagnostic disable-next-line: undefined-global
calculate_infinifusion(card, nil, function(i)
Jane.misprintize(card, override, force_reset, stack)
end)
end
end
if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not
stack or not
no(card, "immutable", true) then
if card.ability.name == "Ace Aequilibrium" then
return
end
if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then
if not override then
override = {}
end
override.min = override.min or G.GAME.modifiers.cry_misprint_min or 1
override.max = override.max or G.GAME.modifiers.cry_misprint_max or 1
override.min = override.min * G.GAME.modifiers.cry_jkr_misprint_mod
override.max = override.max * G.GAME.modifiers.cry_jkr_misprint_mod
end
if G.GAME.modifiers.cry_misprint_min or override and override.min then
Jane.misprintize_tbl(
card.config.center_key,
card,
"ability",
nil,
override,
stack,
is_card_big(card)
)
if card.base then
Jane.misprintize_tbl(
card.config.card_key,
card,
"base",
nil,
override,
stack,
is_card_big(card)
)
end
end
if G.GAME.modifiers.cry_misprint_min then
card.misprint_cost_fac = 1 /
log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
)
card:set_cost()
end
else
Jane.misprintize_tbl(card.config.center_key, card, "ability", true, nil, nil, is_card_big(card))
end
if card.ability.consumeable then
for k, _ in pairs(card.ability.consumeable) do
card.ability.consumeable[k] = deep_copy(card.ability[k])
end
end
end