Compare commits

..

No commits in common. "master" and "TAS_UI" have entirely different histories.

137 changed files with 93 additions and 4966 deletions

View File

@ -9,10 +9,3 @@ Fresnel: https://godotshaders.com/snippet/fresnel/
Code: Code:
occlussion shader: https://www.reddit.com/r/godot/comments/rww6e9/comment/hrfa51g/?utm_source=share&utm_medium=web2x&context=3 occlussion shader: https://www.reddit.com/r/godot/comments/rww6e9/comment/hrfa51g/?utm_source=share&utm_medium=web2x&context=3
Sound:
billiard-clack: https://freesound.org/people/Za-Games/sounds/539854/
https://freesound.org/people/original_sound/sounds/372197/

BIN
blends/Child_Colour.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/Child_Normal.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/Domino.blend (Stored with Git LFS)

Binary file not shown.

BIN
blends/Domino_Colour.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/Igloo_Colour.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/Igloo_Normal.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/Present_Colour.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/balloon.blend (Stored with Git LFS)

Binary file not shown.

BIN
blends/cake.blend (Stored with Git LFS)

Binary file not shown.

BIN
blends/cake_albedo.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/cake_normals.png (Stored with Git LFS)

Binary file not shown.

BIN
blends/child.blend (Stored with Git LFS)

Binary file not shown.

View File

@ -23,8 +23,8 @@ def export(path: str):
use_selection=True, use_selection=True,
export_colors=False, export_colors=False,
export_apply=True, export_apply=True,
#export_animation_mode="NLA_TRACKS", export_animation_mode="NLA_TRACKS",
#export_anim_slide_to_zero=True, export_anim_slide_to_zero=True,
) )
try: try:

BIN
blends/grape.blend (Stored with Git LFS)

Binary file not shown.

BIN
blends/igloo.blend (Stored with Git LFS)

Binary file not shown.

BIN
blends/present.blend (Stored with Git LFS)

Binary file not shown.

