forked from OceanRamen/Brainstorm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBrainstorm_reroll.lua
More file actions
306 lines (282 loc) · 10.5 KB
/
Copy pathBrainstorm_reroll.lua
File metadata and controls
306 lines (282 loc) · 10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
local lovely = require("lovely")
local nativefs = require("nativefs")
Brainstorm.AUTOREROLL = {}
G.FUNCS.change_search_tag = function(x)
Brainstorm.SETTINGS.autoreroll.searchTagID = x.to_key
Brainstorm.SETTINGS.autoreroll.searchTag = Brainstorm.SearchTagList[x.to_val]
nativefs.write(lovely.mod_dir .. "/Brainstorm/settings.lua", STR_PACK(Brainstorm.SETTINGS))
end
G.FUNCS.change_search_pack = function(x)
Brainstorm.SETTINGS.autoreroll.searchPackID = x.to_key
Brainstorm.SETTINGS.autoreroll.searchPack = Brainstorm.SearchPackList[x.to_val]
nativefs.write(lovely.mod_dir .. "/Brainstorm/settings.lua", STR_PACK(Brainstorm.SETTINGS))
end
G.FUNCS.change_search_soul_count = function(x)
Brainstorm.SETTINGS.autoreroll.searchForSoul = x.to_val
nativefs.write(lovely.mod_dir .. "/Brainstorm/settings.lua", STR_PACK(Brainstorm.SETTINGS))
end
G.FUNCS.change_seeds_per_frame = function(x)
Brainstorm.SETTINGS.autoreroll.seedsPerFrameID = x.to_key
Brainstorm.SETTINGS.autoreroll.seedsPerFrame = Brainstorm.seedsPerFrame[x.to_val]
nativefs.write(lovely.mod_dir .. "/Brainstorm/settings.lua", STR_PACK(Brainstorm.SETTINGS))
end
Brainstorm.AUTOREROLL.autoRerollActive = false
Brainstorm.AUTOREROLL.rerollInterval = 0.01 -- Time interval between rerolls (in seconds)
Brainstorm.AUTOREROLL.rerollTimer = 0
function FastReroll()
G.GAME.viewed_back = nil
G.run_setup_seed = G.GAME.seeded
G.challenge_tab = G.GAME and G.GAME.challenge and G.GAME.challenge_tab or nil
G.forced_seed, G.setup_seed = nil, nil
if G.GAME.seeded then
G.forced_seed = G.GAME.pseudorandom.seed
end
local current_stake = G.GAME.stake
local _seed = G.run_setup_seed and G.setup_seed or G.forced_seed or nil
local _challenge = G.challenge_tab
if not G.challenge_tab then
_stake = current_stake or G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1
else
_stake = 1
end
G:delete_run()
G:start_run({ stake = _stake, seed = _seed, challenge = _challenge })
end
function Brainstorm.auto_reroll()
local rerollsThisFrame = 0
-- This part is meant to mimic how Balatro rerolls for Gold Stake
local extra_num = -0.561892350821
local seed_found = nil
while not seed_found and rerollsThisFrame < Brainstorm.SETTINGS.autoreroll.seedsPerFrame do
rerollsThisFrame = rerollsThisFrame + 1
extra_num = extra_num + 0.561892350821
seed_found = random_string(
8,
extra_num
+ G.CONTROLLER.cursor_hover.T.x * 0.33411983
+ G.CONTROLLER.cursor_hover.T.y * 0.874146
+ 0.412311010 * G.CONTROLLER.cursor_hover.time
)
Brainstorm.random_state = {
hashed_seed = pseudohash(seed_found),
}
if Brainstorm.SETTINGS.autoreroll.searchTag ~= "" then
_tag = pseudorandom_element(G.P_CENTER_POOLS["Tag"], Brainstorm.pseudoseed("Tag1" .. seed_found)).key
if _tag ~= Brainstorm.SETTINGS.autoreroll.searchTag then
seed_found = nil
end
end
if seed_found and Brainstorm.SETTINGS.autoreroll.searchForSoul then
-- Check if arcana pack from skip has The Soul
for i = 1, Brainstorm.SETTINGS.autoreroll.searchForSoul do
local soul_found = false
for i = 1, 5 do
if pseudorandom(Brainstorm.pseudoseed("soul_Tarot1" .. seed_found)) > 0.997 then
soul_found = true
end
end
if not soul_found then
seed_found = nil
break
end
end
end
if seed_found and Brainstorm.SETTINGS.autoreroll.searchPack and #Brainstorm.SETTINGS.autoreroll.searchPack > 0 then
local cume, it, center = 0, 0, nil
for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do
if (not _type or _type == v.kind) then cume = cume + (v.weight or 1 ) end
end
local poll = pseudorandom(Brainstorm.pseudoseed("shop_pack1"..seed_found))*cume
for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do
if not _type or _type == v.kind then it = it + (v.weight or 1) end
if it >= poll and it - (v.weight or 1) <= poll then center = v
break end
end
local pack_found = false
for i = 1, #Brainstorm.SETTINGS.autoreroll.searchPack do
if Brainstorm.SETTINGS.autoreroll.searchPack[i] == center.key then
pack_found = true
break
end
end
if not pack_found then
seed_found = nil
end
end
--[[
Relevant vanilla pack code
local cume, it, center = 0, 0, nil
for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do
if (not _type or _type == v.kind) and not G.GAME.banned_keys[v.key] then cume = cume + (v.weight or 1 ) end
end
local poll = pseudorandom(pseudoseed((_key or 'pack_generic')..G.GAME.round_resets.ante))*cume
for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do
if not G.GAME.banned_keys[v.key] then
if not _type or _type == v.kind then it = it + (v.weight or 1) end
if it >= poll and it - (v.weight or 1) <= poll then center = v; break end
end
end
return center
]]
end
if seed_found then
_stake = G.GAME.stake
G:delete_run()
G:start_run({
stake = _stake,
seed = seed_found,
challenge = G.GAME and G.GAME.challenge and G.GAME.challenge_tab,
})
G.GAME.seeded = false
end
return seed_found
end
function Brainstorm.searchParametersMet()
--note: this appears to be deprecated, so I didn't update it
if not G or not G.GAME or not G.GAME.round_resets or not G.GAME.round_resets.blind_tags then
print("One or more variables are nil or undefined")
return false
end
local _tag = G.GAME.round_resets.blind_tags.Small
if not _tag then
print("Value of _tag is nil or undefined")
return false
end
if _tag == Brainstorm.SETTINGS.autoreroll.searchTag then
if Brainstorm.SETTINGS.autoreroll.searchForSoul then
return true
end
-- Check if arcana pack from skip has The Soul
Brainstorm.random_state = copy_table(G.GAME.pseudorandom)
for i = 1, 5 do
if pseudorandom(Brainstorm.pseudoseed("soul_Tarot1")) > 0.997 then
return true
end
end
return false
else
return false
end
end
function wait(seconds)
local start = os.clock()
while os.clock() - start < seconds do
-- Busy wait
end
end
function Brainstorm.pseudoseed(key, predict_seed)
if key == "seed" then
return math.random()
end
if predict_seed then
local _pseed = pseudohash(key .. (predict_seed or ""))
_pseed = math.abs(tonumber(string.format("%.13f", (2.134453429141 + _pseed * 1.72431234) % 1)))
return (_pseed + (pseudohash(predict_seed) or 0)) / 2
end
if not Brainstorm.random_state[key] then
Brainstorm.random_state[key] = pseudohash(key .. (Brainstorm.random_state.seed or ""))
end
Brainstorm.random_state[key] =
math.abs(tonumber(string.format("%.13f", (2.134453429141 + Brainstorm.random_state[key] * 1.72431234) % 1)))
return (Brainstorm.random_state[key] + (Brainstorm.random_state.hashed_seed or 0)) / 2
end
--Used for reroll UI
--Based on Balatro's attention_text
function Brainstorm.attention_text(args)
args = args or {}
args.text = args.text or 'test'
args.scale = args.scale or 1
args.colour = copy_table(args.colour or G.C.WHITE)
args.hold = (args.hold or 0) + 0.1*(G.SPEEDFACTOR)
args.pos = args.pos or {x = 0, y = 0}
args.align = args.align or 'cm'
args.emboss = args.emboss or nil
args.fade = 1
if args.cover then
args.cover_colour = copy_table(args.cover_colour or G.C.RED)
args.cover_colour_l = copy_table(lighten(args.cover_colour, 0.2))
args.cover_colour_d = copy_table(darken(args.cover_colour, 0.2))
else
args.cover_colour = copy_table(G.C.CLEAR)
end
args.uibox_config = {
align = args.align or 'cm',
offset = args.offset or {x=0,y=0},
major = args.cover or args.major or nil,
}
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0,
blockable = false,
blocking = false,
func = function()
args.AT = UIBox{
T = {args.pos.x,args.pos.y,0,0},
definition =
{n=G.UIT.ROOT, config = {align = args.cover_align or 'cm', minw = (args.cover and args.cover.T.w or 0.001) + (args.cover_padding or 0), minh = (args.cover and args.cover.T.h or 0.001) + (args.cover_padding or 0), padding = 0.03, r = 0.1, emboss = args.emboss, colour = args.cover_colour}, nodes={
{n=G.UIT.O, config={draw_layer = 1, object = DynaText({scale = args.scale, string = args.text, maxw = args.maxw, colours = {args.colour},float = true, shadow = true, silent = not args.noisy, args.scale, pop_in = 0, pop_in_rate = 6, rotate = args.rotate or nil})}},
}},
config = args.uibox_config
}
args.AT.attention_text = true
args.text = args.AT.UIRoot.children[1].config.object
args.text:pulse(0.5)
if args.cover then
Particles(args.pos.x,args.pos.y, 0,0, {
timer_type = 'TOTAL',
timer = 0.01,
pulse_max = 15,
max = 0,
scale = 0.3,
vel_variation = 0.2,
padding = 0.1,
fill=true,
lifespan = 0.5,
speed = 2.5,
attach = args.AT.UIRoot,
colours = {args.cover_colour, args.cover_colour_l, args.cover_colour_d},
})
end
if args.backdrop_colour then
args.backdrop_colour = copy_table(args.backdrop_colour)
Particles(args.pos.x,args.pos.y,0,0,{
timer_type = 'TOTAL',
timer = 5,
scale = 2.4*(args.backdrop_scale or 1),
lifespan = 5,
speed = 0,
attach = args.AT,
colours = {args.backdrop_colour}
})
end
return true
end
}))
return args
end
function Brainstorm.remove_attention_text(args)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0,
blockable = false,
blocking = false,
func = function()
if not args.start_time then
args.start_time = G.TIMERS.TOTAL
args.text:pop_out(3)
else
--args.AT:align_to_attach()
args.fade = math.max(0, 1 - 3*(G.TIMERS.TOTAL - args.start_time))
if args.cover_colour then args.cover_colour[4] = math.min(args.cover_colour[4], 2*args.fade) end
if args.cover_colour_l then args.cover_colour_l[4] = math.min(args.cover_colour_l[4], args.fade) end
if args.cover_colour_d then args.cover_colour_d[4] = math.min(args.cover_colour_d[4], args.fade) end
if args.backdrop_colour then args.backdrop_colour[4] = math.min(args.backdrop_colour[4], args.fade) end
args.colour[4] = math.min(args.colour[4], args.fade)
if args.fade <= 0 then
args.AT:remove()
return true
end
end
end
}))
end