Compare commits

..

6 Commits

Author SHA1 Message Date
Spencer Killen db7474043b
progress 2023-11-11 16:12:46 -07:00
Spencer Killen 13d6939103
Merge branch 'master' of https://git.sjkillen.ca/sjkillen/hurrmmm into sjkillen 2023-11-11 14:57:07 -07:00
alex-kumpula 1ce9c11a02 Added TASable 2023-11-11 14:47:07 -07:00
alex-kumpula 9f7780f176 Merge branch 'TAS_system' 2023-11-11 13:16:20 -07:00
alex-kumpula a0b8942bdf Created TAS system framework 2023-11-11 13:11:27 -07:00
alex-kumpula 0ad7b5b1b6 create TAS system branch 2023-11-11 11:31:48 -07:00
33 changed files with 760 additions and 16 deletions

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

Binary file not shown.

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

Binary file not shown.

Binary file not shown.

BIN
godot/.vs/Hurrmmm/v17/.suo Normal file

Binary file not shown.

19
godot/Backup/Hurrmmm.sln Normal file
View File

@ -0,0 +1,19 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hurrmmm", "Hurrmmm.csproj", "{BD45A87E-5242-45B0-9A55-8B809F4BB443}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
ExportDebug|Any CPU = ExportDebug|Any CPU
ExportRelease|Any CPU = ExportRelease|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
EndGlobalSection
EndGlobal

6
godot/Hurrmmm.csproj Normal file
View File

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

28
godot/Hurrmmm.sln Normal file
View File

@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33815.320
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hurrmmm", "Hurrmmm.csproj", "{BD45A87E-5242-45B0-9A55-8B809F4BB443}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
ExportDebug|Any CPU = ExportDebug|Any CPU
ExportRelease|Any CPU = ExportRelease|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
{BD45A87E-5242-45B0-9A55-8B809F4BB443}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {87544EC1-9C6D-4DF7-891E-89088A6D794E}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,129 @@
using Godot;
using System;
public partial class TAS_System : Node
{
private double _frameLength = 0.1;
private bool _isIncrementingFrames = false;
private double _timeSinceLastFrame;
private int _currentFrame = 0;
private int _lastAdvancedFrame = 0;
public double FrameLength
{
get { return this._frameLength; }
set { this._frameLength = value; }
}
public bool IsIncrementingFrames
{
get { return this._isIncrementingFrames; }
private set { this._isIncrementingFrames = value; }
}
private double TimeSinceLastFrame
{
get { return this._timeSinceLastFrame; }
set { this._timeSinceLastFrame = value; }
}
public int CurrentFrame
{
get { return this._currentFrame; }
private set { this._currentFrame = value; }
}
/// <summary>
/// The last frame that can be advanced to. This will
/// only be greater than CurrentFrame after the player
/// regresses frames, and will be equal to CurrentFrame
/// when the player has just done an action.
/// </summary>
/// <value></value>
public int LastAdvancedFrame
{
get { return this._lastAdvancedFrame; }
private set { this._lastAdvancedFrame = value; }
}
/// <summary>
/// Signal is emitted whenever the current frame is incremented.
/// </summary>
/// <param name="newFrame"></param>
[Signal]
public delegate void FrameIncrementedEventHandler(int newFrame);
[Signal]
public delegate void FramesAdvancedEventHandler(int startFrame, int endFrame);
[Signal]
public delegate void FramesRegressedEventHandler(int startFrame, int endFrame);
public void StartIncrementingFrames()
{
this.IsIncrementingFrames = true;
}
public void StopIncrementingFrames()
{
this.IsIncrementingFrames = false;
}
public void ResetFrameCount()
{
this.CurrentFrame = 0;
this.LastAdvancedFrame = 0;
}
// Returns how many frames it could successfully advance
public int Advance(int numFrames)
{
int newFrame = Math.Min(this.CurrentFrame + numFrames, this.LastAdvancedFrame);
int framesAdvanced = newFrame - this.CurrentFrame;
EmitSignal(SignalName.FramesAdvanced, this.CurrentFrame, newFrame);
this.CurrentFrame = newFrame;
return framesAdvanced;
}
// Returns how many frames it could successfully regress
public int Regress(int numFrames)
{
int newFrame = Math.Max(this.CurrentFrame - numFrames, 0);
int framesRegressed = newFrame - this.CurrentFrame;
EmitSignal(SignalName.FramesRegressed, this.CurrentFrame, newFrame);
this.CurrentFrame = newFrame;
return framesRegressed;
}
/// <summary>
/// Gets rid of advanced frames.
/// </summary>
public void DiscardAdvancedFrames()
{
this.LastAdvancedFrame = this.CurrentFrame;
}
public override void _PhysicsProcess(double delta)
{
if (this.IsIncrementingFrames)
{
this.TimeSinceLastFrame += delta;
if (this.TimeSinceLastFrame >= this.FrameLength)
{
this.CurrentFrame++;
EmitSignal(SignalName.FrameIncremented, this.CurrentFrame);
this.TimeSinceLastFrame = 0 + (this.TimeSinceLastFrame - this.FrameLength);
}
}
// GD.Print(CurrentFrame);
}
// public void Test()
// {
// GD.Print("test123");
// // EmitSignal(SignalName.TestSignal, "test456");
// }
}

