17 Commits
Author SHA1 Message Date
qwsdcvghyu89 1813800db4 Fixed merge commit - discarded demo.tscn
Release / Export Game (push) Successful in 1m42s
2026-06-14 18:37:51 +10:00
qwsdcvghyu89 744c750638 Added new jump mechanics
Release / Export Game (push) Successful in 2m2s
2026-06-14 18:27:29 +10:00
qwsdcvghyu89 d549edbf15 Added a tiny bit of air control and a turnback jump trick.
Release / Export Game (push) Successful in 1m58s
2026-06-11 20:48:48 +10:00
qwsdcvghyu89 a4d73f8697 Final basic ground and jump physics tweaks.
Release / Export Game (push) Successful in 1m57s
2026-06-11 15:25:50 +10:00
qwsdcvghyu89 a0a288eee2 Merge branch 'main' of https://git.main.qwsdcvghyu.com/riley/wrplat-godot
Release / Export Game (push) Successful in 1m58s
Merged animations into main branch
2026-06-11 14:45:07 +10:00
qwsdcvghyu89 6ee79020ef Added new animations 2026-06-11 14:43:51 +10:00
qwsdcvghyu89 3ccf193a7c wip - fixing movement physics 2026-06-11 14:43:13 +10:00
qwsdcvghyu89 be6cad911c Added new animations
Release / Export Game (push) Successful in 1m57s
2026-06-09 22:38:07 +10:00
qwsdcvghyu89 77bc341f9b Changed run/walk to be based more off of momentum. Fixed jump bug.
Release / Export Game (push) Successful in 1m57s
2026-06-09 04:00:33 +10:00
qwsdcvghyu89 b18283ed9d Changed debug information to be hidden by default.
Release / Export Game (push) Successful in 1m59s
2026-06-07 23:19:46 +10:00
qwsdcvghyu89 eca85aa2d0 Changed LangVersion back to avoid export issues and removed experimental language features.
Release / Export Game (push) Successful in 2m0s
2026-06-07 23:15:37 +10:00
qwsdcvghyu89 b55d2d87c8 Fixed export_presets.cfg
Release / Export Game (push) Successful in 1m53s
2026-06-07 23:13:15 +10:00
qwsdcvghyu89 77d850f95e Improved platforming jump physics and added music autoplay feature. Added joystick support. Added dimmed background tiling.
Release / Export Game (push) Successful in 2m22s
2026-06-07 23:02:51 +10:00
qwsdcvghyu89 ba2ce768e4 Changed macOSX build export path to end with .dmg instead of .app
Release / Export Game (push) Failing after 1m21s
2026-06-06 22:30:29 +10:00
qwsdcvghyu89 fb29fead0d Disabled export caching feature (incompatible with gitea)
Release / Export Game (push) Successful in 1m50s
2026-06-06 21:24:49 +10:00
qwsdcvghyu89 82ce008b05 Fixed runs_on
Release / Export Game (push) Canceled after 10m48s
2026-06-06 21:14:32 +10:00
qwsdcvghyu89 08d75b55f0 Added tag-based release labeling
Release / Export Game (push) Failing after 51s
2026-06-06 21:11:23 +10:00
54 changed files with 1724 additions and 91 deletions
+21 -10
View File
@@ -1,9 +1,9 @@
name: Nightly Release
name: Release
on:
push:
branches:
- main
branches: ['**'] # every commit on any branch -> nightly
tags: ['**'] # any tag push -> versioned draft
workflow_dispatch:
# The default token is read-only; release/tag operations need write.
@@ -33,14 +33,25 @@ jobs:
godot_export_templates_download_url: https://godot-releases.nbg1.your-objectstorage.com/4.6.3-stable/Godot_v4.6.3-stable_mono_export_templates.tpz
relative_project_path: ./
archive_output: true
- name: create release
# cache: true # doesn't work on gitea
# --- not tagged: rolling nightly, updates the existing release ---
- name: create nightly release
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
uses: akkuman/gitea-release-action@v1
with:
# token: ${{ secrets.GITHUB_TOKEN }}
# generateReleaseNotes: true
# tag: ${{ github.ref_name }}
files: ${{ steps.export.outputs.archive_directory }}/*
# commit: ${{ gitea.sha }}
# allowUpdates: true
tag_name: nightly
target_commitish: ${{ github.sha }}
name: Latest Nightly Build
prerelease: true
files: ${{ steps.export.outputs.archive_directory }}/*
# --- tagged with a version: versioned draft release ---
- name: create versioned release draft
if: ${{ startsWith(github.ref, 'refs/tags/') }}
uses: akkuman/gitea-release-action@v1
with:
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
draft: true
files: ${{ steps.export.outputs.archive_directory }}/*
+1
View File
@@ -3,5 +3,6 @@
<TargetFramework>net8.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
+2 -2
View File
@@ -27,7 +27,7 @@ script_export_mode=2
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
shader_baker/enabled=true
@@ -365,7 +365,7 @@ script_export_mode=2
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
shader_baker/enabled=false
+9
View File
@@ -0,0 +1,9 @@
[gd_resource type="CanvasTexture" format=3 uid="uid://b78uwnnyovqci"]
[ext_resource type="Texture2D" uid="uid://n6b4udvjt2pt" path="res://sprites/atlas/diffuse/pool.diffuse.png" id="1_v3cld"]
[ext_resource type="Texture2D" uid="uid://cs2jr54egxwey" path="res://sprites/atlas/normal/pool.normal.png" id="2_srhaa"]
[resource]
diffuse_texture = ExtResource("1_v3cld")
normal_texture = ExtResource("2_srhaa")
specular_shininess = 0.35
+46
View File
@@ -0,0 +1,46 @@
[gd_resource type="SpriteFrames" format=3 uid="uid://trcnb1ubmx5e"]
[ext_resource type="Texture2D" uid="uid://wli5w6t8y6se" path="res://sprites/atlas/jump_point_radiates.png" id="1_3yoq3"]
[sub_resource type="AtlasTexture" id="AtlasTexture_aokl3"]
atlas = ExtResource("1_3yoq3")
region = Rect2(0, 32, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_xd81c"]
atlas = ExtResource("1_3yoq3")
region = Rect2(0, 64, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_u618n"]
atlas = ExtResource("1_3yoq3")
region = Rect2(0, 96, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_twrqh"]
atlas = ExtResource("1_3yoq3")
region = Rect2(32, 0, 32, 32)
[sub_resource type="AtlasTexture" id="AtlasTexture_vrk17"]
atlas = ExtResource("1_3yoq3")
region = Rect2(0, 0, 32, 32)
[resource]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_aokl3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_xd81c")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_u618n")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_twrqh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vrk17")
}],
"loop": true,
"name": &"default",
"speed": 16.0
}]
+50 -8
View File
@@ -1,35 +1,77 @@
[gd_resource type="SpriteFrames" format=3 uid="uid://doxc4pl5hvs6k"]
[ext_resource type="Texture2D" uid="uid://bv4gsgya7wp4d" path="res://sprites/atlas/demoman_walking.png" id="1_1t22f"]
[ext_resource type="Texture2D" uid="uid://cl3uy4d6lgspe" path="res://sprites/man_falls.png" id="1_kdeld"]
[ext_resource type="Texture2D" uid="uid://dy7fh0eg6qulr" path="res://sprites/atlas/flats/demoman_idles.png" id="2_kdeld"]
[ext_resource type="Texture2D" uid="uid://cr5bdv3hgmd4q" path="res://sprites/man_jumps.png" id="3_a1t44"]
[ext_resource type="Texture2D" uid="uid://bv4gsgya7wp4d" path="res://sprites/atlas/flats/demoman_walking.png" id="4_a1t44"]
[sub_resource type="AtlasTexture" id="AtlasTexture_w1sc6"]
atlas = ExtResource("2_kdeld")
region = Rect2(0, 0, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_mcxxx"]
atlas = ExtResource("2_kdeld")
region = Rect2(0, 64, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_nf227"]
atlas = ExtResource("2_kdeld")
region = Rect2(32, 0, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_sbabb"]
atlas = ExtResource("2_kdeld")
region = Rect2(32, 64, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_c2ath"]
atlas = ExtResource("1_1t22f")
atlas = ExtResource("4_a1t44")
region = Rect2(0, 0, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_gwfnt"]
atlas = ExtResource("1_1t22f")
atlas = ExtResource("4_a1t44")
region = Rect2(0, 64, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_kdeld"]
atlas = ExtResource("1_1t22f")
atlas = ExtResource("4_a1t44")
region = Rect2(32, 0, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_a1t44"]
atlas = ExtResource("1_1t22f")
atlas = ExtResource("4_a1t44")
region = Rect2(32, 64, 32, 64)
[sub_resource type="AtlasTexture" id="AtlasTexture_k551e"]
atlas = ExtResource("1_1t22f")
atlas = ExtResource("4_a1t44")
region = Rect2(64, 0, 32, 64)
[resource]
animations = [{
"frames": [],
"frames": [{
"duration": 1.0,
"texture": ExtResource("1_kdeld")
}],
"loop": true,
"name": &"fall",
"speed": 5.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_w1sc6")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mcxxx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_nf227")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sbabb")
}],
"loop": true,
"name": &"idle",
"speed": 5.0
}, {
"frames": [],
"frames": [{
"duration": 1.0,
"texture": ExtResource("3_a1t44")
}],
"loop": true,
"name": &"jump",
"speed": 5.0
@@ -0,0 +1,4 @@
[gd_resource type="CircleShape2D" format=3 uid="uid://duhxyfwoh6ndb"]
[resource]
radius = 3.0
+6
View File
@@ -0,0 +1,6 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://b4epp5w0awoov"]
[ext_resource type="Shader" uid="uid://dwgy05x43arpb" path="res://src/shaders/dimming_shader.tres" id="1_jm73v"]
[resource]
shader = ExtResource("1_jm73v")
File diff suppressed because one or more lines are too long
+56 -4
View File
@@ -25,31 +25,83 @@ move_right={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":14,"pressure":0.0,"pressed":true,"script":null)
]
}
move_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":13,"pressure":0.0,"pressed":true,"script":null)
]
}
jump={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
]
}
look_up={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":true,"script":null)
]
}
look_down={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":true,"script":null)
]
}
run={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null)
]
}
skip_music={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":78,"key_label":0,"unicode":78,"location":0,"echo":false,"script":null)
]
}
toggle_debug={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":75,"key_label":0,"unicode":75,"location":0,"echo":false,"script":null)
]
}
move_up={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":11,"pressure":0.0,"pressed":true,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
]
}
move_down={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":true,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
turn_back={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":86,"key_label":0,"unicode":118,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null)
]
}
[layer_names]
2d_render/layer_1="Backgrounds"
2d_render/layer_2="Foregrounds"
[physics]
Binary file not shown.
+24
View File
@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://fhfma3rrxyfi"
path="res://.godot/imported/Asphodel.wav-f87ecbeaa99b324bd8f5df8f9b0d72e4.sample"
[deps]
source_file="res://sounds/ost/Asphodel.wav"
dest_files=["res://.godot/imported/Asphodel.wav-f87ecbeaa99b324bd8f5df8f9b0d72e4.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=2
Binary file not shown.
+24
View File
@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://5gnpemu56ac0"
path="res://.godot/imported/Azalea.wav-cbe1be7340fbe8dc3e31528edc546255.sample"
[deps]
source_file="res://sounds/ost/Azalea.wav"
dest_files=["res://.godot/imported/Azalea.wav-cbe1be7340fbe8dc3e31528edc546255.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=2
Binary file not shown.
+24
View File
@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://0tturucf5gxf"
path="res://.godot/imported/Datura.wav-78725853df39d0ef155db6eea1881728.sample"
[deps]
source_file="res://sounds/ost/Datura.wav"
dest_files=["res://.godot/imported/Datura.wav-78725853df39d0ef155db6eea1881728.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=2
Binary file not shown.
+24
View File
@@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b5cvbx3ypbbho"
path="res://.godot/imported/Hyacinth.wav-32c97df5a6b61df7f68aa21d2c6edfae.sample"
[deps]
source_file="res://sounds/ost/Hyacinth.wav"
dest_files=["res://.godot/imported/Hyacinth.wav-32c97df5a6b61df7f68aa21d2c6edfae.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=2
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://n6b4udvjt2pt"
path="res://.godot/imported/pool.diffuse.png-f15c5d02eff23304ecfbdd590cdc3504.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/diffuse/pool.diffuse.png"
dest_files=["res://.godot/imported/pool.diffuse.png-f15c5d02eff23304ecfbdd590cdc3504.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dy7fh0eg6qulr"
path="res://.godot/imported/demoman_idles.png-add2b3af5478c463b97d1483e4e33e47.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/flats/demoman_idles.png"
dest_files=["res://.godot/imported/demoman_idles.png-add2b3af5478c463b97d1483e4e33e47.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bv4gsgya7wp4d"
path="res://.godot/imported/demoman_walking.png-9be9634caac03406a9e7d7741131c5f4.ctex"
path="res://.godot/imported/demoman_walking.png-3b471b54b0862aac29ec2aa6d7d5d5d6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/demoman_walking.png"
dest_files=["res://.godot/imported/demoman_walking.png-9be9634caac03406a9e7d7741131c5f4.ctex"]
source_file="res://sprites/atlas/flats/demoman_walking.png"
dest_files=["res://.godot/imported/demoman_walking.png-3b471b54b0862aac29ec2aa6d7d5d5d6.ctex"]
[params]

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cgr7fx5emk037"
path="res://.godot/imported/pool.png-b13073abd16d5b4aa7f02817fa2d5dca.ctex"
path="res://.godot/imported/pool.png-9044908d89edc8b0017e06046d331edd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/pool.png"
dest_files=["res://.godot/imported/pool.png-b13073abd16d5b4aa7f02817fa2d5dca.ctex"]
source_file="res://sprites/atlas/flats/pool.png"
dest_files=["res://.godot/imported/pool.png-9044908d89edc8b0017e06046d331edd.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://wli5w6t8y6se"
path="res://.godot/imported/jump_point_radiates.png-1a97dab1296f185bfc3d06015e15ec05.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/jump_point_radiates.png"
dest_files=["res://.godot/imported/jump_point_radiates.png-1a97dab1296f185bfc3d06015e15ec05.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cs2jr54egxwey"
path="res://.godot/imported/pool.normal.png-d715ee8c1699b86312f19adc110615ea.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/normal/pool.normal.png"
dest_files=["res://.godot/imported/pool.normal.png-d715ee8c1699b86312f19adc110615ea.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://p4hfrsl8bbpg"
path="res://.godot/imported/pool.specular.png-11a7497f1c1ddae08e066a0e33eb2e9b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/atlas/specular/pool.specular.png"
dest_files=["res://.godot/imported/pool.specular.png-11a7497f1c1ddae08e066a0e33eb2e9b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cl3uy4d6lgspe"
path="res://.godot/imported/man_falls.png-61beb99173ba0b99454c416e7ba44020.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/man_falls.png"
dest_files=["res://.godot/imported/man_falls.png-61beb99173ba0b99454c416e7ba44020.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

+40
View File
@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cr5bdv3hgmd4q"
path="res://.godot/imported/man_jumps.png-70ad3c36f80f10d1a96a8706ccbc76b6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://sprites/man_jumps.png"
dest_files=["res://.godot/imported/man_jumps.png-70ad3c36f80f10d1a96a8706ccbc76b6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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=1
+11 -2
View File
@@ -1,9 +1,10 @@
[gd_resource type="TileSet" format=3 uid="uid://bk7cbdppa3j6a"]
[ext_resource type="Texture2D" uid="uid://cgr7fx5emk037" path="res://sprites/atlas/pool.png" id="1_otsg2"]
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5h5kb"]
load_path = "res://.godot/imported/pool.png-b13073abd16d5b4aa7f02817fa2d5dca.ctex"
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_blkrv"]
texture = ExtResource("1_otsg2")
texture = SubResource("CompressedTexture2D_5h5kb")
texture_region_size = Vector2i(32, 32)
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
@@ -59,6 +60,7 @@ texture_region_size = Vector2i(32, 32)
2:2/1/flip_h = true
2:2/1/terrain_set = 0
2:2/1/terrain = 0
2:2/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16, -16, -16)
2:2/1/terrains_peering_bit/right_side = 0
2:2/1/terrains_peering_bit/bottom_right_corner = 0
2:2/1/terrains_peering_bit/bottom_side = 0
@@ -107,6 +109,7 @@ texture_region_size = Vector2i(32, 32)
1:3/1/flip_v = true
1:3/1/terrain_set = 0
1:3/1/terrain = 0
1:3/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
1:3/1/terrains_peering_bit/right_side = 0
1:3/1/terrains_peering_bit/bottom_right_corner = 0
1:3/1/terrains_peering_bit/bottom_side = 0
@@ -129,6 +132,7 @@ texture_region_size = Vector2i(32, 32)
2:3/1/flip_h = true
2:3/1/terrain_set = 0
2:3/1/terrain = 0
2:3/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/1/terrains_peering_bit/right_side = 0
2:3/1/terrains_peering_bit/bottom_right_corner = 0
2:3/1/terrains_peering_bit/bottom_side = 0
@@ -141,6 +145,7 @@ texture_region_size = Vector2i(32, 32)
2:3/2/flip_v = true
2:3/2/terrain_set = 0
2:3/2/terrain = 0
2:3/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/2/terrains_peering_bit/right_side = 0
2:3/2/terrains_peering_bit/bottom_right_corner = 0
2:3/2/terrains_peering_bit/bottom_side = 0
@@ -153,6 +158,7 @@ texture_region_size = Vector2i(32, 32)
2:3/4/transpose = true
2:3/4/terrain_set = 0
2:3/4/terrain = 0
2:3/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/4/terrains_peering_bit/right_side = 0
2:3/4/terrains_peering_bit/bottom_right_corner = 0
2:3/4/terrains_peering_bit/bottom_side = 0
@@ -166,6 +172,7 @@ texture_region_size = Vector2i(32, 32)
2:3/5/transpose = true
2:3/5/terrain_set = 0
2:3/5/terrain = 0
2:3/5/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/5/terrains_peering_bit/right_side = 0
2:3/5/terrains_peering_bit/bottom_right_corner = 0
2:3/5/terrains_peering_bit/bottom_side = 0
@@ -188,6 +195,7 @@ texture_region_size = Vector2i(32, 32)
3:3/1/flip_v = true
3:3/1/terrain_set = 0
3:3/1/terrain = 0
3:3/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
3:3/1/terrains_peering_bit/bottom_side = 0
3:3/1/terrains_peering_bit/bottom_left_corner = 0
3:3/1/terrains_peering_bit/left_side = 0
@@ -247,6 +255,7 @@ texture_region_size = Vector2i(32, 32)
2:4/1/flip_h = true
2:4/1/terrain_set = 0
2:4/1/terrain = 0
2:4/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:4/1/terrains_peering_bit/right_side = 0
2:4/1/terrains_peering_bit/left_side = 0
2:4/1/terrains_peering_bit/top_left_corner = 0
+446
View File
@@ -0,0 +1,446 @@
[gd_resource type="TileSet" format=3 uid="uid://cb1bigfqp1l7t"]
[ext_resource type="Texture2D" uid="uid://b78uwnnyovqci" path="res://materials/tilesets/pool.tres" id="1_l670f"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_l670f"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_5tlu2"]
polygon = PackedVector2Array(-6.8571424, -2.2857132, 16, -2.2857132, 16, 16, -6.8571424, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_by4n8"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_0ou5r"]
polygon = PackedVector2Array(-6.8571424, -16, -6.8571424, 16, 16, 16, 16, -16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_1bmlt"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_g011h"]
polygon = PackedVector2Array(-6.8571424, -16, -6.8571424, 2.285715, 16, 2.285715, 16, -16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_x4gly"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_uesvo"]
polygon = PackedVector2Array(-16, -2.2857132, 16, -2.2857132, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_h32fx"]
polygon = PackedVector2Array(-16, -2.2857132, 16, -2.2857132, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_f0cx1"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_dghjy"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_dc0ws"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_6l2xn"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_blamv"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_f77ak"]
polygon = PackedVector2Array(-16, 2.285715, 16, 2.285715, 16, -16, -16, -16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_kj7tv"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_ro6yg"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 2.285715, -16, 2.285715)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_ebmht"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_xuple"]
polygon = PackedVector2Array(-16, -2.2857132, 6.8571434, -2.2857132, 6.8571434, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_ru1yo"]
polygon = PackedVector2Array(6.8571434, -16, 6.8571434, 16, -16, 16, -16, -16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_vok1k"]
polygon = PackedVector2Array(6.8571434, -16, 6.8571434, 16, -16, 16, -16, -16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_flqmo"]
polygon = PackedVector2Array(-16, 2.285715, 6.8571434, 2.285715, 6.8571434, -16, -16, -16, -16, 2.285715, -16, 2.285715)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_8alh0"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_xwwfl"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_njrqr"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_o2foe"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_yfu7p"]
polygon = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_blkrv"]
texture = ExtResource("1_l670f")
texture_region_size = Vector2i(32, 32)
0:0/0 = 0
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
1:0/0 = 0
1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
2:0/0 = 0
2:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
3:0/0 = 0
3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
4:0/0 = 0
5:0/0 = 0
6:0/0 = 0
7:0/0 = 0
8:0/0 = 0
9:0/0 = 0
10:0/0 = 0
11:0/0 = 0
0:1/0 = 0
0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, -16, -16, 16, -16, 16, 16)
1:1/0 = 0
1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
2:1/0 = 0
2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
3:1/0 = 0
3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, 16, 16, 16, 16, -16, -16, -16)
4:1/0 = 0
5:1/0 = 0
6:1/0 = 0
7:1/0 = 0
8:1/0 = 0
9:1/0 = 0
10:1/0 = 0
11:1/0 = 0
0:2/0 = 0
1:2/0 = 0
1:2/0/terrain_set = 0
1:2/0/terrain = 0
1:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_l670f")
1:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_5tlu2")
1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
1:2/0/terrains_peering_bit/right_side = 0
1:2/0/terrains_peering_bit/bottom_right_corner = 0
1:2/0/terrains_peering_bit/bottom_side = 0
2:2/next_alternative_id = 3
2:2/0 = 0
2:2/0/terrain_set = 0
2:2/0/terrain = 0
2:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_x4gly")
2:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_uesvo")
2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
2:2/0/terrains_peering_bit/right_side = 0
2:2/0/terrains_peering_bit/bottom_right_corner = 0
2:2/0/terrains_peering_bit/bottom_side = 0
2:2/0/terrains_peering_bit/bottom_left_corner = 0
2:2/0/terrains_peering_bit/left_side = 0
2:2/1 = 1
2:2/1/flip_h = true
2:2/1/terrain_set = 0
2:2/1/terrain = 0
2:2/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1bmlt")
2:2/1/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_h32fx")
2:2/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16, -16, -16)
2:2/1/terrains_peering_bit/right_side = 0
2:2/1/terrains_peering_bit/bottom_right_corner = 0
2:2/1/terrains_peering_bit/bottom_side = 0
2:2/1/terrains_peering_bit/bottom_left_corner = 0
2:2/1/terrains_peering_bit/left_side = 0
3:2/0 = 0
3:2/0/terrain_set = 0
3:2/0/terrain = 0
3:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_ebmht")
3:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_xuple")
3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
3:2/0/terrains_peering_bit/bottom_side = 0
3:2/0/terrains_peering_bit/bottom_left_corner = 0
3:2/0/terrains_peering_bit/left_side = 0
4:2/0 = 0
4:2/0/terrain_set = 0
4:2/0/terrain = 0
4:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_8alh0")
4:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_xwwfl")
4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
4:2/0/terrains_peering_bit/right_side = 0
5:2/0 = 0
5:2/0/terrain_set = 0
5:2/0/terrain = 0
5:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_8alh0")
5:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_xwwfl")
5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
5:2/0/terrains_peering_bit/right_side = 0
5:2/0/terrains_peering_bit/left_side = 0
6:2/0 = 0
6:2/0/terrain_set = 0
6:2/0/terrain = 0
6:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_8alh0")
6:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_xwwfl")
6:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
6:2/0/terrains_peering_bit/left_side = 0
7:2/0 = 0
7:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_yfu7p")
7:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_xwwfl")
8:2/0 = 0
8:2/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_yfu7p")
8:2/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_xwwfl")
9:2/0 = 0
10:2/0 = 0
11:2/0 = 0
0:3/0 = 0
1:3/next_alternative_id = 2
1:3/0 = 0
1:3/0/terrain_set = 0
1:3/0/terrain = 0
1:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_by4n8")
1:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_0ou5r")
1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
1:3/0/terrains_peering_bit/right_side = 0
1:3/0/terrains_peering_bit/bottom_right_corner = 0
1:3/0/terrains_peering_bit/bottom_side = 0
1:3/0/terrains_peering_bit/top_side = 0
1:3/0/terrains_peering_bit/top_right_corner = 0
1:3/1 = 1
1:3/1/flip_v = true
1:3/1/terrain_set = 0
1:3/1/terrain = 0
1:3/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1bmlt")
1:3/1/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_0ou5r")
1:3/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
1:3/1/terrains_peering_bit/right_side = 0
1:3/1/terrains_peering_bit/bottom_right_corner = 0
1:3/1/terrains_peering_bit/bottom_side = 0
1:3/1/terrains_peering_bit/top_side = 0
1:3/1/terrains_peering_bit/top_right_corner = 0
2:3/next_alternative_id = 6
2:3/0 = 0
2:3/0/terrain_set = 0
2:3/0/terrain = 0
2:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_by4n8")
2:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_f0cx1")
2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
2:3/0/terrains_peering_bit/right_side = 0
2:3/0/terrains_peering_bit/bottom_right_corner = 0
2:3/0/terrains_peering_bit/bottom_side = 0
2:3/0/terrains_peering_bit/bottom_left_corner = 0
2:3/0/terrains_peering_bit/left_side = 0
2:3/0/terrains_peering_bit/top_left_corner = 0
2:3/0/terrains_peering_bit/top_side = 0
2:3/0/terrains_peering_bit/top_right_corner = 0
2:3/1 = 1
2:3/1/flip_h = true
2:3/1/terrain_set = 0
2:3/1/terrain = 0
2:3/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1bmlt")
2:3/1/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_dghjy")
2:3/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/1/terrains_peering_bit/right_side = 0
2:3/1/terrains_peering_bit/bottom_right_corner = 0
2:3/1/terrains_peering_bit/bottom_side = 0
2:3/1/terrains_peering_bit/bottom_left_corner = 0
2:3/1/terrains_peering_bit/left_side = 0
2:3/1/terrains_peering_bit/top_left_corner = 0
2:3/1/terrains_peering_bit/top_side = 0
2:3/1/terrains_peering_bit/top_right_corner = 0
2:3/2 = 2
2:3/2/flip_v = true
2:3/2/terrain_set = 0
2:3/2/terrain = 0
2:3/2/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1bmlt")
2:3/2/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_dc0ws")
2:3/2/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/2/terrains_peering_bit/right_side = 0
2:3/2/terrains_peering_bit/bottom_right_corner = 0
2:3/2/terrains_peering_bit/bottom_side = 0
2:3/2/terrains_peering_bit/bottom_left_corner = 0
2:3/2/terrains_peering_bit/left_side = 0
2:3/2/terrains_peering_bit/top_left_corner = 0
2:3/2/terrains_peering_bit/top_side = 0
2:3/2/terrains_peering_bit/top_right_corner = 0
2:3/4 = 4
2:3/4/transpose = true
2:3/4/terrain_set = 0
2:3/4/terrain = 0
2:3/4/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1bmlt")
2:3/4/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_6l2xn")
2:3/4/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/4/terrains_peering_bit/right_side = 0
2:3/4/terrains_peering_bit/bottom_right_corner = 0
2:3/4/terrains_peering_bit/bottom_side = 0
2:3/4/terrains_peering_bit/bottom_left_corner = 0
2:3/4/terrains_peering_bit/left_side = 0
2:3/4/terrains_peering_bit/top_left_corner = 0
2:3/4/terrains_peering_bit/top_side = 0
2:3/4/terrains_peering_bit/top_right_corner = 0
2:3/5 = 5
2:3/5/flip_h = true
2:3/5/transpose = true
2:3/5/terrain_set = 0
2:3/5/terrain = 0
2:3/5/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1bmlt")
2:3/5/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_blamv")
2:3/5/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/5/terrains_peering_bit/right_side = 0
2:3/5/terrains_peering_bit/bottom_right_corner = 0
2:3/5/terrains_peering_bit/bottom_side = 0
2:3/5/terrains_peering_bit/bottom_left_corner = 0
2:3/5/terrains_peering_bit/left_side = 0
2:3/5/terrains_peering_bit/top_left_corner = 0
2:3/5/terrains_peering_bit/top_side = 0
2:3/5/terrains_peering_bit/top_right_corner = 0
3:3/next_alternative_id = 2
3:3/0 = 0
3:3/0/terrain_set = 0
3:3/0/terrain = 0
3:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_by4n8")
3:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_ru1yo")
3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
3:3/0/terrains_peering_bit/bottom_side = 0
3:3/0/terrains_peering_bit/bottom_left_corner = 0
3:3/0/terrains_peering_bit/left_side = 0
3:3/0/terrains_peering_bit/top_left_corner = 0
3:3/0/terrains_peering_bit/top_side = 0
3:3/1 = 1
3:3/1/flip_v = true
3:3/1/terrain_set = 0
3:3/1/terrain = 0
3:3/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_kj7tv")
3:3/1/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_vok1k")
3:3/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
3:3/1/terrains_peering_bit/bottom_side = 0
3:3/1/terrains_peering_bit/bottom_left_corner = 0
3:3/1/terrains_peering_bit/left_side = 0
3:3/1/terrains_peering_bit/top_left_corner = 0
3:3/1/terrains_peering_bit/top_side = 0
4:3/0 = 0
4:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
4:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
4:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
5:3/0 = 0
5:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
5:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
6:3/0 = 0
6:3/0/terrain_set = 0
6:3/0/terrain = 0
6:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
6:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
6:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
6:3/0/terrains_peering_bit/right_side = 0
6:3/0/terrains_peering_bit/bottom_side = 0
6:3/0/terrains_peering_bit/bottom_left_corner = 0
6:3/0/terrains_peering_bit/left_side = 0
6:3/0/terrains_peering_bit/top_left_corner = 0
6:3/0/terrains_peering_bit/top_side = 0
6:3/0/terrains_peering_bit/top_right_corner = 0
7:3/0 = 0
7:3/0/terrain_set = 0
7:3/0/terrain = 0
7:3/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
7:3/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
7:3/0/terrains_peering_bit/right_side = 0
7:3/0/terrains_peering_bit/bottom_right_corner = 0
7:3/0/terrains_peering_bit/bottom_side = 0
7:3/0/terrains_peering_bit/left_side = 0
7:3/0/terrains_peering_bit/top_left_corner = 0
7:3/0/terrains_peering_bit/top_side = 0
7:3/0/terrains_peering_bit/top_right_corner = 0
8:3/0 = 0
9:3/0 = 0
10:3/0 = 0
11:3/0 = 0
0:4/0 = 0
1:4/0 = 0
1:4/0/terrain_set = 0
1:4/0/terrain = 0
1:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_by4n8")
1:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_g011h")
1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
1:4/0/terrains_peering_bit/right_side = 0
1:4/0/terrains_peering_bit/top_side = 0
1:4/0/terrains_peering_bit/top_right_corner = 0
0:5/0 = 0
1:5/0 = 0
2:4/next_alternative_id = 2
2:4/0 = 0
2:4/0/terrain_set = 0
2:4/0/terrain = 0
2:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_by4n8")
2:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_f77ak")
2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
2:4/0/terrains_peering_bit/right_side = 0
2:4/0/terrains_peering_bit/left_side = 0
2:4/0/terrains_peering_bit/top_left_corner = 0
2:4/0/terrains_peering_bit/top_side = 0
2:4/0/terrains_peering_bit/top_right_corner = 0
2:4/1 = 1
2:4/1/flip_h = true
2:4/1/terrain_set = 0
2:4/1/terrain = 0
2:4/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_kj7tv")
2:4/1/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_ro6yg")
2:4/1/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:4/1/terrains_peering_bit/right_side = 0
2:4/1/terrains_peering_bit/left_side = 0
2:4/1/terrains_peering_bit/top_left_corner = 0
2:4/1/terrains_peering_bit/top_side = 0
2:4/1/terrains_peering_bit/top_right_corner = 0
3:4/0 = 0
3:4/0/terrain_set = 0
3:4/0/terrain = 0
3:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_by4n8")
3:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_flqmo")
3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
3:4/0/terrains_peering_bit/left_side = 0
3:4/0/terrains_peering_bit/top_left_corner = 0
3:4/0/terrains_peering_bit/top_side = 0
6:4/0 = 0
6:4/0/terrain_set = 0
6:4/0/terrain = 0
6:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
6:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
6:4/0/terrains_peering_bit/right_side = 0
6:4/0/terrains_peering_bit/bottom_right_corner = 0
6:4/0/terrains_peering_bit/bottom_side = 0
6:4/0/terrains_peering_bit/bottom_left_corner = 0
6:4/0/terrains_peering_bit/left_side = 0
6:4/0/terrains_peering_bit/top_left_corner = 0
6:4/0/terrains_peering_bit/top_side = 0
7:4/0 = 0
7:4/0/terrain_set = 0
7:4/0/terrain = 0
7:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
7:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
7:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
7:4/0/terrains_peering_bit/right_side = 0
7:4/0/terrains_peering_bit/bottom_right_corner = 0
7:4/0/terrains_peering_bit/bottom_side = 0
7:4/0/terrains_peering_bit/bottom_left_corner = 0
7:4/0/terrains_peering_bit/left_side = 0
7:4/0/terrains_peering_bit/top_side = 0
7:4/0/terrains_peering_bit/top_right_corner = 0
4:4/0 = 0
4:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
4:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
4:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
5:4/0 = 0
5:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_njrqr")
5:4/0/occlusion_layer_1/polygon_0/polygon = SubResource("OccluderPolygon2D_o2foe")
5:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, -16, 16, 16, 16, 16, -16)
[resource]
tile_size = Vector2i(32, 32)
occlusion_layer_0/light_mask = 1
occlusion_layer_1/light_mask = 2
physics_layer_0/collision_layer = 1
terrain_set_0/mode = 0
terrain_set_0/terrain_0/name = "Brick"
terrain_set_0/terrain_0/color = Color(0.5, 0.34375, 0.25, 1)
sources/0 = SubResource("TileSetAtlasSource_blkrv")
+5
View File
@@ -0,0 +1,5 @@
extends CanvasItem
func _process(_delta: float) -> void:
if Input.is_action_just_pressed("toggle_debug"):
visible = !visible;
+1
View File
@@ -0,0 +1 @@
uid://1mjqnyofaeo8
+18
View File
@@ -0,0 +1,18 @@
extends AudioStreamPlayer
@export var music : Array[AudioStream];
func skip_music():
var piece = music[randi_range(0, music.size() - 1)];
stream = piece;
play()
func _ready() -> void:
skip_music()
func _on_finished() -> void:
skip_music()
func _process(_delta: float) -> void:
if Input.is_action_just_pressed(("skip_music")):
skip_music()
+1
View File
@@ -0,0 +1 @@
uid://b3unn3dqhg2vl
+192 -46
View File
@@ -1,24 +1,42 @@
using Godot;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
public partial class PlayerPhysicsController : CharacterBody2D {
// [Export]
// public float RunMultiplier { get; set; } = 1.84f;
[Signal]
public delegate void OnTurnbackJumpEventHandler(bool onJumpPoint, bool isOnWall);
[ExportCategory("Accelerations and Impulses")]
[Export]
public float FloatingMovePenalty { get; set; } = 0.1f;
public float WalkAcceleration { get; set; } = 3f;
[Export]
public float FloatingJumpPenalty { get; set; } = 0.1f;
public float StoppingDeceleration { get; set; } = 8f;
[Export]
public float JumpStrengthDecay { get; set; } = 2;
public float CancellationAcceleration { get; set; } = 4f;
[Export]
public float MovementDecay { get; set; } = 2;
[Export]
public float MovementScale { get; set; } = 10;
[Export]
public float JumpScale { get; set; } = 12;
public float AirAcceleration { get; set; } = 0.5f;
[Export]
public float FrictionCoefficent { get; set; } = 0.1f;
public float JumpHeight { get; set; } = 5.5f;
[ExportCategory("Max Speeds")]
[Export]
private float MaxFallSpeed { get; set; } = 8f;
[Export]
private float MaxRiseSpeed { get; set; } = 16f;
[Export]
private float MaxRunSpeed { get; set; } = 16f;
[Export]
private float MaxWalkSpeed { get; set; } = 8f;
[ExportCategory("Objects")]
[Export]
public Label DebugTextLabel { get; set; }
@@ -26,60 +44,188 @@ public partial class PlayerPhysicsController : CharacterBody2D {
public AnimatedSprite2D Sprite { get; set; }
[Export]
public float Gravity { get; set; } = 980f;
public PredictiveCollisions Predictor { get; set; }
private float _timeInFlight = 0;
[ExportCategory("Physics Tweaks")]
[Export]
public float Gravity { get; set; } = 30.625f;
private float TilesToMeters => 9.81f / Gravity;
private float PxToMeters => (1 / UnitToPx) * TilesToMeters;
[Export]
public float UnitToPx { get; set; } = 32;
private float _timeOffGround = 0.0f;
[Export]
public float CoyoteTiming { get; set; } = 0.1f;
[Export]
public float Deadzone { get; set; } = 0.1f;
private float _lv = 0.0f;
private void RecalculateLv() {
_lv = Mathf.Sqrt(Mathf.Pow(Gravity * 0.1f / 2, 2) + 2 * Gravity * JumpHeight);
}
public override void _Ready() {
RecalculateLv();
base._Ready();
}
private float epsilon = 10e-5f;
public override void _Process(double delta) {
var grounded = this.IsOnFloor();
var absvel = new Vector2(Mathf.Abs(Velocity.X), Mathf.Abs(Velocity.Y));
Sprite.FlipH = Velocity.X < 0;
if (grounded && absvel.X > 0) {
Sprite.Play("walk", absvel.X switch {
var xAxis = Input.GetAxis("move_left", "move_right");
Sprite.FlipH = xAxis < 0;
if (grounded && absvel.X > 0.1) {
Sprite.Animation = "walk";
Sprite.SpeedScale = absvel.X switch {
< 10 => 1,
< 150 => 2,
< 300 => 4,
_ => 1
});
} else if (grounded && absvel.X < epsilon && absvel.Y < epsilon) {
Sprite.Play("idle");
< 600 => 4,
_ => 4
};
if (!Sprite.IsPlaying())
Sprite.Play();
} else {
Sprite.SpeedScale = 1;
}
if (grounded && absvel.X < 0.1) {
Sprite.Animation = "idle";
if (!Sprite.IsPlaying())
Sprite.Play();
}
if (!grounded && Velocity.Y > 0.1) {
Sprite.Animation = "fall";
}
if (!grounded && Velocity.Y < 0.1) {
Sprite.Animation = "jump";
}
}
public override void _PhysicsProcess(double delta) {
var xAxis = Input.GetAxis("move_left", "move_right") * MovementScale;
var yAxis = Input.GetAxis("look_up", "look_down");
var jumpStrength = -Input.GetActionStrength("jump") * JumpScale;
var xAxis = Input.GetAxis("move_left", "move_right");
var yAxis = Input.GetAxis("move_up", "move_down");
var lookAxis = Input.GetAxis("look_up", "look_down");
// var jumpStrength = -Input.GetActionStrength("jump");
RecalculateLv();
float velx = (Velocity.X / UnitToPx);
float vely = (Velocity.Y / UnitToPx) + Gravity * (float)delta;
if (Mathf.Abs(velx) < 0.1) velx = 0;
var grounded = this.IsOnFloor();
if (!grounded) {
xAxis *= FloatingMovePenalty;
jumpStrength *= FloatingJumpPenalty;
var coyoteGrounded = _timeOffGround < CoyoteTiming;
if (grounded || coyoteGrounded) {
if (grounded) _timeOffGround = 0;
else _timeOffGround += (float)delta;
if (Input.IsActionJustPressed("jump")) {
vely = -_lv;
}
if (!grounded && coyoteGrounded && Input.IsActionJustReleased("jump") && vely < 0) {
vely *= 1/4f;
}
var accel = WalkAcceleration;
if (xAxis * Velocity.X < 0) accel = StoppingDeceleration;
velx += xAxis * accel * (float)delta;
} else {
if (Input.IsActionJustReleased("jump") && vely < 0) {
vely *= 1/4f;
}
if (Input.IsActionJustPressed("turn_back") && vely > 0) {
var side = velx > 0 ? PredictiveCollisions.Location.BottomRight : PredictiveCollisions.Location.BottomLeft;
if (Predictor.AnyHit(side) && !this.IsOnWall()) {
EmitSignal(SignalName.OnTurnbackJump, true, this.IsOnWall());
var hits = Predictor.GetLastCastHits(side);
_ = hits.First(x => {
if (x.Obj is null) return false;
var collider = x.AsGodotDictionary()["collider"].AsGodotObject();
if (collider.HasMeta("JumpPointAnimatable")) {
var animPath = collider.GetMeta("JumpPointAnimatable").AsNodePath();
var anim = collider.Call(MethodName.GetNode, animPath).As<AnimatedSprite2D>();
var frame = anim.Frame;
void anf() {
anim.Stop();
anim.Frame = frame;
anim.AnimationLooped -= anf;
};
anim.AnimationLooped += anf;
anim.Play();
}
return true;
});
// has jump point
float theta = Mathf.Atan2(-yAxis, Mathf.Abs(xAxis));
float margin = 20 * (Mathf.Pi / 180f);
if (theta < margin) theta = margin;
if (theta > Mathf.Pi / 2 - margin) theta = Mathf.Pi/2 - margin;
Vector2 turnjump = new Vector2(-Mathf.Sign(velx) * Mathf.Cos(theta), -Mathf.Sin(theta) - 0.2f) * _lv;
GD.Print($"Theta: {theta * (180 / Mathf.Pi)}, turnjump: {turnjump}");
velx = turnjump.X;
vely = turnjump.Y;
} else {
// does not have jump point
// float theta = Mathf.Atan2(-yAxis, Mathf.Abs(xAxis));
// float margin = 20 * (Mathf.Pi / 180f);
// if (theta < margin) theta = margin;
// if (theta > Mathf.Pi / 2 - margin) theta = Mathf.Pi/2 - margin;
// Vector2 turnjump = new Vector2(-Mathf.Sign(Velocity.X) * Mathf.Cos(theta), -Mathf.Sin(theta) - 0.2f) * _lv;
// GD.Print($"Theta: {theta * (180 / Mathf.Pi)}, turnjump: {turnjump}");
// velx = turnjump.X;
// vely = turnjump.Y;
}
}
if (Input.IsActionJustPressed("jump") && Mathf.Abs(vely) < 2) {
vely = -_lv;
}
velx += xAxis * AirAcceleration * (float)delta;
}
if (grounded && jumpStrength < 0)
_timeInFlight = 0;
jumpStrength *= Mathf.Exp(-JumpStrengthDecay * _timeInFlight);
// autorun
var friction = Mathf.Abs(Velocity.X) > 125 ? FrictionCoefficent * 1/8f : FrictionCoefficent;
// var decay = Mathf.Abs(Velocity.X) > 125 ? MovementDecay * 1/4f : MovementDecay;
xAxis *= Mathf.Exp(-MovementDecay * Mathf.Abs(Velocity.X));
xAxis -= Velocity.X * friction;
if (grounded && Mathf.Abs(xAxis) < Deadzone) {
var autostop = -Mathf.Sign(velx) * StoppingDeceleration * (float)delta;
if (Mathf.Abs(autostop) > Mathf.Abs(velx)) velx = 0f;
else velx += autostop;
}
var moveVector = new Vector2((float)(delta * xAxis), (float)( delta * (Gravity + jumpStrength)));
DebugTextLabel.Text = $"grounded: {grounded}\nmv: {moveVector}\n vel: {Velocity}\n jumpStrength: {jumpStrength}\ntimeInFlight: {_timeInFlight}";
Velocity += moveVector;
var maxXSpeed = Input.IsActionPressed("run") ? MaxRunSpeed : MaxWalkSpeed;
var maxYSpeed = vely > 0 ? MaxFallSpeed : MaxRiseSpeed;
var (absvelx, absvely) = (Mathf.Abs(velx), Mathf.Abs(vely));
float xcancel = 0, ycancel = 0;
if (absvelx > maxXSpeed) xcancel = -Math.Sign(velx) * CancellationAcceleration * (float)delta;
if (absvely > maxYSpeed) ycancel = -Math.Sign(vely) * CancellationAcceleration * (float)delta;
if (Mathf.Abs(xcancel) + 0.1 > absvelx) velx = 0;
else velx += xcancel;
if (Mathf.Abs(ycancel) + 0.1 > absvely) vely = 0;
else vely += ycancel;
DebugTextLabel.Text =
$"grounded: {grounded}\n" +
$"vely: {vely}\n" +
$"velx: {velx}\n" +
$"lv : {_lv:F2} or {_lv/(float)delta:F2}\n" +
$"lcrc : {Predictor.AnyHit(PredictiveCollisions.Location.BottomLeft)}/{Predictor.AnyHit(PredictiveCollisions.Location.BottomRight)}";
// Force = new Vector2(0, forcey);
Velocity = new Vector2(velx, vely);
Velocity *= UnitToPx;
MoveAndSlide();
if (!grounded)
_timeInFlight += (float)delta;
base._PhysicsProcess(delta);
}
}
+43
View File
@@ -0,0 +1,43 @@
using Godot;
using System;
using System.Collections.Generic;
public partial class PredictiveCollisions : Node {
[Export]
public ShapeCast2D BottomLeft { get; set; }
[Export]
public ShapeCast2D BottomRight { get; set; }
[Export]
public ShapeCast2D TopLeft { get; set; }
[Export]
public ShapeCast2D TopRight { get; set; }
[Flags]
public enum Location {
BottomRight = 0b01,
TopRight = 0b11,
TopLeft = 0b10,
BottomLeft = 0b00
}
public Godot.Collections.Array Cast(Location location) {
GetShapeCast(location).ForceShapecastUpdate();
return GetShapeCast(location).CollisionResult;
}
public bool AnyHit(Location location)
=> (Cast(location)?.Count ?? -1) > 0;
public Godot.Collections.Array GetLastCastHits(Location location) {
return GetShapeCast(location).CollisionResult;
}
public ShapeCast2D GetShapeCast(Location location) => location switch {
Location.BottomLeft => BottomLeft,
Location.BottomRight => BottomRight,
Location.TopLeft => TopLeft,
Location.TopRight => TopRight,
_ => throw new Exception("Invalid location")
};
}
@@ -0,0 +1 @@
uid://de3b068om3gsq
+21
View File
@@ -0,0 +1,21 @@
using Godot;
using System;
public partial class ResetPlayer : Area2D {
[Export]
public Node2D Player { get; set; }
[Export]
public Vector2 ResetPosition { get; set; }
public override void _Ready() {
this.BodyShapeEntered += OnBodyShapeEntered;
base._Ready();
}
private void OnBodyShapeEntered(Rid bodyRid, Node2D body, long bodyShapeIndex, long localShapeIndex) {
if (Player == body) {
Player.Position = ResetPosition;
}
}
}
+1
View File
@@ -0,0 +1 @@
uid://d0qoxtv6ld1ef
+105
View File
@@ -0,0 +1,105 @@
using Godot;
using System;
using System.Collections.Generic;
#nullable enable
public class LevelPattern {
public TileMapPattern Level { get; }
public TileSet Solid1 { get; }
public TileSet? Solid2 { get; init; }
public TileSet Background1 { get; }
public TileSet? Background2 { get; init; }
public record Connection(int Length, bool IsHorizontal) { public bool IsVertical => !IsHorizontal; }
public Connection[] Connections { get; }
public Dictionary<Vector2I, Template.Tile> TranslationMap { get; }
public class Template {
public readonly record struct Solid(int Id);
public readonly record struct Background(int Id);
public readonly record struct Enemy(int Id);
public readonly record struct Item(int Id);
public readonly record struct Decoration(int Id);
public readonly record struct MultiTile(Tile NonOverlappable, OverlappableTile[] Overlappable);
public readonly record struct Any;
public readonly union OverlappableTile(Enemy, Item, Decoration);
public readonly union Tile(Solid, Any, Background, Enemy, Item, Decoration, MultiTile) {
public bool IsAir() {
if (this is Any or Background or Enemy or Item or Decoration) return true;
if (this is MultiTile mt) {
do {
if (mt.NonOverlappable is MultiTile _mt)
mt = _mt;
else
return mt.NonOverlappable is Any or Background or Enemy or Item or Decoration;
} while (true);
}
return false;
}
}
}
public LevelPattern(TileMapPattern pattern, TileSet solid1, TileSet background1) {
Level = pattern;
Solid1 = solid1;
Background1 = background1;
// Connections = CalculateConnections(pattern);
}
record struct ScanInfo(int XFrom, int XTo, int YFrom, int YTo);
public static Connection[] CalculateConnections(TileMapPattern pattern, Dictionary<Vector2I, Template.Tile> translations) {
var current = Vector2I.Zero;
var size = pattern.GetSize();
// scan borders
Span<ScanInfo> borders = stackalloc ScanInfo[] {
new ScanInfo(current.X, size.X, current.Y, current.Y), // top-horiz
new ScanInfo(current.X, current.X, current.Y, size.Y), // left-vert
new ScanInfo(current.X, size.X, size.Y, size.Y), // bottom-horiz
new ScanInfo(size.X, size.X, current.Y, size.Y) // right-vert
};
List<Connection> connections = [];
foreach(var border in borders) {
int xrun = 0;
for(int x = border.XFrom; x < border.XTo; x++) {
int yrun = 0;
for(int y = border.YFrom; y < border.YTo; y++) {
var cell = translations[pattern.GetCellAtlasCoords(new Vector2I(x, y))];
if (cell.IsAir())
yrun++;
else if (yrun > 0) {
connections.Add(new Connection(
yrun, IsHorizontal: false
));
yrun = 0;
}
}
if (border.YFrom == border.YTo) {
// horizontal run
var cell = translations[pattern.GetCellAtlasCoords(new Vector2I(x, border.YFrom))];
if (cell.IsAir())
xrun++;
else if (xrun > 0) {
connections.Add(new Connection(
xrun, IsHorizontal: true
));
xrun = 0;
}
}
}
}
return connections.ToArray();
}
}
#nullable restore
+1
View File
@@ -0,0 +1 @@
uid://b4fmcn1xf2rue
+4
View File
@@ -0,0 +1,4 @@
public class SymbolicTileMap {
}
+1
View File
@@ -0,0 +1 @@
uid://ca1802nst4udo
+6
View File
@@ -0,0 +1,6 @@
namespace System.Runtime.CompilerServices {
public interface IUnion { }
[AttributeUsage(AttributeTargets.Class)]
public sealed class UnionAttribute : Attribute { }
}
+1
View File
@@ -0,0 +1 @@
uid://cgpdhgigu3oo4
+33
View File
@@ -0,0 +1,33 @@
[gd_resource type="VisualShader" format=3 uid="uid://dwgy05x43arpb"]
[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_46mxo"]
input_name = "color"
[sub_resource type="VisualShaderNodeFloatParameter" id="VisualShaderNodeFloatParameter_paeta"]
parameter_name = "FloatParameter"
qualifier = 2
hint = 1
default_value_enabled = true
default_value = 0.5
[sub_resource type="VisualShaderNodeVectorCompose" id="VisualShaderNodeVectorCompose_282el"]
default_input_values = [0, 0.0, 1, 0.0, 2, 0.0, 3, 0.0]
op_type = 2
[sub_resource type="VisualShaderNodeVectorOp" id="VisualShaderNodeVectorOp_ivc0m"]
default_input_values = [0, Quaternion(0, 0, 0, 0), 1, Quaternion(0, 0, 0, 0)]
op_type = 2
operator = 2
[resource]
mode = 1
flags/light_only = false
nodes/vertex/3/node = SubResource("VisualShaderNodeInput_46mxo")
nodes/vertex/3/position = Vector2(-280, 160)
nodes/vertex/7/node = SubResource("VisualShaderNodeFloatParameter_paeta")
nodes/vertex/7/position = Vector2(-460, 340)
nodes/vertex/8/node = SubResource("VisualShaderNodeVectorCompose_282el")
nodes/vertex/8/position = Vector2(-140, 300)
nodes/vertex/9/node = SubResource("VisualShaderNodeVectorOp_ivc0m")
nodes/vertex/9/position = Vector2(80, 160)
nodes/vertex/connections = PackedInt32Array(3, 0, 9, 0, 8, 0, 9, 1, 7, 0, 8, 0, 7, 0, 8, 1, 7, 0, 8, 2, 7, 0, 8, 3, 9, 0, 0, 2)