BIN
blends/small_room.blend (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
blends/string.blend (Stored with Git LFS)

Binary file not shown.

View File

@ -1,8 +0,0 @@
extends Button
func _on_pressed():
get_tree().change_scene_to_file("res://main.tscn")
func _input(event):
if event.is_action("charge"):
_on_pressed()

View File

@ -1,30 +0,0 @@
using Godot;
using System;
public partial class CollisionSound : AudioStreamPlayer
{
Node controller;
bool firstPlayed = false;
public override void _Ready()
{
controller = GetNode<Node>("/root/ControllerEventBus");
Callable callable = new Callable(this, MethodName.OnControllerContact);
controller.Connect("new_target", callable);
this.OnControllerContact(this);
}
public void OnControllerContact(Node node)
{
if (firstPlayed) this.Play();
firstPlayed = true;
}
}

BIN
godot/Domino.glb (Stored with Git LFS)

Binary file not shown.

View File

@ -1,41 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dmttoc025f26x"
path="res://.godot/imported/Domino.glb-425929d56fd611b3f418978da5619fbf.scn"
[deps]
source_file="res://Domino.glb"
dest_files=["res://.godot/imported/Domino.glb-425929d56fd611b3f418978da5619fbf.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path="res://physics/import_billiard.gd"
_subresources={
"nodes": {
"PATH:Domino2": {
"generate/physics": true,
"physics/body_type": 1,
"physics/shape_type": 3,
"primitive/size": Vector3(0.01, 0.01, 0.01)
}
}
}
gltf/embedded_image_handling=1

BIN
godot/Domino_Domino_Colour.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,35 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ds1wgysoytgp3"
path.s3tc="res://.godot/imported/Domino_Domino_Colour.png-07a86699fb9aab3fc9c77e79728398fd.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Domino_Domino_Colour.png"
dest_files=["res://.godot/imported/Domino_Domino_Colour.png-07a86699fb9aab3fc9c77e79728398fd.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@ -1,6 +0,0 @@
<Project Sdk="Godot.NET.Sdk/4.1.3">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
</Project>

View File

@ -1,6 +0,0 @@
<Project Sdk="Godot.NET.Sdk/4.1.1">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
</Project>

File diff suppressed because one or more lines are too long

View File

@ -1,25 +0,0 @@
[gd_scene load_steps=4 format=3 uid="uid://db3h7pscfif84"]
[ext_resource type="PackedScene" uid="uid://dl005e2rvn86b" path="res://balloon.glb" id="1_sa42c"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_wfeli"]
friction = 0.0
bounce = 12.8
[sub_resource type="SphereShape3D" id="SphereShape3D_pjfh4"]
radius = 0.258256
[node name="balloon" instance=ExtResource("1_sa42c")]
mass = 0.1
physics_material_override = SubResource("PhysicsMaterial_wfeli")
gravity_scale = 0.0
[node name="Balloon_String" parent="." index="2"]
transform = Transform3D(-0.002, 0, -1.74846e-10, 0, 0.286, 0, 1.74846e-10, 0, -0.002, 0, -0.378486, 0)
[node name="Balloon" parent="." index="3"]
transform = Transform3D(0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, 0, 0, 0)
[node name="CollisionShape3D" parent="." index="4"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.239173, 0)
shape = SubResource("SphereShape3D_pjfh4")

View File

@ -1,7 +0,0 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://bnn6mfpgaqxvb"]
[ext_resource type="Shader" path="res://Objects/balloon/balloon_shader.gdshader" id="1_i5nh0"]
[resource]
render_priority = 0
shader = ExtResource("1_i5nh0")

View File

@ -1,8 +0,0 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://cqhehgwersrkl"]
[resource]
albedo_color = Color(1, 0, 0, 1)
metallic = 0.26
roughness = 0.0
clearcoat_enabled = true
clearcoat_roughness = 0.83

View File

@ -1,9 +0,0 @@
shader_type spatial;
render_mode specular_schlick_ggx;
void fragment() {
ALBEDO = vec3(255.0, 0.0, 0.0);
METALLIC = 0.9;
ROUGHNESS = 0.2;
ALPHA = 0.98;
}

View File

@ -1,8 +0,0 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://3r1biqr3c4l7"]
[resource]
resource_name = "string"
cull_mode = 2
vertex_color_use_as_albedo = true
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
roughness = 0.5

View File

@ -1,8 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://dkoiku0t4b0o7"]
[ext_resource type="PackedScene" uid="uid://4imncqpi4gw5" path="res://string.glb" id="1_otewq"]
[node name="string" instance=ExtResource("1_otewq")]
[node name="Balloon_String" parent="." index="0"]
transform = Transform3D(-0.00735031, 1.59288e-05, -5.56369e-06, 1.21871e-07, 1, -6.21002e-06, 5.56359e-06, -0.000844878, -0.00735031, 0, -1.5621, 0)

View File

@ -1,19 +0,0 @@
extends Node3D
var delta := 1.0 / float(Engine.physics_ticks_per_second)
func _ready():
Engine.get_physics_frames()
TAS_System.FrameIncremented.connect(frame_inc)
TAS_System.FramesAdvanced.connect(frames_change)
TAS_System.FramesRegressed.connect(frames_change)
func frame_inc(frame: int):
%AnimationTree.advance(delta)
func frames_change(start: int, end: int):
%AnimationTree.advance((end - start)*delta)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

View File

@ -1,57 +0,0 @@
[gd_scene load_steps=9 format=3 uid="uid://cfpiau12q3fut"]
[ext_resource type="PackedScene" uid="uid://c2kmady6gqslx" path="res://child.glb" id="1_rqu88"]
[ext_resource type="Script" path="res://animation_tree.gd" id="2_tcc3g"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_uc42e"]
animation = &"JumpingJacksNLA"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ijpln"]
animation = &"JumpingJacksNLA"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_57k3o"]
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_3idly"]
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_h2mkw"]
switch_mode = 2
advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_u0o4a"]
states/JumpingJacksNLA/node = SubResource("AnimationNodeAnimation_ijpln")
states/JumpingJacksNLA/position = Vector2(559, 54)
"states/JumpingJacksNLA 2/node" = SubResource("AnimationNodeAnimation_uc42e")
"states/JumpingJacksNLA 2/position" = Vector2(633, 131)
transitions = ["JumpingJacksNLA", "JumpingJacksNLA 2", SubResource("AnimationNodeStateMachineTransition_57k3o"), "JumpingJacksNLA 2", "JumpingJacksNLA", SubResource("AnimationNodeStateMachineTransition_3idly"), "Start", "JumpingJacksNLA", SubResource("AnimationNodeStateMachineTransition_h2mkw")]
[node name="child" instance=ExtResource("1_rqu88")]
[node name="Skeleton3D" parent="Armature" index="0"]
bones/0/position = Vector3(0, 2.32035, 0)
bones/3/rotation = Quaternion(0.0514876, -5.4438e-17, -2.71031e-16, 0.998674)
bones/5/rotation = Quaternion(0.0965706, 0.063607, -0.119505, 0.986077)
bones/6/rotation = Quaternion(0.0206859, -0.0873376, 0.0694537, 0.993539)
bones/7/rotation = Quaternion(0.00777981, 0.0423361, -0.0822345, 0.995683)
bones/9/rotation = Quaternion(0.0965705, -0.063607, 0.119505, 0.986077)
bones/10/rotation = Quaternion(0.0206859, 0.0873376, -0.0694538, 0.993539)
bones/11/rotation = Quaternion(0.00777978, -0.0423361, 0.0822345, 0.995683)
bones/12/rotation = Quaternion(0.626251, 0.334163, 0.616519, -0.340661)
bones/13/rotation = Quaternion(-0.27126, -0.0288476, 0.0393126, 0.96127)
bones/14/rotation = Quaternion(-0.0251956, -0.00324478, 0.00115795, 0.999677)
bones/15/rotation = Quaternion(0.0339653, 0.0223564, -0.693306, 0.719495)
bones/16/rotation = Quaternion(0.626251, -0.334163, -0.616519, -0.340661)
bones/17/rotation = Quaternion(-0.27126, 0.0288476, -0.0393126, 0.96127)
bones/18/rotation = Quaternion(-0.0251956, 0.00324479, -0.00115795, 0.999677)
bones/19/rotation = Quaternion(0.0339653, -0.0223564, 0.693306, 0.719495)
[node name="AnimationTree" type="AnimationTree" parent="." index="2"]
unique_name_in_owner = true
tree_root = SubResource("AnimationNodeStateMachine_u0o4a")
anim_player = NodePath("../AnimationPlayer")
active = true
process_callback = 2
script = ExtResource("2_tcc3g")

BIN
godot/Objects/child/child_Child_Colour.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://75axeu8xnj41"
path.bptc="res://.godot/imported/child_Child_Colour.png-c4c784e55c596fd0d230ba7bb48dd996.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://Objects/child/child_Child_Colour.png"
dest_files=["res://.godot/imported/child_Child_Colour.png-c4c784e55c596fd0d230ba7bb48dd996.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Objects/child/child_Child_Normal.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5s7geaamdsd1"
path.bptc="res://.godot/imported/child_Child_Normal.png-e0c80530ce3d1ba886433b18216a7e2c.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://Objects/child/child_Child_Normal.png"
dest_files=["res://.godot/imported/child_Child_Normal.png-e0c80530ce3d1ba886433b18216a7e2c.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://child_Child_Normal.png"
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bvkvdhygvvxae"
path.s3tc="res://.godot/imported/Domino_Domino_Colour.png-067d515b08069aa1e54b6d66cb76bf8b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://Objects/domino/Domino_Domino_Colour.png"
dest_files=["res://.godot/imported/Domino_Domino_Colour.png-067d515b08069aa1e54b6d66cb76bf8b.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

File diff suppressed because one or more lines are too long

View File

@ -1,16 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://b7qky0n2ea40e"]
[ext_resource type="PackedScene" uid="uid://dmttoc025f26x" path="res://Domino.glb" id="1_n2u88"]
[sub_resource type="BoxShape3D" id="BoxShape3D_ndu5u"]
size = Vector3(0.153, 0.279, 0.066)
[node name="Domino" instance=ExtResource("1_n2u88")]
mass = 20.0
[node name="Domino2" parent="." index="2"]
transform = Transform3D(0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, 0, 0, 0)
[node name="CollisionShape3D" parent="." index="3"]
transform = Transform3D(0.999984, 0, 0, 0, 0.999984, 0, 0, 0, 0.999984, 0, 0, 0)
shape = SubResource("BoxShape3D_ndu5u")

File diff suppressed because one or more lines are too long

BIN
godot/Objects/igloo/igloo_Igloo_Colour.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbqufebenynym"
path.bptc="res://.godot/imported/igloo_Igloo_Colour.png-3593c486967c2287e44aad91030db888.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://Objects/igloo/igloo_Igloo_Colour.png"
dest_files=["res://.godot/imported/igloo_Igloo_Colour.png-3593c486967c2287e44aad91030db888.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Objects/igloo/igloo_Igloo_Normal.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://7w2x04tm1opn"
path.bptc="res://.godot/imported/igloo_Igloo_Normal.png-ca22887363a6b45a9fd447d212cdb2df.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://Objects/igloo/igloo_Igloo_Normal.png"
dest_files=["res://.godot/imported/igloo_Igloo_Normal.png-ca22887363a6b45a9fd447d212cdb2df.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://igloo_Igloo_Normal.png"
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@ -1,15 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://y0mo5gxmd08q"]
[ext_resource type="PackedScene" uid="uid://b7kpas3rxox0u" path="res://present.glb" id="1_420vr"]
[sub_resource type="BoxShape3D" id="BoxShape3D_v5kqf"]
size = Vector3(2.18126, 1.97943, 2.07727)
[node name="present" instance=ExtResource("1_420vr")]
[node name="Present" parent="." index="2"]
transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 0, 0)
[node name="CollisionShape3D" parent="." index="3"]
transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 0, 0)
shape = SubResource("BoxShape3D_v5kqf")

View File

@ -8,15 +8,6 @@ public partial class TAS_System : Node
private double _timeSinceLastFrame; private double _timeSinceLastFrame;
private int _currentFrame = 0; private int _currentFrame = 0;
private int _lastAdvancedFrame = 0; private int _lastAdvancedFrame = 0;
[Export]
public double min_speed = 1.0;
[Export]
public double max_speed = 10.0;
// Number of ms passed while speeding up
[Export]
public double speed = 0.0;
[Export]
public double exp_speed_base = 1.05;
public double FrameLength public double FrameLength
{ {
@ -73,42 +64,21 @@ public partial class TAS_System : Node
[Signal] [Signal]
public delegate void FramesRegressedEventHandler(int startFrame, int endFrame); public delegate void FramesRegressedEventHandler(int startFrame, int endFrame);
[Signal]
public delegate void StartedIncrementingEventHandler();
[Signal]
public delegate void StoppedIncrementingEventHandler();
[Signal]
public delegate void FramesResetEventHandler();
[Signal]
public delegate void SpeedChangeEventHandler(float speed);
public void StartIncrementingFrames() public void StartIncrementingFrames()
{
if (this.IsIncrementingFrames == false)
{ {
this.IsIncrementingFrames = true; this.IsIncrementingFrames = true;
EmitSignal(SignalName.StartedIncrementing);
}
} }
public void StopIncrementingFrames() public void StopIncrementingFrames()
{
if (this.IsIncrementingFrames == true)
{ {
this.IsIncrementingFrames = false; this.IsIncrementingFrames = false;
EmitSignal(SignalName.StoppedIncrementing);
}
} }
public void ResetFrameCount() public void ResetFrameCount()
{ {
this.CurrentFrame = 0; this.CurrentFrame = 0;
this.LastAdvancedFrame = 0; this.LastAdvancedFrame = 0;
EmitSignal(SignalName.FramesReset);
} }
// Returns how many frames it could successfully advance // Returns how many frames it could successfully advance
@ -121,25 +91,6 @@ public partial class TAS_System : Node
return framesAdvanced; return framesAdvanced;
} }
public int AdvanceWithSpeedup(double time_delta) {
speed += time_delta;
speed = Math.Clamp(speed, min_speed, max_speed);
EmitSignal(SignalName.SpeedChange, speed);
return Advance((int)Math.Pow(exp_speed_base, speed));
}
public int RegressWithSpeedup(double time_delta) {
speed += time_delta;
speed = Math.Clamp(speed, min_speed, max_speed);
EmitSignal(SignalName.SpeedChange, speed);
return Regress((int)Math.Pow(exp_speed_base, speed));
}
public void ResetSpeedup() {
speed = 0.0;
EmitSignal(SignalName.SpeedChange, speed);
}
// Returns how many frames it could successfully regress // Returns how many frames it could successfully regress
public int Regress(int numFrames) public int Regress(int numFrames)
{ {
@ -171,15 +122,14 @@ public partial class TAS_System : Node
this.TimeSinceLastFrame = 0 + (this.TimeSinceLastFrame - this.FrameLength); this.TimeSinceLastFrame = 0 + (this.TimeSinceLastFrame - this.FrameLength);
} }
} }
// GD.Print(CurrentFrame);
} }
// public void Test()
// {
// GD.Print("test123");
// // EmitSignal(SignalName.TestSignal, "test456");
// }
public override void _Ready()
{
this.FrameLength = 1/60;
this.StartIncrementingFrames();
}
} }

View File

@ -1,93 +1,33 @@
using Godot; using Godot;
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Threading;
public partial class TASable : Node public partial class TASable : Node
{ {
[Export] RigidBody3D _assignedRigidBody3D; Node3D _parent;
public RigidBody3D AssignedRigidBody3D
{
get { return this._assignedRigidBody3D; }
}
// Frame data
public Dictionary<int, Vector3> framePositions = new Dictionary<int, Vector3>();
public Dictionary<int, Vector3> frameRotations = new Dictionary<int, Vector3>();
public Dictionary<int, Vector3> frameLinearVelocities = new Dictionary<int, Vector3>();
public Dictionary<int, Vector3> frameAngularVelocities = new Dictionary<int, Vector3>();
public virtual void SaveState(int frame)
{
this.framePositions[frame] = this.AssignedRigidBody3D.Position;
this.frameRotations[frame] = this.AssignedRigidBody3D.Rotation;
this.frameLinearVelocities[frame] = this.AssignedRigidBody3D.LinearVelocity;
this.frameAngularVelocities[frame] = this.AssignedRigidBody3D.AngularVelocity;
}
public virtual void LoadState(int frame)
{
this.AssignedRigidBody3D.Position = this.framePositions[frame];
this.AssignedRigidBody3D.Rotation = this.frameRotations[frame];
this.AssignedRigidBody3D.LinearVelocity = this.frameLinearVelocities[frame];
this.AssignedRigidBody3D.AngularVelocity = this.frameAngularVelocities[frame];
}
public override void _Ready() public override void _Ready()
{ {
if (this._assignedRigidBody3D is null) this._parent = this.GetParent<Node3D>();
{
this._assignedRigidBody3D = this.GetParent<RigidBody3D>();
}
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System"); TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
TAS.FrameIncremented += this.OnFrameIncremented; TAS.FrameIncremented += this.OnFrameIncremented;
TAS.FramesAdvanced += this.OnFramesAdvanced; TAS.FramesAdvanced += this.OnFramesAdvanced;
TAS.FramesRegressed += this.OnFramesRegressed; TAS.FramesRegressed += this.OnFramesRegressed;
TAS.StartedIncrementing += this.OnStartedIncrementing;
TAS.StoppedIncrementing += this.OnStoppedIncrementing;
TAS.FramesReset += this.OnFramesReset;
this.SaveState(0);
} }
public virtual void OnFrameIncremented(int newFrame) public virtual void OnFrameIncremented(int newFrame)
{ {
this.SaveState(newFrame); GD.Print($"Frame advanced to {newFrame}, called from node {_parent.Name}");
// GD.Print($"Frame advanced to {newFrame}, called from node {this.AssignedRigidBody3D.Name}");
} }
public virtual void OnFramesAdvanced(int startFrame, int endFrame) public virtual void OnFramesAdvanced(int startFrame, int endFrame)
{ {
this.LoadState(endFrame); GD.Print($"Frames advanced from {startFrame} to {endFrame}, called from node {_parent.Name}");
// GD.Print($"Frames advanced from {startFrame} to {endFrame}, called from node {this.AssignedRigidBody3D.Name}");
} }
public virtual void OnFramesRegressed(int startFrame, int endFrame) public virtual void OnFramesRegressed(int startFrame, int endFrame)
{ {
this.LoadState(endFrame); GD.Print($"Frames regressed from {startFrame} to {endFrame}, called from node {_parent.Name}");
// GD.Print($"Frames regressed from {startFrame} to {endFrame}, called from node {this.AssignedRigidBody3D.Name}");
}
public virtual void OnStartedIncrementing()
{
this.AssignedRigidBody3D.Freeze = false;
this.AssignedRigidBody3D.LockRotation = false;
}
public virtual void OnStoppedIncrementing()
{
this.AssignedRigidBody3D.Freeze = true;
this.AssignedRigidBody3D.LockRotation = true;
}
public virtual void OnFramesReset()
{
this.SaveState(0);
} }
} }

View File

@ -1,52 +0,0 @@
using Godot;
using System;
public partial class TimescaleSystem : Node
{
[Export] public double SlowLength = 1.0;
[Export] public double SlowMagnitude = 0.2;
Node controller;
public override void _Ready()
{
controller = GetNode<Node>("/root/ControllerEventBus");
Callable callable = new Callable(this, MethodName.OnControllerContact);
controller.Connect("new_target", callable);
this.OnControllerContact(this);
}
public void OnControllerContact(Node node)
{
GD.Print("toUCHED!");
Engine.TimeScale = this.SlowMagnitude;
Timer timer = new Timer();
timer.Name = "SlowTimer";
this.AddChild(timer);
timer.WaitTime = this.SlowLength * this.SlowMagnitude;
timer.OneShot = true;
timer.Timeout += () => {
GD.Print("TimE!");
Engine.TimeScale = 1.0;
timer.QueueFree();
};
timer.Start();
}
}

View File

@ -1,6 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://bs3yqnctxfwaa"]
[ext_resource type="Script" path="res://Timescale_System/TimescaleSystem.cs" id="1_6tt5j"]
[node name="TimescaleSystem" type="Node"]
script = ExtResource("1_6tt5j")

View File

@ -4,25 +4,12 @@ using System;
public partial class AdvanceButton : Button public partial class AdvanceButton : Button
{ {
TAS_System TAS; TAS_System TAS;
bool isButtonPressed = false;
// Called when the node enters the scene tree for the first time. // Called when the node enters the scene tree for the first time.
public override void _Ready() public override void _Ready()
{ {
TAS = GetNode<TAS_System>("/root/TAS_System"); TAS = GetNode<TAS_System>("/root/TAS_System");
this.Pressed += () => { TAS.Advance(1); };
AudioStreamPlayer buttonSound = this.GetNode<AudioStreamPlayer>("../../ButtonSound");
bool playSound = true;
this.Pressed += () => {
TAS.Advance(1);
if (playSound) buttonSound.Play();
playSound = false;
};
this.ButtonDown += () => { this.isButtonPressed = true; };
this.ButtonUp += () => { this.isButtonPressed = false; TAS.ResetSpeedup(); playSound = true; };
} }
// Called every frame. 'delta' is the elapsed time since the previous frame. // Called every frame. 'delta' is the elapsed time since the previous frame.
@ -31,18 +18,10 @@ public partial class AdvanceButton : Button
if (TAS.AdvancedFramesRemaining == 0) if (TAS.AdvancedFramesRemaining == 0)
{ {
this.Disabled = true; this.Disabled = true;
TAS.ResetSpeedup();
this.isButtonPressed = false;
} }
else else
{ {
this.Disabled = false; this.Disabled = false;
if (this.isButtonPressed)
{
TAS.AdvanceWithSpeedup(delta);
} }
} }
} }
}

