├── .gitignore ├── .gitattributes ├── .github └── mp4 │ ├── ss.png │ └── source.mp4 ├── assets ├── fonts │ ├── m6x11.ttf │ ├── m6x11plus.ttf │ ├── m6x11.ttf.import │ └── m6x11plus.ttf.import └── images │ ├── red-btn.png │ ├── blue-btn.png │ ├── red-btn.png.import │ └── blue-btn.png.import ├── README.md ├── project.godot ├── color-distort.gdshader ├── icon.svg ├── icon.svg.import ├── control.gdshader ├── fish-eyes.gdshader ├── fire-number.gdshader ├── anti-aliasing.gdshader ├── background.gdshader └── node_2d.tscn /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | /android/ 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /.github/mp4/ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxidbr9/balatro-effect-recreate/HEAD/.github/mp4/ss.png -------------------------------------------------------------------------------- /.github/mp4/source.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxidbr9/balatro-effect-recreate/HEAD/.github/mp4/source.mp4 -------------------------------------------------------------------------------- /assets/fonts/m6x11.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxidbr9/balatro-effect-recreate/HEAD/assets/fonts/m6x11.ttf -------------------------------------------------------------------------------- /assets/images/red-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxidbr9/balatro-effect-recreate/HEAD/assets/images/red-btn.png -------------------------------------------------------------------------------- /assets/fonts/m6x11plus.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxidbr9/balatro-effect-recreate/HEAD/assets/fonts/m6x11plus.ttf -------------------------------------------------------------------------------- /assets/images/blue-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxidbr9/balatro-effect-recreate/HEAD/assets/images/blue-btn.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Balatro Effect Example 2 | 3 | I've been playing a lot of Balatro recently, so I tried to recreate some of the effects in the game. Here's a simple example recreating the Balatro effect. 4 | 5 | You can watch the example video below: 6 | 7 | [![Balatro Effect](./.github/mp4/ss.png)](./.github/mp4/source.mp4) 8 | 9 | BUY BALATRO NOW: [playbalatro.com](https://playbalatro.com) 10 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="balatro recreate" 14 | run/main_scene="res://node_2d.tscn" 15 | config/features=PackedStringArray("4.3", "Mobile") 16 | config/icon="res://icon.svg" 17 | 18 | [rendering] 19 | 20 | renderer/rendering_method="mobile" 21 | -------------------------------------------------------------------------------- /color-distort.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform vec2 screen_resolution = vec2(480, 270); 4 | uniform float distortion_size : hint_range(0.0, 10.0) = 1.0; // Controls the size of the distortion 5 | 6 | uniform sampler2D screen_texture : hint_screen_texture, filter_nearest; 7 | 8 | void fragment() { 9 | // Calculate distortion offset based on screen resolution and size parameter 10 | float offset = distortion_size / screen_resolution.x; 11 | 12 | // Sample each color channel with different UV offsets 13 | vec2 uv = SCREEN_UV; 14 | float red = texture(screen_texture, uv - vec2(offset, 0.0)).r; 15 | float green = texture(screen_texture, uv + vec2(offset, 0.0)).g; 16 | float blue = texture(screen_texture, uv).b; 17 | 18 | // Combine distorted channels 19 | COLOR = vec4(red, green, blue, 1.0); 20 | } 21 | -------------------------------------------------------------------------------- /assets/fonts/m6x11.ttf.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="font_data_dynamic" 4 | type="FontFile" 5 | uid="uid://cgn2tcjqivlg7" 6 | path="res://.godot/imported/m6x11.ttf-879581dc489af7f9f23c5079607a2e0f.fontdata" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/fonts/m6x11.ttf" 11 | dest_files=["res://.godot/imported/m6x11.ttf-879581dc489af7f9f23c5079607a2e0f.fontdata"] 12 | 13 | [params] 14 | 15 | Rendering=null 16 | antialiasing=1 17 | generate_mipmaps=false 18 | disable_embedded_bitmaps=true 19 | multichannel_signed_distance_field=false 20 | msdf_pixel_range=8 21 | msdf_size=48 22 | allow_system_fallback=true 23 | force_autohinter=false 24 | hinting=1 25 | subpixel_positioning=1 26 | oversampling=0.0 27 | Fallbacks=null 28 | fallbacks=[] 29 | Compress=null 30 | compress=true 31 | preload=[] 32 | language_support={} 33 | script_support={} 34 | opentype_features={} 35 | -------------------------------------------------------------------------------- /assets/fonts/m6x11plus.ttf.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="font_data_dynamic" 4 | type="FontFile" 5 | uid="uid://chth4yuj6m6kq" 6 | path="res://.godot/imported/m6x11plus.ttf-ce99c43f9a56b6cb3c7448f42d8cdd11.fontdata" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/fonts/m6x11plus.ttf" 11 | dest_files=["res://.godot/imported/m6x11plus.ttf-ce99c43f9a56b6cb3c7448f42d8cdd11.fontdata"] 12 | 13 | [params] 14 | 15 | Rendering=null 16 | antialiasing=1 17 | generate_mipmaps=false 18 | disable_embedded_bitmaps=true 19 | multichannel_signed_distance_field=false 20 | msdf_pixel_range=8 21 | msdf_size=48 22 | allow_system_fallback=true 23 | force_autohinter=false 24 | hinting=1 25 | subpixel_positioning=1 26 | oversampling=0.0 27 | Fallbacks=null 28 | fallbacks=[] 29 | Compress=null 30 | compress=true 31 | preload=[] 32 | language_support={} 33 | script_support={} 34 | opentype_features={} 35 | -------------------------------------------------------------------------------- /assets/images/red-btn.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bx72qb1qtajm7" 6 | path="res://.godot/imported/red-btn.png-a7db1d11e20863c660ec87e11a85cb41.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/images/red-btn.png" 14 | dest_files=["res://.godot/imported/red-btn.png-a7db1d11e20863c660ec87e11a85cb41.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /assets/images/blue-btn.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://n81t0ixrdymu" 6 | path="res://.godot/imported/blue-btn.png-e3ef4846b8d83e1ae2fd6cbca2a8648f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/images/blue-btn.png" 14 | dest_files=["res://.godot/imported/blue-btn.png-e3ef4846b8d83e1ae2fd6cbca2a8648f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icon.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://h4dunojvd25" 6 | path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://icon.svg" 14 | dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | svg/scale=1.0 36 | editor/scale_with_editor_scale=false 37 | editor/convert_colors_with_editor_theme=false 38 | -------------------------------------------------------------------------------- /control.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform vec2 screen_resolution = vec2(480, 270); 4 | uniform float scanline_intensity : hint_range(0.0, 1.0) = 0.3; 5 | uniform float color_bleed_weight : hint_range(0.0, 1.0) = 0.35; 6 | 7 | uniform sampler2D screen_texture : hint_screen_texture, filter_nearest; 8 | 9 | void fragment() { 10 | // Darken top halves of pixels 11 | float color_dark_offset = 0.0; 12 | int y_pos = int(floor(SCREEN_UV.y * screen_resolution.y * 2.0)); 13 | if (int(floor((float(y_pos) / 2.0))) * 2 == y_pos) 14 | color_dark_offset = scanline_intensity; 15 | 16 | // Blend pixel with left and top pixel to simulate color bleeding 17 | vec4 adjacent_pixel_color_average = texture(screen_texture, SCREEN_UV - vec2(1.0 / screen_resolution.x, 0)) * 0.5 + texture(screen_texture, SCREEN_UV - vec2(0, 1.0 / screen_resolution.y)) * 0.5; 18 | vec4 this_pixel_color = texture(screen_texture, SCREEN_UV); 19 | 20 | COLOR = adjacent_pixel_color_average * color_bleed_weight + this_pixel_color * (1.0 - color_bleed_weight) - vec4(vec3(color_dark_offset), 0); 21 | } -------------------------------------------------------------------------------- /fish-eyes.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform vec2 screen_resolution = vec2(480, 270); 4 | uniform float fisheye_intensity : hint_range(0.0, 1.0) = 0.0; // 0: No distortion, 1: Full fish-eye 5 | 6 | uniform sampler2D screen_texture : hint_screen_texture, filter_nearest; 7 | 8 | void fragment() { 9 | // Normalize screen coordinates to [-1, 1] 10 | vec2 uv = SCREEN_UV * 2.0 - 1.0; 11 | 12 | // Apply fish-eye distortion 13 | float radius = length(uv); 14 | if (fisheye_intensity > 0.0) { 15 | float distortion = mix(1.0, 1.0 + radius * radius, fisheye_intensity); 16 | uv *= distortion; 17 | } 18 | 19 | // Convert back to [0, 1] range 20 | uv = uv * 0.5 + 0.5; 21 | 22 | 23 | // Check if UV is outside valid range 24 | if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { 25 | COLOR = vec4(0.0, 0.0, 0.0, 1.0); // Black color for out-of-bounds 26 | } else { 27 | // Blend pixel with left and top pixel to simulate color bleeding 28 | vec4 adjacent_pixel_color_average = texture(screen_texture, uv - vec2(1.0 / screen_resolution.x, 0)) * 0.5 + 29 | texture(screen_texture, uv - vec2(0, 1.0 / screen_resolution.y)) * 0.5; 30 | 31 | COLOR = adjacent_pixel_color_average; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /fire-number.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D noise_tex : hint_default_white; 4 | uniform vec4 bottom_color : source_color = vec4(0.0, 0.7, 1.0, 1.0); 5 | uniform vec4 middle_color : source_color = vec4(1.0, 0.5, 0.0, 1.0); 6 | uniform vec4 top_color : source_color = vec4(1.0, 0.03, 0.001, 1.0); 7 | uniform float fire_alpha : hint_range(0.0, 1.0) = 1.0; 8 | uniform vec2 fire_speed = vec2(0.0, 2.0); 9 | uniform float fire_aperture : hint_range(0.0, 3.0) = 0.22; 10 | 11 | vec4 tri_color_mix(vec4 color1, vec4 color2, vec4 color3, float pos) { 12 | pos = clamp(pos, 0.0, 1.0); 13 | if (pos < 0.5) { 14 | return mix(color1, color2, pos * 2.0); 15 | } else { 16 | return mix(color2, color3, (pos - 0.5) * 2.0); 17 | } 18 | } 19 | 20 | void fragment() { 21 | // Scale UVs to make the noise more visible 22 | vec2 base_uv = UV * 1.0; 23 | 24 | // Create two layers of noise with different speeds 25 | vec2 shifted_uv1 = base_uv + TIME * fire_speed; 26 | vec2 shifted_uv2 = base_uv + TIME * fire_speed * 1.5; 27 | 28 | // Sample noise texture twice 29 | float fire_noise1 = texture(noise_tex, fract(shifted_uv1)).r; 30 | float fire_noise2 = texture(noise_tex, fract(shifted_uv2)).r; 31 | 32 | // Combine the noise samples 33 | float combined_noise = (fire_noise1 + fire_noise2) * 0.5; 34 | 35 | // Calculate fire shape 36 | float noise = UV.y * (((UV.y + fire_aperture) * combined_noise - fire_aperture) * 75.0); 37 | 38 | // Add horizontal movement 39 | noise += sin(UV.y * 10.0 + TIME * 2.0) * 0.1; 40 | 41 | // Calculate gradient position and mix three colors 42 | float gradient_pos = clamp(noise * 0.08, 0.3, 2.0); 43 | //vec4 smoth_mid_color = smoothstep(top_color, middle_color, vec4(1)); 44 | vec4 fire_color = tri_color_mix(bottom_color, middle_color, top_color, gradient_pos); 45 | 46 | 47 | 48 | // Set final color and alpha 49 | COLOR = fire_color; 50 | COLOR.a = clamp(noise, 0.0, 1.0) * fire_alpha; 51 | } -------------------------------------------------------------------------------- /anti-aliasing.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D screen_texture : hint_screen_texture, filter_nearest; 4 | uniform vec2 screen_resolution = vec2(480, 270); // Resolution of the screen 5 | uniform float edge_threshold : hint_range(0.0, 1.0) = 0.1; // Threshold for detecting edges 6 | uniform float smoothing_factor : hint_range(0.0, 1.0) = 0.5; // How much to smooth the edges 7 | 8 | void fragment() { 9 | // Calculate pixel size based on screen resolution 10 | vec2 pixel_size = 1.0 / screen_resolution; 11 | 12 | // Sample the current pixel and its neighbors 13 | vec4 center_color = texture(screen_texture, SCREEN_UV); 14 | vec4 left_color = texture(screen_texture, SCREEN_UV - vec2(pixel_size.x, 0.0)); 15 | vec4 right_color = texture(screen_texture, SCREEN_UV + vec2(pixel_size.x, 0.0)); 16 | vec4 top_color = texture(screen_texture, SCREEN_UV - vec2(0.0, pixel_size.y)); 17 | vec4 bottom_color = texture(screen_texture, SCREEN_UV + vec2(0.0, pixel_size.y)); 18 | 19 | // Compute luminance (perceived brightness) of each sample 20 | float center_luminance = dot(center_color.rgb, vec3(0.299, 0.587, 0.114)); 21 | float left_luminance = dot(left_color.rgb, vec3(0.299, 0.587, 0.114)); 22 | float right_luminance = dot(right_color.rgb, vec3(0.299, 0.587, 0.114)); 23 | float top_luminance = dot(top_color.rgb, vec3(0.299, 0.587, 0.114)); 24 | float bottom_luminance = dot(bottom_color.rgb, vec3(0.299, 0.587, 0.114)); 25 | 26 | // Calculate edge detection 27 | float horizontal_edge = abs(left_luminance - right_luminance); 28 | float vertical_edge = abs(top_luminance - bottom_luminance); 29 | float edge_strength = max(horizontal_edge, vertical_edge); 30 | 31 | // Determine if the current pixel is part of an edge 32 | if (edge_strength > edge_threshold) { 33 | // Blend the pixel with its neighbors to smooth the edge 34 | vec4 blended_color = (left_color + right_color + top_color + bottom_color) * 0.25; 35 | COLOR = mix(center_color, blended_color, smoothing_factor); 36 | } else { 37 | // If not an edge, output the original color 38 | COLOR = center_color; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /background.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | //I DONT OWN THIS i just took it directly from balatro source code 3 | //and then converted it into godots shader language 4 | //shoutouts localthunk, buy balatro now: https://www.playbalatro.com 5 | 6 | uniform bool polar_coordinates = false; // cool polar coordinates effect, this is use in card 7 | uniform vec2 polar_center = vec2(0.5); 8 | uniform float polar_zoom = 1.; 9 | uniform float polar_repeat = 1.; 10 | 11 | uniform highp float spin_rotation; 12 | uniform highp float spin_speed = 1; 13 | uniform highp vec2 offset = vec2(0., 0.); 14 | uniform highp vec4 colour_1 : source_color; 15 | uniform highp vec4 colour_2 : source_color; 16 | uniform highp vec4 colour_3 : source_color; 17 | uniform highp float contrast = 2.; 18 | uniform highp float lighting = 0.4; 19 | uniform highp float spin_amount = 0.36; 20 | uniform highp float pixel_filter = 700.; 21 | #define SPIN_EASE 1.0 22 | 23 | 24 | vec4 effect(vec2 screenSize, vec2 screen_coords){ 25 | //Convert to UV coords (0-1) and floor for pixel effect 26 | highp float pixel_size = length(screenSize.xy) / pixel_filter; 27 | highp vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*screenSize.xy)/length(screenSize.xy) - offset; 28 | highp float uv_len = length(uv); 29 | 30 | //Adding in a center swirl, changes with time. Only applies meaningfully if the 'spin amount' is a non-zero number 31 | highp float speed = (spin_rotation*SPIN_EASE*0.2) + 302.2; 32 | highp float new_pixel_angle = (atan(uv.y, uv.x)) + speed - SPIN_EASE*20.*(1.*spin_amount*uv_len + (1. - 1.*spin_amount)); 33 | highp vec2 mid = (screenSize.xy/length(screenSize.xy))/2.; 34 | uv = (vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid); 35 | 36 | //Now add the paint effect to the swirled UV 37 | uv *= 30.; 38 | speed = TIME*(spin_speed); 39 | highp vec2 uv2 = vec2(uv.x+uv.y); 40 | 41 | for(int i=0; i < 5; i++) { 42 | uv2 += sin(max(uv.x, uv.y)) + uv; 43 | uv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121),sin(uv2.x - 0.113*speed)); 44 | uv -= 1.0*cos(uv.x + uv.y) - 1.0*sin(uv.x*0.711 - uv.y); 45 | } 46 | 47 | //Make the paint amount range from 0 - 2 48 | highp float contrast_mod = (0.25*contrast + 0.5*spin_amount + 1.2); 49 | highp float paint_res = min(2., max(0.,length(uv)*(0.035)*contrast_mod)); 50 | highp float c1p = max(0.,1. - contrast_mod*abs(1.-paint_res)); 51 | highp float c2p = max(0.,1. - contrast_mod*abs(paint_res)); 52 | highp float c3p = 1. - min(1., c1p + c2p); 53 | 54 | highp float ligth = (lighting - 0.2) * max(c1p*5. - 4., 0.) + lighting * max(c2p*5. - 4., 0.); 55 | highp vec4 ret_col = (0.3/contrast)*colour_1 + (1. - 0.3/contrast)*(colour_1*c1p + colour_2*c2p + vec4(c3p*colour_3.rgb, c3p*colour_1.a)) + ligth; 56 | return ret_col; 57 | } 58 | 59 | vec2 polar_coords(vec2 uv, vec2 center, float zoom, float repeat){ 60 | vec2 dir = uv - center; 61 | float radius = length(dir) * 2.0; 62 | float angle = atan(dir.y , dir.x) * 1.0 / (PI * 2.0); 63 | return mod(vec2(radius * zoom, angle * repeat), 1.0); 64 | } 65 | 66 | void fragment() { 67 | vec2 polarCoords = UV; 68 | if (polar_coordinates){ 69 | polarCoords = polar_coords(UV.xy, polar_center, polar_zoom, polar_repeat); 70 | } 71 | COLOR *= effect(TEXTURE_PIXEL_SIZE, polarCoords); 72 | } 73 | -------------------------------------------------------------------------------- /node_2d.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=27 format=3 uid="uid://dfjsfjg0sr38c"] 2 | 3 | [ext_resource type="Shader" path="res://background.gdshader" id="1_icbcv"] 4 | [ext_resource type="Shader" path="res://control.gdshader" id="1_ukovc"] 5 | [ext_resource type="FontFile" uid="uid://cgn2tcjqivlg7" path="res://assets/fonts/m6x11.ttf" id="3_grj83"] 6 | [ext_resource type="Shader" path="res://fish-eyes.gdshader" id="4_tvh3s"] 7 | [ext_resource type="Shader" path="res://color-distort.gdshader" id="5_glcpl"] 8 | [ext_resource type="Shader" path="res://anti-aliasing.gdshader" id="6_0mj6h"] 9 | [ext_resource type="Texture2D" uid="uid://bx72qb1qtajm7" path="res://assets/images/red-btn.png" id="7_065sh"] 10 | [ext_resource type="FontFile" uid="uid://chth4yuj6m6kq" path="res://assets/fonts/m6x11plus.ttf" id="8_gq1s5"] 11 | [ext_resource type="Texture2D" uid="uid://n81t0ixrdymu" path="res://assets/images/blue-btn.png" id="9_0hw0h"] 12 | [ext_resource type="Shader" path="res://fire-number.gdshader" id="9_xqo8m"] 13 | 14 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_siuto"] 15 | shader = ExtResource("1_icbcv") 16 | shader_parameter/polar_coordinates = false 17 | shader_parameter/polar_center = Vector2(0.5, 0.5) 18 | shader_parameter/polar_zoom = 1.0 19 | shader_parameter/polar_repeat = 3.0 20 | shader_parameter/spin_rotation = 2.0 21 | shader_parameter/spin_speed = 7.0 22 | shader_parameter/offset = Vector2(0, 0) 23 | shader_parameter/colour_1 = Color(0.870588, 0.266667, 0.231373, 1) 24 | shader_parameter/colour_2 = Color(0, 0.419608, 0.705882, 1) 25 | shader_parameter/colour_3 = Color(0.0862745, 0.137255, 0.145098, 1) 26 | shader_parameter/contrast = 3.5 27 | shader_parameter/lighting = 0.3 28 | shader_parameter/spin_amount = 0.2 29 | shader_parameter/pixel_filter = 740.0 30 | 31 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_j2fuy"] 32 | shader = ExtResource("1_icbcv") 33 | shader_parameter/polar_coordinates = false 34 | shader_parameter/polar_center = Vector2(0.5, 0.5) 35 | shader_parameter/polar_zoom = 1.0 36 | shader_parameter/polar_repeat = 3.0 37 | shader_parameter/spin_rotation = 1.0 38 | shader_parameter/spin_speed = 6.0 39 | shader_parameter/offset = Vector2(0, 0) 40 | shader_parameter/colour_1 = Color(0.184314, 0.45098, 0.933333, 1) 41 | shader_parameter/colour_2 = Color(0.0666667, 0.109804, 0.133333, 1) 42 | shader_parameter/colour_3 = Color(0, 0, 0, 0) 43 | shader_parameter/contrast = 1.5 44 | shader_parameter/lighting = 0.0 45 | shader_parameter/spin_amount = 0.1 46 | shader_parameter/pixel_filter = 756.0 47 | 48 | [sub_resource type="LabelSettings" id="LabelSettings_pujqb"] 49 | font = ExtResource("3_grj83") 50 | 51 | [sub_resource type="FastNoiseLite" id="FastNoiseLite_henq6"] 52 | noise_type = 3 53 | seed = 6 54 | 55 | [sub_resource type="NoiseTexture2D" id="NoiseTexture2D_ykdxk"] 56 | noise = SubResource("FastNoiseLite_henq6") 57 | 58 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_po3oo"] 59 | shader = ExtResource("9_xqo8m") 60 | shader_parameter/bottom_color = Color(0.984314, 0.992157, 0.933333, 1) 61 | shader_parameter/middle_color = Color(0.972549, 0.47451, 0.258824, 1) 62 | shader_parameter/top_color = Color(1, 0.298039, 0.25098, 1) 63 | shader_parameter/fire_alpha = 1.0 64 | shader_parameter/fire_speed = Vector2(-0.2, 1.5) 65 | shader_parameter/fire_aperture = 0.461 66 | shader_parameter/noise_tex = SubResource("NoiseTexture2D_ykdxk") 67 | 68 | [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_mqrxj"] 69 | 70 | [sub_resource type="LabelSettings" id="LabelSettings_aikcd"] 71 | font = ExtResource("8_gq1s5") 72 | font_size = 60 73 | shadow_size = 3 74 | shadow_color = Color(0, 0, 0, 0.364706) 75 | shadow_offset = Vector2(4, 3) 76 | 77 | [sub_resource type="FastNoiseLite" id="FastNoiseLite_0w7a2"] 78 | noise_type = 3 79 | seed = 5 80 | 81 | [sub_resource type="NoiseTexture2D" id="NoiseTexture2D_uc66s"] 82 | noise = SubResource("FastNoiseLite_0w7a2") 83 | 84 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_05gvo"] 85 | shader = ExtResource("9_xqo8m") 86 | shader_parameter/bottom_color = Color(0.984314, 0.992157, 0.933333, 1) 87 | shader_parameter/middle_color = Color(0, 0.996078, 1, 1) 88 | shader_parameter/top_color = Color(0, 0.576471, 0.996078, 1) 89 | shader_parameter/fire_alpha = 1.0 90 | shader_parameter/fire_speed = Vector2(0.2, 1.5) 91 | shader_parameter/fire_aperture = 0.461 92 | shader_parameter/noise_tex = SubResource("NoiseTexture2D_uc66s") 93 | 94 | [sub_resource type="LabelSettings" id="LabelSettings_1snga"] 95 | font = ExtResource("8_gq1s5") 96 | font_size = 60 97 | shadow_size = 3 98 | shadow_color = Color(0, 0, 0, 0.313726) 99 | shadow_offset = Vector2(-4, 3) 100 | 101 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_p2xa6"] 102 | shader = ExtResource("1_ukovc") 103 | shader_parameter/screen_resolution = Vector2(480, 270) 104 | shader_parameter/scanline_intensity = 0.05 105 | shader_parameter/color_bleed_weight = 0.0 106 | 107 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_ysaqo"] 108 | shader = ExtResource("5_glcpl") 109 | shader_parameter/screen_resolution = Vector2(1152, 648) 110 | shader_parameter/distortion_size = 0.7 111 | 112 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_ya2ux"] 113 | shader = ExtResource("4_tvh3s") 114 | shader_parameter/screen_resolution = Vector2(1152, 648) 115 | shader_parameter/fisheye_intensity = 0.02 116 | 117 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_p357h"] 118 | shader = ExtResource("6_0mj6h") 119 | shader_parameter/screen_resolution = Vector2(1152, 648) 120 | shader_parameter/edge_threshold = 0.1 121 | shader_parameter/smoothing_factor = 0.5 122 | 123 | [node name="Node2D" type="Node2D"] 124 | 125 | [node name="body" type="Control" parent="."] 126 | clip_contents = true 127 | layout_mode = 3 128 | anchors_preset = 15 129 | anchor_right = 1.0 130 | anchor_bottom = 1.0 131 | offset_right = 1152.0 132 | offset_bottom = 648.0 133 | grow_horizontal = 2 134 | grow_vertical = 2 135 | 136 | [node name="background" type="ColorRect" parent="body"] 137 | material = SubResource("ShaderMaterial_siuto") 138 | layout_mode = 1 139 | anchors_preset = 15 140 | anchor_right = 1.0 141 | anchor_bottom = 1.0 142 | grow_horizontal = 2 143 | grow_vertical = 2 144 | metadata/_edit_use_anchors_ = true 145 | metadata/_edit_lock_ = true 146 | 147 | [node name="background2" type="ColorRect" parent="body"] 148 | visible = false 149 | material = SubResource("ShaderMaterial_j2fuy") 150 | layout_mode = 1 151 | anchors_preset = 15 152 | anchor_right = 1.0 153 | anchor_bottom = 1.0 154 | grow_horizontal = 2 155 | grow_vertical = 2 156 | metadata/_edit_use_anchors_ = true 157 | metadata/_edit_lock_ = true 158 | 159 | [node name="margin" type="MarginContainer" parent="body"] 160 | visible = false 161 | layout_mode = 1 162 | anchors_preset = 8 163 | anchor_left = 0.5 164 | anchor_top = 0.5 165 | anchor_right = 0.5 166 | anchor_bottom = 0.5 167 | offset_left = -60.5 168 | offset_top = -20.0 169 | offset_right = 60.5 170 | offset_bottom = 20.0 171 | grow_horizontal = 2 172 | grow_vertical = 2 173 | 174 | [node name="Label" type="Label" parent="body/margin"] 175 | layout_mode = 2 176 | text = "HELLO WORLD!" 177 | label_settings = SubResource("LabelSettings_pujqb") 178 | horizontal_alignment = 1 179 | 180 | [node name="number" type="Control" parent="."] 181 | visible = false 182 | layout_mode = 3 183 | anchors_preset = 0 184 | 185 | [node name="red" type="Node2D" parent="number"] 186 | position = Vector2(525, 548) 187 | scale = Vector2(0.357099, 0.355263) 188 | 189 | [node name="fire" type="TextureRect" parent="number/red"] 190 | material = SubResource("ShaderMaterial_po3oo") 191 | offset_left = -104.0 192 | offset_top = -259.0 193 | offset_right = 106.0 194 | offset_bottom = -37.0 195 | texture = SubResource("PlaceholderTexture2D_mqrxj") 196 | 197 | [node name="Red-btn" type="Sprite2D" parent="number/red"] 198 | texture = ExtResource("7_065sh") 199 | 200 | [node name="Label" type="Label" parent="number/red"] 201 | offset_left = -64.4079 202 | offset_top = -33.7779 203 | offset_right = 62.5921 204 | offset_bottom = 26.2221 205 | text = "24,000" 206 | label_settings = SubResource("LabelSettings_aikcd") 207 | horizontal_alignment = 1 208 | 209 | [node name="blue" type="Node2D" parent="number"] 210 | position = Vector2(626, 549) 211 | scale = Vector2(0.359649, 0.359649) 212 | 213 | [node name="fire" type="TextureRect" parent="number/blue"] 214 | material = SubResource("ShaderMaterial_05gvo") 215 | offset_left = -106.0 216 | offset_top = -259.0 217 | offset_right = 106.0 218 | offset_bottom = -28.0 219 | texture = SubResource("PlaceholderTexture2D_mqrxj") 220 | 221 | [node name="Blue-btn" type="Sprite2D" parent="number/blue"] 222 | texture = ExtResource("9_0hw0h") 223 | 224 | [node name="Label" type="Label" parent="number/blue"] 225 | offset_left = -64.4079 226 | offset_top = -33.7779 227 | offset_right = 62.5921 228 | offset_bottom = 26.2221 229 | text = "15,000" 230 | label_settings = SubResource("LabelSettings_1snga") 231 | horizontal_alignment = 1 232 | 233 | [node name="crt_layer" type="CanvasLayer" parent="."] 234 | visible = false 235 | 236 | [node name="crt" type="ColorRect" parent="crt_layer"] 237 | material = SubResource("ShaderMaterial_p2xa6") 238 | anchors_preset = 15 239 | anchor_right = 1.0 240 | anchor_bottom = 1.0 241 | grow_horizontal = 2 242 | grow_vertical = 2 243 | metadata/_edit_lock_ = true 244 | 245 | [node name="color_distortion_layer" type="CanvasLayer" parent="."] 246 | visible = false 247 | follow_viewport_enabled = true 248 | 249 | [node name="color-distort" type="ColorRect" parent="color_distortion_layer"] 250 | material = SubResource("ShaderMaterial_ysaqo") 251 | anchors_preset = 15 252 | anchor_right = 1.0 253 | anchor_bottom = 1.0 254 | grow_horizontal = 2 255 | grow_vertical = 2 256 | metadata/_edit_lock_ = true 257 | 258 | [node name="fish_eyes_layer" type="CanvasLayer" parent="."] 259 | visible = false 260 | follow_viewport_enabled = true 261 | 262 | [node name="fish-eyes" type="ColorRect" parent="fish_eyes_layer"] 263 | material = SubResource("ShaderMaterial_ya2ux") 264 | anchors_preset = 15 265 | anchor_right = 1.0 266 | anchor_bottom = 1.0 267 | grow_horizontal = 2 268 | grow_vertical = 2 269 | metadata/_edit_lock_ = true 270 | 271 | [node name="anti_aliasing_layer" type="CanvasLayer" parent="."] 272 | visible = false 273 | 274 | [node name="anti-aliasing" type="ColorRect" parent="anti_aliasing_layer"] 275 | material = SubResource("ShaderMaterial_p357h") 276 | anchors_preset = 15 277 | anchor_right = 1.0 278 | anchor_bottom = 1.0 279 | offset_left = 3.0 280 | offset_top = 13.0 281 | offset_right = 3.0 282 | offset_bottom = 13.0 283 | grow_horizontal = 2 284 | grow_vertical = 2 285 | metadata/_edit_lock_ = true 286 | --------------------------------------------------------------------------------