feat: add initial architecture

This commit is contained in:
2026-08-20 19:46:07 +02:00
parent 6fbdc578a2
commit 51ac7aee8c
32 changed files with 1264 additions and 41 deletions
@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://b5i827vmueyei" uid="uid://b5i827vmueyei"
path.s3tc="res://.godot/imported/skybox_emx_19.png-bcedc2389708497367e5aad83b1663bd.s3tc.ctex" path.s3tc="res://.godot/imported/skybox_emx_19.png-32e3e8fe1f1a6e420d2641cab7e6f270.s3tc.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "imported_formats": ["s3tc_bptc"],
"vram_texture": true "vram_texture": true
@@ -11,8 +11,8 @@ metadata={
[deps] [deps]
source_file="res://Assets/Textures/Skyboxes/skybox_emx_19.png" source_file="res://assets/textures/skyboxes/skybox_emx_19.png"
dest_files=["res://.godot/imported/skybox_emx_19.png-bcedc2389708497367e5aad83b1663bd.s3tc.ctex"] dest_files=["res://.godot/imported/skybox_emx_19.png-32e3e8fe1f1a6e420d2641cab7e6f270.s3tc.ctex"]
[params] [params]
Binary file not shown.
@@ -0,0 +1,45 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://blkhom228sqgi"
path="res://.godot/imported/floor_ceiling_hr_4.glb-34017de24b2c7bf5df2db25493b6d322.scn"
[deps]
source_file="res://assets/models/floor_ceiling_hr_4.glb"
dest_files=["res://.godot/imported/floor_ceiling_hr_4.glb-34017de24b2c7bf5df2db25493b6d322.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
mesh_library/use_node_names_as_mesh_names=false
array_mesh/deduplicate_surfaces=true
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1
gltf/texture_map_mode=1
Binary file not shown.
@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dwtldkyjqkfn2"
path.s3tc="res://.godot/imported/floor_ceiling_hr_4_concrete_hr_1.png-18c5952fad7fed29047d5f53a9693939.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "6b68812ca1192c55adb97820fddac433"
}
[deps]
source_file="res://assets/models/floor_ceiling_hr_4_concrete_hr_1.png"
dest_files=["res://.godot/imported/floor_ceiling_hr_4_concrete_hr_1.png-18c5952fad7fed29047d5f53a9693939.s3tc.ctex"]
[params]
compress/mode=2
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=true
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=0
Binary file not shown.
@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bmvhcu2j0mpeh"
path.s3tc="res://.godot/imported/floor_ceiling_hr_4_tiles_floor_hr_2.png-0ab5afd20ee5925c948f8e3977df04f0.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "1db141300033565c166a12c6adf9734e"
}
[deps]
source_file="res://assets/models/floor_ceiling_hr_4_tiles_floor_hr_2.png"
dest_files=["res://.godot/imported/floor_ceiling_hr_4_tiles_floor_hr_2.png-0ab5afd20ee5925c948f8e3977df04f0.s3tc.ctex"]
[params]
compress/mode=2
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=true
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=0
Binary file not shown.
@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cd7ppu185gnyn"
path.s3tc="res://.godot/imported/floor_ceiling_hr_4_wall_hr_2.png-976c9892b0e708b837cfe88549fbdddd.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "1dd1b53fe45bdc4cd8e26c2885e0a4a4"
}
[deps]
source_file="res://assets/models/floor_ceiling_hr_4_wall_hr_2.png"
dest_files=["res://.godot/imported/floor_ceiling_hr_4_wall_hr_2.png-976c9892b0e708b837cfe88549fbdddd.s3tc.ctex"]
[params]
compress/mode=2
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=true
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=0
Binary file not shown.
@@ -0,0 +1,45 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b8abaxh2nxu3j"
path="res://.godot/imported/simple-character-psx.glb-e2ab5e760b4cbcc47459e3a2153e8e6e.scn"
[deps]
source_file="res://assets/models/simple-character-psx.glb"
dest_files=["res://.godot/imported/simple-character-psx.glb-e2ab5e760b4cbcc47459e3a2153e8e6e.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
mesh_library/use_node_names_as_mesh_names=false
array_mesh/deduplicate_surfaces=true
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
gltf/naming_version=2
gltf/embedded_image_handling=1
gltf/texture_map_mode=1
Binary file not shown.
@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bymgknsy145ap"
path.s3tc="res://.godot/imported/simple-character-psx_character_256.png-5281280763143f8159deb85fd84320a2.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "9a96d8b5a62d6005d9b1214f0f2f602d"
}
[deps]
source_file="res://assets/models/simple-character-psx_character_256.png"
dest_files=["res://.godot/imported/simple-character-psx_character_256.png-5281280763143f8159deb85fd84320a2.s3tc.ctex"]
[params]
compress/mode=2
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=true
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=0
+2 -3
View File
@@ -1,8 +1,7 @@
<Project Sdk="Godot.NET.Sdk/4.7.1"> <Project Sdk="Godot.NET.Sdk/4.7.1">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading> <EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>NightShift</RootNamespace> <RootNamespace>Game</RootNamespace>
</PropertyGroup> </PropertyGroup>
</Project> </Project>
-15
View File
@@ -1,15 +0,0 @@
using Godot;
using System;
public partial class Main : Node
{
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
}
-1
View File
@@ -1 +0,0 @@
uid://20xhubfcniqg
-19
View File
@@ -1,19 +0,0 @@
[gd_scene format=3 uid="uid://p766ipnev5hb"]
[ext_resource type="Texture2D" uid="uid://b5i827vmueyei" path="res://Assets/Textures/Skyboxes/skybox_emx_19.png" id="1_p8rbg"]
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_p8rbg"]
panorama = ExtResource("1_p8rbg")
[sub_resource type="Sky" id="Sky_qtv3y"]
sky_material = SubResource("PanoramaSkyMaterial_p8rbg")
[sub_resource type="Environment" id="Environment_cmk6n"]
background_mode = 2
sky = SubResource("Sky_qtv3y")
glow_enabled = true
[node name="Main" type="Node" unique_id=118718415]
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=262568438]
environment = SubResource("Environment_cmk6n")
+8
View File
@@ -0,0 +1,8 @@
using Game.Shared.Domain;
namespace Game.Features.Player.Domain;
public class PlayerData
{
public EntityId Id { get; private set; }
}
@@ -0,0 +1 @@
uid://cjblpuqhlu1yf
@@ -0,0 +1,10 @@
using Game.Features.Player.Domain;
using Godot;
using System;
namespace Game.Features.Player.Godot;
public partial class PlayerController : Node3D
{
[Export] public CharacterBody3D Body;
}
@@ -0,0 +1 @@
uid://mjm7ghkibnxa
File diff suppressed because one or more lines are too long
@@ -0,0 +1,13 @@
[gd_scene format=3 uid="uid://curuqmbndymi6"]
[ext_resource type="PackedScene" uid="uid://blkhom228sqgi" path="res://assets/models/floor_ceiling_hr_4.glb" id="1_7nnv3"]
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_7nnv3"]
points = PackedVector3Array(-2, 2.861023e-06, -2, -2, 2.861023e-06, 2, -2, 0.4000031, -2, 2, 2.861023e-06, -2, -2, 0.39996395, 2, 2, 2.861023e-06, 2, 2, 0.4000031, -2, 2, 0.39996395, 2)
[node name="floor_ceiling_hr_42" unique_id=33949496 instance=ExtResource("1_7nnv3")]
[node name="StaticBody3D" type="StaticBody3D" parent="." index="1" unique_id=1729023140]
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0" unique_id=1193592610]
shape = SubResource("ConvexPolygonShape3D_7nnv3")
@@ -0,0 +1,8 @@
using Game.Features.Player.Godot;
using Godot;
using System;
public partial class GameWorld : Node
{
}
@@ -0,0 +1 @@
uid://drctu5y21ey2y
@@ -0,0 +1,56 @@
[gd_scene format=3 uid="uid://c44pljehe0qun"]
[ext_resource type="Texture2D" uid="uid://b5i827vmueyei" path="res://assets/textures/skyboxes/skybox_emx_19.png" id="1_g4n7o"]
[ext_resource type="PackedScene" uid="uid://curuqmbndymi6" path="res://src/Infrastructure/Floor/FloorCeilingHr42.tscn" id="2_1kpcd"]
[ext_resource type="PackedScene" uid="uid://bka1dmgdi5btd" path="res://src/Features/Player/Godot/PlayerNode.tscn" id="2_mvtit"]
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_epykj"]
panorama = ExtResource("1_g4n7o")
[sub_resource type="Sky" id="Sky_1kpcd"]
sky_material = SubResource("PanoramaSkyMaterial_epykj")
[sub_resource type="Environment" id="Environment_mvtit"]
background_mode = 2
sky = SubResource("Sky_1kpcd")
glow_enabled = true
[node name="GameWorld" type="Node" unique_id=222644234]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1669211403]
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
shadow_enabled = true
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=847581298]
environment = SubResource("Environment_mvtit")
[node name="Player" parent="." unique_id=26823676 instance=ExtResource("2_mvtit")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
[node name="Entities" type="Node3D" parent="." unique_id=851492709]
[node name="floor_ceiling_hr_46" parent="Entities" unique_id=33949496 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 4)
[node name="floor_ceiling_hr_47" parent="Entities" unique_id=277851190 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 4)
[node name="floor_ceiling_hr_44" parent="Entities" unique_id=1904740552 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, -4)
[node name="floor_ceiling_hr_45" parent="Entities" unique_id=1096250035 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4)
[node name="floor_ceiling_hr_43" parent="Entities" unique_id=1799505353 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0)
[node name="floor_ceiling_hr_42" parent="Entities" unique_id=1144273698 instance=ExtResource("2_1kpcd")]
[node name="floor_ceiling_hr_48" parent="Entities" unique_id=252704215 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, 4)
[node name="floor_ceiling_hr_49" parent="Entities" unique_id=1131416798 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, -4)
[node name="floor_ceiling_hr_50" parent="Entities" unique_id=1804933431 instance=ExtResource("2_1kpcd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, 0)
+6
View File
@@ -0,0 +1,6 @@
namespace Game.Shared.Events;
public interface IEvent
{
}
+1
View File
@@ -0,0 +1 @@
uid://bc6g3mar6am56
+12
View File
@@ -0,0 +1,12 @@
using System;
namespace Game.Shared.Events;
public interface IEventBus
{
IDisposable Subscribe<TEvent>(Action<TEvent> handler) where TEvent : IEvent;
void Publish<TEvent>(TEvent gameEvent) where TEvent : IEvent;
void Clear();
}
+1
View File
@@ -0,0 +1 @@
uid://c6txowanjmm5j
+87
View File
@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
namespace Game.Shared.Events;
public sealed class InMemoryEventBus : IEventBus
{
private readonly Dictionary<Type, List<Delegate>> _handlers = [];
private readonly object _lock = new();
public IDisposable Subscribe<TEvent>(Action<TEvent> handler) where TEvent : IEvent
{
ArgumentNullException.ThrowIfNull(handler);
var eventType = typeof(TEvent);
lock (_lock)
{
if (!_handlers.TryGetValue(eventType, out var list))
{
list = [];
_handlers[eventType] = list;
}
list.Add(handler);
}
return new EventSubscription(() => Unsubscribe(eventType, handler));
}
public void Publish<TEvent>(TEvent gameEvent) where TEvent : IEvent
{
ArgumentNullException.ThrowIfNull(gameEvent);
List<Delegate> snapshot = null;
var eventType = typeof(TEvent);
lock (_lock)
{
if (_handlers.TryGetValue(eventType, out var list))
{
snapshot = new List<Delegate>(list);
}
}
if (snapshot == null) return;
foreach (var subscriber in snapshot)
{
((Action<TEvent>)subscriber)(gameEvent);
}
}
private void Unsubscribe(Type eventType, Delegate handler)
{
lock (_lock)
{
if (!_handlers.TryGetValue(eventType, out var list)) return;
list.Remove(handler);
if (list.Count == 0)
{
_handlers.Remove(eventType);
}
}
}
public void Clear()
{
lock (_lock)
{
_handlers.Clear();
}
}
private sealed class EventSubscription(Action unsubscribeAction) : IDisposable
{
private Action _unsubscribeAction = unsubscribeAction;
public void Dispose()
{
_unsubscribeAction?.Invoke();
_unsubscribeAction = null;
}
}
}
@@ -0,0 +1 @@
uid://dsai75jgta1v3