View File

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

View File

@ -0,0 +1,33 @@
using Godot;
using System;
using System.Globalization;
public partial class TASable : Node
{
Node3D _parent;
public override void _Ready()
{
this._parent = this.GetParent<Node3D>();
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
TAS.FrameIncremented += this.OnFrameIncremented;
TAS.FramesAdvanced += this.OnFramesAdvanced;
TAS.FramesRegressed += this.OnFramesRegressed;
}
public virtual void OnFrameIncremented(int newFrame)
{
GD.Print($"Frame advanced to {newFrame}, called from node {_parent.Name}");
}
public virtual void OnFramesAdvanced(int startFrame, int endFrame)
{
GD.Print($"Frames advanced from {startFrame} to {endFrame}, called from node {_parent.Name}");
}
public virtual void OnFramesRegressed(int startFrame, int endFrame)
{
GD.Print($"Frames regressed from {startFrame} to {endFrame}, called from node {_parent.Name}");
}
}

View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://bjhii55pagkb5"]
[ext_resource type="Script" path="res://TAS_system/TASable.cs" id="1_uqel0"]
[node name="is_TASable" type="Node"]
script = ExtResource("1_uqel0")

275
godot/UpgradeLog.htm Normal file
View File

@ -0,0 +1,275 @@
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="ConversionReport0">
Migration Report
</title><style>
/* Body style, for the entire document */
body
{
background: #F3F3F4;
color: #1E1E1F;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
padding: 0;
margin: 0;
}
/* Header1 style, used for the main title */
h1
{
padding: 10px 0px 10px 10px;
font-size: 21pt;
background-color: #E2E2E2;
border-bottom: 1px #C1C1C2 solid;
color: #201F20;
margin: 0;
font-weight: normal;
}
/* Header2 style, used for "Overview" and other sections */
h2
{
font-size: 18pt;
font-weight: normal;
padding: 15px 0 5px 0;
margin: 0;
}
/* Header3 style, used for sub-sections, such as project name */
h3
{
font-weight: normal;
font-size: 15pt;
margin: 0;
padding: 15px 0 5px 0;
background-color: transparent;
}
/* Color all hyperlinks one color */
a
{
color: #1382CE;
}
/* Table styles */
table
{
border-spacing: 0 0;
border-collapse: collapse;
font-size: 10pt;
}
table th
{
background: #E7E7E8;
text-align: left;
text-decoration: none;
font-weight: normal;
padding: 3px 6px 3px 6px;
}
table td
{
vertical-align: top;
padding: 3px 6px 5px 5px;
margin: 0px;
border: 1px solid #E7E7E8;
background: #F7F7F8;
}
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
.localLink
{
color: #1E1E1F;
background: #EEEEED;
text-decoration: none;
}
.localLink:hover
{
color: #1382CE;
background: #FFFF99;
text-decoration: none;
}
/* Center text, used in the over views cells that contain message level counts */
.textCentered
{
text-align: center;
}
/* The message cells in message tables should take up all avaliable space */
.messageCell
{
width: 100%;
}
/* Padding around the content after the h1 */
#content
{
padding: 0px 12px 12px 12px;
}
/* The overview table expands to width, with a max width of 97% */
#overview table
{
width: auto;
max-width: 75%;
}
/* The messages tables are always 97% width */
#messages table
{
width: 97%;
}
/* All Icons */
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
{
min-width:18px;
min-height:18px;
background-repeat:no-repeat;
background-position:center;
}
/* Success icon encoded */
.IconSuccessEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconSuccess#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
}
/* Information icon encoded */
.IconInfoEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconInformation#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
}
/* Warning icon encoded */
.IconWarningEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconWarning#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
}
/* Error icon encoded */
.IconErrorEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconError#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
}
</style><script type="text/javascript" language="javascript">
// Startup
// Hook up the the loaded event for the document/window, to linkify the document content
var startupFunction = function() { linkifyElement("messages"); };
if(window.attachEvent)
{
window.attachEvent('onload', startupFunction);
}
else if (window.addEventListener)
{
window.addEventListener('load', startupFunction, false);
}
else
{
document.addEventListener('load', startupFunction, false);
}
// Toggles the visibility of table rows with the specified name
function toggleTableRowsByName(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
if(!!currentName && currentName.indexOf(name) == 0)
{
var isVisible = allRows[i].style.display == '';
isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
}
}
}
function scrollToFirstVisibleRow(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
var isVisible = allRows[i].style.display == '';
if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
{
allRows[i].scrollIntoView(true);
return true;
}
}
return false;
}
// Linkifies the specified text content, replaces candidate links with html links
function linkify(text)
{
if(!text || 0 === text.length)
{
return text;
}
// Find http, https and ftp links and replace them with hyper links
var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
return text.replace(urlLink, '<a href="$&">$&</a>') ;
}
// Linkifies the specified element by ID
function linkifyElement(id)
{
var element = document.getElementById(id);
if(!!element)
{
element.innerHTML = linkify(element.innerHTML);
}
}
function ToggleMessageVisibility(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
toggleTableRowsByName("MessageRowClass" + projectName);
toggleTableRowsByName('MessageRowHeaderShow' + projectName);
toggleTableRowsByName('MessageRowHeaderHide' + projectName);
}
function ScrollToFirstVisibleMessage(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
// First try the 'Show messages' row
if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
{
// Failed to find a visible row for 'Show messages', try an actual message row
scrollToFirstVisibleRow('MessageRowClass' + projectName);
}
}
</script></head><body><h1 _locID="ConversionReport">
Migration Report - Hurrmmm</h1><div id="content"><h2 _locID="OverviewTitle">Overview</h2><div id="overview"><table><tr><th></th><th _locID="ProjectTableHeader">Project</th><th _locID="PathTableHeader">Path</th><th _locID="ErrorsTableHeader">Errors</th><th _locID="WarningsTableHeader">Warnings</th><th _locID="MessagesTableHeader">Messages</th></tr><tr><td class="IconWarningEncoded" /><td><strong><a href="#Solution"><span _locID="OverviewSolutionSpan">Solution</span></a></strong></td><td>Hurrmmm.sln</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#SolutionWarning">1</a></td><td class="textCentered"><a href="#" onclick="ScrollToFirstVisibleMessage('Solution'); return false;">2</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Hurrmmm">Hurrmmm</a></strong></td><td>Hurrmmm.csproj</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr></table></div><h2 _locID="SolutionAndProjectsTitle">Solution and projects</h2><div id="messages"><a name="Solution" /><h3 _locID="ProjectDisplayNameHeader">Solution</h3><table><tr id="SolutionHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">Message</th></tr><tr name="WarningRowClassSolution"><td class="IconWarningEncoded"><a name="SolutionWarning" /></td><td class="messageCell"><strong>Hurrmmm.sln:
</strong><span>Visual Studio needs to make non-functional changes to this project in order to enable the project to open in released versions of Visual Studio newer than Visual Studio 2010 SP1 without impacting project behavior.</span></td></tr><tr name="MessageRowHeaderShowSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="ShowAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
Show 2 additional messages
</a></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>Hurrmmm.sln:
</strong><span>File successfully backed up as C:\Repos\Hurrmmm\hurrmmm\godot\Backup\Hurrmmm.sln</span></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>Hurrmmm.sln:
</strong><span>Solution migrated successfully</span></td></tr><tr style="display: none" name="MessageRowHeaderHideSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="HideAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
Hide 2 additional messages
</a></td></tr></table><a name="Hurrmmm" /><h3>Hurrmmm</h3><table><tr id="HurrmmmHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">Message</th></tr><tr><td class="IconInfoEncoded" /><td class="messageCell" _locID="NoMessagesRow">Hurrmmm logged no messages.
</td></tr></table></div></div></body></html>

