-
Notifications
You must be signed in to change notification settings - Fork 2
Description
Oops! The game crashed:
Error validating vertex shader code:
Line 76: ERROR: 'uniform' : cannot initialize this type of qualifier
ERROR: 1 compilation errors. No code generated.
Additional Context:
Balatro Version: 1.0.1o-FULL
Modded Version: 1.0.0~BETA-1224a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.8.0
Platform: Android
Steamodded Mods:
1: iOS adaptation by Xioxin [ID: IOSAdaptation]
2: UltraHand by Xioxin [ID: UltraHand]
3: Balatro: Blindside by LunaAstraCassiopeia, AnneBean, base4 [ID: Blindside, Priority: -100, Version: 0.1.2-BETA]
Lovely Mods:
Stack Traceback
(3) field C function 'newShader'
(4) Lua method 'inject' at Steamodded file 'src/game_object.lua:3269'
Local variables:
self = table: 0x7970bf3428 {original_key:finish, path:finish.fs, full_path:Mods/Blindside-main/assets/shaders/finish.fs, prefix_config:table: 0x7970cd1458, atlas:Shader (more...)}
file = string: "#if defined(VERTEX) || VERSION > 100 || defined(GL_FRAGMENT_PRECISION_HIGH)
#define PRECISION highp
#else
#define PRECISION mediump
#endif
// THANK YOU UNIK'S MOD
// !! change this variable name to your Shader's name
// YOU MUST USE THIS VARIABLE IN THE vec4 effect AT LEAST ONCE
// Values of this variable:
// self.ARGS.send_to_shader[1] = math.min(self.VT.r3, 1) + (math.sin(G.TIMERS.REAL/28) + 1) + (self.juice and self.juice.r20 or 0) + self.tilt_var.amt
// self.ARGS.send_to_shader[2] = G.TIMERS.REAL
extern PRECISION vec2 finish;
extern PRECISION number dissolve;
extern PRECISION number time;
// [Note] sprite_pos_x _y is not a pixel position!
// To get pixel position, you need to multiply
// it by sprite_width _height (look flipped.fs)
// (sprite_pos_x, sprite_pos_y, sprite_width, sprite_height) [not normalized]
extern PRECISION vec4 texture_details;
// (width, height) for atlas texture [not normalized]
extern PRECISION vec2 image_details;
extern bool shadow;
extern PRECISION vec4 burn_colour_1;
extern PRECISION vec4 burn_colour_2;
extern PRECISION float lines_offset;
// [Required]
// Apply dissolve effect (when card is being "burnt", e.g. when consumable is used)
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv);
number hue(number s, number t, number h)
{
\9number hs = mod(h, 1.)6.;
\9if (hs < 1.) return (t-s) * hs + s;
\9if (hs < 3.) return t;
\9if (hs < 4.) return (t-s) * (4.-hs) + s;
\9return s;
}
vec4 RGB(vec4 c)
{
\9if (c.y < 0.0001)
\9\9return vec4(vec3(c.z), c.a);
\9number t = (c.z < .5) ? c.yc.z + c.z : -c.yc.z + (c.y+c.z);
\9number s = 2.0 * c.z - t;
\9return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w);
}
vec4 HSL(vec4 c)
{
\9number low = min(c.r, min(c.g, c.b));
\9number high = max(c.r, max(c.g, c.b));
\9number delta = high - low;
\9number sum = high+low;
\9vec4 hsl = vec4(.0, .0, .5 * sum, c.a);
\9if (delta == .0)
\9\9return hsl;
\9hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum);
\9if (high == c.r)
\9\9hsl.x = (c.g - c.b) / delta;
\9else if (high == c.g)
\9\9hsl.x = (c.b - c.r) / delta + 2.0;
\9else
\9\9hsl.x = (c.r - c.g) / delta + 4.0;
\9hsl.x = mod(hsl.x / 6., 1.);
\9return hsl;
}
extern PRECISION mat3 YIQ_CONVERT = mat3(
0.299, 0.596, 0.211,
0.587, -0.274, -0.523,
0.114, -0.322, 0.312
);
extern PRECISION mat3 RGB_CONVERT = mat3(
1.0, 1.0, 1.0,
0.956, -0.272, -1.106,
0.621, -0.647, 1.703
);
//https://agatedragon.blog/2024/04/02/hue-shift-shader/\
vec3 ToYIQ(vec3 colour)
{
return YIQ_CONVERT * colour;
}
vec3 ToRGB(vec3 colour)
{
return RGB_CONVERT * colour;
}
vec3 HueShift(vec3 colour,float shift)
{
//to pi
vec3 yiq = ToYIQ(colour);
mat2 rotMatrix = mat2(
cos(shift), -sin(shift),
sin(shift), cos(shift)
);
yiq.yz = rotMatrix;
return ToRGB(yiq);
}
#define TWO_PI 6.28318530718
vec4 finish_color = vec4(225., 238., 255., 255.)/ 255.;
bool line(vec2 uv, float offset, float width) {
uv.x = uv.x * texture_details.z / texture_details.w;
offset = offset + 0.35 * sin(finish.x + TWO_PI * lines_offset);
width = width + 0.005 * sin(finish.x);
float min_y = -uv.x + offset;
float max_y = -uv.x + offset + width;
return uv.y > min_y && uv.y < max_y;
}
// This is what actually changes the look of card
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{
// Take pixel color (rgba) from texture at texture_coords, equivalent of texture2D in GLSL
vec4 img = Texel(texture, texture_coords);
vec3 img2 = img.rgb;
float ogtrans = img.a;
// Position of a pixel within the sprite
\9vec2 uv = (((texture_coords)(image_details)) - texture_details.xytexture_details.ba)/texture_details.ba;
vec4 tex = Texel( texture, texture_coords);
//Pixel basis, hopefully independent of card size
float shiftExact = 1.5;
float sprite_width = texture_details.z / image_details.x; // Normalized width
float sprite_height = texture_details.w / image_details.y; // Normalized height
float min_x = texture_details.x * sprite_width; // min X
float max_x = (texture_details.x + 1.) * sprite_width; // max X
float min_y = texture_details.y * sprite_height; // min Y
float max_y = (texture_details.y + 1.) * sprite_height; // max Y
float shiftX = 4. / image_details.x; // shift X so normalize by X
float shiftY = 4. / image_details.y; // shift Y so normalize by Y
float shiftX2 = 0.5 / image_details.x; // shift X so normalize by X
float shiftY2 = 0.5 / image_details.y; // shift Y so normalize by Y
float newX = min(max_x, max(min_x, texture_coords.x + shiftX));
float newY = min(max_y, max(min_y, texture_coords.y + shiftY));
float newX2 = min(max_x, max(min_x, texture_coords.x - shiftX));
float newY2 = min(max_y, max(min_y, texture_coords.y - shiftY));
float newX3 = min(max_x, max(min_x, texture_coords.x + shiftX2));
float newY3 = min(max_y, max(min_y, texture_coords.y + shiftY2));
float newX4 = min(max_x, max(min_x, texture_coords.x - shiftX2));
float newY4 = min(max_y, max(min_y, texture_coords.y - shiftY2));
//Emboss texture to make it actually look convincingly like a steel card instead of a simple bezeled greyscale
float avg = (img.r + img.g + img.b) / 3.;
vec3 a = Texel(texture,vec2(newX3,newY3)).rgb;
vec3 b = Texel(texture,vec2(newX4,newY4)).rgb;
float avgA = (a.r + a.g + a.b) / 3.;
float avgB = (b.r + b.g + b.b) / 3.;
float differenceX = (avgA - avgB) * 3.5;
float lighting = differenceX * 0.2 + 0.8;
float borderFactor = 0.0;
if (
(Texel(texture,vec2(newX,newY)).a <= 0.2 )
){
tex = tex - 0.25;
borderFactor = borderFactor + 0.17;
tex.b = tex.b + 0.06;
tex.r = tex.r - 0.03;
lighting = 0.8;
}
if (
(Texel(texture,vec2(newX2,newY2)).a <= 0.2 )
){
tex = tex + 0.1;
tex.b = tex.b + 0.01;
lighting = 0.8;
}
if (
lines_offset > 0. && (line(uv, 0.0, 0.07) || line(uv, 0.4, 0.1) || line(uv, 0.55, 0.1) || line(uv, 1.3, 0.05) || line(uv, 1.8, 0.1)) ||
lines_offset <= 0. && (line(uv, -0.2, 0.13) || line(uv, 0.3, 0.05) || line(uv, 0.8, 0.1) || line(uv, 1.3, 0.11) || line(uv, 1.7, 0.07))
) {
tex = tex + 0.03;
tex.b = tex.b + 0.01;
} else if (
lines_offset > 0.02 && (line(uv, 0.0, 0.04) || line(uv, 0.4, 0.1) || line(uv, 0.55, 0.1) || line(uv, 1.3, 0.05) || line(uv, 1.8, 0.1)) ||
lines_offset <= 0.01 && (line(uv, -0.15, 0.25) || line(uv, 0.5, 0.4) || line(uv, 0.5, 0.05) || line(uv, 1.1, 0.001) || line(uv, 1.2, 0.9))
) {
tex = tex + 0.02;
tex.b = tex.b + 0.01;
}
else {
tex = tex - 0.025;
tex.b = tex.b + 0.01;
}
img = vec4(0.3tex.rgb * vec3(lighting) + 0.06 + tex.rgb - borderFactor, ogtrans);
\9return dissolve_mask(img, texture_coords, uv);
}
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
if (dissolve < 0.001) {
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a0.3: tex.a);
}
float adjusted_dissolve = (dissolvedissolve(3.-2.dissolve))1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values
\9float t = time * 10.0 + 2003.;
\9vec2 floored_uv = (floor((uvtexture_details.ba)))/max(texture_details.b, texture_details.a);
vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a);
\9
\9vec2 field_part1 = uv_scaled_centered + 50.vec2(sin(-t / 143.6340), cos(-t / 99.4324));
\9vec2 field_part2 = uv_scaled_centered + 50.vec2(cos( t / 53.1532), cos( t / 61.4532));
\9vec2 field_part3 = uv_scaled_centered + 50.vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
vec2 borders = vec2(0.2, 0.8);
float res = (.5 + .5 cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) 3.14))
- (floored_uv.x > borders.y ? (floored_uv.x - borders.y)(5. + 5.dissolve) : 0.)(dissolve)
- (floored_uv.y > borders.y ? (floored_uv.y - borders.y)(5. + 5.dissolve) : 0.)(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)(5. + 5.dissolve) : 0.)(dissolve)
- (floored_uv.y < borders.x ? (borders.x - floored_uv.y)(5. + 5.dissolve) : 0.)(dissolve);
if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
tex.rgba = burn_colour_1.rgba;
} else if (burn_colour_2.a > 0.01) {
tex.rgba = burn_colour_2.rgba;
}
}
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a0.3: tex.a) : .0);
}
// for transforming the card while your mouse is on it
extern PRECISION vec2 mouse_screen_pos;
extern PRECISION float hovering;
extern PRECISION float screen_scale;
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
if (hovering <= 0.){
return transform_projection * vertex_position;
}
float mid_dist = length(vertex_position.xy - 0.5love_ScreenSize.xy)/length(love_ScreenSize.xy);
vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
hovering(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0,0,0,scale);
}
#endif
"
lovely_success = boolean: true
lovely = table: 0x79812d9f98 {mod_dir:/data/data/systems.shorty.lmm.balatro/files/save/ASET/Mods, version:0.8.0, repo:https://github.com/ethangreen-dev/lovely-injector}
(*temporary) = table: 0x79712a97e0 {vortex:Shader: 0x78f257c8c0, booster:Shader: 0x797a359400, bld_enamel:Shader: 0x797a354380, flash:Shader: 0x797a359b00, CRT:Shader: 0x797a359080 (more...)}
(*temporary) = string: "bld_finish"
(5) Lua method 'inject_class' at Steamodded file 'src/game_object.lua:183'
Local variables:
self = table: 0x78e92a0c50 {__call:function: 0x78e9407cc0, obj_buffer:table: 0x78e92a0bd8, process_loc_text:function: 0x78e92a0c20, set:Shader, subclasses:table: 0x78e92a0c98 (more...)}
inject_time = number: 3.693e-06
start_time = number: 6.37713
end_time = number: 6.37713
o = table: 0x7970bf3428 {original_key:finish, path:finish.fs, full_path:Mods/Blindside-main/assets/shaders/finish.fs, prefix_config:table: 0x7970cd1458, atlas:Shader (more...)}
(for generator) = C function: builtin#6
(for state) = table: 0x78e92a0bd8 {1:bld_enamel, 2:bld_finish, 3:bld_mint, 4:bld_shiny}
(for control) = number: 2
i = number: 2
key = string: "bld_finish"
(6) Lua field 'injectObjects' at Steamodded file 'src/game_object.lua:257'
Local variables:
class = table: 0x78e92a0c50 {__call:function: 0x78e9407cc0, obj_buffer:table: 0x78e92a0bd8, process_loc_text:function: 0x78e92a0c20, set:Shader, subclasses:table: 0x78e92a0c98 (more...)}
(7) Lua field 'injectObjects' at Steamodded file 'src/game_object.lua:259'
Local variables:
class = table: 0x78e93286a8 {register:function: 0x78e9406318, __call:function: 0x78e9407cc0, process_loc_text:function: 0x78e93de858, obj_list:function: 0x78e94002c8, check_dependencies:function: 0x78e9408010 (more...)}
(for generator) = C function: builtin#6
(for state) = table: 0x78e9328758 {1:table: 0x78e93288c0, 2:table: 0x78e9328ff8, 3:table: 0x78e93293c8, 4:table: 0x78e9329780, 5:table: 0x78e9329cf0, 6:table: 0x78e932aa80, 7:table: 0x78e92cb230 (more...)}
(for control) = number: 24
_ = number: 24
subclass = table: 0x78e92a0c50 {__call:function: 0x78e9407cc0, obj_buffer:table: 0x78e92a0bd8, process_loc_text:function: 0x78e92a0c20, set:Shader, subclasses:table: 0x78e92a0c98 (more...)}
(8) Lua field 'injectItems' at Steamodded file 'src/loader.lua:608'
(9) Lua global 'initSteamodded' at Steamodded file 'src/loader.lua:661'
(10) Lua method 'start_up' at file 'game.lua:216'
Local variables:
self = table: 0x7979a33270 {X_CHEAT_SETTINGS:table: 0x7970d3f9a8, blindside_joker_undiscovered:table: 0x78f300ece0, MIN_CLICK_DIST:0.9, F_SOUND_THREAD:true, STAGE_OBJECTS:table: 0x7973d40ff0 (more...)}
settings = string: "return {["run_stake_stickers"]=false,["tutorial_complete"]=true,["play_button_pos"]=2,["COMP"]={["prev_name"]="",["score"]=1.7549454148922e+100,["name"]="",},["colour_palettes"]={["Hearts"]="lc",["fur_stars"]="lc",["Spades"]="lc",["Diamonds"]="lc",["Clubs"]="lc",},["QUEUED_CHANGE"]={},["language"]="en-us",["colourblind_option"]=false,["ACHIEVEMENTS_EARNED"]={["royale"]=true,["ante_up"]=true,["_10k"]=true,["_1000k"]=true,["_100000k"]=true,["tiny_hands"]=true,["legendary"]=true,["cartomancy"]=true,["card_discarder"]=true,["ante_upper"]=true,["heads_up"]=true,["ach_fur_teamwipe"]=true,["ach_fur_welcometothefandom"]=true,["ach_fur_fursuitmoney"]=true,["low_stakes"]=true,["mid_stakes"]=true,["ach_fur_imouttahere"]=true,["ach_fur_youaregae"]=true,["ach_fur_teamwipeplus"]=true,["nest_egg"]=true,},["GAMESPEED"]=8,["music_control"]={["current_track"]="",["lerp"]=1,["desired_track"]="",},["SOUND"]={["volume"]=50,["game_sounds_volume"]=42.350287441774,["music_volume"]=100,},["WINDOW"]={["vsync"]=0,["selected_display"]=1,["display_names"]={[1]="1",},["DISPLAYS"]={[1]={["screen_res"]={["w"]=1006,["h"]=452,},["MONITOR_DIMS"]={["height"]=1080,["width"]=2340,},["screen_resolutions"]={["values"]={[1]={["w"]=2340,["h"]=1080,},},["strings"]={[1]="2340 X 1080",},},["DPI_scale"]=1,},},["screenmode"]="Borderless",},["tutorial_progress"]={["section"]="big_blind",["completed_parts"]={["first_hand_section"]=true,["first_hand"]=true,["first_hand_2"]=true,["small_blind"]=true,["shop_1"]=true,["big_blind"]=true,["first_hand_3"]=true,["first_hand_4"]=true,},["hold_parts"]={},},["profile"]=1,["current_setup"]="New Run",["version"]="1.0.1o-FULL",["paused"]=false,["CUSTOM_DECK"]={["Collabs"]={["Hearts"]="default_Hearts",["fur_stars"]="fur_star_skin",["Spades"]="default_Spades",["Diamonds"]="default_Diamonds",["Clubs"]="default_Clubs",},},["DEMO"]={["timed_CTA_shown"]=true,["win_CTA_shown"]=true,["quit_CTA_shown"]=true,["total_uptime"]=14.400448614877,},["crashreports"]=false,["ambient_control"]={["ambientOrgan1"]={["vol"]=0,["per"]=0.7,},["ambientFire2"]={["vol"]=0,["per"]=1.05,},["ambientFire3"]={["vol"]=0,["per"]=1,},["ambientFire1"]={["vol"]=0,["per"]=1.1,},},["GRAPHICS"]={["texture_scaling"]=2,["crt"]=70,["shadows"]="On",["bloom"]=1,},["screenshake"]=50,}"
settings_ver = nil
new_colour_proto = table: 0x7979a58a10 {bld_Red:table: 0x79709c4e20, bld_Yellow:table: 0x796dcf5bf0, Clubs:table: 0x7979a58e10, bld_Purple:table: 0x797411df60, Spades:table: 0x7979a58d48 (more...)}
sound_files = table: 0x7979a65108 {1:ambientFire1.ogg, 2:ambientFire2.ogg, 3:ambientFire3.ogg, 4:ambientOrgan1.ogg, 5:button.ogg, 6:cancel.ogg, 7:card1.ogg, 8:card3.ogg, 9:cardFan2.ogg (more...)}
shader_files = table: 0x79712a9c60 {1:CRT.fs, 2:background.fs, 3:booster.fs, 4:debuff.fs, 5:dissolve.fs, 6:flame.fs, 7:flash.fs, 8:foil.fs, 9:gold_seal.fs, 10:holo.fs, 11:hologram.fs (more...)}
(11) Lua field 'load' at file 'main.lua:960'
(12) Lua function '?' at file 'main.lua:907' (best guess)
(13) global C function 'xpcall'
(14) LÖVE function at file 'boot.lua:368' (best guess)
Local variables:
result = boolean: true
main = nil
(15) global C function 'xpcall'
(16) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])