View File

@ -1,4 +0,0 @@
extends Label
func _process(delta):
text = "Speed: " + str(TAS_System.speed)

View File

@ -3,49 +3,15 @@ using System;
public partial class RegressButton : Button public partial class RegressButton : Button
{ {
TAS_System TAS;
bool isButtonPressed = false;
// Called when the node enters the scene tree for the first time. // Called when the node enters the scene tree for the first time.
public override void _Ready() public override void _Ready()
{ {
TAS = GetNode<TAS_System>("/root/TAS_System"); TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
AudioStreamPlayer buttonSound = this.GetNode<AudioStreamPlayer>("../../ButtonSound"); this.Pressed += () => { TAS.Regress(1); };
bool playSound = true;
this.Pressed += () => {
TAS.Regress(1);
if (playSound) buttonSound.Play();
playSound = false;
};
this.ButtonDown += () => { this.isButtonPressed = true; TAS.StopIncrementingFrames(); };
this.ButtonUp += () => { this.isButtonPressed = false; TAS.ResetSpeedup(); playSound = true; };
} }
public virtual void OnFrameIncremented(int newFrame) public virtual void OnFrameIncremented(int newFrame)
{ {
this.Text = $"Current frame: {newFrame}"; this.Text = $"Current frame: {newFrame}";
} }
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
if (TAS.CurrentFrame == 0)
{
this.Disabled = true;
TAS.ResetSpeedup();
this.isButtonPressed = false;
}
else
{
this.Disabled = false;
if (this.isButtonPressed)
{
TAS.RegressWithSpeedup(delta);
}
}
}
} }