BIN
godot/audio/charge.wav Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[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

View File

@ -4,13 +4,16 @@ 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 charge_time := 3 @export var charge_time := 2
func _ready(): func _ready():
set_target(initial_target) set_target(initial_target)
func get_charge():
return %radial_ui.charge_amount
func _input(event): func _input(event):
if event is InputEventMouseMotion: if event is InputEventMouseMotion and MouseControl.mouse_is_locked() and get_charge() == 0.0:
rotate_view(event.relative*sensitivity) rotate_view(event.relative*sensitivity)
if event.is_action("charge"): if event.is_action("charge"):
charge(event.get_action_strength("charge")) charge(event.get_action_strength("charge"))
@ -25,9 +28,11 @@ func charge(amount: float):
charge_tween.kill() charge_tween.kill()
if amount == 0.0: if amount == 0.0:
%radial_ui.set_charge(0.0) %radial_ui.set_charge(0.0)
$AudioStreamPlayer.stop()
return return
charge_tween = create_tween() charge_tween = create_tween()
charge_tween.tween_method(%radial_ui.set_charge, 0.0, 1.0, charge_time) charge_tween.tween_method(%radial_ui.set_charge, 0.0, 1.0, charge_time)
$AudioStreamPlayer.play()
func rotate_view(amount: Vector2): func rotate_view(amount: Vector2):
rotate_y(-amount.x) rotate_y(-amount.x)

View File

@ -1,7 +1,8 @@
[gd_scene load_steps=3 format=3 uid="uid://drmb4sitb74fx"] [gd_scene load_steps=4 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="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"]
[node name="controller" type="Node3D"] [node name="controller" type="Node3D"]
top_level = true top_level = true
@ -16,3 +17,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
[node name="radial_ui" parent="." instance=ExtResource("2_qidcb")] [node name="radial_ui" parent="." instance=ExtResource("2_qidcb")]
unique_name_in_owner = true unique_name_in_owner = true
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
stream = ExtResource("3_exgm6")

View File

@ -12,7 +12,7 @@ func make_target():
func unmake_target(): func unmake_target():
walk_meshes_post_order(self.get_parent(), unchange_all_materials) walk_meshes_post_order(self.get_parent(), unchange_all_materials)
func walk_meshes_post_order(parent: Node3D, f: Callable): func walk_meshes_post_order(parent: Node, f: Callable):
for child in parent.get_children(): for child in parent.get_children():
walk_meshes_post_order(child, f) walk_meshes_post_order(child, f)
if parent is MeshInstance3D: if parent is MeshInstance3D:

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=2 format=3 uid="uid://w6cldokq87k0"] [gd_scene load_steps=2 format=3 uid="uid://cbp8c4kpmr0hk"]
[ext_resource type="Script" path="res://control_scheme/is_targetable.gd" id="1_108lw"] [ext_resource type="Script" path="res://control_scheme/is_targetable.gd" id="1_108lw"]

