Compare commits

...

2 Commits

Author SHA1 Message Date
Rob Kelly 495e29c487 Shot fast-forward control with VCR effect 2024-12-30 17:24:12 -07:00
Rob Kelly f2a7b75e43 Added VCR font 2024-12-30 17:03:34 -07:00
17 changed files with 471 additions and 3 deletions

View File

@ -57,6 +57,16 @@ Asset credits
*** Retrieved from https://github.com/AlphaZTX/Two-Weekends-Sans
*** Author: AlphaZTX
*** License: OFL 1.1
** CLASSIC Better VCR
*** Retrieved from https://fontstruct.com/fontstructions/show/2505236/classic-better-vcr
*** Author: Artdzyk
*** License: OFL 1.1
* Sound

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dwy8k2w7vt64x"
path="res://.godot/imported/classic-better-vcr.otf-78a95e88b4c7ad31748ba0a4ef1b3b0b.fontdata"
[deps]
source_file="res://assets/fonts/classic-better-vcr/classic-better-vcr.otf"
dest_files=["res://.godot/imported/classic-better-vcr.otf-78a95e88b4c7ad31748ba0a4ef1b3b0b.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,93 @@
Copyright (c) 2024, Artdzyk
(https://fontstruct.com/fontstructors/2103201/siroutyugist)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -0,0 +1,22 @@
The font file in this archive was created using Fontstruct the free, online
font-building tool.
This font was created by Artdzyk *.
This font has a homepage where this archive and other versions may be found:
https://fontstruct.com/fontstructions/show/2505236
*NOTE: “CLASSIC Better VCR” was originally cloned (copied) from the
FontStruction “12x16 iskra”
(https://fontstruct.com/fontstructions/show/2274822) by Artdzyk , which is
licensed under a Open Font License license
(https://fontstruct.com/fontstructions/license/2274822).
Try Fontstruct at https://fontstruct.com
Its easy and its fun.
Fontstruct is copyright ©2024 Rob Meek
LEGAL NOTICE:
In using this font you must comply with the licensing terms described in the
file “license.txt” included with this archive.
If you redistribute the font file in this archive, it must be accompanied by all
the other files from this archive, including this one.

View File

@ -124,6 +124,7 @@ ACTION_club_previous,"Select previous club"
ACTION_pause,Pause
ACTION_ball_next,"Select next ball"
ACTION_ball_previous,"Select previous ball"
ACTION_fast_forward,Fast-forward
,
ACTION_FREE_CAMERA,"Free Camera"
ACTION_AIM,Aim

1 keys en
124 ACTION_pause Pause
125 ACTION_ball_next Select next ball
126 ACTION_ball_previous Select previous ball
127 ACTION_fast_forward Fast-forward
128
129 ACTION_FREE_CAMERA Free Camera
130 ACTION_AIM Aim

View File

@ -187,12 +187,12 @@ select_putter={
}
club_next={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194306,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
club_previous={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194306,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
ball_next={
@ -205,6 +205,11 @@ ball_previous={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":71,"key_label":0,"unicode":71,"location":0,"echo":false,"script":null)
]
}
fast_forward={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
]
}
pause={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)

View File

@ -81,6 +81,8 @@ func _unload_content() -> void:
func _finish_scene_load(instance: Node) -> void:
# Unpause in case the previous scene was paused.
get_tree().paused = false
# Reset time scale in case it's been changed.
Engine.time_scale = 1.0
content.add_child(instance)
instance.reparent(content)

View File

@ -21,6 +21,8 @@ var projection_gravity: bool
var default_text_speed: float
var default_physics_ticks_per_second: int
func _init() -> void:
ProjectSettings.settings_changed.connect(_read_settings)
@ -54,6 +56,9 @@ func _read_settings() -> void:
)
default_text_speed = ProjectSettings.get_setting("game/config/text/default_text_speed")
default_physics_ticks_per_second = ProjectSettings.get_setting(
"physics/common/physics_ticks_per_second"
)
func _load_audio_bus_override() -> void:

View File

@ -485,6 +485,8 @@ func _on_phase_change(new_phase: Phase) -> void:
idle_prompt_timer.start()
hud.hide_idle_prompts()
world.fast_forward = false
match new_phase:
Phase.AIM:
hud.show_hud()
@ -660,6 +662,9 @@ func _process(_delta: float) -> void:
hud.stop_curve_bar()
phase = Phase.DOWNSWING
Phase.SHOT:
# Fast-forward when input is held:
world.fast_forward = Input.is_action_pressed("fast_forward", true)
if reset_enabled and Input.is_action_just_pressed("shot_reset", true):
phase = Phase.SHOT_RESET
reset_enabled = false
@ -750,3 +755,5 @@ func _on_idle_prompt_timer_timeout() -> void:
hud.show_power_prompt()
Phase.CURVE_ADJUST:
hud.show_curve_prompt()
Phase.SHOT:
hud.show_shot_prompt()

View File

@ -0,0 +1,108 @@
// https://www.shadertoy.com/view/MdffD7
// Fork of FMS_Cat's VCR distortion shader
// Retrieved from https://godotshaders.com/shader/vhs-post-processing/
shader_type canvas_item;
// TODO: Add uniforms for tape crease discoloration and image jiggle
uniform sampler2D screen_texture: hint_screen_texture, filter_linear_mipmap, repeat_disable;
uniform vec2 vhs_resolution = vec2(320.0, 240.0);
uniform int samples = 2;
uniform float crease_noise: hint_range(0.0, 2.0, 0.1) = 1.0;
uniform float crease_opacity: hint_range(0.0, 1.0, 0.1) = 0.5;
uniform float filter_intensity: hint_range(0.0, 1.0, 0.1) = 0.1;
group_uniforms tape_crease;
uniform float tape_crease_smear: hint_range(0.0, 2.0, 0.1) = 0.2;
uniform float tape_crease_intensity: hint_range(0.0, 1.0, 0.1) = 0.2;
uniform float tape_crease_jitter: hint_range(0.0, 1.0, 0.01) = 0.10;
uniform float tape_crease_speed: hint_range(-2.0, 2.0, 0.1) = 0.5;
uniform float tape_crease_discoloration: hint_range(0.0, 2.0, 0.1) = 1.0;
group_uniforms bottom_border;
uniform float bottom_border_thickness: hint_range(0.0,32.0, 0.1) = 6.0;
uniform float bottom_border_jitter: hint_range(0.0, 24.0, 0.5) = 6.0;
group_uniforms noise;
uniform float noise_intensity: hint_range(0.0, 1.0, 0.1) = 0.1;
uniform sampler2D noise_texture: filter_linear_mipmap, repeat_enable;
float v2random(vec2 uv) {
return texture(noise_texture, mod(uv, vec2(1.0))).x;
}
mat2 rotate2D(float t) {
return mat2(vec2(cos(t), sin(t)), vec2(-sin(t), cos(t)));
}
vec3 rgb2yiq(vec3 rgb) {
return mat3(vec3(0.299, 0.596, 0.211), vec3(0.587, -0.274, -0.523), vec3(0.114, -0.322, 0.312)) * rgb;
}
vec3 yiq2rgb(vec3 yiq) {
return mat3(vec3(1.0, 1.0, 1.0), vec3(0.956, -0.272, -1.106), vec3(0.621, -0.647, 1.703)) * yiq;
}
vec3 vhx_tex_2D(sampler2D tex, vec2 uv, float rot) {
vec3 yiq = vec3(0.0);
for (int i = 0; i < samples; i++) {
yiq += rgb2yiq(texture(tex, uv - vec2(float(i), 0.0) / vhs_resolution).xyz) *
vec2(float(i), float(samples - 1 - i)).yxx / float(samples - 1)
/ float(samples) * 2.0;
}
if (rot != 0.0) {
yiq.yz *= rotate2D(rot * tape_crease_discoloration);
}
return yiq2rgb(yiq);
}
void fragment() {
vec2 uvn = UV;
vec3 col = vec3(0.0, 0.0, 0.0);
// Tape wave.
uvn.x += (v2random(vec2(uvn.y / 10.0, TIME / 10.0) / 1.0) - 0.5) / vhs_resolution.x * 1.0;
uvn.x += (v2random(vec2(uvn.y, TIME * 10.0)) - 0.5) / vhs_resolution.x * 1.0;
// tape crease
float tc_phase = smoothstep(0.9, 0.96, sin(uvn.y * 8.0 - (TIME * tape_crease_speed + tape_crease_jitter * v2random(TIME * vec2(0.67, 0.59))) * PI * 1.2));
float tc_noise = smoothstep(0.3, 1.0, v2random(vec2(uvn.y * 4.77, TIME)));
float tc = tc_phase * tc_noise;
uvn.x = uvn.x - tc / vhs_resolution.x * 8.0 * tape_crease_smear;
// switching noise
float sn_phase = smoothstep(1.0 - bottom_border_thickness / vhs_resolution.y, 1.0, uvn.y);
uvn.x += sn_phase * (v2random(vec2(UV.y * 100.0, TIME * 10.0)) - 0.5) / vhs_resolution.x * bottom_border_jitter;
// fetch
col = vhx_tex_2D(screen_texture, uvn, tc_phase * 0.2 + sn_phase * 2.0);
// crease noise
float cn = tc_noise * crease_noise * (0.7 * tc_phase * tape_crease_intensity + 0.3);
if (0.29 < cn) {
vec2 V = vec2(0.0, crease_opacity);
vec2 uvt = (uvn + V.yx * v2random(vec2(uvn.y, TIME))) * vec2(0.1, 1.0);
float n0 = v2random(uvt);
float n1 = v2random(uvt + V.yx / vhs_resolution.x);
if (n1 < n0) {
col = mix(col, 2.0 * V.yyy, pow(n0, 10.0));
}
}
// ac beat
col *= 1.0 + 0.1 * smoothstep(0.4, 0.6, v2random(vec2(0.0, 0.1 * (UV.y + TIME * 0.2)) / 10.0));
// color noise
col *= 1.0 - noise_intensity * 0.5 + noise_intensity * texture(noise_texture, mod(uvn * vec2(1.0, 1.0) + TIME * vec2(5.97, 4.45), vec2(1.0))).xyz;
col = clamp(col, 0.0, 1.0);
// yiq
col = rgb2yiq(col);
col = vec3(0.9, 1.1, 1.5) * col + vec3(0.1, -0.1, 0.0) * filter_intensity;
col = yiq2rgb(col);
COLOR = vec4(col, 1.0);
}

View File

@ -16,6 +16,7 @@ var _freeze_input := false
func _ready() -> void:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
Engine.time_scale = 1.0
func _unhandled_key_input(event: InputEvent) -> void:

View File

@ -17,6 +17,7 @@ var player: WorldPlayer
var _aim_prompt_shown := false
var _power_prompt_shown := false
var _curve_prompt_shown := false
var _shot_prompt_shown := false
var _free_cam_prompts_shown := false
@onready var power_bar: TextureProgressBar = %PowerBar
@ -45,6 +46,7 @@ var _free_cam_prompts_shown := false
@onready var _aim_prompt_animation: AnimationPlayer = %AimPromptAnimation
@onready var _power_prompt_animation: AnimationPlayer = %PowerPromptAnimation
@onready var _curve_prompt_animation: AnimationPlayer = %CurvePromptAnimation
@onready var _shot_prompt_animation: AnimationPlayer = %ShotPromptAnimation
@onready var _free_cam_util_prompt_animation: AnimationPlayer = %FreeCamUtilPromptAnimation
@onready var _free_cam_motion_prompt_animation: AnimationPlayer = %FreeCamMotionPromptAnimation
@ -181,10 +183,23 @@ func hide_free_cam_prompts() -> void:
_free_cam_util_prompt_animation.play_backwards("show")
func show_shot_prompt() -> void:
if not _shot_prompt_shown:
_shot_prompt_shown = true
_shot_prompt_animation.play("show")
func hide_shot_prompt() -> void:
if _shot_prompt_shown:
_shot_prompt_shown = false
_shot_prompt_animation.play_backwards("show")
func hide_idle_prompts() -> void:
hide_aim_prompt()
hide_power_prompt()
hide_curve_prompt()
hide_shot_prompt()
## Set the value of the life bar, potentially playing some kind of effect in response.

View File

@ -1242,6 +1242,30 @@ libraries = {
"": SubResource("AnimationLibrary_o70c6")
}
[node name="ShotPrompt" type="MarginContainer" parent="Prompts"]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_bottom = 55.0
grow_horizontal = 2
grow_vertical = 0
theme_override_constants/margin_right = 16
theme_override_constants/margin_bottom = 16
[node name="InputPrompt" parent="Prompts/ShotPrompt" instance=ExtResource("14_ik4gg")]
layout_mode = 2
text = "❓ - ACTION_fast_forward"
action = &"fast_forward"
[node name="ShotPromptAnimation" type="AnimationPlayer" parent="Prompts/ShotPrompt"]
unique_name_in_owner = true
libraries = {
"": SubResource("AnimationLibrary_o70c6")
}
[node name="FreeCamUtilPrompts" type="MarginContainer" parent="Prompts"]
layout_mode = 1
anchors_preset = -1

View File

@ -52,6 +52,9 @@ func _finish_winner_sequence() -> void:
func pause() -> void:
# Turn off fast-forward, if it's on
world.fast_forward = false
# Switch to demo cam, if there is one.
var democams: Array[Node] = get_tree().get_nodes_in_group(DEMO_CAMERA_GROUP)
if democams:

View File

@ -6,18 +6,23 @@ class_name World extends Node
const SCENE := "res://src/world/world.tscn"
const FF_TIME_SCALE := 4.0
@export var initial_level: PackedScene
@export var manager: PlayManager
@export var spawn_group := "PlayerSpawn"
var fast_forward: bool:
set = _set_fast_forward
var _spawns_available: Array[Node3D] = []
@onready var level: Node3D = %Level
@onready var ui: WorldUI = %UI
@onready var world_transition: AnimationPlayer = %WorldTransition
@onready var fast_forward_effect: Control = %FastForwardEffect
@onready var game: Game = get_tree().get_first_node_in_group(Game.group)
@ -62,6 +67,26 @@ func _on_winner(_player: WorldPlayer) -> void:
# TODO announce winner?
## Set the state of the world-wide fast-forward feature
func _set_fast_forward(value: bool) -> void:
if value == fast_forward:
# Ignore if not a change from the previous value
return
fast_forward = value
if fast_forward:
Engine.time_scale = FF_TIME_SCALE
Engine.physics_ticks_per_second = int(
Game.settings.default_physics_ticks_per_second * FF_TIME_SCALE
)
fast_forward_effect.show()
else:
Engine.time_scale = 1.0
Engine.physics_ticks_per_second = Game.settings.default_physics_ticks_per_second
fast_forward_effect.hide()
func fade_to_title() -> void:
world_transition.play("fade_to_title")

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=16 format=3 uid="uid://cwnwcd8kushl3"]
[gd_scene load_steps=24 format=3 uid="uid://cwnwcd8kushl3"]
[ext_resource type="Script" path="res://src/world/world.gd" id="1_ybjyx"]
[ext_resource type="Script" path="res://src/player/world_player.gd" id="2_e743i"]
@ -10,6 +10,8 @@
[ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="7_0gd42"]
[ext_resource type="PackedScene" uid="uid://biokiug3e0ipk" path="res://src/ui/shot_hud/death_alert.tscn" id="8_fuyxc"]
[ext_resource type="PackedScene" uid="uid://dwyy7tt3nose1" path="res://src/ui/shot_hud/winner_alert.tscn" id="9_lln1k"]
[ext_resource type="FontFile" uid="uid://dwy8k2w7vt64x" path="res://assets/fonts/classic-better-vcr/classic-better-vcr.otf" id="11_uv5b5"]
[ext_resource type="Shader" path="res://src/shaders/vcr_distortion.gdshader" id="11_xag32"]
[sub_resource type="Resource" id="Resource_mbhdy"]
script = ExtResource("2_e743i")
@ -26,6 +28,68 @@ _balls = {
script = ExtResource("5_h6mje")
players = Array[ExtResource("2_e743i")]([ExtResource("3_pyw81"), SubResource("Resource_mbhdy")])
[sub_resource type="Animation" id="Animation_xfpfm"]
resource_name = "blink"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, false]
}
[sub_resource type="Animation" id="Animation_6350f"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_7gn8c"]
_data = {
"RESET": SubResource("Animation_6350f"),
"blink": SubResource("Animation_xfpfm")
}
[sub_resource type="FastNoiseLite" id="FastNoiseLite_txttc"]
noise_type = 5
frequency = 1.0
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_p8oo3"]
seamless = true
noise = SubResource("FastNoiseLite_txttc")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_m76ua"]
shader = ExtResource("11_xag32")
shader_parameter/vhs_resolution = Vector2(320, 240)
shader_parameter/samples = 3
shader_parameter/crease_noise = 1.4
shader_parameter/crease_opacity = 0.5
shader_parameter/filter_intensity = 0.2
shader_parameter/tape_crease_smear = 0.2
shader_parameter/tape_crease_intensity = 0.2
shader_parameter/tape_crease_jitter = 0.21
shader_parameter/tape_crease_speed = 0.5
shader_parameter/tape_crease_discoloration = 1.0
shader_parameter/bottom_border_thickness = 6.0
shader_parameter/bottom_border_jitter = 6.0
shader_parameter/noise_intensity = 0.2
shader_parameter/noise_texture = SubResource("NoiseTexture2D_p8oo3")
[sub_resource type="Animation" id="Animation_ihq1m"]
length = 0.001
tracks/0/type = "value"
@ -143,6 +207,55 @@ grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="FastForwardEffect" type="Control" parent="UI/EffectContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MarginContainer" type="MarginContainer" parent="UI/EffectContainer/FastForwardEffect"]
layout_mode = 0
offset_right = 176.0
offset_bottom = 96.0
theme_override_constants/margin_left = 128
theme_override_constants/margin_top = 128
[node name="HBoxContainer" type="HBoxContainer" parent="UI/EffectContainer/FastForwardEffect/MarginContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="UI/EffectContainer/FastForwardEffect/MarginContainer/HBoxContainer"]
layout_mode = 2
theme_override_fonts/font = ExtResource("11_uv5b5")
theme_override_font_sizes/font_size = 96
text = "FF"
[node name="Label2" type="Label" parent="UI/EffectContainer/FastForwardEffect/MarginContainer/HBoxContainer"]
layout_mode = 2
theme_override_fonts/font = ExtResource("11_uv5b5")
theme_override_font_sizes/font_size = 128
text = "⏩"
[node name="AnimationPlayer" type="AnimationPlayer" parent="UI/EffectContainer/FastForwardEffect/MarginContainer/HBoxContainer"]
libraries = {
"": SubResource("AnimationLibrary_7gn8c")
}
autoplay = "blink"
speed_scale = 0.25
[node name="Overlay" type="ColorRect" parent="UI/EffectContainer/FastForwardEffect"]
material = SubResource("ShaderMaterial_m76ua")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="PauseContainer" type="Control" parent="UI"]
unique_name_in_owner = true
layout_mode = 1