View File

@ -1,28 +0,0 @@
extends Control
func _input(event):
var f: Callable
if event.is_pressed():
f = press
else:
f = release
if event.is_action("regress"):
f.call($FrameButtons/RegressButton)
elif event.is_action("advance"):
f.call($FrameButtons/AdvanceButton)
elif event.is_action("increment"):
if TAS_System.IsIncrementingFrames:
f.call($TASButtons/StopIncrementButton)
else:
f.call($TASButtons/StartIncrementButton)
func press(btn: Button):
btn.button_pressed = true
btn.pressed.emit()
btn.button_down.emit()
func release(btn: Button):
btn.button_pressed = false
btn.button_up.emit()

View File

@ -1,12 +1,8 @@
[gd_scene load_steps=11 format=3 uid="uid://b1uf31ed6h0ir"] [gd_scene load_steps=7 format=3 uid="uid://b1uf31ed6h0ir"]
[ext_resource type="Script" path="res://UI/TAS UI/CurrentFrameLabel.cs" id="1_27u4w"] [ext_resource type="Script" path="res://UI/TAS UI/CurrentFrameLabel.cs" id="1_27u4w"]
[ext_resource type="Script" path="res://UI/TAS UI/TAS UI.gd" id="1_ytl0x"]
[ext_resource type="Script" path="res://UI/TAS UI/RegressButton.cs" id="2_fhmsa"] [ext_resource type="Script" path="res://UI/TAS UI/RegressButton.cs" id="2_fhmsa"]
[ext_resource type="AudioStream" uid="uid://cio6yfcnyf2lx" path="res://audio/note.wav" id="2_nsxig"]
[ext_resource type="Script" path="res://UI/TAS UI/Label2.gd" id="2_otida"]
[ext_resource type="Script" path="res://UI/TAS UI/AdvanceButton.cs" id="3_0ti6q"] [ext_resource type="Script" path="res://UI/TAS UI/AdvanceButton.cs" id="3_0ti6q"]
[ext_resource type="Script" path="res://UI/TAS UI/UIAudioPlayer.cs" id="3_251uv"]
[ext_resource type="Script" path="res://UI/TAS UI/StopIncrementButton.cs" id="4_4gd4c"] [ext_resource type="Script" path="res://UI/TAS UI/StopIncrementButton.cs" id="4_4gd4c"]
[ext_resource type="Script" path="res://UI/TAS UI/StartIncrementButton.cs" id="5_5af83"] [ext_resource type="Script" path="res://UI/TAS UI/StartIncrementButton.cs" id="5_5af83"]
[ext_resource type="Script" path="res://UI/TAS UI/ResetFramesButton.cs" id="6_nwwkv"] [ext_resource type="Script" path="res://UI/TAS UI/ResetFramesButton.cs" id="6_nwwkv"]
@ -18,22 +14,14 @@ anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
mouse_filter = 2
script = ExtResource("1_ytl0x")
[node name="ButtonSound" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_nsxig")
script = ExtResource("3_251uv")
[node name="DEBUG" type="Control" parent="."] [node name="DEBUG" type="Control" parent="."]
visible = false
layout_mode = 1 layout_mode = 1
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
mouse_filter = 2
[node name="Label" type="Label" parent="DEBUG"] [node name="Label" type="Label" parent="DEBUG"]
layout_mode = 1 layout_mode = 1
@ -46,21 +34,7 @@ grow_vertical = 0
text = "Current Frame: 0" text = "Current Frame: 0"
script = ExtResource("1_27u4w") script = ExtResource("1_27u4w")
[node name="Label2" type="Label" parent="DEBUG"]
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 2.0
offset_top = -55.0
offset_right = 201.0
offset_bottom = -29.0
grow_vertical = 0
text = "Current Frame: 0"
script = ExtResource("2_otida")
[node name="FrameButtons" type="Control" parent="."] [node name="FrameButtons" type="Control" parent="."]
visible = false
layout_mode = 1 layout_mode = 1
anchors_preset = 7 anchors_preset = 7
anchor_left = 0.5 anchor_left = 0.5
@ -79,7 +53,6 @@ anchors_preset = -1
anchor_right = 0.5 anchor_right = 0.5
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_vertical = 2 grow_vertical = 2
focus_mode = 0
text = "Regress" text = "Regress"
script = ExtResource("2_fhmsa") script = ExtResource("2_fhmsa")
@ -90,13 +63,11 @@ anchor_left = 0.5
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_vertical = 2 grow_vertical = 2
focus_mode = 0
disabled = true disabled = true
text = "Advance" text = "Advance"
script = ExtResource("3_0ti6q") script = ExtResource("3_0ti6q")
[node name="TASButtons" type="Control" parent="."] [node name="TASButtons" type="Control" parent="."]
visible = false
layout_mode = 1 layout_mode = 1
anchors_preset = 3 anchors_preset = 3
anchor_left = 1.0 anchor_left = 1.0
@ -114,7 +85,6 @@ anchors_preset = 10
anchor_right = 1.0 anchor_right = 1.0
offset_bottom = 31.0 offset_bottom = 31.0
grow_horizontal = 2 grow_horizontal = 2
focus_mode = 0
text = "Stop Increment" text = "Stop Increment"
script = ExtResource("4_4gd4c") script = ExtResource("4_4gd4c")
@ -128,7 +98,6 @@ offset_top = -15.5
offset_bottom = 15.5 offset_bottom = 15.5
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
focus_mode = 0
text = "Start Increment" text = "Start Increment"
script = ExtResource("5_5af83") script = ExtResource("5_5af83")
@ -141,6 +110,5 @@ anchor_bottom = 1.0
offset_top = -31.0 offset_top = -31.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 0 grow_vertical = 0
focus_mode = 0
text = "Reset Frames" text = "Reset Frames"
script = ExtResource("6_nwwkv") script = ExtResource("6_nwwkv")

View File

@ -1,15 +0,0 @@
using Godot;
using System;
public partial class UIAudioPlayer : AudioStreamPlayer
{
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
}

View File

@ -1,14 +0,0 @@
extends AnimationTree
var delta := 1.0 / float(Engine.physics_ticks_per_second)
func _ready():
TAS_System.FrameIncremented.connect(frame_inc)
TAS_System.FramesAdvanced.connect(frames_change)
TAS_System.FramesRegressed.connect(frames_change)
func frame_inc(_frame: int):
advance(delta)
func frames_change(start: int, end: int):
advance((end - start)*delta)

BIN
godot/audio/TricksterGhost.mp3 (Stored with Git LFS)

Binary file not shown.

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://b88pn0htpxvo3"
path="res://.godot/imported/TricksterGhost.mp3-9e9257851e7178f1dea40efb12b41b62.mp3str"
[deps]
source_file="res://audio/TricksterGhost.mp3"
dest_files=["res://.godot/imported/TricksterGhost.mp3-9e9257851e7178f1dea40efb12b41b62.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

BIN
godot/audio/TricksterGhostNew.mp3 (Stored with Git LFS)

Binary file not shown.

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://dw06bektw4j8m"
path="res://.godot/imported/TricksterGhostNew.mp3-04c37f493148cbf09dc4a34a27263367.mp3str"
[deps]
source_file="res://audio/TricksterGhostNew.mp3"
dest_files=["res://.godot/imported/TricksterGhostNew.mp3-04c37f493148cbf09dc4a34a27263367.mp3str"]
[params]
loop=true
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://c5v6c6x05lqg3"
path="res://.godot/imported/billiard-clack.wav-3f99ec74be11d1cb465d3dc06a94b10f.sample"
[deps]
source_file="res://audio/billiard-clack.wav"
dest_files=["res://.godot/imported/billiard-clack.wav-3f99ec74be11d1cb465d3dc06a94b10f.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://ckhf7ksthi053"
path="res://.godot/imported/charge.wav-9ea0e7ab134da578b6f69151780ec24f.sample"
[deps]
source_file="res://audio/charge.wav"
dest_files=["res://.godot/imported/charge.wav-9ea0e7ab134da578b6f69151780ec24f.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
godot/audio/error.mp3 (Stored with Git LFS)

Binary file not shown.

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bg07vavc0duo5"
path="res://.godot/imported/error.mp3-e904d198a343e1da5de4876587f3ccef.mp3str"
[deps]
source_file="res://audio/error.mp3"
dest_files=["res://.godot/imported/error.mp3-e904d198a343e1da5de4876587f3ccef.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://d2ncd2qoklbbe"
path="res://.godot/imported/impact.wav-606f8b40b78eec03bfd2693747f9e1cb.sample"
[deps]
source_file="res://audio/impact.wav"
dest_files=["res://.godot/imported/impact.wav-606f8b40b78eec03bfd2693747f9e1cb.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://cio6yfcnyf2lx"
path="res://.godot/imported/note.wav-f74766d8f2fafbaa9729bf4b58d8f300.sample"
[deps]
source_file="res://audio/note.wav"
dest_files=["res://.godot/imported/note.wav-f74766d8f2fafbaa9729bf4b58d8f300.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

BIN
godot/balloon.glb (Stored with Git LFS)

Binary file not shown.

View File

@ -1,50 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dl005e2rvn86b"
path="res://.godot/imported/balloon.glb-1dbd4246a6d2ad23da187ebfe5c7e652.scn"
[deps]
source_file="res://balloon.glb"
dest_files=["res://.godot/imported/balloon.glb-1dbd4246a6d2ad23da187ebfe5c7e652.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path="res://physics/import_billiard.gd"
_subresources={
"materials": {
"balloon": {
"use_external/enabled": true,
"use_external/path": "res://Objects/balloon/balloon_material_standard.tres"
},
"string": {
"use_external/enabled": true,
"use_external/path": "res://Objects/balloon/string.tres"
}
},
"nodes": {
"PATH:Balloon": {
"generate/physics": true,
"physics/body_type": 1,
"physics/shape_type": 3
}
}
}
gltf/embedded_image_handling=1

BIN
godot/cake.glb (Stored with Git LFS)

Binary file not shown.

View File

@ -1,53 +0,0 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://djj412h1ien4o"
path="res://.godot/imported/cake.glb-e60e073e8642f273d1a78ec90c85894b.scn"
[deps]
source_file="res://cake.glb"
dest_files=["res://.godot/imported/cake.glb-e60e073e8642f273d1a78ec90c85894b.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path="res://physics/import_billiard.gd"
_subresources={
"materials": {
"cake": {
"use_external/enabled": true,
"use_external/path": "res://cake.tres"
},
"candles": {
"use_external/enabled": true,
"use_external/path": "res://candles.tres"
}
},
"nodes": {
"PATH:cake2": {
"generate/physics": true,
"physics/body_type": 1,
"physics/shape_type": 5,
"primitive/height": 0.244,
"primitive/position": Vector3(0, 0.042, 0),
"primitive/radius": 0.219
}
}
}
gltf/embedded_image_handling=1

View File

@ -1,12 +0,0 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://b8htfw5f1a4wf"]
[ext_resource type="Texture2D" uid="uid://dhyh1g25bmhtf" path="res://cake_cake_albedo.png" id="1_jefwg"]
[ext_resource type="Texture2D" uid="uid://cer3pk0fspi1c" path="res://cake_cake_normals.png" id="2_55xkl"]
[resource]
resource_name = "cake"
vertex_color_use_as_albedo = true
albedo_texture = ExtResource("1_jefwg")
roughness = 0.5
normal_enabled = true
normal_texture = ExtResource("2_55xkl")

View File

@ -1,8 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://cx4ohbn84hmc3"]
[ext_resource type="PackedScene" uid="uid://djj412h1ien4o" path="res://cake.glb" id="1_q3mni"]
[node name="cake" instance=ExtResource("1_q3mni")]
[node name="CollisionShape3D" parent="." index="4"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0367587, 0)

BIN
godot/cake_cake_albedo.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dhyh1g25bmhtf"
path.bptc="res://.godot/imported/cake_cake_albedo.png-8e7e933b04d67a69b2a262d9cdfe2bb0.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://cake_cake_albedo.png"
dest_files=["res://.godot/imported/cake_cake_albedo.png-8e7e933b04d67a69b2a262d9cdfe2bb0.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/cake_cake_normals.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,36 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cer3pk0fspi1c"
path.bptc="res://.godot/imported/cake_cake_normals.png-85023f0c4cf5997d4101eb078e7a1400.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={}
[deps]
source_file="res://cake_cake_normals.png"
dest_files=["res://.godot/imported/cake_cake_normals.png-85023f0c4cf5997d4101eb078e7a1400.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://cake_cake_normals.png"
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@ -1,8 +0,0 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://li4gdaji6poj"]
[resource]
resource_name = "candles"
cull_mode = 2
vertex_color_use_as_albedo = true
albedo_color = Color(0.453326, 0, 0.0696221, 1)
roughness = 0.5

BIN
godot/child.glb (Stored with Git LFS)

Binary file not shown.

File diff suppressed because it is too large Load Diff

BIN
godot/child_Child_Colour.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,35 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ykvmuu6gxuom"
path.s3tc="res://.godot/imported/child_Child_Colour.png-f361e4e6aa172920dd7d8097cc2e5595.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://child_Child_Colour.png"
dest_files=["res://.godot/imported/child_Child_Colour.png-f361e4e6aa172920dd7d8097cc2e5595.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/child_Child_Normal.png (Stored with Git LFS)

Binary file not shown.

View File

@ -1,35 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cgwi7p5178xwg"
path.s3tc="res://.godot/imported/child_Child_Normal.png-2c56fd0195c1c8de3aa3abb3c7b11f2f.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://child_Child_Normal.png"
dest_files=["res://.godot/imported/child_Child_Normal.png-2c56fd0195c1c8de3aa3abb3c7b11f2f.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://child_Child_Normal.png"
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@ -11,7 +11,7 @@ void vertex() {
void fragment() { void fragment() {
float scale = 50.0; float scale = 50.0;
float speed = 1000.0; float speed = 1000.0;
float f = random2(UV + round(TIME*speed)/speed); float f = random2(round(UV * scale)/scale + round(TIME*speed)/speed);
if (f > 0.1) { if (f > 0.1) {
discard; discard;
} }

Binary file not shown.

View File

@ -4,135 +4,26 @@ extends Node3D
@export var initial_target: Node3D @export var initial_target: Node3D
var target: Targetable = null var target: Targetable = null
@export var sensitivity := 0.01 @export var sensitivity := 0.01
@export var controller_sensitivity := 0.04
@export var charge_time := 1.7
@export var min_charge := 0.2
var camera_tweening = false
var time_targets := Dictionary()
func _ready(): func _ready():
set_target(initial_target, false) set_target(initial_target)
time_targets[0] = target
camera.set_as_top_level(true)
ControllerEventBus.billiard_touched_billiard.connect(_on_billiard_touched_billiard)
TAS_System.FrameIncremented.connect(frame_inc)
TAS_System.FramesAdvanced.connect(frames_change)
TAS_System.FramesRegressed.connect(frames_change)
TAS_System.FramesReset.connect(frames_reset)
func frame_inc(frame: int):
time_targets[frame] = target
func frames_change(_start: int, end: int):
if not time_targets.has(end):
return
if time_targets[end] != target:
set_target(time_targets[end].get_billiard())
func frames_reset():
time_targets = Dictionary()
time_targets[0] = target
func _on_billiard_touched_billiard(who: Billiard, touched: Billiard):
var who_target = Targetable.is_targetable(who)
if who_target != target or who.can_hit:
return
set_target(touched)
ControllerEventBus.new_target.emit(touched)
func get_charge():
return %radial_ui.charge_amount
func _input(event): func _input(event):
var billiard := target.get_billiard() if event is InputEventMouseMotion:
if camera_tweening or not MouseControl.mouse_is_locked():
return
if event is InputEventMouseMotion and get_charge() == 0.0 :
rotate_view(event.relative*sensitivity) rotate_view(event.relative*sensitivity)
if event.is_action_released("charge") and not billiard.can_hit and charge_tween != null:
release()
if event.is_action_pressed("charge") and charge_tween == null:
if billiard.can_hit:
charge(event.get_action_strength("charge"))
else:
$NoChargesSound.play()
func _process(_delta): func _process(_delta):
if target.get_billiard().can_hit:
set_strobe(strobe_amount)
else:
set_strobe(0.0)
transform.origin = target.global_position transform.origin = target.global_position
%camera_spot.look_at(target.global_position) camera.global_position = %camera_spot.global_position
if not camera_tweening: camera.look_at(target.global_position)
camera.global_transform = %camera_spot.global_transform
else:
camera.global_position = lerp(camera.global_position, %camera_spot.global_position, 0.5)
camera.global_rotation = lerp(camera.global_rotation, %camera_spot.global_rotation, 0.5)
var epsilon: float = 0.005
if (camera.global_position - %camera_spot.global_position).length() <= epsilon and (camera.global_rotation - %camera_spot.global_rotation).length() <= epsilon:
camera_tweening = false
if get_charge() >= 1.0:
cancel_charge()
var look := Input.get_vector("look_left", "look_right", "loop_up", "look_down")
rotate_view(look*controller_sensitivity)
func cancel_charge():
%radial_ui.set_charge(0.0)
%ChargeSound.stop()
if charge_tween != null:
charge_tween.kill()
charge_tween = null
var billiard := target.get_billiard()
billiard.can_hit = true
func release():
if get_charge() <= min_charge:
cancel_charge()
return
%ChargeReleaseSound.volume_db = get_charge() * 12
%ChargeReleaseSound.play()
var billiard := target.get_billiard()
TAS_System.StartIncrementingFrames()
billiard.hit((target.global_position - %camera_spot.global_position).normalized(), get_charge())
%radial_ui.set_charge(0.0)
%ChargeSound.stop()
if charge_tween != null:
charge_tween.kill()
charge_tween = null
var charge_tween: Tween = null
func charge(_amount: float):
var billiard := target.get_billiard()
billiard.can_hit = false
if charge_tween != null:
charge_tween.kill()
charge_tween = create_tween()
charge_tween.tween_method(%radial_ui.set_charge, 0.0, 1.0, charge_time)
%ChargeSound.play()
func rotate_view(amount: Vector2): func rotate_view(amount: Vector2):
rotate_y(-amount.x) rotate_y(-amount.x)
%rotate_helper.rotate_z(amount.y) %rotate_helper.rotate_z(amount.y)
%rotate_helper.rotation_degrees.z = clampf(%rotate_helper.rotation_degrees.z, -77, 77) %rotate_helper.rotation_degrees.z = clampf(%rotate_helper.rotation_degrees.z, -77, 77)
func set_target(node: Node3D):
func set_target(node: Node3D, should_create_tween=true):
camera_tweening = should_create_tween
$AnimationPlayer.seek(0)
var ntarget = Targetable.is_targetable(node) var ntarget = Targetable.is_targetable(node)
var billiard = ntarget.get_billiard()
billiard.can_hit = true
if ntarget == null: if ntarget == null:
push_error("Node is node targetable", node) push_error("Node is node targetable", node)
return return
@ -140,7 +31,3 @@ func set_target(node: Node3D, should_create_tween=true):
target.unmake_target() target.unmake_target()
ntarget.make_target() ntarget.make_target()
target = ntarget target = ntarget
@export var strobe_amount: float = 0.0
func set_strobe(c: float):
target.set_strobe(c)

View File

@ -1,31 +1,6 @@
[gd_scene load_steps=8 format=3 uid="uid://drmb4sitb74fx"] [gd_scene load_steps=2 format=3 uid="uid://drmb4sitb74fx"]
[ext_resource type="Script" path="res://control_scheme/controller.gd" id="1_h3pjb"] [ext_resource type="Script" path="res://control_scheme/controller.gd" id="1_h3pjb"]
[ext_resource type="PackedScene" uid="uid://p2n48c8st55d" path="res://control_scheme/radial_ui.tscn" id="2_qidcb"]
[ext_resource type="AudioStream" uid="uid://ckhf7ksthi053" path="res://audio/charge.wav" id="3_exgm6"]
[ext_resource type="AudioStream" uid="uid://c5v6c6x05lqg3" path="res://audio/billiard-clack.wav" id="4_12r5s"]
[ext_resource type="AudioStream" uid="uid://bg07vavc0duo5" path="res://audio/error.mp3" id="5_l6rvw"]
[sub_resource type="Animation" id="Animation_p1nwe"]
resource_name = "highlight_target"
loop_mode = 2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:strobe_amount")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [0.0, 0.3, 0.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_e1dcv"]
_data = {
"highlight_target": SubResource("Animation_p1nwe")
}
[node name="controller" type="Node3D"] [node name="controller" type="Node3D"]
top_level = true top_level = true
@ -37,23 +12,3 @@ unique_name_in_owner = true
[node name="camera_spot" type="Marker3D" parent="rotate_helper"] [node name="camera_spot" type="Marker3D" parent="rotate_helper"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
[node name="radial_ui" parent="." instance=ExtResource("2_qidcb")]
unique_name_in_owner = true
[node name="ChargeSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("3_exgm6")
[node name="ChargeReleaseSound" type="AudioStreamPlayer" parent="."]
unique_name_in_owner = true
stream = ExtResource("4_12r5s")
[node name="NoChargesSound" type="AudioStreamPlayer" parent="."]
stream = ExtResource("5_l6rvw")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
autoplay = "highlight_target"
libraries = {
"": SubResource("AnimationLibrary_e1dcv")
}

View File

@ -6,9 +6,6 @@ class_name Targetable
static func is_targetable(node: Node3D) -> Targetable: static func is_targetable(node: Node3D) -> Targetable:
return node.get_node_or_null("is_targetable") return node.get_node_or_null("is_targetable")
func get_billiard() -> Billiard:
return get_parent()
func make_target(): func make_target():
walk_meshes_post_order(self.get_parent(), change_all_materials) walk_meshes_post_order(self.get_parent(), change_all_materials)
@ -24,19 +21,21 @@ func walk_meshes_post_order(parent: Node, f: Callable):
func change_all_materials(mesh: MeshInstance3D): func change_all_materials(mesh: MeshInstance3D):
for i in range(mesh.get_surface_override_material_count()): for i in range(mesh.get_surface_override_material_count()):
var original_mat: BaseMaterial3D = mesh.get_active_material(i) var original_mat: BaseMaterial3D = mesh.get_active_material(i)
var layer0: BaseMaterial3D = original_mat.duplicate() var layer0 = original_mat.duplicate()
var layer1: ShaderMaterial = preload("control_target_overlay.material").duplicate() var layer1 = preload("control_target_overlay.material").duplicate()
# Non-occlused # Non-occlused
var layer2: BaseMaterial3D = original_mat.duplicate() var layer2 = original_mat.duplicate()
layer0.next_pass = layer1 layer0.next_pass = layer1
layer1.next_pass = layer2 layer1.next_pass = layer2
layer0.render_priority = 10 layer0.render_priority = 0
layer1.render_priority = 20 layer1.render_priority = 1
layer2.render_priority = 30 layer2.render_priority = 2
layer0.no_depth_test = true layer0.no_depth_test = true
layer0.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_HASH layer0.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS
layer0.grow = true layer0.grow = true
layer0.grow_amount = -0.001 layer0.grow_amount = -0.001
layer0.albedo_color = layer0.albedo_color.darkened(0.5) layer0.albedo_color = layer0.albedo_color.darkened(0.5)
@ -45,31 +44,26 @@ func change_all_materials(mesh: MeshInstance3D):
layer2.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_ALWAYS layer2.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_ALWAYS
mesh.set_surface_override_material(i, layer0) mesh.set_surface_override_material(i, layer0)
#mesh.set_surface_override_material(i, mat)
#mat.next_pass = preload("control_target_overlay.material")
func unchange_all_materials(mesh: MeshInstance3D): func unchange_all_materials(mesh: MeshInstance3D):
for i in range(mesh.get_surface_override_material_count()): for i in range(mesh.get_surface_override_material_count()):
var mat := mesh.get_active_material(i) var mat := mesh.get_active_material(i)
var layer2: StandardMaterial3D = mat.next_pass.next_pass unchange_material(mat)
layer2.transparency = BaseMaterial3D.TRANSPARENCY_DISABLED while mat.next_pass != null:
layer2.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_OPAQUE_ONLY unchange_material(mat.next_pass)
layer2.emission_enabled = false mat = mat.next_pass
layer2.emission = Color(1.0, 1.0, 1.0) mat.next_pass = null
mesh.set_surface_override_material(i, layer2.duplicate())
func set_strobe(color: float): func change_material(mat: BaseMaterial3D) -> BaseMaterial3D:
walk_meshes_post_order(self.get_parent(), set_mesh_strobe.bind(color)) mat = mat.duplicate()
mat.render_priority = 100
func set_mesh_strobe(mesh: MeshInstance3D, color: float): mat.no_depth_test = true
for i in range(mesh.get_surface_override_material_count()): return mat
var mat := mesh.get_active_material(i)
var layer0: BaseMaterial3D = mat
var layer1: ShaderMaterial = mat.next_pass
var layer2: BaseMaterial3D = mat.next_pass.next_pass
layer0.emission_enabled = true
layer2.emission_enabled = true
layer0.emission_energy_multiplier = color
layer2.emission_energy_multiplier = color
layer0.emission = Color(1.0, 0.0, 0.0)
layer2.emission = Color(1.0, 0.0, 0.0)
func unchange_material(mat: BaseMaterial3D) -> BaseMaterial3D:
mat.render_priority = 0
mat.no_depth_test = false
return mat

View File

@ -1,12 +0,0 @@
extends Node3D
func _ready():
set_charge(0.0)
var charge_amount: float = 0.0
func set_charge(amount: float):
charge_amount = amount
var mat: ShaderMaterial = $MeshInstance3D.get_active_material(0)
mat.set_shader_parameter("charge", amount)

View File

@ -1,37 +0,0 @@
// NOTE: Shader automatically converted from Godot Engine 4.1.3.stable.mono's StandardMaterial3D.
shader_type spatial;
render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_disabled,unshaded,shadows_disabled,ambient_light_disabled, depth_test_disabled;
uniform float grow;
uniform sampler2D colors : source_color, repeat_disable;
uniform float charge = 1.0;
void vertex() {
// Billboarding
MODELVIEW_MATRIX = VIEW_MATRIX * mat4(INV_VIEW_MATRIX[0], INV_VIEW_MATRIX[1], INV_VIEW_MATRIX[2], MODEL_MATRIX[3]);
MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);
VERTEX+=NORMAL*grow;
float speed = pow(2.0, ((charge+.4)*5.0));
float dy = sin(speed*.7) * 0.005;
float dx = sin(speed) * 0.005;
VERTEX.y += dy;
VERTEX.x += dx;
}
uniform sampler2D alpha_falloff : repeat_disable;
void fragment() {
float where = distance(UV, vec2(0.5))*2.0;
if (where >= charge) {
discard;
}
vec2 buv = floor(UV * 350.0);
int bx = int(buv.x);
int by = int(buv.y);
int amount = 2;
ALPHA = texture(alpha_falloff, vec2(where/charge)).r;
ALBEDO = texture(colors, vec2(where)).rgb;
}

Some files were not shown because too many files have changed in this diff Show More