View File

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

BIN
godot/grape.glb (Stored with Git LFS) Normal file

Binary file not shown.

40
godot/grape.glb.import Normal file
View File

@ -0,0 +1,40 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bsge8trc5uwb0"
path="res://.godot/imported/grape.glb-590b932d26d4103b5968cc4125e7a03e.scn"
[deps]
source_file="res://grape.glb"
dest_files=["res://.godot/imported/grape.glb-590b932d26d4103b5968cc4125e7a03e.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:grape2": {
"generate/physics": true,
"physics/body_type": 1,
"physics/shape_type": 1
}
}
}
gltf/embedded_image_handling=1

23
godot/mouse_control.gd Normal file
View File

@ -0,0 +1,23 @@
extends Node
func lock_mouse():
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
func unlock_mouse():
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
func toggle_mouse_lock():
if mouse_is_locked():
unlock_mouse()
else:
lock_mouse()
func mouse_is_locked():
return Input.mouse_mode == Input.MOUSE_MODE_CAPTURED
func _input(event):
if event.is_action("charge") and Input.mouse_mode != Input.MOUSE_MODE_CAPTURED:
lock_mouse()
get_viewport().set_input_as_handled()
if event.is_action("ui_cancel"):
unlock_mouse()

View File

@ -0,0 +1 @@
extends RigidBody3D

View File

@ -0,0 +1,9 @@
[gd_scene load_steps=3 format=3 uid="uid://cpj2gefpjwogk"]
[ext_resource type="Script" path="res://physics/billiard.gd" id="1_a0fke"]
[ext_resource type="PackedScene" uid="uid://cbp8c4kpmr0hk" path="res://control_scheme/is_targetable.tscn" id="2_yrk4o"]
[node name="billiard" type="RigidBody3D"]
script = ExtResource("1_a0fke")
[node name="is_targetable" parent="." instance=ExtResource("2_yrk4o")]

5
godot/physics/grape.tscn Normal file
View File

@ -0,0 +1,5 @@
[gd_scene load_steps=2 format=3 uid="uid://c43pr474qofhl"]
[ext_resource type="PackedScene" uid="uid://bsge8trc5uwb0" path="res://grape.glb" id="1_jlfas"]
[node name="grape" instance=ExtResource("1_jlfas")]

View File

@ -0,0 +1,24 @@
@tool
extends EditorScenePostImport
func _post_import(scene: Node) -> Object:
if scene.get_child_count(true) != 1:
push_error("Ruh oh! 342808")
return null
var new_root: Node = scene.get_child(0)
var billiard: Node = preload("billiard.tscn").instantiate()
billiard.name = scene.name
take_children(new_root, billiard)
take_ownership(billiard, billiard)
return billiard
func take_children(src: Node, dest: Node):
for child in src.get_children(true):
src.remove_child(child)
dest.add_child(child)
func take_ownership(node: Node, owner: Node):
for child in node.get_children(true):
child.owner = owner
take_ownership(child, owner)

View File

@ -11,12 +11,15 @@ config_version=5
[application] [application]
config/name="Hurrmmm" config/name="Hurrmmm"
config/features=PackedStringArray("4.1", "Forward Plus") run/main_scene="res://tests/TAS_system/TAS_test_001.tscn"
config/features=PackedStringArray("4.1", "C#", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"
[autoload] [autoload]
ControllerEventBus="*res://controller_event_bus.gd" ControllerEventBus="*res://controller_event_bus.gd"
TAS_System="*res://TAS_system/TAS_System.tscn"
MouseControl="*res://mouse_control.gd"
[dotnet] [dotnet]
@ -28,6 +31,12 @@ import/blender/enabled=false
[input] [input]
ui_cancel={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
charge={ charge={
"deadzone": 0.0, "deadzone": 0.0,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)

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

Binary file not shown.

View File

@ -28,5 +28,16 @@ animation/fps=30
animation/trimming=false animation/trimming=false
animation/remove_immutable_tracks=true animation/remove_immutable_tracks=true
import_script/path="" import_script/path=""
_subresources={} _subresources={
"nodes": {
"PATH:room": {
"generate/physics": true,
"physics/shape_type": 2
},
"PATH:table": {
"generate/physics": true,
"physics/shape_type": 2
}
}
}
gltf/embedded_image_handling=1 gltf/embedded_image_handling=1

View File

@ -0,0 +1,29 @@
using Godot;
using System;
public partial class TAS_test_001 : Node
{
public override void _Ready()
{
// Called every time the node is added to the scene.
// Initialization here.
GD.Print("Hello from C# to Godot :)");
TAS_System TAS = GetNode<TAS_System>("/root/TAS_System");
TAS.FrameLength = 1.5;
TAS.StartIncrementingFrames();
// TAS.FrameIncremented += (x) => GD.Print(x);
// TAS.Test();
}
private void Test2(string testStr2)
{
}
}

View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://bbml0d2v4lf78"]
[ext_resource type="Script" path="res://tests/TAS_system/TAS_test_001.cs" id="1_0ap5j"]
[node name="TAS_test_001" type="Node3D"]
script = ExtResource("1_0ap5j")

View File

@ -0,0 +1,36 @@
[gd_scene load_steps=7 format=3 uid="uid://by3rnp88l4plx"]
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_bo0jp"]
[ext_resource type="PackedScene" uid="uid://cbp8c4kpmr0hk" path="res://control_scheme/is_targetable.tscn" id="2_d7v5s"]
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="3_0hshv"]
[ext_resource type="PackedScene" uid="uid://bjhii55pagkb5" path="res://TAS_system/is_TASable.tscn" id="3_srlbt"]
[ext_resource type="Script" path="res://tests/TAS_system/TAS_test_001.cs" id="5_0ber1"]
[sub_resource type="Environment" id="Environment_f0m14"]
ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_energy = 0.5
[node name="small_room" instance=ExtResource("1_bo0jp")]
[node name="is_TASable" parent="table" index="0" instance=ExtResource("3_srlbt")]
[node name="is_targetable" parent="grape" index="0" node_paths=PackedStringArray("attached_to") instance=ExtResource("2_d7v5s")]
attached_to = NodePath("..")
[node name="is_TASable" parent="grape" index="1" instance=ExtResource("3_srlbt")]
[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="3"]
environment = SubResource("Environment_f0m14")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"]
transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738)
[node name="controller" parent="." index="4" node_paths=PackedStringArray("camera", "initial_target") instance=ExtResource("3_0hshv")]
camera = NodePath("Camera3D")
initial_target = NodePath("../grape")
[node name="Camera3D" type="Camera3D" parent="controller" index="1"]
[node name="TAS_test_001" type="Node" parent="." index="6"]
script = ExtResource("5_0ber1")

View File

@ -2,7 +2,7 @@
[ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_2ticn"] [ext_resource type="PackedScene" uid="uid://bua7f25rpewkp" path="res://small_room.glb" id="1_2ticn"]
[ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="2_dcvuq"] [ext_resource type="PackedScene" uid="uid://drmb4sitb74fx" path="res://control_scheme/controller.tscn" id="2_dcvuq"]
[ext_resource type="PackedScene" uid="uid://w6cldokq87k0" path="res://control_scheme/is_targetable.tscn" id="2_y2131"] [ext_resource type="PackedScene" uid="uid://c43pr474qofhl" path="res://physics/grape.tscn" id="3_gijly"]
[sub_resource type="Environment" id="Environment_f0m14"] [sub_resource type="Environment" id="Environment_f0m14"]
ambient_light_source = 2 ambient_light_source = 2
@ -11,16 +11,22 @@ ambient_light_energy = 0.5
[node name="small_room" instance=ExtResource("1_2ticn")] [node name="small_room" instance=ExtResource("1_2ticn")]
[node name="is_targetable" parent="grape" index="0" instance=ExtResource("2_y2131")] [node name="WorldEnvironment" type="WorldEnvironment" parent="." index="2"]
[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="3"]
environment = SubResource("Environment_f0m14") environment = SubResource("Environment_f0m14")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment" index="0"]
transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738) transform = Transform3D(1, 0, 0, 0, 0.933762, 0.357895, 0, -0.357895, 0.933762, 0, 1.43864, 1.81738)
[node name="controller" parent="." index="4" node_paths=PackedStringArray("camera", "initial_target") instance=ExtResource("2_dcvuq")] [node name="controller" parent="." index="3" node_paths=PackedStringArray("camera", "initial_target") instance=ExtResource("2_dcvuq")]
camera = NodePath("Camera3D") camera = NodePath("Camera3D")
initial_target = NodePath("../grape") initial_target = NodePath("../grape")
[node name="Camera3D" type="Camera3D" parent="controller" index="1"] [node name="Camera3D" type="Camera3D" parent="controller" index="1"]
[node name="billiard" parent="." index="4" instance=ExtResource("3_gijly")]
[node name="grape" parent="." index="5" instance=ExtResource("3_gijly")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.56762, 0.385236)
[node name="grape2" parent="." index="6" instance=ExtResource("3_gijly")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.60495, 0)