Compare commits

...

27 Commits

Author SHA1 Message Date
8a99771491 Add more boxes, implement weapon that gets stronger on lower HP 2026-02-04 23:51:07 -08:00
d45bc67722 Partially implementation of box items 2026-02-04 22:30:10 -08:00
13ebe54474 Fix some control issues 2026-02-04 02:34:23 -08:00
b9a1888bfc Add implementation for box item 2026-02-04 02:11:00 -08:00
5ae556cb4b Fix some broken stuff (player spawn, disabled input after loading next floor) 2026-02-04 02:04:04 -08:00
52dc8fb9e4 Box item implementation 2026-02-04 01:49:17 -08:00
affa5e1f79 Player step SFX pitch change 2026-02-03 22:15:02 -08:00
Pal
35a625f636 merge 2026-02-03 21:06:28 -08:00
Pal
d5de5f7379 player anim changes 2026-02-03 21:05:20 -08:00
3e6e21977e Fix Altar scaling 2026-02-03 20:52:14 -08:00
Pal
4a2d131276 Boss floor changes minor 2026-02-03 19:54:05 -08:00
Pal
d9c2ba7ed1 Added Memorial Steles, boss A floor visual polish, re-enabled overworld distance scenery 2026-02-03 04:18:25 -08:00
051ffbbcb1 Fix bug with Boss A (hit box didn't get scaled correctly)
Fix reset of death animation
2026-02-03 02:24:54 -08:00
9747d7d2c5 Revert boss floor environment lighting change 2026-02-03 02:04:21 -08:00
34dce8c5a2 Loading screen fixes, transition screen UI fixes 2026-02-03 01:47:42 -08:00
51010c4f7d Fix overworld collisions 2026-02-03 00:34:19 -08:00
fd96eb2dc9 Fix minimap height
Rework boss code to separate boss A concerns from demon wall
2026-02-02 23:24:48 -08:00
51c8f26e50 Minor fixes for NPC dialogue stuff
Add collisions for overworld
2026-02-02 22:39:33 -08:00
4c90eb6f07 Fix additional collisions 2026-02-02 21:59:48 -08:00
30f0a078a9 Boss A fixes 2026-02-02 20:01:54 -08:00
6e4a4d605c Partially fix boss room A, only one guy moves though 2026-02-02 00:27:11 -08:00
Pal
836b9eb26d idk merghhe 2026-02-01 16:48:25 -08:00
Pal
cb2df83079 idk 2026-02-01 16:48:02 -08:00
0282ef68f3 Collisions again 2026-02-01 16:00:44 -08:00
Pal
1678d79bbd Added E symbol to Exit floors 2026-02-01 14:02:52 -08:00
Pal
20d2890b37 Pit A, Dismantled, Puer texture fixes 2026-02-01 13:46:14 -08:00
Pal
e85c8d51f1 1A fix 2026-02-01 05:07:13 -08:00
217 changed files with 17941 additions and 10805 deletions

View File

@@ -4,5 +4,21 @@ public enum ItemTag
{
None,
BreaksOnChange,
MysteryItem
}
MysteryItem,
DamagesPlayer,
ContainsRestorative,
ContainsWeapon,
ContainsArmor,
ContainsBox,
RandomSpell,
ContainsAccessory,
DropTo1HPAndGainRareItem,
TradeOneRandomItem,
TradeAllRandomItems,
ContainsUnobtainedItem,
ContainsBasicItem,
RestrictUnequip,
UnequipAllItems,
EjectAllItems,
UseAllItems
}

View File

@@ -7,4 +7,5 @@ public enum WeaponTag
IgnoreAffinity,
IgnoreDefense,
Knockback,
InverseHPAttackPower,
}

View File

@@ -7,7 +7,7 @@ public interface IDungeonFloor : INode3D
{
void InitializeDungeon();
public Transform3D GetPlayerSpawnPoint();
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint();
public ImmutableList<IDungeonRoom> Rooms { get; }

View File

@@ -18,7 +18,7 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void LevelUp();
public void TeleportPlayer(Transform3D newTransform);
public void TeleportPlayer((Vector3 Rotation, Vector3 Position) newTransform);
public void Equip(EquipableItem equipable);
@@ -44,6 +44,8 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void SetHealthTimerStatus(bool isActive);
public bool CanEquipState { get; set; }
public event Action PlayerDied;
public delegate InventoryItem RerollItem(InventoryItem item);
}

View File

@@ -55,144 +55,142 @@ public partial class App : Node, IApp
public void Initialize()
{
_container = new SimpleInjector.Container();
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.RegisterSingleton<IAppRepo, AppRepo>();
_container.RegisterSingleton<IAppLogic, AppLogic>();
_container.RegisterSingleton<IFileSystem, FileSystem>();
_container.RegisterSingleton<ISaveFileManager, SaveFileManager>();
_container = new SimpleInjector.Container();
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.RegisterSingleton<IAppRepo, AppRepo>();
_container.RegisterSingleton<IAppLogic, AppLogic>();
_container.RegisterSingleton<IFileSystem, FileSystem>();
_container.RegisterSingleton<ISaveFileManager, SaveFileManager>();
_saveFileManager = _container.GetInstance<ISaveFileManager>();
_optionsSavePath = $"{OS.GetUserDataDir()}/options.json";
_controllerSavePath = $"{OS.GetUserDataDir()}/controls.json";
_saveFileManager = _container.GetInstance<ISaveFileManager>();
_optionsSavePath = $"{OS.GetUserDataDir()}/options.json";
_controllerSavePath = $"{OS.GetUserDataDir()}/controls.json";
MainMenu.StartGame += OnStartGame;
MainMenu.EnemyViewer += OnEnemyViewer;
MainMenu.Gallery += OnGallery;
MainMenu.Options += OnOptions;
MainMenu.Quit += OnQuit;
MainMenu.StartGame += OnStartGame;
MainMenu.EnemyViewer += OnEnemyViewer;
MainMenu.Gallery += OnGallery;
MainMenu.Options += OnOptions;
MainMenu.Quit += OnQuit;
GalleryMenu.GalleryExited += GalleryExited;
GalleryMenu.GalleryExited += GalleryExited;
OptionsMenu.OptionsMenuExited += OptionsMenu_OptionsMenuExited;
OptionsMenu.DeleteSaveData += DeleteSaveData;
AppRepo = _container.GetInstance<IAppRepo>();
AppLogic = _container.GetInstance<IAppLogic>();
OptionsMenu.OptionsMenuExited += OptionsMenu_OptionsMenuExited;
OptionsMenu.DeleteSaveData += DeleteSaveData;
AppRepo = _container.GetInstance<IAppRepo>();
AppLogic = _container.GetInstance<IAppLogic>();
Task.Run(() => _saveFileManager.ReadFromFile<string>(_controllerSavePath).ContinueWith((data) =>
{
if (data.IsCompletedSuccessfully)
OptionsMenu.Controller.CallDeferred(nameof(OptionsMenu.Controller.LoadControllerInput), data.Result);
}));
Task.Run(() => _saveFileManager.ReadFromFile<string>(_controllerSavePath).ContinueWith((data) =>
{
if (data.IsCompletedSuccessfully)
OptionsMenu.Controller.CallDeferred(nameof(OptionsMenu.Controller.LoadControllerInput), data.Result);
}));
AppLogic.Set(AppRepo);
AppLogic.Set(new AppLogic.Data());
AppLogic.Set(AppRepo);
AppLogic.Set(new AppLogic.Data());
AppRepo.DataViewerExited += DataViewerExited;
AppRepo.DataViewerExited += DataViewerExited;
Input.MouseMode = Input.MouseModeEnum.Visible;
_progress = [];
this.Provide();
Input.MouseMode = Input.MouseModeEnum.Visible;
_progress = [];
this.Provide();
}
private void GameExitRequested()
{
AppLogic.Input(new AppLogic.Input.QuitGame());
AppLogic.Input(new AppLogic.Input.QuitGame());
}
private void DeleteSaveData()
{
var saveFileManager = _container.GetInstance<ISaveFileManager>();
saveFileManager.DeleteSaveData();
var saveFileManager = _container.GetInstance<ISaveFileManager>();
saveFileManager.DeleteSaveData();
}
private void DataViewerExited()
{
AppLogic.Input(new AppLogic.Input.EnemyViewerExited());
AppLogic.Input(new AppLogic.Input.EnemyViewerExited());
}
private async void OptionsMenu_OptionsMenuExited()
{
var saveFileManager = _container.GetInstance<ISaveFileManager>();
await saveFileManager.WriteToFile(OptionsMenu.OptionsData, _optionsSavePath);
var controllerOutput = InputHelper.SerializeInputsForActions();
await saveFileManager.WriteToFile(controllerOutput, _controllerSavePath);
OptionsMenu.Hide();
MainMenu.OptionsButton.GrabFocus();
var saveFileManager = _container.GetInstance<ISaveFileManager>();
await saveFileManager.WriteToFile(OptionsMenu.OptionsData, _optionsSavePath);
var controllerOutput = InputHelper.SerializeInputsForActions();
await saveFileManager.WriteToFile(controllerOutput, _controllerSavePath);
OptionsMenu.Hide();
MainMenu.OptionsButton.GrabFocus();
}
private void GalleryExited()
{
GalleryMenu.Hide();
MainMenu.GalleryButton.GrabFocus();
GalleryMenu.Hide();
MainMenu.GalleryButton.GrabFocus();
}
public void OnReady()
{
AppBinding = AppLogic.Bind();
AppBinding = AppLogic.Bind();
AppBinding
.Handle((in AppLogic.Output.Initialize _) =>
{
Task.Run(() => _saveFileManager.ReadFromFile<string>(_optionsSavePath).ContinueWith((data) =>
{
AppLogic.Input(new AppLogic.Input.SaveFileLoaded());
}));
})
.Handle((in AppLogic.Output.ShowSplashScreen _) =>
{
AppLogic.Input(new AppLogic.Input.FadeOutFinished());
})
.Handle((in AppLogic.Output.HideSplashScreen _) =>
{
})
.Handle((in AppLogic.Output.SetupGameScene _) =>
{
LoadingScreen.Show();
LoadGame(GAME_SCENE_PATH);
})
.Handle((in AppLogic.Output.ShowMainMenu _) =>
{
MainMenu.CallDeferred(MainMenu.MethodName.FadeIn);
})
.Handle((in AppLogic.Output.CloseGame _) =>
{
LoadingScreen.Hide();
_game.GameExitRequested -= GameExitRequested;
MainMenu.StartGameButton.GrabFocus();
_game.CallDeferred(MethodName.QueueFree, []);
GetTree().Paused = false;
})
.Handle((in AppLogic.Output.StartLoadingSaveFile _) =>
{
})
.Handle((in AppLogic.Output.EnemyViewerOpened _) =>
{
LoadingScreen.Show();
LoadEnemyViewer(ENEMY_VIEWER_PATH);
})
.Handle((in AppLogic.Output.EnemyViewerExited _) =>
{
LoadingScreen.Hide();
if (_enemyViewer != null && _enemyViewer is DataViewer enemyViewer)
enemyViewer.CallDeferred(MethodName.QueueFree);
MainMenu.Show();
MainMenu.EnemyViewerButton.GrabFocus();
})
.Handle((in AppLogic.Output.ExitGame _) =>
{
GetTree().Quit();
});
AppBinding
.Handle((in AppLogic.Output.Initialize _) =>
{
Task.Run(() => _saveFileManager.ReadFromFile<string>(_optionsSavePath).ContinueWith((data) =>
{
AppLogic.Input(new AppLogic.Input.SaveFileLoaded());
}));
})
.Handle((in AppLogic.Output.ShowSplashScreen _) =>
{
AppLogic.Input(new AppLogic.Input.FadeOutFinished());
})
.Handle((in AppLogic.Output.HideSplashScreen _) =>
{
})
.Handle((in AppLogic.Output.SetupGameScene _) =>
{
LoadingScreen.Show();
LoadGame(GAME_SCENE_PATH);
})
.Handle((in AppLogic.Output.ShowMainMenu _) =>
{
MainMenu.CallDeferred(MainMenu.MethodName.FadeIn);
})
.Handle((in AppLogic.Output.CloseGame _) =>
{
LoadingScreen.Hide();
_game.GameExitRequested -= GameExitRequested;
MainMenu.StartGameButton.GrabFocus();
_game.CallDeferred(MethodName.QueueFree, []);
GetTree().Paused = false;
})
.Handle((in AppLogic.Output.StartLoadingSaveFile _) =>
{
})
.Handle((in AppLogic.Output.EnemyViewerOpened _) =>
{
LoadingScreen.Show();
MainMenu.Hide();
LoadEnemyViewer(ENEMY_VIEWER_PATH);
})
.Handle((in AppLogic.Output.EnemyViewerExited _) =>
{
LoadingScreen.Hide();
if (_enemyViewer != null && _enemyViewer is DataViewer enemyViewer)
enemyViewer.CallDeferred(MethodName.QueueFree);
MainMenu.Show();
MainMenu.EnemyViewerButton.GrabFocus();
})
.Handle((in AppLogic.Output.ExitGame _) =>
{
GetTree().Quit();
});
AppLogic.Start();
AppLogic.Start();
}
public override void _Process(double delta)
{
if (_reportedProgress < 1)
LoadingScreen.ProgressBar.Value = Mathf.RoundToInt(Mathf.Lerp(LoadingScreen.ProgressBar.Value, _reportedProgress * 100, (float)delta * 2));
else
LoadingScreen.ProgressBar.Value = Mathf.RoundToInt(Mathf.Lerp(LoadingScreen.ProgressBar.Value, 200, (float)delta * 5));
LoadingScreen.ProgressBar.Value = Mathf.RoundToInt(Mathf.Lerp(LoadingScreen.ProgressBar.Value, _reportedProgress * 100, (float)delta * 2));
}
public void OnStartGame() => AppLogic.Input(new AppLogic.Input.NewGame());
@@ -203,64 +201,68 @@ public partial class App : Node, IApp
private async void LoadGame(string sceneName)
{
var scene = await LoadSceneInternal(sceneName);
_game = scene as IGame;
_game.GameExitRequested += GameExitRequested;
await ToSignal(GetTree().CreateTimer(0.8f), "timeout");
CallDeferred(MethodName.AddChild, scene);
var scene = await LoadSceneInternal(sceneName);
_game = scene as IGame;
_game.GameLoaded += OnGameLoaded;
_game.GameExitRequested += GameExitRequested;
await ToSignal(GetTree().CreateTimer(0.8f), "timeout");
CallDeferred(MethodName.AddChild, scene);
}
private void OnGameLoaded() => LoadingScreen.Hide();
private async void LoadEnemyViewer(string sceneName)
{
var scene = await LoadSceneInternal(sceneName);
_enemyViewer = scene as IDataViewer;
await ToSignal(GetTree().CreateTimer(0.8f), "timeout");
CallDeferred(MethodName.AddChild, scene);
var scene = await LoadSceneInternal(sceneName);
_enemyViewer = scene as IDataViewer;
await ToSignal(GetTree().CreateTimer(0.8f), "timeout");
CallDeferred(MethodName.AddChild, scene);
LoadingScreen.Hide();
}
private async Task<Node> LoadSceneInternal(string sceneName)
{
LoadingScreen.Show();
LoadingScreen.ProgressBar.Value = 0;
var sceneLoader = new SceneLoader();
CallDeferred(MethodName.AddChild, sceneLoader);
sceneLoader.LoadSceneRequest(sceneName);
sceneLoader.SceneReportedProgress += SceneLoader_SceneReportedProgress;
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
var result = sceneLoader.LoadedScene;
sceneLoader.QueueFree();
return result;
LoadingScreen.Show();
LoadingScreen.ProgressBar.Value = 0;
var sceneLoader = new SceneLoader();
CallDeferred(MethodName.AddChild, sceneLoader);
sceneLoader.LoadSceneRequest(sceneName);
sceneLoader.SceneReportedProgress += SceneLoader_SceneReportedProgress;
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
var result = sceneLoader.LoadedScene;
sceneLoader.QueueFree();
return result;
}
private void SceneLoader_SceneReportedProgress(double progress) => _reportedProgress = progress;
private async void OnOptions()
{
OptionsMenu.Show();
OptionsMenu.GameTab.GrabFocus();
OptionsMenu.Show();
OptionsMenu.GameTab.GrabFocus();
}
private async void OnGallery()
{
GalleryMenu.Show();
GalleryMenu.ItemButton1.GrabFocus();
GalleryMenu.Show();
GalleryMenu.ItemButton1.GrabFocus();
}
public void OnQuit() => AppLogic.Input(new AppLogic.Input.QuitGame());
public void OnSaveFileLoaded()
{
AppLogic.Input(new AppLogic.Input.SaveFileLoaded());
AppLogic.Input(new AppLogic.Input.SaveFileLoaded());
}
public void OnExitTree()
{
AppLogic.Stop();
AppBinding.Dispose();
AppRepo.Dispose();
AppLogic.Stop();
AppBinding.Dispose();
AppRepo.Dispose();
MainMenu.StartGame -= OnStartGame;
MainMenu.EnemyViewer -= OnEnemyViewer;
MainMenu.Quit -= OnQuit;
MainMenu.StartGame -= OnStartGame;
MainMenu.EnemyViewer -= OnEnemyViewer;
MainMenu.Quit -= OnQuit;
}
}

View File

@@ -14,10 +14,6 @@ script = ExtResource("1_rt73h")
unique_name_in_owner = true
visible = false
[node name="LoadingScreen" parent="." instance=ExtResource("3_3st5l")]
unique_name_in_owner = true
visible = false
[node name="OptionsMenu" parent="." instance=ExtResource("2_v0mgf")]
unique_name_in_owner = true
visible = false
@@ -31,3 +27,9 @@ unique_name_in_owner = true
visible = false
offset_right = 40.0
offset_bottom = 40.0
[node name="LoadingScreen" parent="." instance=ExtResource("3_3st5l")]
unique_name_in_owner = true
visible = false
top_level = true
z_index = 999

View File

@@ -1,3 +1,3 @@
~ no_exit
Altar: This is the text that shows when you try to leave
Altar: There exists only one way forward.
=> END

View File

@@ -0,0 +1,42 @@
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class BossAModelView : EnemyModelView3D, INode3D
{
public override void _Notification(int what) => this.Notify(what);
[Node] public Node3D Armature { get; set; } = default!;
[Node] public Area3D Hitbox { get; set; } = default!;
[Node] public Node3D ExplodingModel { get; set; } = default!;
[Node] public AnimationPlayer DeathAnimation { get; set; } = default!;
[Signal] public delegate void OnDeathAnimationCompletedEventHandler();
public void Setup()
{
Hitbox.AreaEntered += Hitbox_AreaEntered;
DeathAnimation.AnimationFinished += DeathAnimation_AnimationFinished;
}
private void Hitbox_AreaEntered(Area3D area) => OnPlayerHit(new AttackEventArgs(AttackData));
private void DeathAnimation_AnimationFinished(StringName animName)
{
EmitSignal(SignalName.OnDeathAnimationCompleted);
}
public override void PlayDeathAnimation()
{
Armature.Hide();
ExplodingModel.Show();
DeathAnimation.Play("Animation");
}
}

View File

@@ -0,0 +1 @@
uid://cycffa0wn7sks

View File

@@ -0,0 +1 @@
uid://brnlf1ybd4mu

View File

@@ -37,17 +37,30 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
[Node] public Area3D PlayerDetector { get; set; } = default!;
private float _movementSpeed = 2.0f;
[Node] public Label BossHP { get; set; } = default!;
private Vector3 _previousPosition = Vector3.Zero;
public void OnResolved()
{
FollowBehavior.Init(NavigationAgent);
FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += PerformAction;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited;
_enemyLogic.Input(new EnemyLogic.Input.Idle());
SetPhysicsProcess(true);
var enemyModelView3D = EnemyModelView as BossAModelView;
enemyModelView3D.OnDeathAnimationCompleted += EnemyModelView3D_OnDeathAnimationCompleted;
}
public override void _Process(double delta)
{
if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer || _enemyLogic.Value is EnemyLogic.State.Patrolling)
{
var velocity = (GlobalPosition - _previousPosition) / (float)delta;
if (velocity.IsZeroApprox())
_enemyLogic.Input(new EnemyLogic.Input.Idle());
else
_enemyLogic.Input(new EnemyLogic.Input.Move());
_previousPosition = GlobalPosition;
}
BossHP.Text = HealthComponent.CurrentHP.Value + "/" + HealthComponent.MaximumHP.Value;
}
public void OnPhysicsProcess(double delta)
@@ -66,10 +79,8 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
protected void OnVelocityComputed(Vector3 safeVelocity)
{
Velocity = safeVelocity;
if (Velocity > Vector3.Zero)
_enemyLogic.Input(new EnemyLogic.Input.Move());
else
_enemyLogic.Input(new EnemyLogic.Input.Idle());
if (!Velocity.IsZeroApprox())
LookAtTarget(safeVelocity);
MoveAndSlide();
}
@@ -106,10 +117,35 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
public override void Activate()
{
FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += PerformAction;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetProcess(true);
SetPhysicsProcess(true);
Show();
EnemyHitbox.SetDeferred(CollisionShape3D.PropertyName.Disabled, false);
_enemyLogic.Input(new EnemyLogic.Input.Activate());
}
public override void Die()
{
SetProcess(false);
SetPhysicsProcess(false);
_enemyLogic.Input(new EnemyLogic.Input.Defeated());
_collisionShape.SetDeferred(CollisionShape3D.PropertyName.Disabled, true);
EnemyHitbox.SetDeferred(CollisionShape3D.PropertyName.Disabled, true);
_player.ExperiencePointsComponent.Gain(ExpGiven);
EnemyModelView.PlayDeathAnimation();
}
private void EnemyModelView3D_OnDeathAnimationCompleted()
{
CallDeferred(MethodName.QueueFree);
}
public void RotateToPlayer(float rotationAngle)
{
var tweener = GetTree().CreateTween();

View File

@@ -1,7 +1,6 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using Godot.Collections;
using System;
using System.Collections.Immutable;
using System.Linq;
@@ -67,16 +66,6 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
protected bool _activated = false;
private Vector3 _previousPosition = Vector3.Zero;
public Enemy()
{
HealthComponent = new HealthComponent(InitialHP);
HealthComponent.HealthReachedZero += Die;
HealthComponent.DamageTaken += TakeHit;
AttackComponent = new AttackComponent(InitialAttack);
DefenseComponent = new DefenseComponent(InitialDefense);
}
#region Godot methods
public void Setup()
{
@@ -87,6 +76,13 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
EnemyModelView.HitPlayer += EnemyModelView_HitPlayer;
EnemyBinding = _enemyLogic.Bind();
HealthComponent = new HealthComponent(InitialHP);
HealthComponent.HealthReachedZero += Die;
HealthComponent.DamageTaken += TakeHit;
AttackComponent = new AttackComponent(InitialAttack);
DefenseComponent = new DefenseComponent(InitialDefense);
EnemyBinding
.Handle((in EnemyLogic.Output.Activate _) =>
{

View File

@@ -26,18 +26,16 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
EnemyDirection _enemyDirection { get; set; } = EnemyDirection.Forward;
public AttackData AttackData { get; set; }
public new void OnReady()
{
Hitbox.AreaEntered += Hitbox_AreaEntered;
base.OnReady();
Hitbox.AreaEntered += Hitbox_AreaEntered;
base.OnReady();
}
public override Vector2 GetSize()
{
return Sprite3D.GetItemRect().Size;
return Sprite3D.GetItemRect().Size;
}
private void Hitbox_AreaEntered(Area3D area) => OnPlayerHit(new AttackEventArgs(AttackData));
@@ -46,102 +44,102 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
public override void PlayHitAnimation()
{
LoadShader("res://src/vfx/shaders/DamageHit.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
LoadShader("res://src/vfx/shaders/DamageHit.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 1.0f, 1.0f);
}
public override void PlayDeathAnimation()
{
LoadShader("res://src/vfx/shaders/PixelMelt.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f);
LoadShader("res://src/vfx/shaders/PixelMelt.gdshader");
var tweener = GetTree().CreateTween();
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f);
}
private EnemyDirection GetEnemyDirection(
Basis enemyBasis,
Vector3 cameraDirection,
float rotateUpperThreshold,
float rotateLowerThreshold)
Basis enemyBasis,
Vector3 cameraDirection,
float rotateUpperThreshold,
float rotateLowerThreshold)
{
var enemyForwardDirection = enemyBasis.Z;
var enemyLeftDirection = enemyBasis.X;
var enemyForwardDirection = enemyBasis.Z;
var enemyLeftDirection = enemyBasis.X;
var leftDotProduct = enemyLeftDirection.Dot(cameraDirection);
var forwardDotProduct = enemyForwardDirection.Dot(cameraDirection);
var leftDotProduct = enemyLeftDirection.Dot(cameraDirection);
var forwardDotProduct = enemyForwardDirection.Dot(cameraDirection);
// Check if forward facing. If the dot product is -1, the enemy is facing the camera.
if (forwardDotProduct < _lowerThreshold)
{
SetForward();
return EnemyDirection.Forward;
}
// Check if forward facing. If the dot product is -1, the enemy is facing the camera.
if (forwardDotProduct < _lowerThreshold)
{
SetForward();
return EnemyDirection.Forward;
}
// Check if backward facing. If the dot product is 1, the enemy is facing the same direction as the camera.
else if (forwardDotProduct > rotateUpperThreshold)
{
SetBack();
return EnemyDirection.Backward;
}
else
{
// If the dot product of the perpendicular direction is positive (up to 1), the enemy is facing to the left (since it's mirrored).
if (leftDotProduct < _lowerThreshold)
{
SetRight();
return EnemyDirection.Left;
}
// Check if backward facing. If the dot product is 1, the enemy is facing the same direction as the camera.
else if (forwardDotProduct > rotateUpperThreshold)
{
SetBack();
return EnemyDirection.Backward;
}
else
{
// If the dot product of the perpendicular direction is positive (up to 1), the enemy is facing to the left (since it's mirrored).
if (leftDotProduct < _lowerThreshold)
{
SetRight();
return EnemyDirection.Left;
}
// Check if side facing. If the dot product is close to zero in the positive or negative direction, its close to the threshold for turning.
if (leftDotProduct > rotateUpperThreshold)
{
SetLeft();
return EnemyDirection.Right;
}
}
// Check if side facing. If the dot product is close to zero in the positive or negative direction, its close to the threshold for turning.
if (leftDotProduct > rotateUpperThreshold)
{
SetLeft();
return EnemyDirection.Right;
}
}
return _enemyDirection;
return _enemyDirection;
}
private void LoadShader(string shaderPath)
{
var shader = GD.Load<Shader>(shaderPath);
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites)
{
sprite.Material = new ShaderMaterial();
var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.Shader = shader;
}
var shader = GD.Load<Shader>(shaderPath);
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites)
{
sprite.Material = new ShaderMaterial();
var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.Shader = shader;
}
}
private void SetShaderValue(float shaderValue)
{
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites)
{
var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.SetShaderParameter("progress", shaderValue);
}
var sprites = FindChildren("*", "AnimatedSprite2D", true).Cast<AnimatedSprite2D>();
foreach (var sprite in sprites)
{
var shaderMaterial = (ShaderMaterial)sprite.Material;
shaderMaterial.SetShaderParameter("progress", shaderValue);
}
}
private void SetForward()
{
_enemyDirection = EnemyDirection.Forward;
_enemyDirection = EnemyDirection.Forward;
}
private void SetLeft()
{
_enemyDirection = EnemyDirection.Left;
_enemyDirection = EnemyDirection.Left;
}
private void SetRight()
{
_enemyDirection = EnemyDirection.Right;
_enemyDirection = EnemyDirection.Right;
}
private void SetBack()
{
_enemyDirection = EnemyDirection.Backward;
_enemyDirection = EnemyDirection.Backward;
}
}

View File

@@ -13,20 +13,14 @@ public partial class EnemyModelView3D : EnemyModelView
[Node] public MeshInstance3D MeshInstance { get; set; } = default!;
[Node] public AnimationPlayer DeathAnimation { get; set; } = default!;
[Node] public Node3D Armature { get; set; } = default!;
[Node] public Node3D ExplodingModel { get; set; } = default!;
public void OnReady()
public override void PlayWalkAnimation()
{
DeathAnimation.AnimationFinished += DeathAnimation_AnimationFinished;
_stateMachine.Travel(_walkingName, false);
}
private void DeathAnimation_AnimationFinished(StringName animName)
public override void PlayIdleAnimation()
{
QueueFree();
_stateMachine.Travel(_idleName, false);
}
public override Vector2 GetSize()
@@ -40,13 +34,6 @@ public partial class EnemyModelView3D : EnemyModelView
}
public override void PlayDeathAnimation()
{
Armature.Hide();
ExplodingModel.Show();
DeathAnimation.Play("Animation");
}
private void ChangeMaterial()
{
var material = new StandardMaterial3D
@@ -72,4 +59,4 @@ public partial class EnemyModelView3D : EnemyModelView
{
MeshInstance.Transparency = transparencyAmount;
}
}
}

View File

@@ -8,32 +8,32 @@
[ext_resource type="AudioStream" uid="uid://b7ycb6qvitpmw" path="res://src/audio/sfx/player_HITENEMY_3.ogg" id="6_fg0ds"]
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="7_exr8b"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_c0n4w"]
radius = 10.3283
height = 50.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_nt5fo"]
radius = 1.0
height = 4.0
[sub_resource type="SphereShape3D" id="SphereShape3D_jl3qa"]
radius = 15.426
[sub_resource type="SphereShape3D" id="SphereShape3D_nt5fo"]
radius = 2.70035
[sub_resource type="CylinderShape3D" id="CylinderShape3D_wp4vi"]
height = 20.0
radius = 15.0
height = 7.0
radius = 3.0
[node name="HorseFace" type="CharacterBody3D"]
collision_layer = 10
collision_mask = 3
axis_lock_linear_y = true
axis_lock_angular_x = true
axis_lock_angular_y = true
motion_mode = 1
script = ExtResource("1_x21p4")
InitialHP = 100
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
shape = SubResource("CapsuleShape3D_c0n4w")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.182602, 0.542515, -0.127861)
shape = SubResource("CapsuleShape3D_nt5fo")
[node name="EnemyModelView" parent="." instance=ExtResource("2_x21p4")]
unique_name_in_owner = true
transform = Transform3D(0.15, 0, 0, 0, 0.15, 0, 0, 0, 0.15, 0, 0.826525, 0)
[node name="Collision" type="Area3D" parent="."]
collision_layer = 2048
@@ -41,7 +41,7 @@ collision_mask = 0
[node name="EnemyHitbox" type="CollisionShape3D" parent="Collision"]
unique_name_in_owner = true
shape = SubResource("SphereShape3D_jl3qa")
shape = SubResource("SphereShape3D_nt5fo")
disabled = true
[node name="Rotation" type="Node3D" parent="."]
@@ -53,6 +53,7 @@ collision_layer = 0
collision_mask = 34
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.02405, 0)
shape = SubResource("CylinderShape3D_wp4vi")
[node name="Components" type="Node3D" parent="."]
@@ -94,3 +95,26 @@ bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
bus = &"SFX"
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchor_right = 0.149
anchor_bottom = 0.129
offset_left = 466.0
offset_top = 1021.0
offset_right = 393.92
offset_bottom = 927.68
[node name="Boss Health" type="Label" parent="Control"]
layout_mode = 0
offset_right = 40.0
offset_bottom = 23.0
text = "Horse Head HP:"
[node name="BossHP" type="Label" parent="Control"]
unique_name_in_owner = true
layout_mode = 0
offset_left = 128.0
offset_top = 2.0
offset_right = 203.0
offset_bottom = 25.0

File diff suppressed because one or more lines are too long

View File

@@ -17,6 +17,18 @@ tracks/0/keys = {
"update": 1,
"values": [true]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Hitbox/CollisionShape3D2:disabled")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_sfyuh"]
resource_name = "idle"
@@ -896,6 +908,18 @@ tracks/39/path = NodePath("Armature/Skeleton3D:heelIK_R")
tracks/39/interp = 0
tracks/39/loop_wrap = true
tracks/39/keys = PackedFloat32Array(0, 1, -0.456756, -0.539878, 0.539587, 0.456893)
tracks/40/type = "value"
tracks/40/imported = false
tracks/40/enabled = true
tracks/40/path = NodePath("Hitbox/CollisionShape3D2:disabled")
tracks/40/interp = 1
tracks/40/loop_wrap = true
tracks/40/keys = {
"times": PackedFloat32Array(0.0666667, 0.533333, 0.7),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [true, false, true]
}
[sub_resource type="Animation" id="Animation_ui3ue"]
resource_name = "WALK"
@@ -1197,7 +1221,7 @@ tracks/40/keys = {
"start_offset": 0.0,
"stream": ExtResource("1_5mwcl")
}],
"times": PackedFloat32Array(0.133333, 0.733333)
"times": PackedFloat32Array(0, 0.666667)
}
tracks/40/use_blend = true

View File

@@ -8,85 +8,40 @@
[ext_resource type="AudioStream" uid="uid://b7ycb6qvitpmw" path="res://src/audio/sfx/player_HITENEMY_3.ogg" id="6_v0b2d"]
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="7_14j2x"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_7uhtm"]
radius = 12.4931
height = 50.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_i0akf"]
radius = 1.0
height = 4.0
[sub_resource type="SphereShape3D" id="SphereShape3D_j7u30"]
radius = 15.426
[sub_resource type="SphereShape3D" id="SphereShape3D_i0akf"]
radius = 3.31305
[sub_resource type="CylinderShape3D" id="CylinderShape3D_ow3fn"]
height = 20.0
radius = 15.0
height = 7.0
radius = 4.76904
[node name="OX FACE" type="CharacterBody3D"]
collision_layer = 10
collision_mask = 3
axis_lock_linear_y = true
axis_lock_angular_z = true
motion_mode = 1
script = ExtResource("1_v6b2s")
InitialHP = 75
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3517, 0, 1.32912)
shape = SubResource("CapsuleShape3D_7uhtm")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.182602, 1.90825, -0.127861)
shape = SubResource("CapsuleShape3D_i0akf")
[node name="EnemyModelView" parent="." instance=ExtResource("2_v6b2s")]
unique_name_in_owner = true
[node name="Skeleton3D" parent="EnemyModelView/Armature" index="0"]
bones/0/position = Vector3(-0.259419, -0.955989, -1.97429)
bones/0/rotation = Quaternion(0.0915277, -0.692111, -0.0341586, 0.715149)
bones/1/rotation = Quaternion(0.0828172, 0.0642671, -0.39627, 0.91213)
bones/2/rotation = Quaternion(-0.137837, 0.137086, 0.403643, 0.894025)
bones/3/rotation = Quaternion(-0.00338816, 0.00852271, 0.0152662, 0.999842)
bones/4/rotation = Quaternion(0.037164, 0.133882, 0.101977, 0.985036)
bones/5/rotation = Quaternion(-0.0397875, -0.0104688, 0.0235613, 0.998875)
bones/6/rotation = Quaternion(-0.0748623, -0.304184, -0.744777, 0.589215)
bones/7/rotation = Quaternion(0.0788712, -0.0306685, -0.220772, 0.971647)
bones/8/rotation = Quaternion(-0.127286, 0.0273856, -0.425308, 0.895635)
bones/9/rotation = Quaternion(-0.0931654, 0.0493592, -0.752794, 0.649757)
bones/10/rotation = Quaternion(0.0429966, 0.0102923, 0.363547, 0.930526)
bones/11/rotation = Quaternion(-0.785185, -0.062058, 0.0709016, 0.612051)
bones/12/rotation = Quaternion(-0.607818, -0.670503, -0.284916, 0.31592)
bones/13/rotation = Quaternion(-0.255941, 0.586097, -0.127235, 0.758153)
bones/14/rotation = Quaternion(-0.513517, -0.227335, -0.228787, 0.795157)
bones/15/rotation = Quaternion(-0.210241, 0.737203, 0.62235, -0.158151)
bones/16/rotation = Quaternion(-0.486067, -0.16412, -0.362283, 0.778174)
bones/17/rotation = Quaternion(-0.0553629, -0.0361614, 0.62832, 0.77514)
bones/18/rotation = Quaternion(-0.119289, 0.0998131, -0.0173011, 0.987678)
bones/19/position = Vector3(-0.302718, -1.12582, -1.97598)
bones/19/rotation = Quaternion(0.611408, 0.312413, 0.571405, -0.449527)
bones/20/rotation = Quaternion(-0.310858, -0.441522, -0.272557, 0.796328)
bones/21/rotation = Quaternion(-0.0601548, 0.0013007, 0.486955, 0.871352)
bones/22/rotation = Quaternion(0.156218, 0.0483037, -0.624744, 0.763516)
bones/23/rotation = Quaternion(0.123936, -0.00678731, -0.347765, 0.92933)
bones/24/rotation = Quaternion(0.427621, 0.561851, 0.530083, 0.469549)
bones/25/position = Vector3(4.82744, -12.3397, 0.183847)
bones/25/rotation = Quaternion(-0.400051, 0.463947, -0.598439, 0.516317)
bones/26/position = Vector3(-0.253573, -1.11395, -2.0176)
bones/26/rotation = Quaternion(0.608697, -0.3155, -0.575514, -0.445793)
bones/27/rotation = Quaternion(-0.208223, 0.421365, 0.142238, 0.871128)
bones/28/rotation = Quaternion(-0.0641552, -0.00115561, -0.51221, 0.85646)
bones/29/rotation = Quaternion(0.150998, -0.0515735, 0.668372, 0.726511)
bones/31/position = Vector3(-7.29038, -6.72226, -0.133983)
bones/31/rotation = Quaternion(-0.453784, 0.542292, 0.542291, -0.453784)
bones/32/rotation = Quaternion(0.456756, 0.539878, -0.539587, -0.456893)
[node name="BoneAttachment3D" parent="EnemyModelView/Armature/Skeleton3D" index="0"]
transform = Transform3D(-0.297606, -0.084924, -0.950904, -0.328725, -0.926012, 0.185582, -0.896309, 0.367817, 0.247669, -1.66129, 8.31029, 4.94733)
[node name="BoneAttachment3D2" parent="EnemyModelView/Armature/Skeleton3D" index="2"]
transform = Transform3D(-0.0446689, 0.0287099, -0.998588, -0.0869986, -0.9959, -0.0247414, -0.995205, 0.0857716, 0.0469831, -6.16044, -1.31467, -0.144618)
[node name="Collision" type="Area3D" parent="."]
collision_layer = 2048
collision_mask = 0
[node name="EnemyHitbox" type="CollisionShape3D" parent="Collision"]
unique_name_in_owner = true
shape = SubResource("SphereShape3D_j7u30")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.87204, 0)
shape = SubResource("SphereShape3D_i0akf")
disabled = true
[node name="Rotation" type="Node3D" parent="."]
@@ -98,6 +53,7 @@ collision_layer = 0
collision_mask = 34
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.43062, 0)
shape = SubResource("CylinderShape3D_ow3fn")
[node name="Components" type="Node3D" parent="."]
@@ -140,4 +96,25 @@ bus = &"SFX"
unique_name_in_owner = true
bus = &"SFX"
[editable path="EnemyModelView"]
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchor_right = 0.149
anchor_bottom = 0.129
offset_left = 6.0
offset_top = 1021.0
offset_right = -66.08
offset_bottom = 927.68
[node name="Boss Health" type="Label" parent="Control"]
layout_mode = 0
offset_right = 40.0
offset_bottom = 23.0
text = "Ox Face HP:"
[node name="BossHP" type="Label" parent="Control"]
unique_name_in_owner = true
layout_mode = 0
offset_left = 95.0
offset_top = 1.0
offset_right = 170.0
offset_bottom = 24.0

File diff suppressed because one or more lines are too long

View File

@@ -14,20 +14,27 @@ public partial class DemonWall : Enemy3D
[Node] private new DemonWallModelView EnemyModelView { get; set; } = default!;
[Node] private Label DemonWallHP { get; set; } = default!;
private Timer _attackTimer;
public void OnReady()
{
_attackTimer = new Timer { WaitTime = 5f };
_attackTimer.Timeout += AttackTimer_Timeout;
AddChild(_attackTimer);
_attackTimer = new Timer { WaitTime = 5f };
_attackTimer.Timeout += AttackTimer_Timeout;
AddChild(_attackTimer);
}
public void OnPhysicsProcess(double delta)
{
DemonWallHP.Text = HealthComponent.CurrentHP.Value + "/" + HealthComponent.MaximumHP.Value;
}
public override void Activate()
{
SetPhysicsProcess(true);
EnemyModelView.PlayActivateAnimation();
_attackTimer.Start();
SetPhysicsProcess(true);
EnemyModelView.PlayActivateAnimation();
_attackTimer.Start();
}
public override void Idle()
@@ -38,11 +45,11 @@ public partial class DemonWall : Enemy3D
private void AttackTimer_Timeout()
{
PerformAction();
PerformAction();
}
public override void PerformAction()
{
EnemyModelView.Attack(_maximumWallMoveAmount);
EnemyModelView.Attack(_maximumWallMoveAmount);
}
}

View File

@@ -8,10 +8,10 @@
[ext_resource type="AudioStream" uid="uid://bn6ns3jxkw03b" path="res://src/audio/sfx/ENEMY_SPROING_death.ogg" id="6_f313b"]
[sub_resource type="BoxShape3D" id="BoxShape3D_5ht6q"]
size = Vector3(28.3283, 10.355, 4.45671)
size = Vector3(29.3551, 17.3836, 4.45671)
[sub_resource type="BoxShape3D" id="BoxShape3D_5gof3"]
size = Vector3(28.4577, 8.476, 8.04248)
size = Vector3(28.4577, 15.2605, 8.04248)
[node name="Demon Wall" type="CharacterBody3D"]
collision_layer = 2
@@ -19,7 +19,7 @@ collision_mask = 2
script = ExtResource("1_dqcrh")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.40558, 8.3319, 2.53654)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.249016, 4.81762, 2.53654)
shape = SubResource("BoxShape3D_5ht6q")
[node name="Area3D6" type="Area3D" parent="."]
@@ -28,7 +28,7 @@ collision_layer = 2048
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D6"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.7687, 8.25977, 4.30386)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.7687, 4.86754, 4.30386)
shape = SubResource("BoxShape3D_5gof3")
[node name="EnemyModelView" parent="." instance=ExtResource("4_affkc")]
@@ -59,3 +59,25 @@ bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
bus = &"SFX"
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="VFlowContainer" type="VFlowContainer" parent="Control"]
layout_mode = 0
offset_left = 51.0
offset_top = 980.0
offset_right = 659.0
offset_bottom = 1085.0
[node name="Label" type="Label" parent="Control/VFlowContainer"]
layout_mode = 2
text = "Demon Wall HP:"
[node name="DemonWallHP" type="Label" parent="Control/VFlowContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(100, 100)
layout_mode = 2

View File

@@ -58,6 +58,8 @@ public partial class Game : Node3D, IGame
public delegate void SaveFileLoadedEventHandler();
public event Action GameExitRequested;
public event Action GameLoaded;
#endregion
public RescuedItemDatabase RescuedItems { get; set; } = default!;
@@ -67,7 +69,6 @@ public partial class Game : Node3D, IGame
public QuestData QuestData { get; private set; }
private EffectService _effectService;
private ItemReroller _itemReroller;
private IInstantiator _instantiator;
private IPlayer _player;
@@ -86,7 +87,6 @@ public partial class Game : Node3D, IGame
QuestData = new QuestData();
RescuedItems = new RescuedItemDatabase();
ItemDatabase = ItemDatabase.Instance;
_itemReroller = new ItemReroller(ItemDatabase);
GameChunk = new SaveChunk<GameData>(
(chunk) =>
@@ -200,6 +200,7 @@ public partial class Game : Node3D, IGame
_effectService = new EffectService(this, _player, _map);
_player.Activate();
await _map.LoadFloor();
GameLoaded?.Invoke();
}
public async Task Save() => await SaveFile.Save();
@@ -209,10 +210,13 @@ public partial class Game : Node3D, IGame
public async Task UseItem(InventoryItem item)
{
if (item.ItemTag == ItemTag.MysteryItem)
item = _itemReroller.RerollItem(item, _player.Inventory);
_effectService.RerollItem(item);
switch (item)
{
case BoxItem boxItem:
EnactBoxItemEffects(boxItem);
break;
case ConsumableItem consumableItem:
EnactConsumableItemEffects(consumableItem);
break;
@@ -425,6 +429,53 @@ public partial class Game : Node3D, IGame
private void FinishedLoadingSaveFile() => EmitSignal(SignalName.SaveFileLoaded);
private void EnactBoxItemEffects(BoxItem boxItem)
{
switch (boxItem.ItemTag)
{
case ItemTag.DamagesPlayer:
_effectService.DamagesPlayer(boxItem.Stats.DamageToPlayer);
GameRepo.CloseInventory();
break;
case ItemTag.ContainsAccessory:
_player.Inventory.TryAdd(_effectService.GetRandomItemOfType<Accessory>());
break;
case ItemTag.ContainsArmor:
_player.Inventory.TryAdd(_effectService.GetRandomItemOfType<Armor>());
break;
case ItemTag.ContainsWeapon:
_player.Inventory.TryAdd(_effectService.GetRandomItemOfType<Weapon>());
break;
case ItemTag.ContainsBox:
_player.Inventory.TryAdd(_effectService.GetRandomItemOfType<BoxItem>());
break;
case ItemTag.ContainsRestorative:
_player.Inventory.TryAdd(_effectService.GetRandomItemOfType<ConsumableItem>());
break;
case ItemTag.DropTo1HPAndGainRareItem:
_effectService.DropTo1HPAndGainRareItem<InventoryItem>();
break;
case ItemTag.TradeAllRandomItems:
var newInventory = _effectService.TradeAllRandomItems<InventoryItem>(boxItem);
_player.Inventory.Items.Clear();
_player.Inventory.TryAdd(boxItem);
foreach (var item in newInventory)
_player.Inventory.TryAdd(item);
break;
case ItemTag.ContainsUnobtainedItem:
_effectService.GetUnobtainedItem();
break;
case ItemTag.ContainsBasicItem:
_effectService.GetBasicItem<InventoryItem>();
break;
case ItemTag.UnequipAllItems:
_player.EquipmentComponent.Unequip(_player.EquipmentComponent.EquippedWeapon.Value);
_player.EquipmentComponent.Unequip(_player.EquipmentComponent.EquippedArmor.Value);
_player.EquipmentComponent.Unequip(_player.EquipmentComponent.EquippedAccessory.Value);
break;
}
}
private void EnactConsumableItemEffects(ConsumableItem consumableItem)
{
if (_player.HealthComponent.AtFullHealth && consumableItem.RaiseHPAmount > 0)
@@ -516,7 +567,7 @@ public partial class Game : Node3D, IGame
_effectService.ChangeAffinity(throwableItem);
break;
case ThrowableItemTag.WarpToExitIfFound:
_effectService.WarpToExit(_player);
_effectService.WarpToExit();
GameRepo.CloseInventory();
break;
}
@@ -535,7 +586,7 @@ public partial class Game : Node3D, IGame
_player.Inventory.Remove(item);
}
private void MovePlayer(Transform3D spawnPoint) => _player.TeleportPlayer(spawnPoint);
private void MovePlayer((Vector3 Rotation, Vector3 Position) spawnPoint) => _player.TeleportPlayer(spawnPoint);
private void OnNewGame()
{

View File

@@ -35,4 +35,6 @@ public interface IGame : IProvide<IGame>, IProvide<IGameRepo>, IProvide<IPlayer>
public QuestData QuestData { get; }
public event Action GameExitRequested;
public event Action GameLoaded;
}

View File

@@ -1,8 +1,9 @@
using Godot;
using Godot;
using System.Linq;
using System;
using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity;
using System.Collections.Generic;
namespace Zennysoft.Game.Ma;
@@ -14,225 +15,301 @@ public class EffectService
public EffectService(IGame game, IPlayer player, IMap map)
{
_game = game;
_player = player;
_map = map;
_game = game;
_player = player;
_map = map;
}
public void TeleportEnemiesToCurrentRoom()
{
var currentFloor = _game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = _map.GetPlayersCurrentRoom();
var currentFloor = _game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
if (currentRoom is not MonsterRoom)
return;
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom monsterRoom)
validRooms.Remove(monsterRoom);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom monsterRoom)
validRooms.Remove(monsterRoom);
var currentMonsterRoom = (MonsterRoom)currentRoom;
var currentMonsterRoom = (MonsterRoom)currentRoom;
var enemyList = validRooms.SelectMany(x => x.GetEnemiesInCurrentRoom()).OfType<Enemy>();
var enemyList = validRooms.SelectMany(x => x.GetEnemiesInCurrentRoom()).OfType<Enemy>();
foreach (var enemy in enemyList)
enemy.MoveEnemyToNewRoom(currentMonsterRoom);
foreach (var enemy in enemyList)
enemy.MoveEnemyToNewRoom(currentMonsterRoom);
}
public void KillHalfEnemiesInRoom()
{
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
var currentMonsterRoom = (MonsterRoom)currentRoom;
var enemyList = currentMonsterRoom.GetEnemiesInCurrentRoom().OfType<Enemy>().ToList();
var enemiesToKill = enemyList.Count / 2;
for (var i = 0; i < enemiesToKill; i++)
enemyList[i].Die();
var currentMonsterRoom = (MonsterRoom)currentRoom;
var enemyList = currentMonsterRoom.GetEnemiesInCurrentRoom().OfType<Enemy>().ToList();
var enemiesToKill = enemyList.Count / 2;
for (var i = 0; i < enemiesToKill; i++)
enemyList[i].Die();
}
public void TurnAllEnemiesInRoomIntoHealingItem()
{
var currentRoom = _map.GetPlayersCurrentRoom();
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
if (currentRoom is not MonsterRoom)
return;
var currentEnemies = currentRoom.EnemiesInRoom.OfType<Enemy>().ToList();
foreach (var enemy in currentEnemies)
{
enemy.OnMorph();
DropHealingItem(enemy.GlobalPosition);
}
if (currentEnemies.Any())
SfxDatabase.Instance.Play(SoundEffect.TurnAllEnemiesIntoHealingItems);
var currentEnemies = currentRoom.EnemiesInRoom.OfType<Enemy>().ToList();
foreach (var enemy in currentEnemies)
{
enemy.OnMorph();
DropHealingItem(enemy.GlobalPosition);
}
if (currentEnemies.Any())
SfxDatabase.Instance.Play(SoundEffect.TurnAllEnemiesIntoHealingItems);
}
public void DropHealingItem(Vector3 vector)
{
var consumableFolder = "res://src/items/consumable";
var restorativeScene = GD.Load<PackedScene>($"{consumableFolder}/ConsumableItem.tscn");
var consumable = restorativeScene.Instantiate<ConsumableItem>();
var resourceFiles = DirAccess.GetFilesAt($"{consumableFolder}/resources");
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomResource = resourceFiles[rng.RandiRange(0, resourceFiles.Length - 1)];
var randomFile = ResourceLoader.Load<ConsumableItemStats>($"{consumableFolder}/resources/{randomResource}");
consumable.Stats = randomFile;
_game.AddChild(consumable);
consumable.GlobalPosition = vector;
var consumableFolder = "res://src/items/consumable";
var restorativeScene = GD.Load<PackedScene>($"{consumableFolder}/ConsumableItem.tscn");
var consumable = restorativeScene.Instantiate<ConsumableItem>();
var resourceFiles = DirAccess.GetFilesAt($"{consumableFolder}/resources");
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomResource = resourceFiles[rng.RandiRange(0, resourceFiles.Length - 1)];
var randomFile = ResourceLoader.Load<ConsumableItemStats>($"{consumableFolder}/resources/{randomResource}");
consumable.Stats = randomFile;
_game.AddChild(consumable);
consumable.GlobalPosition = vector;
}
public void HealAllEnemiesAndPlayerInRoomToFull()
{
var currentRoom = _map.GetPlayersCurrentRoom();
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
if (currentRoom is not MonsterRoom)
return;
currentRoom.EnemiesInRoom.ForEach(e => e.HealthComponent.SetCurrentHealth(e.HealthComponent.MaximumHP.Value));
_player.HealthComponent.SetCurrentHealth(_player.HealthComponent.MaximumHP.Value);
currentRoom.EnemiesInRoom.ForEach(e => e.HealthComponent.SetCurrentHealth(e.HealthComponent.MaximumHP.Value));
_player.HealthComponent.SetCurrentHealth(_player.HealthComponent.MaximumHP.Value);
}
public void AbsorbHPFromAllEnemiesInRoom()
{
var currentRoom = _map.GetPlayersCurrentRoom();
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
if (currentRoom is not MonsterRoom)
return;
var currentEnemies = currentRoom.EnemiesInRoom;
var hpToAbsorb = 0.0;
foreach (var enemy in currentEnemies)
{
var absorbAmount = enemy.HealthComponent.MaximumHP.Value * 0.05;
enemy.HealthComponent.Damage((int)absorbAmount);
hpToAbsorb += absorbAmount;
enemy.OnAbsorb();
}
_player.HealthComponent.Heal((int)hpToAbsorb);
GD.Print("HP to absorb: " + hpToAbsorb);
var currentEnemies = currentRoom.EnemiesInRoom;
var hpToAbsorb = 0.0;
foreach (var enemy in currentEnemies)
{
var absorbAmount = enemy.HealthComponent.MaximumHP.Value * 0.05;
enemy.HealthComponent.Damage((int)absorbAmount);
hpToAbsorb += absorbAmount;
enemy.OnAbsorb();
}
_player.HealthComponent.Heal((int)hpToAbsorb);
GD.Print("HP to absorb: " + hpToAbsorb);
}
public void DealElementalDamageToAllEnemiesInRoom(ElementType elementType)
{
var currentRoom = _map.GetPlayersCurrentRoom();
var currentRoom = _map.GetPlayersCurrentRoom();
if (currentRoom is not MonsterRoom)
return;
if (currentRoom is not MonsterRoom)
return;
var currentEnemies = currentRoom.EnemiesInRoom;
foreach (var enemy in currentEnemies)
{
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(20, elementType), 10, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt);
}
var currentEnemies = currentRoom.EnemiesInRoom;
foreach (var enemy in currentEnemies)
{
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(20, elementType), 10, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt);
}
}
public void SwapHPandVT()
{
var oldHp = _player.HealthComponent.CurrentHP.Value;
var oldVt = _player.VTComponent.CurrentVT.Value;
var oldHp = _player.HealthComponent.CurrentHP.Value;
var oldVt = _player.VTComponent.CurrentVT.Value;
_player.HealthComponent.SetCurrentHealth(oldVt);
_player.VTComponent.SetVT(oldHp);
SfxDatabase.Instance.Play(SoundEffect.SwapHPAndVT);
_player.HealthComponent.SetCurrentHealth(oldVt);
_player.VTComponent.SetVT(oldHp);
SfxDatabase.Instance.Play(SoundEffect.SwapHPAndVT);
}
public void RandomEffect(EffectItem item)
{
var itemEffects = Enum.GetValues<UsableItemTag>().ToList();
itemEffects.Remove(UsableItemTag.RandomEffect);
itemEffects.Remove(UsableItemTag.None);
var randomEffect = new Godot.Collections.Array<UsableItemTag>(itemEffects).PickRandom();
item.SetEffectTag(randomEffect);
_game.UseItem(item);
var itemEffects = Enum.GetValues<UsableItemTag>().ToList();
itemEffects.Remove(UsableItemTag.RandomEffect);
itemEffects.Remove(UsableItemTag.None);
var randomEffect = new Godot.Collections.Array<UsableItemTag>(itemEffects).PickRandom();
item.SetEffectTag(randomEffect);
_game.UseItem(item);
}
public void RaiseCurrentWeaponAttack()
{
if (string.IsNullOrEmpty(_player.EquipmentComponent.EquippedWeapon.Value.ItemName))
return;
if (string.IsNullOrEmpty(_player.EquipmentComponent.EquippedWeapon.Value.ItemName))
return;
var currentWeapon = (Weapon)_player.EquipmentComponent.EquippedWeapon.Value;
currentWeapon.IncreaseWeaponAttack(1);
SfxDatabase.Instance.Play(SoundEffect.IncreaseStat);
var currentWeapon = (Weapon)_player.EquipmentComponent.EquippedWeapon.Value;
currentWeapon.IncreaseWeaponAttack(1);
SfxDatabase.Instance.Play(SoundEffect.IncreaseStat);
}
public void RaiseCurrentArmorDefense()
{
if (string.IsNullOrEmpty(_player.EquipmentComponent.EquippedArmor.Value.ItemName))
return;
if (string.IsNullOrEmpty(_player.EquipmentComponent.EquippedArmor.Value.ItemName))
return;
var currentArmor = (Armor)_player.EquipmentComponent.EquippedArmor.Value;
currentArmor.IncreaseArmorDefense(1);
SfxDatabase.Instance.Play(SoundEffect.IncreaseStat);
var currentArmor = (Armor)_player.EquipmentComponent.EquippedArmor.Value;
currentArmor.IncreaseArmorDefense(1);
SfxDatabase.Instance.Play(SoundEffect.IncreaseStat);
}
public void RaiseLevel() => _player.LevelUp();
public void TeleportToRandomRoom(IEnemy enemy)
{
var currentFloor = _game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = enemy.GetCurrentRoom(rooms);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
var currentFloor = _game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = enemy.GetCurrentRoom(rooms);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
if (validRooms.Count == 0)
return;
if (validRooms.Count == 0)
return;
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
enemy.MoveEnemyToNewRoom(randomRoom);
enemy.MoveEnemyToNewRoom(randomRoom);
}
public void TeleportToRandomRoom(IPlayer player)
{
var currentFloor = _game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentFloor = _game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
var currentRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
if (validRooms.Count == 0)
return;
if (validRooms.Count == 0)
return;
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var spawnPoint = randomRoom.PlayerSpawn;
player.TeleportPlayer(spawnPoint.Transform);
SfxDatabase.Instance.Play(SoundEffect.TeleportToRandomRoom);
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var spawnPoint = randomRoom.PlayerSpawn;
player.TeleportPlayer((spawnPoint.Rotation, spawnPoint.Position));
SfxDatabase.Instance.Play(SoundEffect.TeleportToRandomRoom);
}
public void ChangeAffinity(ThrowableItem throwableItem)
{
var maximumElements = Enum.GetNames(typeof(ElementType)).Length;
var newElement = ((int)throwableItem.ElementType + 1) % maximumElements;
throwableItem.SetElementType((ElementType)newElement);
var maximumElements = Enum.GetNames(typeof(ElementType)).Length;
var newElement = ((int)throwableItem.ElementType + 1) % maximumElements;
throwableItem.SetElementType((ElementType)newElement);
// TODO: Make this an inventory animation to cycle through elements.
throwableItem.SetDescription(
$"Inflicts {throwableItem.ElementType} damage when thrown." +
$"{System.Environment.NewLine}Use item to change Affinity.");
// TODO: Make this an inventory animation to cycle through elements.
throwableItem.SetDescription(
$"Inflicts {throwableItem.ElementType} damage when thrown." +
$"{System.Environment.NewLine}Use item to change Affinity.");
throwableItem.SetCount(throwableItem.Count + 1);
throwableItem.SetCount(throwableItem.Count + 1);
}
public void WarpToExit(IPlayer player)
public void WarpToExit()
{
var exitRoom = _game.CurrentFloor.Rooms.OfType<ExitRoom>().Single();
if (exitRoom.PlayerDiscoveredRoom)
{
SfxDatabase.Instance.Play(SoundEffect.TeleportToExit);
player.TeleportPlayer(exitRoom.PlayerSpawn.Transform);
}
var exitRoom = _game.CurrentFloor.Rooms.OfType<ExitRoom>().Single();
if (exitRoom.PlayerDiscoveredRoom)
{
SfxDatabase.Instance.Play(SoundEffect.TeleportToExit);
_player.TeleportPlayer((exitRoom.PlayerSpawn.Rotation, exitRoom.PlayerSpawn.Position));
}
}
public void DamagesPlayer(int damage)
{
_player.TakeDamage(new AttackData(damage, ElementType.None, true, true));
}
public void RerollItem(InventoryItem itemToReroll)
{
var itemReroller = new ItemReroller(ItemDatabase.Instance);
itemReroller.RerollItem(itemToReroll, _player.Inventory);
}
public T GetRandomItemOfType<T>(T itemToExclude = null)
where T : InventoryItem => ItemDatabase.Instance.PickItem(itemToExclude);
public void RandomSpell()
{
throw new NotImplementedException("Spells not implemented yet.");
}
public void DropTo1HPAndGainRareItem<T>()
where T : InventoryItem
{
_player.HealthComponent.SetCurrentHealth(1);
_player.Inventory.TryAdd(ItemDatabase.Instance.PickRareItem<T>());
}
public void TradeRandomItem<T>(BoxItem box)
where T : InventoryItem
{
var tradableItems = _player.Inventory.Items.OfType<T>().Where(x => x != box).ToList();
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomIndex = rng.RandiRange(0, tradableItems.Count - 1);
var randomItem = tradableItems[randomIndex];
if (randomItem is EquipableItem equipableItem)
{
if (_player.EquipmentComponent.IsItemEquipped(equipableItem))
_player.Unequip(equipableItem);
}
_player.Inventory.Remove(randomItem);
GetRandomItemOfType<T>();
}
public IEnumerable<InventoryItem> TradeAllRandomItems<T>(BoxItem box)
where T : InventoryItem
{
var newInventory = new List<InventoryItem>();
var items = _player.Inventory.Items.OfType<T>().Where(x => x != box).ToList();
foreach (var item in items)
newInventory.Add(GetRandomItemOfType<T>());
return newInventory;
}
public void GetUnobtainedItem()
{
var pickableItems = ItemDatabase.Instance.Items.Except(_player.Inventory.Items).ToList();
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomIndex = rng.RandiRange(0, pickableItems.Count - 1);
var selectedItem = pickableItems[randomIndex];
if (selectedItem is ThrowableItem throwableItem)
throwableItem.SetCount(rng.RandiRange(throwableItem.Stats.MinimumCount, throwableItem.Stats.MaximumCount));
_player.Inventory.TryAdd(selectedItem);
}
public void GetBasicItem<T>()
where T : InventoryItem
{
_player.Inventory.TryAdd(ItemDatabase.Instance.PickBasicItem<T>());
}
}

View File

@@ -18,14 +18,33 @@ public class ItemDatabase
public T PickItem<T>(T itemToExclude = null)
where T : InventoryItem
{
var itemsToSelectFrom = Items.OfType<T>();
return PickItemInternal(itemsToSelectFrom, itemToExclude);
}
public T PickRareItem<T>(T itemToExclude = null)
where T : InventoryItem
{
var getRareItems = Items.OfType<T>().Where(x => x.SpawnRate < 0.1f);
return PickItemInternal(getRareItems, itemToExclude);
}
public T PickBasicItem<T>(T itemToExclude = null)
where T : InventoryItem
{
var getBasicItems = Items.OfType<T>().Where(x => x.SpawnRate > 0.5f);
return PickItemInternal(getBasicItems, itemToExclude);
}
private T PickItemInternal<T>(IEnumerable<T> itemsToSelectFrom, T itemToExclude = null)
where T : InventoryItem
{
var rng = new RandomNumberGenerator();
rng.Randomize();
var itemsToSelectFrom = Items;
if (itemToExclude is not null)
itemsToSelectFrom = [.. itemsToSelectFrom.OfType<T>().Where(x => x.ItemName != itemToExclude.ItemName)];
itemsToSelectFrom = [.. itemsToSelectFrom.Where(x => x.ItemName != itemToExclude.ItemName)];
var weights = itemsToSelectFrom.Select(x => x.SpawnRate).ToArray();
var selectedItem = itemsToSelectFrom.ToArray()[rng.RandWeighted(weights)];
@@ -33,7 +52,7 @@ public class ItemDatabase
if (selectedItem is ThrowableItem throwableItem)
throwableItem.SetCount(rng.RandiRange(throwableItem.Stats.MinimumCount, throwableItem.Stats.MaximumCount));
return (T)selectedItem;
return selectedItem;
}
private ItemDatabase()
@@ -45,6 +64,7 @@ public class ItemDatabase
var throwableResources = DirAccess.GetFilesAt("res://src/items/throwable/resources/");
var consumableResources = DirAccess.GetFilesAt("res://src/items/consumable/resources/");
var effectResources = DirAccess.GetFilesAt("res://src/items/effect/resources/");
var boxResources = DirAccess.GetFilesAt("res://src/items/box/resources/");
foreach (var armor in armorResources)
{
@@ -100,6 +120,15 @@ public class ItemDatabase
database.Add(effectItemScene);
}
foreach (var boxItem in boxResources)
{
var boxItemInfo = GD.Load<BoxItemStats>($"res://src/items/box/resources/{boxItem}");
var boxItemScene = ResourceLoader.Load<PackedScene>("res://src/items/box/BoxItem.tscn").Instantiate<BoxItem>();
boxItemScene.Stats = boxItemInfo;
if (!database.Contains(boxItemScene))
database.Add(boxItemScene);
}
Items = [.. database];
}
}

View File

@@ -27,6 +27,21 @@ public class ItemReroller
return rolledItem;
}
public InventoryItem RerollItemToAny(InventoryItem itemToReroll, IInventory inventory, bool insertIntoInventory = true)
{
var currentIndex = inventory.Items.IndexOf(itemToReroll);
if (insertIntoInventory)
inventory.Remove(itemToReroll);
var rolledItem = _database.PickItem(itemToReroll);
if (insertIntoInventory)
inventory.TryInsert(rolledItem, currentIndex);
return rolledItem;
}
private Weapon RerollItemInternal(Weapon itemToReroll) => _database.PickItem(itemToReroll);
private Armor RerollItemInternal(Armor itemToReroll) => _database.PickItem(itemToReroll);
private Accessory RerollItemInternal(Accessory itemToReroll) => _database.PickItem(itemToReroll);

View File

@@ -0,0 +1,12 @@
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma;
[GlobalClass]
[Meta, Id("box_item_stat_type")]
public partial class BoxItemStats : InventoryItemStats
{
[Export]
public int DamageToPlayer { get; set; } = 10;
}

View File

@@ -0,0 +1 @@
uid://vuavr681au06

View File

@@ -6,7 +6,7 @@
height = 0.725098
[sub_resource type="BoxShape3D" id="BoxShape3D_qdeu2"]
size = Vector3(0.778381, 0.929947, 0.731567)
size = Vector3(0.898941, 2.34974, 0.86676)
[node name="Armor" type="RigidBody3D"]
collision_layer = 0
@@ -36,4 +36,5 @@ texture_filter = 0
render_priority = 100
[node name="CollisionShape3D" type="CollisionShape3D" parent="Pickup"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00804907, 0.709896, 0.0675965)
shape = SubResource("BoxShape3D_qdeu2")

View File

@@ -4,12 +4,12 @@ importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dkpgrhj14phdd"
path="res://.godot/imported/plastique.glb-38f4438846eaa3d64b225272714c5d02.scn"
path="res://.godot/imported/plastique.glb-5845ad959844e1ca0c9791ff0287bc66.scn"
[deps]
source_file="res://src/items/assetts/plastique.glb"
dest_files=["res://.godot/imported/plastique.glb-38f4438846eaa3d64b225272714c5d02.scn"]
source_file="res://src/items/assets/plastique.glb"
dest_files=["res://.godot/imported/plastique.glb-5845ad959844e1ca0c9791ff0287bc66.scn"]
[params]

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -3,7 +3,7 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dkqs4x4pi18on"
path="res://.godot/imported/plastique_plastique.png-3ad121f0468f0ec1d61934d8a0e41cb7.ctex"
path="res://.godot/imported/plastique_plastique.png-06bcea5737da44088a0bd794735523f0.ctex"
metadata={
"vram_texture": false
}
@@ -13,8 +13,8 @@ generator_parameters={
[deps]
source_file="res://src/items/assetts/plastique_plastique.png"
dest_files=["res://.godot/imported/plastique_plastique.png-3ad121f0468f0ec1d61934d8a0e41cb7.ctex"]
source_file="res://src/items/assets/plastique_plastique.png"
dest_files=["res://.godot/imported/plastique_plastique.png-06bcea5737da44088a0bd794735523f0.ctex"]
[params]

View File

@@ -0,0 +1,37 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Chickensoft.Serialization;
using Godot;
using Zennysoft.Game.Ma;
using Zennysoft.Ma.Adapter;
[Meta(typeof(IAutoNode)), Id("box_item")]
public partial class BoxItem : InventoryItem
{
public override void _Notification(int what) => this.Notify(what);
[Node] private Sprite3D _sprite { get; set; }
[Export]
[Save("box_stats")]
public BoxItemStats Stats { get; set; } = new BoxItemStats();
public override string ItemName => Stats.Name;
public override string Description => Stats.Description;
public override float SpawnRate => Stats.SpawnRate;
public override int ThrowDamage => Stats.ThrowDamage;
public override float ThrowSpeed => Stats.ThrowSpeed;
public override ItemTag ItemTag => Stats.ItemTag;
public override Texture2D GetTexture() => Stats.Texture;
public void OnReady()
{
_sprite.Texture = Stats.Texture;
}
}

View File

@@ -0,0 +1 @@
uid://cqqqj4hgywst4

View File

@@ -0,0 +1,40 @@
[gd_scene load_steps=5 format=3 uid="uid://bguomljidwgto"]
[ext_resource type="Script" uid="uid://cqqqj4hgywst4" path="res://src/items/box/BoxItem.cs" id="1_holk0"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="2_holk0"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_x6u08"]
height = 0.725098
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1ceef"]
radius = 0.470016
[node name="Box Item" type="RigidBody3D"]
collision_layer = 0
axis_lock_linear_x = true
axis_lock_linear_z = true
axis_lock_angular_x = true
axis_lock_angular_y = true
axis_lock_angular_z = true
script = ExtResource("1_holk0")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.00908482, 0)
shape = SubResource("CylinderShape3D_x6u08")
[node name="Pickup" type="Area3D" parent="."]
unique_name_in_owner = true
collision_layer = 4
collision_mask = 0
[node name="Sprite" type="Sprite3D" parent="Pickup"]
unique_name_in_owner = true
pixel_size = 0.0025
billboard = 2
shaded = true
texture_filter = 0
render_priority = 100
texture = ExtResource("2_holk0")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Pickup"]
shape = SubResource("CapsuleShape3D_1ceef")

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://ds7s722m5y7m4"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_dgx1x"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_ncstm"]
[resource]
script = ExtResource("2_ncstm")
DamageToPlayer = 0
Name = "Alluring Acquisition"
Description = "Grants you a basic item."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 14
Texture = ExtResource("1_dgx1x")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://6c0t45setc82"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_wwmaf"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_6h66g"]
[resource]
script = ExtResource("2_6h66g")
DamageToPlayer = 0
Name = "Asceticism"
Description = "Forcibly unequips all of your items."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 16
Texture = ExtResource("1_wwmaf")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://deebat2kuxfo3"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_p2ro7"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_k6pqw"]
[resource]
script = ExtResource("2_k6pqw")
DamageToPlayer = 0
Name = "Blood Acquisition"
Description = "Contains a rare item but lowers current HP to 1."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 10
Texture = ExtResource("1_p2ro7")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://k0uhsuxvyegw"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_yf4yo"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_xe8mc"]
[resource]
script = ExtResource("2_xe8mc")
DamageToPlayer = 0
Name = "Chaotic Prayer"
Description = "Converts all items into random items."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 12
Texture = ExtResource("1_yf4yo")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,25 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://cgkorwblwr12t"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_650jj"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="1_i336w"]
[resource]
script = ExtResource("1_i336w")
Name = "Empty Promise"
Description = "An empty box."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 0
Texture = ExtResource("1_650jj")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://bit6jsgs4yl7t"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_85ci2"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_pe0kd"]
[resource]
script = ExtResource("2_pe0kd")
DamageToPlayer = 0
Name = "Fashionable Acquisition"
Description = "Contains a random armor."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 6
Texture = ExtResource("1_85ci2")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://g3buxgpmjcio"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_3hy40"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_kb1l2"]
[resource]
script = ExtResource("2_kb1l2")
DamageToPlayer = 0
Name = "Furious Acquisition"
Description = "Contains a random weapon."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 5
Texture = ExtResource("1_3hy40")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://bb44i0nb2ov3i"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_kqlme"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_w23fa"]
[resource]
script = ExtResource("2_w23fa")
DamageToPlayer = 0
Name = "Glue Jar"
Description = "Makes you unable to unequip any items."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 15
Texture = ExtResource("1_kqlme")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://icdlurnmjryh"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_svub6"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_iw3ll"]
[resource]
script = ExtResource("2_iw3ll")
DamageToPlayer = 0
Name = "Healthy Acquisition"
Description = "Contains a random restorative."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 4
Texture = ExtResource("1_svub6")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://b2buq6ckkam7i"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_dwyk7"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_pssvy"]
[resource]
script = ExtResource("2_pssvy")
DamageToPlayer = 0
Name = "Identity Acquisition"
Description = "Contains a random mask."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 9
Texture = ExtResource("1_dwyk7")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://dsb2gcjeme5yy"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_3scao"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_vgter"]
[resource]
script = ExtResource("2_vgter")
DamageToPlayer = 10
Name = "Malfunction"
Description = "Damages self."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 3
Texture = ExtResource("1_3scao")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://ba1ihsi6culef"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_a6ha2"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_tbg32"]
[resource]
script = ExtResource("2_tbg32")
DamageToPlayer = 0
Name = "Scripture Sign; Curiosity"
Description = "Grants you an item you do not currently have."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 13
Texture = ExtResource("1_a6ha2")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -0,0 +1,26 @@
[gd_resource type="Resource" script_class="BoxItemStats" load_steps=3 format=3 uid="uid://cf8mf2qguf7q1"]
[ext_resource type="Texture2D" uid="uid://bg47n2tmintm0" path="res://src/items/consumable/textures/past self remnant.PNG" id="1_1eojb"]
[ext_resource type="Script" uid="uid://vuavr681au06" path="res://src/items/accessory/BoxItemStats.cs" id="2_ucc84"]
[resource]
script = ExtResource("2_ucc84")
DamageToPlayer = 0
Name = "Speculative Acquisition"
Description = "Contains a random box."
SpawnRate = 0.5
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 7
Texture = ExtResource("1_1eojb")
metadata/_custom_type_script = "uid://vuavr681au06"

View File

@@ -6,7 +6,7 @@
height = 0.725098
[sub_resource type="BoxShape3D" id="BoxShape3D_7mh0f"]
size = Vector3(0.778381, 0.929947, 0.731567)
size = Vector3(0.778381, 3.19556, 0.731567)
[node name="ConsumableItem" type="RigidBody3D"]
collision_layer = 0
@@ -38,4 +38,5 @@ texture_filter = 0
render_priority = 100
[node name="CollisionShape3D" type="CollisionShape3D" parent="Pickup"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.13281, 0)
shape = SubResource("BoxShape3D_7mh0f")

View File

@@ -2,7 +2,7 @@
[ext_resource type="Script" uid="uid://da8mhruqpgh6r" path="res://src/items/misc/SetItem.cs" id="1_m8dyi"]
[ext_resource type="AudioStream" uid="uid://bjcersd5id8ee" path="res://src/audio/sfx/ITEM_PLASTIQUETIMER.ogg" id="2_kgxna"]
[ext_resource type="Texture2D" uid="uid://dkqs4x4pi18on" path="res://src/items/assetts/plastique_plastique.png" id="2_m8dyi"]
[ext_resource type="Texture2D" uid="uid://dkqs4x4pi18on" path="res://src/items/assets/plastique_plastique.png" id="2_m8dyi"]
[sub_resource type="Animation" id="Animation_eat5q"]
length = 0.001

View File

@@ -1,5 +1,4 @@
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using Chickensoft.Serialization;
using Godot;
@@ -46,6 +45,8 @@ public partial class Weapon : EquipableItem
public void IncreaseWeaponAttack(int bonus) => _bonusDamage += bonus;
public void SetWeaponAttack(int newBonus) => _bonusDamage = newBonus;
public override int BonusAttack { get => Stats.BonusAttack + _bonusDamage; }
[Save("weapon_bonus_damage")]

View File

@@ -0,0 +1,30 @@
[gd_resource type="Resource" script_class="WeaponStats" load_steps=4 format=3 uid="uid://c5d1lx0m53d5i"]
[ext_resource type="AudioStream" uid="uid://ilf2s8ct2stt" path="res://src/audio/sfx/PLAYER_slower_slash.ogg" id="1_wkueq"]
[ext_resource type="Texture2D" uid="uid://cil3xe3jq82r6" path="res://src/items/weapons/textures/JIBLETT.PNG" id="2_13kat"]
[ext_resource type="Script" uid="uid://cc7byqeolw5y4" path="res://src/items/weapons/WeaponStats.cs" id="3_34krx"]
[resource]
script = ExtResource("3_34krx")
AttackSpeed = 1.0
WeaponElement = 0
WeaponTag = 5
SoundEffect = 4
Name = "Hope's Edge"
Description = "Sword that strikes harder the lower HP you have."
SpawnRate = 0.1
BonusAttack = 0
BonusDefense = 0
BonusLuck = 0.05
BonusHP = 0
BonusVT = 0
AeolicResistance = 0
TelluricResistance = 0
HydricResistance = 0
IgneousResistance = 0
FerrumResistance = 0
ThrowSpeed = 12.0
ThrowDamage = 5
ItemTag = 0
Texture = ExtResource("2_13kat")
AudioStream = ExtResource("1_wkueq")

View File

@@ -16,7 +16,7 @@ public interface IMap : INode3D
IDungeonFloor CurrentFloor { get; }
Transform3D GetPlayerSpawnPosition();
(Vector3 Rotation, Vector3 Position) GetPlayerSpawnPosition();
IDungeonRoom GetPlayersCurrentRoom();
@@ -24,7 +24,7 @@ public interface IMap : INode3D
public AutoProp<int> CurrentFloorNumber { get; }
public event Action<Transform3D> SpawnPointCreated;
public event Action<(Vector3 Rotation, Vector3 Position)> SpawnPointCreated;
public event Action FloorLoaded;
}

View File

@@ -28,7 +28,7 @@ public partial class Map : Node3D, IMap
private readonly string _floorFilePath = @"res://src/map/dungeon/floors/";
public event Action<Transform3D> SpawnPointCreated;
public event Action<(Vector3 Rotation, Vector3 Position)> SpawnPointCreated;
public event Action FloorLoaded;
@@ -49,7 +49,11 @@ public partial class Map : Node3D, IMap
return playersRoom;
}
public Transform3D GetPlayerSpawnPosition() => CurrentFloor.GetPlayerSpawnPoint();
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPosition()
{
var spawnPoint = CurrentFloor.GetPlayerSpawnPoint();
return (spawnPoint.Rotation, spawnPoint.Position);
}
public async Task LoadFloor()
{
@@ -75,7 +79,7 @@ public partial class Map : Node3D, IMap
{
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, "fade_out");
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
SpawnPointCreated?.Invoke(new Transform3D(Basis.Identity, new Vector3(-999, -999, -999)));
SpawnPointCreated?.Invoke((Vector3.Forward, new Vector3(-999, -999, -999)));
}
private void InitializeFloor(Node newFloor)

View File

@@ -76,9 +76,12 @@ libraries = {
[node name="MapOrder" type="Node" parent="."]
unique_name_in_owner = true
[node name="Boss Floor 1" type="Node" parent="MapOrder"]
[node name="Altar" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 1
[node name="Overworld" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 2
[node name="Floor01" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
@@ -86,13 +89,6 @@ FolderName = "Floor01"
FloorOdds = Array[float]([0.33, 0.33, 0.33])
Michael = 1.0
[node name="Overworld" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
[node name="Altar" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 1
[node name="Floor02" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor02"
@@ -129,11 +125,9 @@ FolderName = "Floor07"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Floor08" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor08"
FloorOdds = Array[float]([0.5, 1.0])
Sproingy = 1.0
[node name="Boss Floor 1" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 2
[node name="Floor09" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
@@ -171,30 +165,14 @@ FolderName = "Floor15"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Floor16" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor16"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Floor17" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor17"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Floor18" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor18"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Floor19" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor19"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Boss Floor 2" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 3
[node name="Goddess of Guidance Floor" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 4
[node name="Final Floor" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 6

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,112 @@
[gd_scene load_steps=9 format=4 uid="uid://r5d74jsx8tq6"]
[ext_resource type="Texture2D" uid="uid://35g2bx4vh3wd" path="res://src/map/assets/Steles/Steles_IMG0031.png" id="1_6obim"]
[ext_resource type="Texture2D" uid="uid://c8nvb5jn8f6k1" path="res://src/map/assets/Steles/Steles_Untitled-1.png" id="2_ochsp"]
[ext_resource type="Texture2D" uid="uid://bwelhd4sx7mkw" path="res://src/map/assets/Steles/Steles_COPPEROX.jpg" id="3_4nuqd"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rgye3"]
resource_name = "Material.003"
cull_mode = 2
albedo_texture = ExtResource("1_6obim")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m77li"]
resource_name = "Material.010"
transparency = 4
cull_mode = 2
albedo_texture = ExtResource("2_ochsp")
roughness = 0.0
texture_filter = 2
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f3mmc"]
resource_name = "Material.006"
cull_mode = 2
albedo_texture = ExtResource("3_4nuqd")
[sub_resource type="ArrayMesh" id="ArrayMesh_vep6p"]
_surfaces = [{
"aabb": AABB(-1.73357, -2.67026, -1, 3.46715, 4.93244, 2),
"format": 34896613377,
"index_count": 204,
"index_data": PackedByteArray("AAABAAIAAQADAAIAAgAHAAAAAAAEAAEABAAFAAEAAAAGAAQABAAKAAUABAAGAAoAAAAIAAYACAAAAAcAAgALAAcAAgADAAsAGgAIAAcABgAIAAkAGgAJAAgABgAJABEACgAGABEAGgAbAAkABwAMABoAGwAaAAwABwALAAwAEAAJABsAEAARAAkAGwAMABwAHAAQABsADQAMAAsADAANABwADQALAAMAEQAQAB0ACgARAB0AHAAPABAADwAdABAAHAANAA4AHAAOAA8AAwAOAA0ADwASAB0ADgASAA8AAwAeAA4AEgAOAB4AAQAeAAMAHgABAAUAEgAeAAUAFAAdABIAFQASAAUAFAASABUAFQAFAB8AHwAFAAoAIAAKAB0AHwAKACAAIAAdABQAGAAVAB8AFgAfACAAGAAfABYAEwAgABQAFgAgABMAFwAUABUAFwAVABgAEwAUABcAFgAhABgAFwAiABMAEwAZABYAFgAZACEAEwAiABkAGAAhACMAGAAjABcAGQAjACEAFwAjACIAGQAiACMA"),
"lods": [0.666615, PackedByteArray("AAABAAIAAQADAAIAAAAEAAEABAAFAAEAAQAFAAMAAAAGAAQAAgAHAAAAAAAIAAYACAAAAAcABgAIAAkACQAIAAcABAAGAAoABAAKAAUAAgALAAcAAgADAAsABwALAAwABwAMAAkADQALAAMADQAMAAsAAwAOAA0AAwAFAA4ADAANAA8ACQAMAA8ADwANAA4ADwAQAAkAEAARAAkADwARABAABgAJABEACgAGABEADgASAA8ADwASABEAEgAOAAUAEwAKABEAFAARABIAEwARABQAFQASAAUAFAASABUAFgAFAAoAFQAFABYAFgAKABMAFwAUABUAEwAUABcAFwAVABgAFwAYABMAGAAVABYAEwAZABYAFgAZABgAGQATABgA")],
"name": "Material.003",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 36,
"vertex_data": PackedByteArray("VhEAAFYRAACo7gAAqO4AAKjuAABWEQAA/v9CAFYRAABWEQAAqO4AAKjuQgD//wAAAABCAKjuAABWEUIAAAAAAAAAQgBWEQAAAADa7VYRAABWEUIA//8AAKjuQgAAAAAAqO7a7QAAAAD//9rtVhEAAP//2u2o7gAAqO7//6juAABWEf//qO4AAAAA2u2o7gAAqO7a7f//AAABJDqJCf4AAGIjDN///wAAnNwM3///AAD92zqJCf4AAAEkH94J/gAA/dsf3gn+AAA51QSNzPgAAFYR2u0AAAAAVhH//1YRAACo7v//VhEAAFYR2u3//wAA/v9CAKjuAAB+3FmG//8AAIAjWYb//wAAOdVW2sz4AADFKgSNzPgAAMUqVtrM+AAA")
}, {
"aabb": AABB(-1.12162, 0.0571891, 0.989969, 2.15964, 1.44339, 1e-05),
"format": 34896613377,
"index_count": 6,
"index_data": PackedByteArray("AAABAAIAAAADAAEA"),
"name": "Material.010",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 4,
"vertex_data": PackedByteArray("AAD+/3cbAAD//wAAAAAAAAAAAAB3GwAA/////wAAAAA=")
}, {
"aabb": AABB(-1.05827, -2.69369, 1.57749, 1.95912, 0.645676, 0.768722),
"format": 34896613377,
"index_count": 396,
"index_data": PackedByteArray("AAAWAAEAAAAmABYAJwABABYAJgAnABYAKAAAAAEAKAAmAAAAKAABACkAAQAqACkAJwAqAAEADQAoACkADQApACoAKwAoAA0AKwANACoAKwAqACwALQArACwAKgAuACwALQAsAC4ALwArAC0ALwAoACsALwAtAC4AKgAwAC4AKgAnADAALwAuABkALgAwABkAGAAvABkAGAAZADAAMQAoAC8AKAAxACYAMgAvABgAMgAYADAAMQAvADIAJgAzACcAJgAxADMAMwAXACcAMwAxABcANAAnABcAMAAnADQAMQA0ABcAMgAwAAwAMAA0AAwAMQAyADUAMQA1ADQANQAyAAwANQAMADQAGgAbAAQADgAEABsADgAcAAQADgAbAAYABAAcADYABAA2ABoAHQAcAA4AHQAOAAYAIAA2ABwAHQA3ABwAIAAcADcAAgAaADYAAgA2ACAADwAaAAIADwADABoAGgADABsAEQAPAAIAAgAgAAUAEQACAAUABQAgABMANwATACAABQASABEABQATABIANwAIABMAEgATAAgAHQAIADcAEQAQAA8ADwAQAAMAEQASAB8AEQAfABAAEgAIADgAOAAfABIACQAIAB0ACQA4AAgAHQAGAAkAOAAHAB8ACQAHADgAEAAfAAcABgAHAAkAEAAHAB4ABgAeAAcAAwAQAB4AGwAeAAYAAwAeABsACgAhAAsACgA5ACEAOgALACEAOQA6ACEAOwAKAAsAOwA5AAoAOwALADwACwA9ADwAOgA9AAsAFQA7ADwAFQA8AD0APgA7ABUAPgAVAD0APgA9AD8AQAA+AD8APQBBAD8AQAA/AEEAQgA+AEAAQgA7AD4AQgBAAEEAPQBDAEEAPQA6AEMAQgBBACMAQQBDACMAIgBCACMAIgAjAEMARAA7AEIAOwBEADkARQBCACIARQAiAEMARABCAEUAOQAkADoAOQBEACQAJAAlADoAJABEACUARgA6ACUAQwA6AEYARABGACUARQBDABQAQwBGABQARABFAEcARABHAEYARwBFABQARwAUAEYA"),
"lods": [0.134239, PackedByteArray("AAAWAAEAAAAXABYADAAWABcAAAAMABcAAQAWAAwADQAAAAEAGAAAAA0AGAANAAEAAAAYAAwAGAABABkAAQAMABkAGAAZAAwAGgAbAAQADgAEABsADgAcAAQABAAcABoADgAbAAYAHQAcAA4AHQAOAAYAHQAGAAkAHQAIABwACQAIAB0ABgAHAAkACQAHAAgAGwAeAAYABgAeAAcAAwAeABsAGgADABsAEAAHAB4AAwAQAB4AEAAfAAcADwADABoADwAQAAMAEQAfABAAEQAQAA8ABwAfABIAEQASAB8AEgAIAAcAEQAPAAIADwAaAAIABQASABEAEQACAAUAEgATAAgABQATABIACAATACAABQAgABMAAgAgAAUAAgAaACAAIAAcAAgAIAAaABwACgAhAAsAFQAKAAsAIgAKABUAIgAVAAsAIgALACMACwAUACMAIgAjABQACwAhABQAJAAKACIACgAkACEAJAAiABQAFAAhACUAJAAlACEAJAAUACUA"), 0.218352, PackedByteArray("AAAMAAEADQABAAwADQAAAAEAAAANAAwAAgADAAQADgAEAAMABAAOAAIADwADAAIADwAQAAMAEQAPAAIAEQAQAA8ABQACAA4AEQACAAUADgADAAYAAwAQAAYABQAOAAgACAAOAAYABQASABEAEQASABAABQATABIACAATAAUAEgATAAgACAAGAAkAEAASAAcAEgAIAAcAEAAHAAYACQAHAAgABgAHAAkACgAUAAsAFQALABQAFQAKAAsACgAVABQA"), 0.608903, PackedByteArray("AAAAAAEAAAABAAEAAgADAAQABQADAAIABQACAAQABAADAAYAAwAFAAcAAwAHAAYABQAEAAgABQAIAAcACAAEAAYABgAHAAkACQAHAAgACAAGAAkACgAKAAsACgALAAsA")],
"name": "Material.006",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 72,
"vertex_data": PackedByteArray("SskAAKhPAABKyWLUqE8AALjkP5i45AAARhtNo///AAC45PH0//8AALjkP5hGGwAARhv//7jkAAAAAPH0RhsAALjk8fQAAAAARhv//0YbAABPNwAAqE8AAE83YtSoTwAAndNi1N2xAABntwAA+WkAALjk//+45AAARhs/mLjkAAAAAE2juOQAAEYbP5hGGwAARhtNowAAAAC45E2jAAAAAKJBYtTdsQAAbSUAAPlpAACd02LUtVYAAPDdYtRJhAAASskAAOq4AAD2vmLU3bEAALjkTaP//wAARhvx9P//AAD///H0uOQAALjk//9GGwAAAADx9LjkAAAAAE2jRhsAAP//TaNGGwAAokFi1LVWAABPNwAA6rgAAPwsYtTdsQAAMUkAAPlpAAD1S2LUSYQAAJ3TAAC1VgAALNti1PlpAAD2vgAAtVYAAPa+YtS1VgAAZ7di1PlpAACjtAAASYQAAKO0YtRJhAAAZ7cAAJqeAABnt2LUmp4AAPa+AADdsQAASsli1Oq4AADw3QAASYQAAJ3TAADdsQAALNsAAPlpAAAs22LUmp4AACzbAACangAA//9No7jkAAD///H0RhsAAEYb8fQAAAAAokEAALVWAAAxSWLU+WkAAPwsAAC1VgAA/Cxi1LVWAABtJWLU+WkAAKgiAABJhAAAqCJi1EmEAABtJQAAmp4AAG0lYtSangAA/CwAAN2xAABPN2LU6rgAAPVLAABJhAAAokEAAN2xAAAxSWLUmp4AADFJAACangAA")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_emikr"]
resource_name = "Steles__Cube"
_surfaces = [{
"aabb": AABB(-1.73357, -2.67026, -1, 3.46715, 4.93244, 2),
"attribute_data": PackedByteArray("b3NvuB0tzPpvc8z6b3P///F4zPrxeG+4b3M8s5snzPodLTyzHS1vuJsnb7i8b61rDrabJ7xvmycOtq1rVubUyADo9/1W5v//c37M+nN+b7jFxDyzc348s0fKzPrxeMz6xcT//3N+//+bJwmuvG+ta7xvCa6bJ3pmvG96ZpsnPLO8bzyzvG/fcLxvrWvdt61rUZl4dlGZo61fs0l2vG88s923PLNfs9Ot//+ta923rWvdt99w//88s923PLNHyv//bcv3/Q3k//9HytTIDeTUyK222WoOtkNSrbaHUk23h1KttkNSTbfZaqzkpMgN5P//rOTP/w3kdcgdLf//AOjbysXEzPrFxG+4R8pvuPF4b7ibJ61r3bffcHGYUnZxmMqt///fcFbmrMpW5sf95uL3/ebi28pty9vKDrata622rWs="),
"format": 34896613399,
"index_count": 204,
"index_data": PackedByteArray("AAABAAIAAQADAAIAAgADAAQAAQA+AAMAAgAEAAUAAgAFAAAABgAAAAUAPgABAAcAAAAGAAgACQAHAAEAAAAJAAEAAAAIAAkACQAKAAcACQAIAAoACwAMAA0ACwAOAAwADwAQABEADwA/ABAAQAATAEEAEwAUAEEAQgBBABQAEwAVABQAQQBCABYAQQAWAEAAFgAYAEAAQAAYABkAFQATAEMAQAASABMAEgBDABMAQAAZABIAEgAXAEMAGQAXABIAGgAbABwAHAAfABoAHAAgAB8AGgBEABsAHgAbAEQAHgBEAB0AIQAjAEUAIQAiACMARgAhAEUARgBFACYAJgBFACgAJgAoACkAKQAoACcAKQAnAEcARwAnACEARwAhAEYAJQBHAEYAJQBGACQASAArACwASAAqACsALAAtAEgALAAuAC0APABJADoAPABKAEkAOgA7ADwAOgA9ADsALwBLADEALwAwAEsAMABMAEsAMABNAEwAMwBMAE0AMwBNADIANAA1ADYANABOADUANwBPADkANwA4AE8A"),
"lods": [0.666615, PackedByteArray("AAABAAIAAQADAAIAAgADAAQAAgAEAAUAAgAFAAAABgAAAAUAAQAHAAMAAAAGAAgACQAHAAEAAAAJAAEAAAAIAAkACQAKAAcACQAIAAoACwAMAA0ACwAOAAwADwAQABEAEgATABQAEwAVABQAEgAVABMAFAAWABIAEgAXABUAFgAYABIAGQAXABIAEgAYABkAGgAbABwAGgAdABsAHgAbAB0AHAAfABoAHAAgAB8AIQAiACMAJAAhACMAJQAhACQAJAAjACYAJQAnACEAJgAjACgAKQAnACUAJgAoACkAKQAoACcAKgArACwALAAtACoALAAuAC0ALwAwADEAMAAyADEAMwAxADIANAA1ADYANwA4ADkAOgA7ADwAOgA9ADsA")],
"material": SubResource("StandardMaterial3D_rgye3"),
"name": "Material.003",
"primitive": 3,
"uv_scale": Vector4(6.09985, 6.46362, 0, 0),
"vertex_count": 80,
"vertex_data": PackedByteArray("VhEAAFYR+ymo7gAAqO5XK6juAABWEXwq/v9CAFYRCSyo7kIAAAAMGFYRQgAAAFYRAABCAFYRqw+o7kIA//+sRAAAQgCo7nYYVhEAAKju2CpWEUIA//9uMAAAQgCo7kQYAADa7VYRAQYAANrtqO7eCQAAQgBWEcwPASQ6iQn+y7o51QSNzPg6w/3bOokJ/p/MqO7//6ju/cJWEf//qO520gAA2u1WEdv8AADa7ajuPeeo7trtAACT86ju2u3//yi+///a7VYRhtP//9rtqO53tP7/QgBWEW/S///a7aju58///9rtVhGJ6KjuQgD//+XBqO7a7f//2MGo7kIAAAD95Kju2u0AAK79VhFCAP//sMgAAEIAqO5Z2AAA2u2o7pjGASQ6iQn+07/92zqJCf5yx2IjDN////+/qO5CAP//5cGo7trt///YwZzcDN///53AAADa7VYRyCQAAEIAVhGHC1YRQgAAAH0MqO7a7QAAUAKo7kIAAAABG/3bOokJ/ubBOdUEjcz4BMD92x/eCf6FxwEkOokJ/ljFASQf3gn+iMABJDqJCf5LmWIjDN///5CKASQf3gn+Npz92x/eCf6ZCpzcDN///8YH/ds6iQn+gwUBJB/eCf7hRJzcDN///2I8/dsf3gn+4jJiIwzf///9Qv7/QgCo7iVJxSoEjcz4Fb6o7v//VhFT2VYR//9WETnuVhHa7QAAQf5WEdrt///Bw/7/QgCo7p7BVhHa7f//EMCAI1mG////v37cWYb//xzAVhHa7QAAUwzFKlbazPjpQTnVVtrM+MQ8OdVW2sz4SsHFKlbazPgEwMUqBI3M+ErBgCNZhv//5YV+3FmG//8MBexUX1W/VUpVOFXFVCliHjHFUAlBLUQgUyNBOWiLZvFcuVOMb3BV5VUuYlhq01Nwb471CUls+fwt/UBgaO8jAw/p/HESG/Mj4WbPAxeK6zIrukCql138C8/QvL4+8hY6A6mh/yWNTcAF/C0kRNIokhqIMmwrrBFV2scVGgTqQ15JajofOaQjRe87zsPyh+NC1M4gbhCV8Drh8gD18awRVdrHFRoE8Q0O/yDQSsiLy5ncG086Smo6HznqQ15Jre1V4Y/9QhNO3G32yh3MESkK6CWkpg0SxFz8WhNhRz0mZY9zvHgVeTX6sBwAhNJUmHJ9fk1bZoNgfplxkGc7PozsQAPzwowvTtc9ND5EsLfx/E/q2Q+bO9H70+m7+TEBzf5BBvnBkcC+fIxsjm3pfAETmP1vArzs/exmAl7mCyFl/MoC")
}, {
"aabb": AABB(-1.12162, 0.0571891, 0.989969, 2.15964, 1.44339, 1e-05),
"attribute_data": PackedByteArray("ZQOBB5n8ffhlA334mfyBBw=="),
"format": 34896613399,
"index_count": 6,
"index_data": PackedByteArray("AAABAAIAAAADAAEA"),
"material": SubResource("StandardMaterial3D_m77li"),
"name": "Material.010",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 4,
"vertex_data": PackedByteArray("AAD+/3cbAID//wAAAAAAgAAAAAB3GwCA/////wAAAID/f////3////9/////f///")
}, {
"aabb": AABB(-1.05827, -2.69369, 1.57749, 1.95912, 0.645676, 0.768722),
"attribute_data": PackedByteArray("////fwAA/3///wAAAAAAAC1Z0UbRZtEGLZkuOf+f0QYtWS150Sb/Py2Z0YYt2dFGLdkteS2Z0Mb/ny250Wb///+fLfn/n9DG////fwAA/3///wAAAAAAAFSVAACqKv9//58uOdGm0UbRZtGG0WYtudFmLfktWf9/0Sb/f9EmLXn/H9FG0SbRRlSVAACqKv9/qeoAAP+/AAD/f/9/qmoAAP8/joK3XjT1RyE09bdeyopwff+//79v/f+/joLKikeh0WYuOS2Z0QYtmf8/LZnRRtFmLXnRpi15/5/RhtFm0MYtmS35LZn//y1Z/z//Hy15/18teanqAABU1f9//78AAP9//3+qagAA/z+OgrdeNPVHITT1t17KinB9/7//v2/9/7+OgsqKR6E09Uehqer/f1TVAABU1f9//7//f6qqAACqqv9/VJX/f/9/AACqav9/VVUAAFVV/3//PwAA/z//f6oqAABVFQAAVRX/fzR1R6HKCkehRyHKijR1t97/P2/9ygq33o8C/79HocqKt97Kim/9/7809UehjoL/v0ehNPXKirfet9409TT1t97RZtFGLZkteS2ZLbktmf9/LZn/v/9f0Uap6v9/VNUAAP+//3+qqgAAqqr/f1SV/3//fwAAqmr/f1VVAABVVf9//z8AAP8//3+qKgAAVRUAAFUV/380dUehygpHoUchyoo0dbfe/z9v/coKt96PAv+/R6HKirfeyopv/f+/joL/v0ehNPXKirfet9409TT1t94="),
"format": 34896613399,
"index_count": 396,
"index_data": PackedByteArray("AAAkAAIAAABLACQASwBMACQASwBNAEwATQAlAEwATQBOACUATgBPACUATgBQAE8AUAAWAE8AUABRABYAUQBSABYAUQAmAFIAJgAnAFIAJgBTACcAUwBUACcAUwBVAFQAVQBWAFQAVQBXAFYAVwBYAFYAVwAXAFgAFwBZAFgAFwBaAFkAWgADAFkAWgABAAMAWwAoACsAWwBcACgAKABcAF0AXgBbACwAXwBbAF4AXABbAF8AXwBeACkAXABfAGAAYABfACoAXABgAGEAYgBjAC4AYgBkAGMAYwBkAGUAZgBiAC8AZwBiAGYAZABiAGcAZwBmAGgAZABnAGkAaQBnAC0AZABpAGoAMAAxAAYAMAAFADEABgBrADAAGAAGADEAGAAxAAcAGAAyAAYABgAzAGsANABrADMABABrADQANAAzAGwAbAAaADQANQBsADMANQAzABkANQAZAAsANQALAAwAbAAKABoAGwAaAAoAGwAKAG0AbQA3ABsADgBtAAoADgAKADYANgAKAG4AbQANADcAHAA3AA0AEQANAG8AEAANABEAHAANADgAEAA4AA0ADwAcADgAOQA4ABAADwA4ADkAIQAgAAkAIQAJADoAHwAgACEAHwA7ACAAHwAeADsAIQA6AAQAHwAhAAQABAA6AHAACAAeAB8AHwAEAAgABAA0AAgACAAdAB4ACAA8AB0AEgA9ABQAEgBxAD0AcQByAD0AcQA+AHIAPgA/AHIAPgBzAD8AcwB0AD8AcwB1AHQAdQAiAHQAdQB2ACIAdgB3ACIAdgBAAHcAQABBAHcAQAB4AEEAeAB5AEEAeAB6AHkAegB7AHkAegB8AHsAfAB9AHsAfAAjAH0AIwB+AH0AIwB/AH4AfwAVAH4AfwATABUAgABCAEUAgACBAEIAQgCBAIIAgwCAAEYAhACAAIMAgQCAAIQAhACDAEMAgQCEAIUAhQCEAEQAgQCFAIYAhwCIAEgAhwCJAIgAiACJAEoAigCHAEkAiwCHAIoAiQCHAIsAiwCKAIwAiQCLAI0AjQCLAEcAiQCNAI4A"),
"lods": [0.134239, PackedByteArray("AAAkAAIAAAAlACQAAAAWACUAAAAmABYAJgAnABYAJgADACcAJgAXAAMAFwABAAMAKAApACoAKAArACkAKQArACwALQAuAC8AMAAxAAYAMAAFADEAGAAGADEAGAAxAAcAGAAyAAYABgAzADAANAAwADMABAAwADQANAAzAAoACgAaADQABAA0AAgAGwAaAAoANQAKADMANQAzABkANQAZAAsANQALAAwADgAKADYADgANAAoAGwAKAA0ADQA3ABsAHAA3AA0AHAANADgADwAcADgADwA4ADkAOQA4ABAAEAA4AA0AEAANABEAIQAgAAkAIQAJADoAIQA6AAQAHwAgACEAHwAhAAQAHwA7ACAAHwAEAAgAHwAeADsACAAeAB8ACAAdAB4ACAA8AB0AEgA9ABQAEgA+AD0APgA/AD0APgAiAD8APgBAACIAQABBACIAQAAVAEEAQAAjABUAIwATABUAQgBDAEQAQgBFAEMAQwBFAEYARwBIAEkASgBIAEcA"), 0.218352, PackedByteArray("AAAWAAIAAAAXABYAFwADABYAFwABAAMABAAFAAYAGAAGAAUAGAAFAAcABgAZAAQACAAEABkACAAZAAoACgAZAAsACgALAAwACgAaAAgAGwAaAAoAGwAKAA0ADgANAAoAHAAbAA0AHAANABAAEAANABEADwAcABAACAAdAB4ACAAeAB8AHwAEAAgAHwAeACAAHwAhAAQAHwAgACEAIQAJAAQAIQAgAAkAEgAiABQAEgAjACIAIwAVACIAIwATABUA"), 0.608903, PackedByteArray("AAABAAIAAQADAAIABAAFAAYABgAFAAcACAAEAAYACAAJAAQACAAGAAoACgAGAAsACgALAAwACAAKAA0ADgANAAoADwAIAA0ADwANABAAEAANABEAEgATABQAEwAVABQA")],
"material": SubResource("StandardMaterial3D_f3mmc"),
"name": "Material.006",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 143,
"vertex_data": PackedByteArray("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")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_vep6p")
[node name="SteleA" type="Node3D"]
[node name="Steles_" type="Node3D" parent="."]
[node name="Cube" type="MeshInstance3D" parent="Steles_"]
transform = Transform3D(0.45, 0, 0, 0, 0.45, 0, 0, 0, 0.45, 0, 1.21845, 0)
mesh = SubResource("ArrayMesh_emikr")
skeleton = NodePath("")

View File

@@ -0,0 +1,120 @@
[gd_scene load_steps=9 format=4 uid="uid://btjwytsymvxiv"]
[ext_resource type="Texture2D" uid="uid://35g2bx4vh3wd" path="res://src/map/assets/Steles/Steles_IMG0031.png" id="1_mtjg5"]
[ext_resource type="Texture2D" uid="uid://br8l5h7n6t41d" path="res://src/map/assets/Steles/Steles_eye.png" id="2_t14ca"]
[ext_resource type="Texture2D" uid="uid://c8nvb5jn8f6k1" path="res://src/map/assets/Steles/Steles_Untitled-1.png" id="3_1uk4s"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rgye3"]
resource_name = "Material.003"
cull_mode = 2
albedo_texture = ExtResource("1_mtjg5")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_jg7fj"]
resource_name = "Material.014"
transparency = 2
alpha_scissor_threshold = 0.5
alpha_antialiasing_mode = 0
cull_mode = 2
albedo_texture = ExtResource("2_t14ca")
texture_filter = 2
texture_repeat = false
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_m77li"]
resource_name = "Material.010"
transparency = 4
cull_mode = 2
albedo_texture = ExtResource("3_1uk4s")
roughness = 0.0
texture_filter = 2
[sub_resource type="ArrayMesh" id="ArrayMesh_oi256"]
_surfaces = [{
"aabb": AABB(21.3311, -2.52229, 0.285272, 2.7385, 3.45381, 1.31704),
"format": 34896613377,
"index_count": 936,
"index_data": PackedByteArray("OQBgADoAAQA6AGAAOQA8AGAAPAABAGAAYQA5ADoAPABAAAEAYgA8ADkAAQACADoAYwBAADwAYgBjADwAQABkAAEAZAACAAEAZQBiADkAZQA5AGEAPQBjAGIAZgBiAGUAZgA9AGIAZwBlAGEAPgBmAGUAPgBlAGcAaABmAD4AaQA9AGYAaABpAGYADgBoAD4AaQBBAD0ADgA+AGoAagA+AGcAaAAOAGsAawAOAGoAaQBoAEQAaABrAEQAaQBEAGwAQQBpAGwARABrAG0AawBqAG4AbQBrAG4AbgBqAG8AagBnAG8AbABEAHAARABtAHAAcABtAA8AcAAPAAoADwBtAEIAbQBuAEIADwBCABAAcQBwAAoAbABwAHEAcQAKAAkAQwBsAHEAQQBsAEMAcgBxAAkAQwBxAHIAcgAJAAgAAABBAEMAcwBDAHIAAABDAHMAdAByAAgAcwByAHQAdAAIAAcAdAAHAAUAdAAFAHUAcwB0AHUAdQAFAAMAAABzAEUAcwB1AEUAQQAAAD8AAABFAD8AQQA/AD0APQA/AGMAdQADAHYARQB1AHYAdgADAAQAPwBFAHcAPwB3AGMARQB2AHcAYwB3AEAAdgAEAHgAdwB2AHgAdwB4AEAAeAAEAAYAQAB4AGQAeAAGAGQABgALAGQABgAMAAsAZAALAAIADABGAAsADAANAEYADQAVAEYADQAWABUARgAZAAsARgBKABkAFQBKAEYACwAZABsACwAbAAIASAAbABkASAAZAHkAeQAZAEoAGwBIAHoAeQB6AEgAAgAbAHsAGwB6AHsAeQB8AHoAeQBKAHwAfQB6AHwAewB6AH0AfABKAH4AfQB8AH4AewB9AH8AfgB/AH0AfgBJAH8AfgBKABgAfgAYAEkAFQAYAEoAGgB/AEkAewB/ABoAGgBJABgARwB7ABoAAgB7AEcAFwAaABgAFwAYABUARwAaABcAAgBHAIAAAgCAADoAYQA6AIAARwCBAIAARwAXAIEAggBhAIAAggCAAIEAZwBhAIIAbwBnAIIAgwCCAIEAbwCCAIMAFwA7AIEAgwCBADsAFwARADsAFQARABcATACDADsATAA7ABEAhABvAIMAhACDAEwAbgBvAIQAQgBuAIQAQgCEAIUAhQCEAEwAEABCAIUAEACFABIAhQBMAEsAEgCFAEsASwBMABEAEgBLABMASwARAIYAEwBLAIYAFQCGABEAEwCGABQAFgCGABUAFgAUAIYATQCHAE8ATwCHAB4ATQBOAIcAHgCHAE4AiABNAE8ATwAeAFMAiQBOAE0AiABPAIoAigBPAFMAiwBNAIgAiwCJAE0AUACIAIoAjACLAIgAjACIAFAAjQCLAIwAjgCJAIsAjQCOAIsAjgCPAIkAkACNAIwAkQCMAFAAkACMAJEANQCNAJAAUQCOAI0ANQBRAI0AUQCSAI4AkgCPAI4AkwBRADUAkACTADUAlACSAFEAkwCUAFEAkABXAJMAkQBXAJAAWACUAJMAVwBYAJMAlACVAJIAWABVAJQAVQCVAJQAMQBVAFgAlQCWAJIAkgCWAI8AMQAwAFUAlwAxAFgAVwCXAFgAlwA3ADEAMACYAFUAVQCYAJUAMAAvAJgAmABeAJUAlQBeAJYALwBfAJgAmABfAF4ALwAuAF8AmQA3AJcAmQA4ADcAmgCXAFcAmgCZAJcAkQCaAFcAmwA4AJkAmwA2ADgAVgCZAJoAVgCbAJkAVACaAJEAVABWAJoAkQBQAFQAnAA2AJsAnAA0ADYAnAAzADQAnQCcAJsAnQCbAFYAnACeADMAnQCeAJwAngAsADMAMgCdAFYAMgBWAFQAnQBZAJ4AMgBZAJ0AngCfACwAWQCfAJ4AnwArACwAVABSADIAMgBSAFkAVABQAFIAUACKAFIAUgCgAFkAUgCKAKAAWQCgAJ8AigBTAKAAnwChACsAoAChAJ8AoABTAKEAoQAqACsAUwCiAKEAoQCiACoAUwAeAKIAKgCiACEAogAeAB0AogAdACEAKgAhACgAHgBOAB0AKAAhAFoAKABaACcAJwBaACUAJwAlACkAWgAhACMAHQBOAKMAiQCjAE4AjwCjAIkAIQAdACAAIQAgACMAWgAjAKQAJQBaAKQAXAAjACAAjwAcAKMAlgAcAI8AXAClACMApQCkACMAIACmAFwApQBcAKYAIABbAKYAHQBbACAApQCmAKcApQCnAKQAqACnAKYAWwCoAKYApwCpAKQAqACpAKcAWwCqAKgAqQCoAKoAHQCrAFsAHQCjAKsAqwCjABwAqwAfAFsAWwAfAKoAqQCqAF0AHwBdAKoAqQBdACIAHwAiAF0AqQAiAKQAqwAkAB8AJAAiAB8AqwAcACQAJQCkACIAJAAlACIAJAAcAKwAlgCsABwAXgCsAJYAJACsACYAXgAmAKwAJQAkACYAXwAmAF4AJQAmAK0AXwCtACYAKQAlAK0ALgCtAF8AKQCtAC0ALgAtAK0A"),
"lods": [0.244843, PackedByteArray("OQABADoAOwA5ADoAOQA8AAEAPQA8ADkAPgA5ADsAPgA9ADkAPQA/ADwADgA9AD4APwBAADwAPABAAAEAQQA/AD0ADgBBAD0AQQAAAD8ADgA+AEIAAABBAEMAQQAOAEQAQQBEAEMARAAOAA8ADwAOAEIARAAPAAoAQwBEAAoAQwAKAAkAQwAJAAgABwBDAAgAAABDAAcADwBCABAAAAAHAEUAAABFAD8ABwAFAEUARQAFAAMAPwBFAEAARQADAEAAQAADAAQAQAAEAAYAQAAGAAEABgALAAEABgAMAAsAAQALAAIAAQACADoADABGAAsADAANAEYAAgBHADoARwA7ADoACwAbAAIAAgAaAEcAAgAbABoACwAZABsARgAZAAsASAAbABkAGwBIABoAGQBJAEgASQAaAEgAGQBKAEkARgBKABkAGgBJABgASQBKABgAFQBKAEYAFQAYAEoADQAVAEYADQAWABUAFgAUABUAFwAaABgAFwAYABUARwAaABcARwAXADsAFQARABcAFQAUABEAFwARADsASwARABQAEwBLABQAEgBLABMAEABLABIAEABCAEsATAA7ABEASwBMABEAQgBMAEsAPgA7AEwAQgA+AEwATQBOAE8AHABOAE0AUABNAE8AUQAcAE0AUQBNAFAAUABPAFIANQBRAFAAHgBPAE4AUgBPAFMATwAeAFMAVABQAFIANQBQAFQAVABSADIANQBVAFEAMgBWAFQAVABXADUAVABWAFcAVwBYADUAWABVADUAVwAxAFgAMQBVAFgAVwA3ADEAVgA3AFcAMQAwAFUAVgA4ADcAVgA2ADgANAA2AFYAMgA0AFYAMgBZADQAMgBSAFkANABZADMAWQAsADMAUgBTAFkAWQBTACwAUwArACwAUwAqACsAUwAeACoAKgAeACEAKgAhACgAHgAdACEAHgBOAB0AKAAhAFoAKABaACcAJwBaACUAWgAhACMAJQBaACMAJwAlACkAHQBOAFsAIQAdACAAIQAgACMAHQBbACAAKQAlACYAKQAmAC0ALgAtACYAXAAjACAAIABbAFwAIwBcAF0AWwBOABwAJQAjACIAXQAiACMAXQBcAB8AHwAiAF0AWwAfAFwAJAAlACIAJAAiAB8AWwAkAB8AWwAcACQAJQAkACYAJAAcACYAXgAmABwAUQBeABwAVQBeAFEAXwAmAF4AVQBfAF4ALgAmAF8AMABfAFUALwAuAF8AMAAvAF8A"), 0.45515, PackedByteArray("AAABAAIAAQADAAQABQADAAEAAAAFAAEAAQAEAAYAAAAHAAUABwAAAAgAAAAJAAgAAAAKAAkABgALAAEABgAMAAsAAQALAAIADAANAAsAAAAOAAoADgAPAAoADwAOABAADgAAABEADgARABAAEQAAAAIAEAARABIAEgARABMAEwARABQAFQAUABEAFgAUABUADQAWABUADQAVAAsAFQARABcAFwARAAIAFQAYAAsAFwAYABUACwAYABkAFwAaABgAAgAaABcAGQAYABoACwAbAAIACwAZABsAAgAbABoAGQAaABsAHAAdAB4AHwAdABwAHQAfACAAIQAdACAAHgAdACEAHwAiACAAIwAgACIAIQAgACMAJAAiAB8AHwAcACQAJQAjACIAJAAlACIAJQAhACMAJQAkACYAJAAcACYAJwAhACUAKAAhACcAJwAlACkAKQAlACYAKgAhACgAKgAeACEAHgAqACsAHgArACwAKQAmAC0ALgAtACYALwAuACYAMAAvACYAMAAmABwAMQAwABwAMgAeACwAMgAcAB4AMgAsADMANAAyADMANQAcADIAMgA0ADUAMQAcADUANAA2ADUANQA3ADEANQA2ADgANQA4ADcA")],
"name": "Material.003",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 174,
"vertex_data": PackedByteArray("9QwVAJ0rAABRJvDJIy0AAEIcVc6yTgAAJ4DgjfIGAAAngPi3QQsAACeAykcSAgAAJ4Cp2DQdAAAngBMAAAAAACeAAABsOwAAJ4AAAP9/AAAngAAAksQAANhOrth2RwAAJ4Bc3UBDAAAngFzd/38AAFsWFQBh1AAAJ4ATAP//AAAngMpH7P0AABwo8Mnb0gAAJ4DgjQz5AAAngPi3vfQAACeAqdjK4gAABU+u2Ii4AAAngFzdvrwAAIscVc5MsQAAYk9a+8C4AAA2T1r7r0cAAOocYfuFsQAAohxh++tOAAAm+BG4o6kAALzjVc6yTgAArdnwySMtAAAU42H7hbEAAFzjYfvrTgAAJrGu2HZHAACcsFr7wLgAAMiwWvuvRwAAc+NVzkyxAAD5sK7YiLgAAOLX8Mnb0gAA139c3f9/AADXf1zdQEMAANd/XN2+vAAA13+p2DQdAADXf/i3QQsAANd/4I3yBgAA13+p2MriAADXf/i3vfQAANd/4I0M+QAA13/KR+z9AADXfxMA//8AAAnzFQCdKwAA13/KRxICAADXfxMAAAAAAKPpFQBh1AAA138AAGw7AADXfwAAksQAANd/AAD/fwAAwQHDmf5TAAC8BRG4W1YAAFsWt7e4xQAAFQwnnGEyAADBAbU7E1UAAOEDtTvrqgAAFQyqPMcvAAAgJ3Krgh4AALwFEABWUgAAg0g7RhD1AABbIQAAGkkAAKMhAADktgAAICfIQp0ZAAABTq7Y/38AAPEaVc7/fwAAjiL+/69aAAD4SPr/hKoAAF5OWvs3gAAAg0gRtFzuAADfKHKrfOEAAD3+w5n+UwAAQvoRuFtWAADp8yecYTIAAD3+tTsTVQAAX+mqPDfQAADp86o8xy8AAN7YcquCHgAAQvoQAFZSAAB7tztGEPUAAKPeAAAaSQAAW94AAOS2AAD9txMAPvYAAN7YyEKdGQAA/bGu2P9/AACu5GH7OIAAAHDd/v+vWgAABrf6/4SqAAAf13KrfOEAAHu3EbRc7gAA9Qy3t0Y6AAAAAMOZ/38AAMEBfnYjVAAAFQxoeNgwAAD5RxjUayIAAAAAfnb/fwAAAAC1O/9/AADhA35226sAANgHEACorQAABAQQAP9/AACfFqo8N9AAABwoEgDT5gAACSAAAP9/AAABSBMAPvYAAN8oyEJh5gAAnxZoeCbPAAAbRQAAIr8AABdEAAD/fwAA7kQAANxAAABRJhIAKxkAAPlHEwDACQAAg0g7Ru4KAACDSN6KXw4AACAnKYQAHAAAg0gRtKIRAADXSPr/9FUAAOUh//9ccwAAUBth+ziAAABnSPr/XHMAAPkh//8fjQAAcUj6/x+NAADHIv7/yaUAAAQEEbj/fwAA2AcRuKOpAADhA8OZAKwAAJ8WJ5ydzQAA3ygphP7jAACDSN6Kn/EAAAFIGNST3QAACfO3t0Y6AAA9/n52I1QAAP//w5n/fwAA6fNoeNgwAAD//352/38AAP//tTv/fwAAHfy1O+uqAAAd/H5226sAAB38w5kArAAAJvgQAKitAAD6+xAA/38AAF/paHgmzwAA4tcSANPmAAAf18hCYeYAAB/XKYT+4wAAX+knnJ3NAADjugAAIr8AAHu33oqf8QAA57sAAP9/AAD13wAA/38AABC7AADcQAAABbgTAMAJAACt2RIAKxkAAHu3O0buCgAAe7feil8OAADe2CmEABwAAHu3EbSiEQAABbgY1GsiAAD6+xG4/38AAKCxWvs3gAAAJ7f6//RVAAAZ3v//XHMAAJe3+v9ccwAABd7//x+NAACNt/r/H40AADfd/v/JpQAADeVVzv9/AACj6be3uMUAAP23GNST3QAA")
}, {
"aabb": AABB(21.7459, -1.62128, 1.38039, 1.90229, 2.02213, 0.221566),
"format": 34896613377,
"index_count": 72,
"index_data": PackedByteArray("DgABAAIAAAACAAMAAAAOAAIABAAOAAAADgAPAAEABAAQAA4AEAAPAA4ABQAQAAQADwAMAAEABQAGABAABgARABAAEAARAA8ABgAIABEADwASAAwAEQASAA8AEgANAAwAEgALAA0AEQATABIAEwALABIACAATABEAEwAHAAsACAAJABMACQAHABMACQAKAAcA"),
"lods": [0.13891, PackedByteArray("AAABAAIAAAACAAMABAABAAAABQAGAAQABgAHAAQABAAHAAEABgAIAAcACAAJAAcACQAKAAcABwALAAEAAQALAAwACwANAAwA")],
"name": "Material.014",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 20,
"vertex_data": PackedByteArray("5v6gs4FeAAC9fv//tl4AAJLP0/mYNgAA///b5xMIAADm/lVwnWoAAOb+WADHcwAA185yBkXHAAAYAapv2mUAAL1+jgj//wAApC7jBVLLAAAYAQAACnQAABgBxLL0VgAA6S0x+LQ/AAAAANjmAAAAANfO48I5mQAAvX4nyGnJAADXzjN8+a4AAL1+Q4AE4wAApC59wXyjAACkLiB74LYAAA==")
}, {
"aabb": AABB(21.8513, -2.3541, 1.50157, 1.65137, 1.03643, 0.106893),
"format": 34896613377,
"index_count": 96,
"index_data": PackedByteArray("EAACAAAAEAABAAIAEQAQAAAAEQAAAAgAEgABABAAEgAEAAEAEwAQABEAEwASABAAFAARAAgAFAAIAAkADgAUAAkADgAJAA8ADQAUAA4AFQARABQADQAVABQAFQATABEACwAVAA0ACwAWABUAFgATABUADAAWAAsADAAKABYAFgAXABMACgAXABYAFwASABMACgAHABcAFwAYABIABwAYABcAGAAEABIABwADABgAGAAFAAQAAwAFABgAAwAGAAUA"),
"lods": [0.0110147, PackedByteArray("AAABAAIAAwABAAAAAwAEAAEAAwAFAAQAAwAGAAUABwADAAAABwAAAAgACQAHAAgACgAHAAkACwAKAAkADAAKAAsACwAJAA0ADQAJAA4ADgAJAA8A")],
"name": "Material.010",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 25,
"vertex_data": PackedByteArray("7MARABK3AAB1//w/nB0AAID/AwBZIAAA2MDH/0WoAACF/+N/ahkAAP//ir+kJwAA0f98/zAaAADOf///ifcAAMV/HgD//wAApD4PADKtAACbPtv/na0AAAAAt7/ZGQAAHgCu/6IRAABcAN5/AAAAAHMA+T9aAwAAaAAAABcGAADmwApA07IAAM5/FkA0+QAA6cD6f/+tAADXfw6AafIAAKo+CEDzqAAAsD4BgLSkAACEPnjBlbgAAN9/BsCe6wAA98A5wue2AAA=")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_rms5v"]
resource_name = "Steles__Cube_012"
_surfaces = [{
"aabb": AABB(21.3311, -2.52229, 0.285272, 2.7385, 3.45381, 1.31704),
"attribute_data": PackedByteArray("z+L8/47iep7q3Fqcs8Z6nnLG/P9XzFqcTcyYhuDcmIazr13NrNRm1azUdMprrEeurNTSvazUMLGs1D6mR7V6nqzUKKes1F2XrNR9u6zUWN1rrPz/rNT9/6zUAsms1AXQgcM8yOi1Fc3dsefGrNTSvXHDaLOs1KGyrNSfq0e1jq7Esb20rNQop+i1ep6s1F2XrNR9u6zUWN2zr/z/rNT9/5LDcrP+sfHG5bHItKLDRsggy1uXFsubhiHeW5cX3puG3bFanKLDm4aBw1uX/rGYhnHDW5flsZiGxLFanJLDm4ahzRyn6txanI7iep7P4vz/csb8/03MmIbg3JiGV8xanLPGep6K+V3NkdR0ypHUZtWR1NK9kdQwsZHUPqbS/Eeu9vN6npHUXZeR1CinkdR9u9L8/P+R1FjdkdT9/5HUAslV8xXNkdQF0LzlPMhg9+fGkdTSvczlaLOR1KGykdSfq/bzjq569720kdQop5HUXZdV83qekdR9u5HUWN2c/hynkdT9/4r5/P+r5XKzWPfItJzlRsg/9/HGIMtblxfem4YWy5uGId5bl2D3Wpyc5ZuGP/eYhrzlW5fM5VuXWPeYhqvlm4Z691qcBty/taDbHKes4Ze0oNRanOjIR6dqzS7j19su4xziuOJN3P//LLY1rbOvR6c/qS7jO8EKqTvBGd6ls+/H5KlptYuztbOQtTWtHKyXtBysuOKQtcTfJsPSvWTBp8X3s/K2R8PcvZfUm4ag1FuXBty/taDbHKes4Ze019su4xziuOJN3P//Jce44pfUmIYR8zWtcvm44gPoGd4w6P3/A+gKqZj178cw6JrTWf9ptbL1tbOt8zWtIf2XtCH9uOKt88TfF+bSvUb18rba56fFzvfcvaDUW5dY4EenANzJxu7h3MWg1L+1oNT//6DULuP0zP//oNTJxiXHuOJBzcnGO82/taDUHKehzRynl9SYhsuvl7ShqhynP6m/tQ3Bkpk7wfG8LLYvwA3B/f8stsTf6LX+/8uv3MU/qcnGy6+44grAc8kNwZrTr7/Svei1w9ChqjvGS6nSvRaz0r1HteGq+r8xsgrBCqg7wQqpCsGSmWusR6ccrNzFkLUvwDvB8bxHtf7/O8EZ3grB/f8NwQ/PCsGVrFjBE7a8s367b7HcvTHBfrvDsz3ANME9wAu0yMRY4EenANzJxu7h3MWg1P//oNQu4/TM//+g1MnGas0u40HNycag1L+1O82/taDUHKeg1Fqc6MhHp4r5R6dy+Ze0//+/tXL53MX//8nGEfMvwDDokpkD6PG8EfPE31Xz/v///y7jM+lzyVXzw9Cc/jvG8//SvSj20r2O6dK99vPhqkPpMbIz6AqoA+gKqTPokpkD6PG80vxHpyH93MWt8y/A9vP+/wPoGd4z6P3/MOgPzzPolazl5xO2gfV+uwzofrv25dy9Ceg9wHr1PcAy9cjEl9Sbhg=="),
"format": 34896613399,
"index_count": 936,
"index_data": PackedByteArray("cgCnAHMAAQBzAKcAcgB0AKcAAQACAHMAqAB0AHIAqACpAHQAqgByAHMAeACpAKgAeAB5AKkAegB5AHgAegAAAHkAqwB6AHgAqwB4AKwArAB4AKgArQCrAKwArgCoAHIArACoAK4ArgByAKoArQCsAHcAdwCsAK4ABACtAHcABAB3AK8AdwCuALAAsACuAKoAsACqALEAsQCqALIAqgBzALIAsQCyALMAAgCyAHMAdQCzALIAAgB1ALIAdQAFALMABQB2ALMABQADAHYAdQAGAAUAdQC0AAYAAgC0AHUAAgAHALQAewB8ACIAewC1AHwAtQC2AHwAtQC3ALYAfgB7ACIAfgAiALgAIQB+ALgAIQC4ACMAJAB+ACEAJAC5AH4AuQB7AH4AJQC5ACQAugC1AHsAuQC6AHsAJQB/ALkAfwC6ALkAJwB/ACUAJwC7AH8AuwC8AH8AfwC8ALoAuwC9ALwAugC+ALUAvAC+ALoAvgC3ALUAvgC/ALcAvADAAL4AwAC/AL4AvQDAALwAwAB9AL8AvQAmAMAAwQAJAAoAwQDCAAkAwwDBAAoAwwAKAAwAgADCAMEAgADEAMIAxQDEAIAAxQAIAMQAxgDFAIAAxwCAAMEAxgCAAMcAxwDBAMMAgQDGAMcAgQDHAIIAggDHAMMACwCBAIIACwCCAMgAggDDAMkAyACCAMkAyQDDAAwAyADJAMoAyQAMAA0AygDJAA0AygANAA4AywARAMwAywAQABEAgwDLAMwAgwDMAA8AhACDAA8AhAAPAM0AzgCDAIQAzgDPAIMAzwDLAIMAhQDPAM4A0AAQAMsAzwDQAMsA0AASABAAhQCGAM8AhgDQAM8AFACGAIUAFADRAIYAhgDSANAA0gASANAA0QDSAIYA0gATABIA0QDTANIA0wATANIA0wAVABMAFgDUABgAFgAXANQAGADUABkAGAAZABoAGwAWABgAGwAYAIcAHQAbAIcAHQCHABwAHgAdABwAHgAcANUA1QAcACAA1QAgAB8A1gDXAIkAiQAoANYAiQAqACgAKgCJANcA1gAoAIoAKgDXANgA1gDZANcA1gCKANkA2ADXANoA2gDXANkA2QCKANsA2gDZANsA2wCKACsA2ADaANwA2wDcANoA2ADcACkA2wArAIgA2wCIANwAKQCIACsAKQDcAIgALACLAIwALAAtAIsAjACLAC8AjAAvAC4AMAAxADIAMAAzADEANAA1ADYANAA3ADUAjQDdAI8AjQCOAN0AOgDdAI4A3gCNAI8AOgCOADkA3gCPAN8AkADeAN8AkADfAJEAkgCQAJEAkgCRADsA4ACQAJIA4ADhAJAA4QDeAJAA4gDhAOAA4QDjAN4A4wCNAN4A4gDkAOEA5ADjAOEAPADkAOIAPACTAOQA5ADlAOMA4wDmAI0A5QDmAOMA5gCOAI0A5QDnAOYA5gDoAI4A5wDoAOYAOQCOAOgA5wA4AOgAOQDoAOkA6QDoADgAOQDpAJQAOQCUAD4A6QA9AJQA6QA/AD0A6QA4AD8APwA4AOoAPwDqAEAAlQDrAOwA7ADrAF8A7ABfAO0AlQBcAOsA7gDsAO0A7gDtAO8A8ACVAOwA8ADsAO4AmQBcAJUAmQDxAFwAWgDxAJkAWgBbAPEAXQBaAJkA8gCZAJUAXQCZAPIA8gCVAPAAXgBdAPIAXgDyAJcAlwDyAPAAYABeAJcAYACXAJgAlwDwAPMAmACXAPMA8wDwAO4AmADzAPQA8wDuAJYA9ADzAJYA9ACWAGEAlgDuAO8AlgDvAPUA9gBDAJsA9gBCAEMAmgD2AJsAmgCbAPcA+ACaAPcA+AD3AEEA+QCaAPgA+QD6AJoA+gD2AJoAnAD6APkA+wBCAPYA+gD7APYA+wBEAEIAnACdAPoAnQD7APoARwCdAJwARwD8AJ0AnQD9APsA/QBEAPsA/AD9AJ0A/QBFAEQA/AD+AP0A/gBFAP0A/gBGAEUA/wBJAEoA/wAAAUkAAQH/AEoAAQFKAEsAngAAAf8AngBIAAABnwBIAJ4AnwACAUgAAwGfAJ4ABAGeAP8AAwGeAAQBBAH/AAEBoAADAQQBoAAEAaEAoQAEAQEBTACgAKEATAChAAUBoQABAQYBBQGhAAYBBgEBAUsABQEGAQcBBgFLAE0ABwEGAU0ABwFNAE4ATwAIAVEATwBSAAgBUgBQAAgBUgBTAFAAVABSAE8AVACiAFIAVgCiAFQAVgBVAKIAVwBVAFYAVwAJAVUACQFZAFUACQFYAFkACgELAQwBCgEMAQ0BCgENAWIAowAKAWIACgGjAAsBowBiAGMAYwALAaMAYwClAAsBDAEOAQ0BDgFkAA0BDwEMAQsBDwEOAQwBpQAPAQsBDgGkAGQAZQBkAKQADgEPARABpQAQAQ8BDgEQAaQApQBlABABZQCkABABZgARAWgAZgCmABEBpgBnABEBpgBpAGcAagBrAGwAagBtAGsAbgBvAHAAbgBxAG8A"),
"lods": [0.244843, PackedByteArray("cgABAHMAAQACAHMAcgB0AAEAAgAHAAYAAgAGAHUAAgB1AHMAdQAGAAUAdQB2AHMAdQAFAHYAdgByAHMABQADAHYAdwByAHYAeAB0AHIAdwB4AHIABAB4AHcAeAB5AHQABAB6AHgAegB5AHgAegAAAHkAewB8ACIAfQB8AHsAfgB7ACIAfgAiACMAfwB9AHsAfwB7AH4AJgB9AH8AIQB+ACMAJwAmAH8AJAB+ACEAJwB/ACUAJQB+ACQAJQB/AH4AgAAJAAoAgAAIAAkAgQAIAIAAggCAAAoAgQCAAIIAggAKAAwACwCBAIIAggAMAA0ACwCCAA4ADgCCAA0AgwARAA8AgwAQABEAhACDAA8AgwASABAAhQCDAIQAhgASAIMAhQCGAIMAhgATABIAFACGAIUAFQATAIYAFAAVAIYAFgAXABgAGAAXABkAGAAZABoAGwAWABgAGwAYAIcAHQAbAIcAHQCHABwAHgAdABwAHgAcAB8AHwAcACAAKACIAIkAiQAqACgAKACKAIgAKgCJACkAiAApAIkAiACKACsAKQCIACsALACLAIwALAAtAIsAjACLAC8AjAAvAC4AMAAxADIAMAAzADEANAA1ADYANAA3ADUAjQCOAI8AOgCPAI4AOgCOADkAkACNAI8AkACPAJEAkgCQAJEAkgCRADsAPACQAJIAPACTAJAAkwCNAJAAkwA4AI0AOACOAI0AOQCOAJQAlACOADgAOQCUAD4AlAA4AD8APwA4AEAAlAA/AD0AlQBcAF8AlgCVAF8AlwCVAJYAYQCXAJYAmACXAGEAYACXAJgAYABeAJcAlwCZAJUAXgCZAJcAmQBcAJUAXgBdAJkAXQBaAJkAWgBcAJkAWgBbAFwAmgBDAJsAmgCbAEEAmgBCAEMAnACaAEEAnQBCAJoAnACdAJoAnQBEAEIARwCdAJwAnQBFAEQARwBGAJ0ARgBFAJ0AngBJAEoAngBIAEkAnwBIAJ4AngBKAEsAoACfAJ4AoQCeAEsAoACeAKEAoQBLAE0ATACgAKEATgChAE0ATAChAE4ATwBQAFEATwBSAFAAUgBTAFAAVABSAE8AVACiAFIAVgCiAFQAVgBVAKIAVwBVAFYAVwBYAFUAWABZAFUAYgCjAKQApABkAGIAowBiAGMAZQBkAKQApACjAGUApQBlAKMAYwClAKMAZgBnAGgAZgCmAGcApgBpAGcAagBrAGwAagBtAGsAbgBvAHAAbgBxAG8A"), 0.45515, PackedByteArray("AAABAAIAAwAAAAIABAAAAAMABQADAAIAAgAGAAUAAgAHAAYACAAJAAoACwAIAAoACwAKAAwACwAMAA0ADgALAA0ADwAQABEADwASABAAEwASAA8AFAATAA8AFAAVABMAFgAXABgAGAAXABkAGAAZABoAGwAWABgAGwAYABwAHQAbABwAHgAdABwAHgAcAB8AHwAcACAAIQAiACMAJAAiACEAJQAiACQAJgAiACUAJwAmACUAKAApACoAKAArACkALAAtAC4ALgAtAC8AMAAxADIAMAAzADEANAA1ADYANAA3ADUAOAA5ADoAOwA4ADoAPAA4ADsAPQA5ADgAOQA9AD4APQA4AD8APwA4AEAAQQBCAEMAQQBEAEIAQQBFAEQARgBFAEEARwBGAEEASABJAEoASABKAEsATABIAEsATABLAE0ATgBMAE0ATwBQAFEATwBSAFAAUgBTAFAAVABSAE8AVABVAFIAVgBVAFQAVwBVAFYAVwBYAFUAWABZAFUAWgBbAFwAXQBaAFwAXgBdAFwAXgBcAF8AYABeAF8AYABfAGEAYgBjAGQAZQBkAGMAZgBnAGgAZgBpAGcAagBrAGwAagBtAGsAbgBvAHAAbgBxAG8A")],
"material": SubResource("StandardMaterial3D_rgye3"),
"name": "Material.003",
"primitive": 3,
"uv_scale": Vector4(1.51256, 2.07012, 0, 0),
"vertex_count": 274,
"vertex_data": PackedByteArray("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")
}, {
"aabb": AABB(21.7459, -1.62128, 1.38039, 1.90229, 2.02213, 0.221566),
"attribute_data": PackedByteArray("/v+toRbCPIJc6zyC//88gv7/HcH+////XOv+/y6EHcEWwv7/0Zj+/y6E//8uhK2h0Zg8gi6EPIJc662hFsKtoVzrHcEWwh3B0ZitodGYHcE="),
"format": 34896613399,
"index_count": 72,
"index_data": PackedByteArray("DgABAAIAAAACAAMAAAAOAAIABAAOAAAADgAPAAEABAAQAA4AEAAPAA4ABQAQAAQADwAMAAEABQAGABAABgARABAAEAARAA8ABgAIABEADwASAAwAEQASAA8AEgANAAwAEgALAA0AEQATABIAEwALABIACAATABEAEwAHAAsACAAJABMACQAHABMACQAKAAcA"),
"lods": [0.13891, PackedByteArray("AAABAAIAAAACAAMABAABAAAABQAGAAQABgAHAAQABAAHAAEABgAIAAcACAAJAAcACQAKAAcABwALAAEAAQALAAwACwANAAwA")],
"material": SubResource("StandardMaterial3D_jg7fj"),
"name": "Material.014",
"primitive": 3,
"uv_scale": Vector4(1.80989, 2.56341, 0, 0),
"vertex_count": 20,
"vertex_data": PackedByteArray("5v6gs4Fed4+9fv//tl4yiJLP0/mYNh2M///b5xMIR5Lm/lVwnWrgjOb+WADHc/qJ185yBkXHjIYYAapv2mUBjb1+jgj//w6BpC7jBVLLSYcYAQAACnRJihgBxLL0VqiP6S0x+LQ/6IwAANjmAABzktfO48I5mUyKvX4nyGnJ/4TXzjN8+a7oh71+Q4AE41SBpC59wXyjOYukLiB74LbViAKZe14E/KBzHrRIZICl1WSXiwpSeIokQW+N8jnUyQz0rfFrUJC7aPMTt5v1HtYF59XibM463QjbW6ZiXUL6d23VjqpMPPEhUH/bB9xczAby")
}, {
"aabb": AABB(21.8513, -2.3541, 1.50157, 1.65137, 1.03643, 0.106893),
"attribute_data": PackedByteArray("TL59+Jn8PryZ/H34TL6BB5n8/3+Z/MBDmfyBB/9/gQf/f334skF9+LJBgQdlA8BDZQOBB2UD/39lAz68ZQN9+Ey+Prz/fz68TL7/f/9//3+yQT68skH/f7JBwEP/f8BDTL7AQw=="),
"format": 34896613399,
"index_count": 96,
"index_data": PackedByteArray("EAACAAAAEAABAAIAEQAQAAAAEQAAAAgAEgABABAAEgAEAAEAEwAQABEAEwASABAAFAARAAgAFAAIAAkADgAUAAkADgAJAA8ADQAUAA4AFQARABQADQAVABQAFQATABEACwAVAA0ACwAWABUAFgATABUADAAWAAsADAAKABYAFgAXABMACgAXABYAFwASABMACgAHABcAFwAYABIABwAYABcAGAAEABIABwADABgAGAAFAAQAAwAFABgAAwAGAAUA"),
"lods": [0.0110147, PackedByteArray("AAABAAIAAwABAAAAAwAEAAEAAwAFAAQAAwAGAAUABwADAAAABwAAAAgACQAHAAgACgAHAAkACwAKAAkADAAKAAsACwAJAA0ADQAJAA4ADgAJAA8A")],
"material": SubResource("StandardMaterial3D_m77li"),
"name": "Material.010",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 25,
"vertex_data": PackedByteArray("7MARABK3l4R1//w/nB1AhoD/AwBZIEWG2MDH/0WoWYSF/+N/ahkphv//ir+kJw2G0f98/zAaBIbOf///ifdNgMV/HgD//2mApD4PADKtJYWbPtv/na2QhAAAt7/ZGbSGHgCu/6IRooZcAN5/AADehnMA+T9aA/WGaAAAABcG+4bmwApA07KOhM5/FkA0+WmA6cD6f/+tY4TXfw6AafIsgKo+CEDzqBqFsD4BgLSk4YSEPnjBlbighN9/BsCe6yaA98A5wue2SYTPh+cHJYVFBZaEqgRjjaQW0Xt1C2iCkRCvkZgSsOllCpDSea0eh/n4tIdU9DxwO/mLkpr0pnNX9UqExPs4hNn7RYhjCH3Ti6xue24Bm5q6ul6H1PhUdDr42nXh9xUApb7KgZEE")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_oi256")
[node name="SteleA" type="Node3D"]
transform = Transform3D(0.45, 0, 0, 0, 0.45, 0, 0, 0, 0.45, -0.375539, 0, 0)
[node name="Steles_" type="Node3D" parent="."]
[node name="Cube_001" type="MeshInstance3D" parent="Steles_"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.263, 2.53447, -0.935844)
mesh = SubResource("ArrayMesh_rms5v")
skeleton = NodePath("")

View File

@@ -0,0 +1,141 @@
[gd_scene load_steps=11 format=4 uid="uid://0aqllfpimgq"]
[ext_resource type="Texture2D" uid="uid://dcodsa21o3syb" path="res://src/map/assets/Steles/Steles_C024_C.jpg" id="1_eu5gg"]
[ext_resource type="Texture2D" uid="uid://dj2upntyeqryx" path="res://src/map/assets/Steles/Steles_COPPWIR.jpg" id="2_xe50d"]
[ext_resource type="Texture2D" uid="uid://bwelhd4sx7mkw" path="res://src/map/assets/Steles/Steles_COPPEROX.jpg" id="3_q5wc4"]
[ext_resource type="Texture2D" uid="uid://c8nvb5jn8f6k1" path="res://src/map/assets/Steles/Steles_Untitled-1.png" id="4_fpef4"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ul40e"]
resource_name = "Material.008"
cull_mode = 2
albedo_texture = ExtResource("1_eu5gg")
texture_filter = 2
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4d486"]
resource_name = "Material.004"
cull_mode = 2
albedo_texture = ExtResource("2_xe50d")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f3mmc"]
resource_name = "Material.006"
cull_mode = 2
albedo_texture = ExtResource("3_q5wc4")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cuv30"]
resource_name = "Material.011"
transparency = 4
cull_mode = 2
albedo_texture = ExtResource("4_fpef4")
roughness = 0.0
texture_filter = 2
[sub_resource type="ArrayMesh" id="ArrayMesh_xnulk"]
_surfaces = [{
"aabb": AABB(-6.57243, -2.67297, -1.03903, 3.68598, 4.0657, 3.66581),
"format": 34896613377,
"index_count": 516,
"index_data": PackedByteArray("MwABADQANQA0AAEANgAzADQANAA1AAIANgA0AAIANQABADcAMwAAAAEAOAA3AAEAOAABAAAANwA4ADkAOgA1ADcANwA5ADoAOgA7ADUAOwACADUAOAAAADwAPAA5ADgAOwAEAAIAOgA9ADsAPQAEADsAOQADADoAOgADAD0APAA+ADkAAwA5AD4AAwA+AAUABQA9AAMAPAA/AD4ABQBAAD0ABAA9AEAAPgAWAAUAPgA/ABYABQBBAEAABQAWAEEABABAAAYAPABCAD8AAABCADwAPwAYABYAAAAXAEIAMwAXAAAAQgBDAD8APwBDABgAFwBEAEIAQgBEAEMAMwBFABcAFgAYAEYAFgBGAEEAFwAaAEQARQAaABcANgBFADMARwBEABoASABDAEQASABEAEcASQBDAEgASQAYAEMASgBIAEcASgBJAEgASwAYAEkASwBGABgATABJAEoATABLAEkASgBHAE0ATQBMAEoATgBNAEcARwAaAE4ATQBPAEwASwBMAFAATwBQAEwAUABGAEsATQBRAE8ATQBOAFEATwBSAFAATwBRAFIAUAAZAEYAUgAZAFAAQQBGABkAUQAVAFIAUgAVABkATgBTAFEATgAaAFMAUQBTABUARQBTABoAQQAZABQAFAAZABUAQABBABQAEwAVAFMAEwBTAEUAFAAVABMAQAAUAAYABgAUABMANgATAEUABgATADYAEgAGADYACQAGABIACQAEAAYAEgA2AAgACAA2AAIABwACAAQACAACAAcABwAEAAkADwASAAgACgAIAAcADwAIAAoACwAHAAkACgAHAAsAEQAJABIAEQASAA8ACwAJABEACgANAA8ADwANABAADwAQABEACgAMAA0ACwAMAAoAEQAQAA4ACwAOAAwAEQAOAAsAGwAcAB0AHgAcAB0AHwAdABsAHwAgAB0AIQAfACAAIgAdACAAIgAgACEAHgAdACIAIQAjAB8AIwAfABsAIwAhACIAIwAiACQAIwAbACQAJAAiAB4AJAAbACUAGwAlABwAJAAeACYAJAAlACYAJwAcAB4AJwAoABwAKQAnAB4AKQAnACgAKQAeACYAKgAoABwAKQAoACoAKgAcACUAJgAqACkAJgAlACoAMABUAFUAVgBVAFQAVwAwAFUAVQBWAFcAVgBUAFgAVgAxAFcAVwAxADAAWAAyAFYAVgAyADEAVAAuAFgAVAAwAC4AWAAuADIAMQArADAAMAAtAC4AMAArAC0ALgAsADIALgAtACwAMgAvADEAMQAvACsAMgAsAC8AWQAtACsAWgAvACwAWwAsAC0AWgAsAFsAWwAtAFkAXAAvAFoAXABaAFsAXAArAC8AXABbAFkAWQArAFwA"),
"lods": [1.50241, PackedByteArray("AAABAAIAAwACAAEAAAADAAEAAwAEAAIAAAAFAAMABQAEAAMABQAGAAQABwACAAQACAAAAAIACAACAAcABwAEAAkACQAEAAYACgAIAAcACwAHAAkACgAHAAsACwAMAAoACgAMAA0ACwAOAAwACgANAA8ADwAIAAoADwANABAAEQAQAA4AEQAOAAsADwAQABEACwAJABEADwASAAgAEQASAA8AEQAJABIACQAGABIAEgAAAAgAEgAGAAAABgATAAAABgAUABMABQAUAAYAFAAVABMAAAAWAAUABQAWABQAAAAXABYAAAATABcAFwAYABYAFgAZABQAFAAZABUAFgAYABkAEwAVABoAEwAaABcAGgAVABkAFwAaABgAGgAZABgAGwAcAB0AHgAcAB0AHwAdABsAHwAgAB0AIQAfACAAIgAdACAAIgAgACEAHgAdACIAIQAjAB8AIwAfABsAIwAhACIAIwAiACQAIwAbACQAJAAiAB4AJAAbACUAGwAlABwAJAAeACYAJAAlACYAJwAcAB4AJwAoABwAKQAnAB4AKQAnACgAKQAeACYAKgAoABwAKQAoACoAKgAcACUAJgAqACkAJgAlACoAKwAsAC0ALgAtACwAKwAvACwAMAAtAC4AMAArAC0AMQAvACsAMQArADAAMgAsAC8AMgAvADEALgAsADIAMAAyADEAMgAwAC4A")],
"name": "Material.008",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 93,
"vertex_data": PackedByteArray("mQffEucXAACZB4mM5xcAAOcXiYxl+AAAZfiJjOcXAAAX6ImMZfgAAGX43xLnFwAAF+jfEmX4AADiKLh+ZfgAAP0oLzdl+AAAHNe4fmX4AAB3Kak4jfYAAHcpPn6N9gAA1S+ZOqDxAAAp0Jk6oPEAANUvTnyg8QAAh9apOI32AAAp0E58oPEAAIfWPn6N9gAAAdcvN2X4AABWEXMS//8AAKjucxL//wAAVhGNAP//AAD//3MSVhEAAAAAcxJWEQAA//+NAFYRAACo7o0A//8AAAAAjQBWEQAAXqsrjsAqAABeWefwwCoAAF6r5/DAKgAAZkfn8LghAABeqyuOvJcAAF6r5/C8lwAAVr3n8E6YAABWvefwuCEAAFa9FI5OmAAAVr0UjrghAABeWSuOwCoAAGZHFI64IQAAZkfn8E6YAABeWefwvJcAAGZHFI5OmAAAXlkrjryXAAAQyu//6xQAAKs67/8bpQAAqzrv/+sUAACrOgHv6xQAABDK7/8bpQAAEMoB7+sUAAAQygHvG6UAAKs6Ae8bpQAAmQffEhfoAACZB4mMF+gAAOcX1JUX6AAA5xffEmX4AADnF9SV5xcAAOcXiYyZBwAAF+iJjJkHAAAX6NSV5xcAABfo1JUX6AAA5xffEpkHAABl+ImMF+gAABfo3xKZBwAAqO5zEgAAAABl+N8SF+gAAP//cxKo7gAAVhFzEgAAAACo7o0AAAAAAFYRjQAAAAAAAABzEqjuAAD//40AqO4AAOcXIQCZBwAAF+ghAJkHAABl+CEA5xcAABfoAADnFwAAZfghABfoAAAX6AAAF+gAAOcXAADnFwAAmQchAOcXAADnFwAAF+gAABfoIQBl+AAAmQchABfoAADnFyEAZfgAAAAAjQCo7gAAXoLy7rghAABWvfLuuCEAAGZH8u5OmAAAVr3y7k6YAABmR/LuuCEAAGZH//+4IQAAVr3//06YAABmR///TpgAAFa9//+4IQAA")
}, {
"aabb": AABB(-5.37842, -0.296387, 1.0716, 1.2516, 0.152054, 1.2516),
"format": 34896613377,
"index_count": 708,
"index_data": PackedByteArray("UgBTACsAUgAqAFMAVABSACsAVAAqAFIAUwAlACsAKgBVAFMAUwBNACUAVQBNAFMAKgBWAFUAVwAlAE0AKgAAAFYAVAAAACoAVgACAFUAVgAAAAIAVQAmAE0AAgAmAFUATwBNACYAVwBNAE8AAgBRACYATwAmAFAAUAAmAFEAUABOAE8AWABRAAIAAABYAAIAUABRABAAAABZAFgAUABaAE4AEABaAFAATwBOAFsATwBbAFcAWgBbAE4AVwBbACMAEAAVAFoAVwAjACQAJAAlAFcAWwBcACMAJAAjAFwAWgBcAFsAJAALACUAKwAlAAsAIgALACQAJABcACIAKwALAEwAIgBcABQAVAArAEwAIgBLAAsATAALAEsAIgAUAA8ADwBLACIAXABdABQADwAUAF0AXABeAF0AWgBeAFwADwBdAEoADwAhAEsASgAhAA8ASgBdAEkAXQBeAEkASgBJACAAIABJAF4AIABIAEoASgBIACEAXwBLACEATABLAF8AYABMAF8AYABUAEwAXwAhAAYABgAhAEgABABgAF8ABABfAAYABABUAGAARgAEAAYAYQBUAAQAYQAEAEYARgAGAGIABgBIAGIAYQBGAGIAYgBIAAwAIAAMAEgAYgAMABoAYQBiABoARwAMACAAGQBhABoAIABeAEcARwBFAAwAGgAMAEUAGQAaAGMAGgBFAGMAZABhABkAZAAZAGMABQBhAGQABQBUAGEAZABjAEEABQBkAGUAZQBkAEEAYwBDAEEAYwBFAEMAZQBBAGYABQBlAGYAQQBDAAoAQQAKAGYAHwBDAEUAHwBFAEcARwBEAB8ARwBeAEQAQgBDAB8AQgAKAEMAHwBEAGcAHwBnAEIAXgBnAEQAQgBnABIAXgBoAGcAZwBoABIAQgASAA4ADgAKAEIADgASAGgADgBAAAoAZgAKAEAAPwBAAA4ADgBoAD8AZgBAAAcAPwBoAD4ABQBmAAcAPwAbAEAABwBAABsAPwA+AB0AHQAbAD8AaABpAD4AHQA+AGkAaABqAGkAXgBqAGgAXgBaAGoAaQBqADkAHQBpADsAOwBpADkAHQA8ABsAOwA8AB0AawAbADwABwAbAGsAPQAHAGsAPQAFAAcAbAA9AGsAbAAFAD0AawA8ABgAbABrABgAOwAcADwAGAA8ABwANwBsABgAHgAcADsAOwA5AB4AHgA5AGoAGAAcAG0ANwAYAG0AHgA6ABwAbQAcADoAbgBsADcAbgA3AG0AbgAFAGwAOAA6AB4AHgBqADgAbQA6ADYAbgBtADYAOAA1ADoANgA6ADUAOABqABMAbwBuADYADQA1ADgAOAATAA0ANgA1AHAAbwA2AHAADQAJADUAcAA1AAkADQATAHEAagBxABMANAAJAA0ADQBxADQAagByAHEAagBaAHIANABxADIAcQByADIANAAyACkAKQAyAHIANAAzAAkAKQAzADQAAQAJADMAcAAJAAEAKQAnADMAAwBwAAEAAwBvAHAAAwBuAG8ALQADAAEAcwBuAAMAcwADAC0AcwAFAG4AcwBUAAUAVABzAAAALQABAHQAAQAzAHQAcwAtAHQAdAAzACcAAABzAHUAAAB1AFkAcwB0ABYAdAAnABYAdQBzABcAFwBzABYAWQB1ACwAdQAXAHYAFwAWAHYAdQB2ACwAWQAsAFgAFgAnAC8AFgAvAHYAMQAvACcAMQAnACkAKQByADEALAAIAFgAWAAIAFEAEABRAAgAMQByABEAEAAIADAALAAuAAgAdgAuACwAMAAIAC4AdgAvAC4AMAAVABAAKAAvADEAKAAuAC8AMAAuACgAMQARACgAMAB3ABUAKAB3ADAAKAARAHcAcgB3ABEAdwBaABUAcgBaAHcA"),
"lods": [0.0121849, PackedByteArray("KgACACsAKgAAAAIABAAqACsABAAAACoAAAAsAAIAAAAXACwAAAAtABcABAAtAAAAFwAWACwAFwAtABYALAAIAAIALAAuAAgALAAvAC4AFgAvACwAMAAIAC4AKAAuAC8AMAAuACgAKAAvADEAKAARADAAMQARACgAMQAvACcAFgAnAC8AMQAyABEAMQAnACkAKQAyADEAKQAnADMAFgAzACcAKQAzADQANAAyACkAAQAzABYANAAzAAkAAQAJADMALQABABYANAAJAA0ALQADAAEANAATADIADQATADQAAQA1AAkADQAJADUAAwA2AAEANgA1AAEALQA3AAMAAwA3ADYALQAFADcAOAATAA0ADQA1ADgAOAA5ABMAOQAyABMAOAA1ADoANgA6ADUAOAA6AB4AHgA5ADgANgAcADoAHgA6ABwAGAAcADYANwAYADYAHgAcADsAOwA5AB4AOwAcADwAGAA8ABwANwA9ABgANwAFAD0APQAHABgAPQAFAAcAGAAbADwABwAbABgAOwA8AB0AHQA8ABsAHQA+ADsAOwA+ADkAHQAbAD8APwA+AB0ABwBAABsAPwAbAEAAEgA5AD4APwASAD4APwBAAA4ADgASAD8ABwAKAEAADgBAAAoAQQAKAAcABQBBAAcADgAKAEIAQgASAA4AQgAKAEMAQQBDAAoAQgBEABIABQAZAEEAQgBDAB8AHwBEAEIAQQBFAEMAHwBDAEUAGQAaAEEAGgBFAEEABQBGABkAGQBGABoABQAEAEYALQAEAAUARgAGABoARgAEAAYAHwBFAEcARwBEAB8AGgAMAEUARwBFAAwAGgBIAAwABgBIABoARwAMACAAIAAMAEgARwBJAEQAIABJAEcASQASAEQASQA5ABIAIABIAEoASgBJACAABgAhAEgASgBIACEASQAVADkAOQAVADIAMgAVABEAMAARABUASgAhAA8ASgAUAEkADwAUAEoAIwBJABQAFQBJACMAIgAUAA8AIgAjABQADwAhAEsADwBLACIABgBLACEAMAAVABAAEAAIADAATABLAAYABABMAAYABAArAEwATAALAEsAKwALAEwAIgBLAAsAKwAlAAsAIgALACQAJAALACUAJAAjACIAKwBNACUAJAAlAE0AAgBNACsAJABOACMAFQAjAE4AJABNAE8ATwBOACQAUAAVAE4AUABOAE8AEAAVAFAATwBNACYAAgAmAE0ATwAmAFAAAgBRACYAUAAmAFEAUABRABAAAgAIAFEAEABRAAgA"), 0.0595631, PackedByteArray("AAAWAAIAAAAXABYAAAADABcAFwADABYABAAAAAIABAADAAAAAwABABYAAwAYAAEAAQAJABYAGAAJAAEAAwAFABgAAwAEAAUABQAEABkAGQAEABoABQAZABoABQAHABgABQAaAAcABwAbABgABAAGABoABAACAAYAGgAKAAcABwAKABsAGAAbABwAGAAcAAkADgAbAAoAHQAcABsAHQAbAA4AHgAcAB0AHgAJABwAHQATAB4ADQAJAB4AHgATAA0ADgASAB0AHQASABMADgAKAB8AHwASAA4AHwAKAAwAGgAMAAoAIAASAB8AHwAMACAAGgAhAAwAIAAMACEABgAhABoAIAAUABIAFAATABIAIAAhAA8ADwAUACAABgALACEADwAhAAsAAgALAAYAIgAUAA8ADwALACIAIgAjABQAFAAVABMAFQAUACMAJAAjACIAIgALACQAJAAVACMAAgAlAAsAJAALACUAAgAmACUAJAAlACYAAgAIACYAJAAmAAgAFgAIAAIAEAAVACQAJAAIABAAFgAnAAgAFgAJACcAEAAIACgAKAAVABAAKAAIACcAKQAnAAkAKAAnACkAKQAJAA0AKAARABUAKQARACgADQARACkAEwAVABEADQATABEA"), 0.144697, PackedByteArray("AAABAAIAAAADAAEABAADAAAABAAAAAIAAwAEAAUABAACAAYABQAEAAYAAwAFAAcAAwAHAAEABQAGAAcAAQAIAAIABwAJAAEAAQAJAAgABgAKAAcABwAKAAkAAgALAAYAAgAIAAsABgAMAAoABgALAAwADQAJAAoADQAIAAkADgAKAAwADQAKAA4ADwAMAAsADgAMAA8AEAALAAgAEAAIAA0ADwALABAADQARABAADwASAA4ADgATAA0ADQATABEADgASABMADwAUABIAFAATABIAEAAVAA8ADwAVABQAEAARABUAFAAVABMAEwAVABEA")],
"name": "Material.004",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 120,
"vertex_data": PackedByteArray("J6AAANdfAAAnoGo3J6AAACegajfXXwAAJ6AAACegAADXXwAA118AANdfAAAnoAAA119qN9dfAADXX2o3J6AAANju////PwAAgdr//4HaAAAmEf///78AAN5e//9cBAAAXAT//95eAABevP//XrwAAKBD//9evAAAoEP//6BDAABevP//oEMAAE7LSbLRawAA3khJsiC3AAAgt0myILcAAN5ISbLeSAAAILdJst5IAADtq2o3xIsAAHmtAAD/fwAAOnRqN+2rAACFUgAA/38AABFUajc6dAAA/z///9juAAD/f/////8AAOZp//930gAAGJb//3fSAACHLf//GJYAAIct///maQAAfSX//30lAABOVf//DjYAANFrSbKwNAAA5mn//4ctAAD/f///AAAAAP+///8mEQAAovv//yChAAB30v//5mkAAHfS//8YlgAAxIsAABFUAAD/f2o3hVIAAO2rajc6dAAAYqcAALyWAACi+///3l4AAP//////fwAA8Mn//05VAABg1f///38AAE7LSbItlAAA2O7///+/AADwyf//sKoAAP+////Y7gAAxItqN+2rAAD/fwAAea0AALCq///wyQAALZRJsk7LAAAgof//ovsAAP9///9g1QAA3l7//6L7AABCaQAAYqcAANFrSbJOywAATlX///DJAAB9Jf//gdoAABFUajfEiwAADjb//7CqAABcBP//IKEAALA0SbItlAAAAAD///9/AACdWAAAQmkAAJ4q////fwAAJhH///8/AACwNEmy0WsAAA42//9OVQAA/z///yYRAAA6dGo3EVQAACCh//9cBAAALZRJsrA0AAAYlv//hy0AALCq//8ONgAAgdr//30lAAD/fwAAhVIAAMSLajcRVAAAOnQAABFUAAC8lmo3nVgAALyWAACdWAAA/3///54qAABip2o3QmkAAGKnAABCaQAA+qZJsno8AAD/f0myCDIAAARZSbJ6PAAAejxJsgRZAAAIMkmy/38AAEJpajedWAAAQmkAAJ1YAAARVAAAOnQAAJ1YajdCaQAAhVJqN/9/AAARVAAAxIsAAJ1YAAC8lgAAnVhqN7yWAAB6PEmy+qYAAARZSbKEwwAA/39JsvbNAAD6pkmyhMMAAEJpajdipwAAOnQAAO2rAAD/f2o3ea0AAMSLAADtqwAAvJYAAGKnAAC8lmo3YqcAAITDSbL6pgAA9s1Jsv9/AADtqwAAxIsAAGKnaje8lgAA7asAADp0AAB5rWo3/38AAITDSbIEWQAA")
}, {
"aabb": AABB(-5.8837, -1.7423, 2.42101, 2.30852, 1.04355, 1e-05),
"format": 34896613377,
"index_count": 6,
"index_data": PackedByteArray("AAABAAIAAAADAAEA"),
"name": "Material.006",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 4,
"vertex_data": PackedByteArray("//8AAAAAAAAAAP//AAAAAP////8AAAAAAAAAAAAAAAA=")
}, {
"aabb": AABB(-6.20538, -1.74789, 2.43067, 2.62285, 1.00891, 1e-05),
"format": 34896613377,
"index_count": 6,
"index_data": PackedByteArray("AAABAAIAAAADAAEA"),
"name": "Material.011",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 4,
"vertex_data": PackedByteArray("AAD+/54kAAD//wAAAAAAAAAAAACeJAAA/////wAAAAA=")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_app7n"]
resource_name = "Steles__Cube_004"
_surfaces = [{
"aabb": AABB(-6.57243, -2.67297, -1.03903, 3.68598, 4.0657, 3.66581),
"attribute_data": PackedByteArray("fdLgvpmv4L6Zr/6FE8ilgRPIYVWPs6yBfdIJUZmvCVGPs1pVnnu8kuV8I72ee8G+5XxalCN7nZIje+C+KXXgvh07xoUpdaCBHTu6un+///9k4hzHZOL//3+/HMdRuc/ATn1JwwS74L4Eu/7/RX/q+VG5EP5OfZb7VKWggXCC4L5wgqCBVKXgvqh6ur5geVOUqHq1kmB5HL0je+C+I3uPknLm+FkL05ZbfdL4WePlllt90v6F4+VfhHLm/oUL01+EI3v1fp57nZIje3uSnnuLfhl8e5Kee4t+GXz1fp57nZKYP+C+Tn2V+5g///9NfUnDfdKUhp/X4L590uC+n9eUhpmv4L52qmaCmK9mgnaq4L5UpWaCdqrgvlSl4L52qmaCTn3CfXCC4L5OfeC+cILCfcT7Smpy5v6FxPv+hXLmSmq7/gLiZOL//7v+//9k4gLiDn8qXbl8vEMOfyo/imC8Q2VgKj+5fJhYZWAqXYpgmFhV4eCgq+NOulXh4L7Z/066///gvqvjc6X+/+Cg2f9ypcrvSmoe65ZOHutKasrvkE4dO3JBSFcmXUhXckEdOyZdZOIFxLv+AuJk4gLiu/4FxJueckFwgiZdcIJyQZueJl1wgsJfGGbCfXCCwn0YZsJfcuaQTh7rSmoe65ZOcuZKarinoIFwgiZduKcmXXCCoIFAZaCBZWAqXUBlKl1lYKCBetzgvp/XZ5p63Gean9fgvnrcappV4eC+VeFqmlGvZoJ2qu1dUa/tXXaqZoIdO6CBZWAmXWVgoIEdOyZdfdI7ipmvO4p90v6FL3W6ulo/xoUvdcaFYHnGhVQ/oIFgebq6VD/gvlo/urpk4lnLf79Zy3yDEP7Jgf7/RX/1xMmB4L58g8/AiL3q+X+/lvuIvfXEf79Jwx93EP5LQRD+0nj+/x07lvtWe+r5H3fq+RQ96vkdO0nDS0Hq+VZ79cQTPfXES0H1xB939cQfd8/A0njgvktBz8BUpbq6cIK6ulSlxoVwgsaFma/+hX3S/oVUpV66dqpeunaqXrqYr166cIIrgk59K4Jwgne6Tn13umw+Y29sPmN+FV1jfmw+Y2AVXWNgaaRjfr+FY2BppGNgv4Vjfnrc4L4="),
"format": 34896613399,
"index_count": 516,
"index_data": PackedByteArray("kwABAJQAkwAAAAEAlQCTAJQAlQCUAAIACQAKAAsACQAMAAoACwANAAkACwAOAA0AlgCXAJgAlwARAJgAmQCYABEAlwCaABEAmACZAJsAmACbAJYAmwAPAJYAlgAPAJwAmgCXABAAlgCdAJcAnQAQAJcAlgCcAJ0AnQASABAAnAASAJ0AEwCeABUAEwCfAJ4AFACeAJ8AFACfABYAoAAdABsAGwAdABgAoAChAB0AGwAYAKIAHAChAKAAogAYAKMAHAAaAKEAogCjAKQApQAaABwApACjABkApQCmABoApAAZABcApwCmAKUAFwAZAKgApwCoAKYAFwCoAKcAqQA6AKoAqQCrADoAqgA6AKwArQCrAKkArQA5AKsArgCpAKoAqQCuAK0AqgCsAK8ArwCsALAArgCqALEAsQCqAK8AsgA5AK0AsgA7ADkArwCwALMAsQCvALMAswCwADgAtACuALEAsQCzALQAtQCtAK4AtQCyAK0AtAC1AK4AtQC2ALIAtAC2ALUAtgA7ALIAtgC3ADsAtAC4ALYAuAC3ALYAuAC0ALMAuAA4ALcAswA4ALgAHwC5ACEAHwC6ALkAuwC5ALoAuwC6ALwAvAAeALsAvAAgAB4AIgAjACQAIgAlACMAJAAmACIAJAAnACYAKAApACoAKAArACkALAAtAC4ALAAvAC0ABQAHAAgACAAHAAYABQC9AAcACAAGAAQAAwC9AAUABAAGAL4AAwC+AL0ABAC+AAMAMAAxADIAMAAzADEANAA1ADYANAA3ADUAPAA9AD4APAA/AD0AvwBFAEYAvwDAAEUARADAAL8ARABHAMAAQADBAMIAQABDAMEAwgDBAEEAwgBBAEIASADDAMQASABLAMMAxADDAMUAxADFAMYAxgDFAEkAxgBJAEoATABNAE4ATABPAE0AUABRAFIAUABTAFEAVABVAFYAVgBVAFcAVgBXAFgAVABZAFUAWgBZAFQAWgBbAFkAXABdAF4AXgBdAF8AXgBfAGAAXABhAF0AYgBhAFwAYgBjAGEAZABlAGYAZABnAGUAaABpAGoAaABrAGkAbABtAG4AbABvAG0AcABxAHIAcABzAHEAdAB1AHYAdAB3AHUAeAB5AHoAeAB7AHkAjwDHAMgAxwCPAJIAyQCPAMgAyQCRAI8AxwCSAMoAygCSAJAAywDIAMcAywDHAMoAyADLAMkAygCQAMsAywCRAMkAywCQAJEAzADNAM4AzQB+AM4AzgB+AHwAzgB8AMwAzQB9AH4AzAB8AH8AzwB9AM0AzADPAM0AzwB/AH0AzAB/AM8AgACBAIIAgACDAIEAhACFAIYAhACHAIUAiwCMAI0AiwCOAIwAiACJANAAiACKAIkA"),
"lods": [1.50241, PackedByteArray("AAABAAIAAwAAAAIABAAAAAMAAwACAAUABAAGAAAABQACAAcACAAGAAQABQAHAAgACAAHAAYACQAKAAsACQAMAAoACwANAAkACwAOAA0ADwAQABEADwASABAAEwAUABUAEwAWABQAFwAYABkAFwAZABoAGwAYABcAFwAaABwAGwAdABgAHAAaAB0AHAAdABsAHgAfACAAHgAhAB8AIgAjACQAIgAlACMAJAAmACIAJAAnACYAKAApACoAKAArACkALAAtAC4ALAAvAC0AMAAxADIAMAAzADEANAA1ADYANAA3ADUAOAA5ADoAOAA7ADkAPAA9AD4APAA/AD0AQABBAEIAQABDAEEARABFAEYARABHAEUASABJAEoASABLAEkATABNAE4ATABPAE0AUABRAFIAUABTAFEAVABVAFYAVgBVAFcAVgBXAFgAVABZAFUAWgBZAFQAWgBbAFkAXABdAF4AXgBdAF8AXgBfAGAAXABhAF0AYgBhAFwAYgBjAGEAZABlAGYAZABnAGUAaABpAGoAaABrAGkAbABtAG4AbABvAG0AcABxAHIAcABzAHEAdAB1AHYAdAB3AHUAeAB5AHoAeAB7AHkAfAB9AH4AfAB/AH0AgACBAIIAgACDAIEAhACFAIYAhACHAIUAiACJAIQAiACKAIkAiwCMAI0AiwCOAIwAjwCQAJEAkACPAJIA")],
"material": SubResource("StandardMaterial3D_ul40e"),
"name": "Material.008",
"primitive": 3,
"uv_scale": Vector4(4.23667, 4.3305, 0, 0),
"vertex_count": 209,
"vertex_data": PackedByteArray("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")
}, {
"aabb": AABB(-5.37842, -0.296387, 1.0716, 1.2516, 0.152054, 1.2516),
"attribute_data": PackedByteArray("7Hiijo55o4SOeaKO7HijhBp9vIR3fLuOd3y8hBp9u45yeqWE0HmkjtB5pYRyeqSOd3y8hNR7u47Ue7yEd3y7jonLSv25xK70vspg84TFmP6ArI9xZK0DfoCsU4RkrYiDZK1mcn/BIBLUylYaSsIJHHrDICp6w1sFO7ogKnq7bhNFvFcdRbWgC6DtXp/c6BGvquyqlx3v+7Hs+OuccfIuu1/7qpdp+oivX/s9t4ij3z59rKQr2a2iPC2i4S0ypQ8q7HhoodB5c4/QeZeg7HiijrR6aKHQeXuPtHqkjtB5naDUe7uOuHywoNR7gaG4fIyPjnnch+x4sol3fJCL0HmGi3J6tImSx/rxsMj//4CsaXeArEd+b8jaI4bARB5Ftdoj67pwGuGyVho+vTMRO7pbBW/IoAvUyiQVk+yHrAvoDKrc6NafoO2Ir+/wMJuq7D23mPW4k/fynLQS9UqaGve2s3b7X6L//9qkLv8RrwL8L6k3oeU51HuvlNR7jpvseKie0Hkom+x4dJu0en6UtHpcm3d8kIvUe7yJ1Hvnh455hIvseCKGd3znhxp9vIkafUWN0Hneh3J6NY2At4cnU76+Hke9eCuys1sfbsB4K6G6zxbhsiQVNcaHJ7KzIBADylsfgLf0ByPDqBgjw88WR70CBHG/uRADyiAQbsADBDXG9AcYzEf2hMVg877KmP7gw+j5ucRK/YCs1XqArISBZK29d4CsP3QL6NqkCOy4pZPsX6Jv6labb+qQsx3v65xl7xGV7/C2s2Xv1rlx8riT9/JKmhL1nLSY9S67pPgRlRr3MJuk+Na57Pj7sZr9Vptp+l+fmv2Qsy7/1p92+4esAvy4pf//DKq3oKwzDadGQfmoPSnPrp4wTq/XNtSqdEC0epme0HkYm7R66pfQedKUtHpUkdR7e5G4fPuU1HsemLh8QZvUe8Ge0HnilOx4lZTseGKRd3y8idR7kIt3fOeH1HtFjXd8RY13fDOG1Hszho55NI3seDSN7HiEi455sonseNyHjnkihnd8M4YafTOGGn3nh3d8vIkafZCLd3xFjdB5JIZyeiSGcnreh9B5tIlyeoaL0Hk1jT69RB56uwkccb++HqG6qBh/wVcd67oHFdnCcBpFvB8SU765ENnCBxVKwm4ThsAzEWLM6PlizBD4icuu9LDI+vHGyXTyfcZ08hjMsfvFyYT/ksf+/33GhP/gwxD4KsRH9irEsftkrfiAZK3demSt2nQI7C+pN6GeMLeg1zYtoqI8MqV0QPmoRkGIo6QrDac9Kdmt4S3Uqg8qfazfPs+u5TlOr60z0HkNntB58pfQee+RuHwemLh8D5K4fC6e0HkUnux4BZjQeQWY0Hn1kQ=="),
"format": 34896613399,
"index_count": 708,
"index_data": PackedByteArray("tAC1AGUAtABkALUAtgC0AGUAZAC3ALUAtgBlAGYAZAC4ALcAuAANALcAuAAPAA0AuQC2AGYAuQBmALoADAC5ALoADAC6AA4AAAC7AAIAAAC8ALsAvABnALsAvAC9AGcAvQC+AGcAvQA9AL4APQA8AL4APQC/ADwAvwDAADwAvwBoAMAAaAABAMAAaAADAAEABADBAAYABADCAMEAwgBpAMEAwgDDAGkAwwDEAGkAwwBqAMQAagA+AMQAagDFAD4AxQDGAD4AxQBrAMYAawAFAMYAawAHAAUACADHAAoACADIAMcAyABsAMcAyADJAGwAyQDKAGwAyQBAAMoAQAA/AMoAQADLAD8AywDMAD8AywBtAMwAbQAJAMwAbQALAAkAzQBuACAAIABuAEcAzQAeAG4AIABHAM4AbwAeAM0AzgBHAHEAbwBwAB4AzgBxAEgAzwBwAG8ASABxAEkAzwByAHAASABJANAARgByAM8A0ABJAHQARgAcAHIA0AB0AHMA0QAcAEYAcwB0AHYA0QB1ABwAcwB2ANIAGwB1ANEA0gB2ACEAGwBFAHUA0gAhAB8A0wBFABsAHwAhAHgA0wB3AEUAHwB4ANQAeQB3ANMA1AB4AEsAeQAaAHcA1ABLAEoAegAaAHkASgBLAHsAegBNABoASgB7ANUA1gBNAHoA1QB7AH4A1gB9AE0A1QB+AHwA1wB9ANYAfAB+AB0A1wBMAH0AfAAdANgAGQBMANcA2AAdAH8AGQB/AEwA2AB/ABkA2QCAANoAgAASANsA2QASAIAAEgDcAN0AEgDeANwA2QDeABIA3ADeAEEAEADZAN8A4ADZABAA4AAQAIIA3gDZABMAEwDZAOAA4QDgAEIAEwDgAOEAEwDhAOIA3gARAIEA3gDjABEA3gATAOMAEQDjAOQA4wATAOUA5QATAIQA4wDlAIMAhQAVAEQARAAVAOYAhQDnABUARADmAIYAhgDmABcAhgAXABYAQwDnAIUAQwCHAOcAiACHAEMAiADoAIcAFADoAIgAFAAYAOgA6QCJAIoAigCJAFAA6QBPAIkAigBQAIsATgBPAOkAiwBQAIwATgAjAE8AiwCMACIAUQAjAE4AIgCMACQAUQCNACMAIgAkAI4AJQCNAFEAjgAkAI8AJQBTAI0AjgCPAFIAkABTACUAUgCPAJIAkACRAFMAUgCSAJMAVQCRAJAAkwCSAFQAVQAnAJEAkwBUAFYAlAAnAFUAVgBUAJYAlACVACcAVgCWAJcAVwCVAJQAlwCWACgAVwCYAJUAlwAoACYAmQCYAFcAJgAoAJoAmQAqAJgAJgCaAJsAKQAqAJkAmwCaAJ0AKQCcACoAmwCdAFgAngCcACkAWACdAFkAngBaAJwAWABZAJ8AWwBaAJ4AnwBZAKAAWwCgAFoAnwCgAFsA6gDrAKEA6wDsAFwA6gDsAOsA7ADtACsA7ADuAO0A6gDuAOwA7QDuAKIA7wDqAC4A8ADqAO8A8ADvAC8A7gDqAPEA8QDqAPAA8gDwAKMA8QDwAPIA8QDyACwA7gDzAKYA7gD0APMA7gDxAPQA8wD0AC0A9ADxAPUA9QDxAKQA9AD1AKUANAD2AKcANAA3APYApwD2AKgApwCoAGMAYwCoAPcAYwD3AKkAqQD3AKoAqQCqAGIAYgCqAPgAYgD4AKsAqwD4ADUAqwA1ADYArACtAF0AXQCtAPkArAD6AK0AOAD6AKwAOAA7APoAXQD5AK4ArgD5AK8ArgCvAF4AXgCvAPsAXgD7ALAAsAD7ADkAsAA5ADoAXwAyADAAXwD8ADIAYQD8AF8AYQBgAPwA/QBgAGEA/QD+AGAAsgD+AP0AsgCxAP4AswCxALIAswD/ALEAMwD/ALMAMwAxAP8A"),
"lods": [0.0121849, PackedByteArray("ZAANAGUAZAAPAA0ADABkAGUADABlAGYADABmAA4AAABnAAIAAAA9AGcAPQA8AGcAPQBoADwAaAABADwAaAADAAEABABpAAYABABqAGkAagA+AGkAagBrAD4AawAFAD4AawAHAAUACABsAAoACABAAGwAQAA/AGwAQABtAD8AbQAJAD8AbQALAAkAIAAeAG4AIABuAEcAbwAeACAAIABHAEgAbwBwAB4ASABHAHEAbwByAHAASABxAEkARgByAG8ASABJAHMARgAcAHIAcwBJAHQARgB1ABwAcwB0AHYAGwB1AEYAcwB2AB8AGwBFAHUAHwB2ACEAGwB3AEUAHwAhAHgAeQB3ABsAHwB4AEoAeQAaAHcASgB4AEsAegAaAHkASgBLAHsAegBNABoASgB7AHwAegB9AE0AfAB7AH4AfAB+AB0AGQB9AHoAfAAdABkAGQBMAH0AGQAdAH8AGQB/AEwAEAASAIAAEACBABIAEgCBAEEAgQAQABMAEwAQAIIAEwCCAEIAgQATAIMAgwATAIQAgQCDABEAhQAVAEQARAAVAIYAhgAVABcAhgAXABYAhQCHABUAQwCHAIUAiACHAEMAiAAYAIcAFAAYAIgATgCJAIoAigCJAFAATgBPAIkAigBQAIsATgAjAE8AiwBQAIwAUQAjAE4AiwCMACIAUQCNACMAIgCMACQAJQCNAFEAIgAkAI4AJQBTAI0AjgAkAI8AkABTACUAjgCPAFIAkACRAFMAUgCPAJIAVQCRAJAAUgCSAJMAVQAnAJEAkwCSAFQAlAAnAFUAkwBUAFYAlACVACcAVgBUAJYAVwCVAJQAVgCWAJcAVwCYAJUAlwCWACgAmQCYAFcAlwAoACYAmQAqAJgAJgAoAJoAKQAqAJkAJgCaAJsAKQCcACoAmwCaAJ0AngCcACkAmwCdAFgAngBaAJwAWACdAFkAWwBaAJ4AWABZAJ8AWwCgAFoAnwBZAKAAnwCgAFsALgBcAKEALgCiAFwAXACiACsAowAuAC8ApAAuAKMAogAuAKQApACjACwAogCkAC0ALQCkAKUAogAtAKYANAA3AKcApwA3AKgApwCoAGMAYwCoAKkAqQCoAKoAqQCqAGIAYgCqAKsAqwCqADUAqwA1ADYArACtAF0AXQCtAK4ArAA7AK0AOAA7AKwArgCtAK8ArgCvAF4AXgCvALAAsACvADkAsAA5ADoAXwAyADAAXwBgADIAYQBgAF8AYQCxAGAAsgCxAGEAswCxALIAswAxALEAMwAxALMA"), 0.0595631, PackedByteArray("AAA8AAIAAAA9ADwAPQADADwAAwABADwABAA+AAYABAAHAD4ABwAFAD4ACAA/AAoACABAAD8AQAALAD8ACwAJAD8ADAANAA4ADAAPAA0AEgARAEEAEAARABIAEQAQABMAEwAQAEIAQwAVAEQAFAAVAEMAFAAYABUARAAVABcARAAXABYAGwBFAEYARgBFABwAGwAaAEUARgAcAB4ARgAeACAAIAAeAEcAIABHAEgASABHAEkASABJACEASAAhAB8AHwAhAEoASgAhAEsASgBLAB0ASgAdABkAGQAaABsAGQAdAEwAGQBNABoAGQBMAE0ATgBPAFAATgAjAE8ATgBQACQAUQAjAE4ATgAkACIAJQAjAFEAIgAkAFIAJQBTACMAUgAkAFQAVQBTACUAUgBUAFYAVQAnAFMAVgBUACgAVwAnAFUAVgAoACYAVwAqACcAJgAoAFgAKQAqAFcAWAAoAFkAKQBaACoAWABZAFsAWwBaACkAWwBZAFoALgArAFwAKwAuACwALAAuAC8AKwAsAC0AOAA7AF0AXQA7ADkAXQA5AF4AXgA5ADoAXwAyADAAXwBgADIAYQBgAF8AYQAxAGAAMwAxAGEAYgA1ADYAYwA1AGIAYwA3ADUANAA3AGMA"), 0.144697, PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUACAAJAAoACAALAAkADAANAA4ADAAPAA0AEAARABIAEQAQABMAFAAVABYAFgAVABcAFAAYABUAGQAaABsAGwAaABwAGQAdABoAGwAcAB4AHwAdABkAGwAeACAAHwAhAB0AIAAeACEAIAAhAB8AIgAjACQAJQAjACIAIgAkACYAJQAnACMAJgAkACgAKQAnACUAJgAoACoAKQAqACcAJgAqACkAKwAsAC0AKwAuACwALAAuAC8AMAAxADIAMwAxADAANAA1ADYANAA3ADUAOAA5ADoAOAA7ADkA")],
"material": SubResource("StandardMaterial3D_4d486"),
"name": "Material.004",
"primitive": 3,
"uv_scale": Vector4(3.96343, 2.40591, 0, 0),
"vertex_count": 256,
"vertex_data": PackedByteArray("J6AAANdfQdYnoGo3J6AfwCegajfXXwLYJ6AAACegA8AnoAAAJ6Bq1NdfajcnoB/AJ6BqNyegv9LXXwAAJ6ADwNdfAAAnoAPA119qN9dfAtjXX2o3J6AfwNdfAADXX0HW118AANdfQdYnoGo311/F/NdfajfXXwLYJ6AAANdf3v7XXwAA11+H8CegAAAnoEK6J6AAANdfHdzXXwAAJ6C34168//9evKv7TstJstFrgu9evP//oENL8CC3SbLeSFfuILdJsiC3ofonoGo31193295e//9cBJj2119qN9dfOfVcBP//3l4P+tju////P6PVJhH///+/nP8noGo3J6CHu9dfajcnoBLhgdr//4Ha5qBevP//oEMXyt5e//9cBKX02O7///8/Xv2gQ///oEOZ2168//9evEbZXAT//95ewcqB2v//gdoc+qBD//9evGnlJhH///+/baveSEmy3kiL3CC3SbIgt6XZ3khJsiC3Tucgt0my3kivx07LSbLRaybKoEP//6BDm9Agt0my3kify95ISbLeSEjQXrz//6BDF82gQ///oENL8N5ISbIgt6H6oEP//168q/veSEmy3khX7qBD//9evGbTILdJsiC3YupevP//XrzV595ISbIgt8fT7atqN8SL+8N5rQAA/3+Rxjp0ajftq7PBEVRqNzp0aMyFUgAA/3+RxnmtAAD/f7vGhVIAAP9/Pe130v//GJbl9XfS///maXjxfSX//30l0fcRVGo3OnTM8v8////Y7lf5OnRqN+2rLNL/f/////843O2rajfEi1zAovv//yChcrX/v///JhFh6/9///8AAK395mn//4ctXNT/f///AADp/f+///8mERL+TlX//w42Idh30v//5mkTzH0l//99Jdbfovv//yChIvyHLf//5mkM4XfS//8YlvLRhy3//xiWUeQYlv//d9LV3/9//////+jf/z///9ju/Jnmaf//d9IJ5NFrSbKwNCbU5mn//3fS29sYlv//d9I/405V//8ONpPO0WtJsrA0/cvmaf//hy3+zIct//8YluX1hy3//+ZpePHEiwAAEVQb8v9/ajeFUsjsOnRqNxFUj+Xtq2o3OnRozGKnAAC8lunAxItqN+2rVcj/fwAAea1txUJpAABip4DAEVRqN8SL+8OdWAAAQmlN0H0l//+B2n39EVRqN8SLBexcBP//IKFg/d5e//+i++HxAAD///9/j/vEi2o37avWwiCh//+i+yOlJhH///8/0/j/v///2O62mf8///8mEfz22O7///+/6Ko6dGo3EVQy8v9/ajeFUlLu//////9/H8Dtq2o3OnS9zCCh//9cBIf2ovv//95e3MqB2v//fSV24MSLAAARVKDoYqcAALyWHrydWAAAQmnt7/9/AAB5rVLMQmkAAGKn2N1g1f///39o8/DJ//9OVX/wTstJsi2UPvTwyf//sKqT+CCh//9cBB7/GJb//4ctYc2wqv//DjYYy4Ha//99Jav9/z///yYRU+rwyf//TlV2yqL7///eXg79Djb//05VmN4mEf///z9N1f//////f6r8YNX///9/rc6eKv///3/z4gAA////fzrA2O7///+/Wvvwyf//sKqU1VwE//8gocG1Djb//7CqJeX/v///2O7e97Cq///wycXcfSX//4HalKEgof//ovvK8k5V///wyQ/l/3///2DVSeLeXv//ovvdoi2USbKwNK/LsDRJstFrjuJOy0myLZQe0S2USbJOyyzh0WtJsk7L3+WwNEmyLZQV5g42//9OVX/wsDRJstFrgu+eKv///39o87A0SbItlD70Djb//7Cqk/hOVf//8Mm919FrSbJOyzLd/3///2DVyN8tlEmyTstO5bCq///wyenlLZRJsrA0tsoYlv//hy0hzLCq//8ONk3M/38AAIVSwOrEi2o3EVQt9Dp0AAARVJjjvJZqN51Yrfu8lgAAnViW+UJpAACdWLvcQmlqN51Ymt5ip2o3Qmnl0WKnAABCaU3Q7asAADp0A8t5rWo3/3+1x+2rAADEiyTDYqdqN7yWZ8G8lmo3YqcozbyWAABip6TOxIsAAO2rlsn/f2o3ea10xDp0AADtq1fCQmlqN2KnOcCdWGo3vJZnwZ1YAAC8lunAEVQAAMSLJMOFUmo3/3+1xxFUAAA6dAPLnVhqN0Jp5dGdWGo3vJYU50JpajdipwfahVJqN/9/7O//f2o3ea0Yyp1YajdCaZv0vJZqN2Knq71CaWo3nVh69GKnaje8lpq8ea1qN/9//MXEi2o3EVQC6byWajedWJbiYqdqN0JpDNQ6dAAAEVR27/9/AACFUuzsvJYAAJ1Y2eLtqwAAOnSozWKnAABCaerU7asAAMSLo8BCaQAAnVh+8BFUAAA6dNXuEVQAAMSLBOudWAAAvJb158SLAADtq9jCvJYAAGKnVbw6dAAA7avy1YTDSbIEWYLu9s1Jsv9/kPGEw0my+qYv9/9///+eKqDQ+qZJsno84sj/f0myCDKozwRZSbJ6PJTYejxJsgRZ4N8IMkmy/3+c5ITDSbIEWSzI9s1Jsv9/Q836pkmyhMOr3YTDSbL6plzVejxJsvqm/eYEWUmyhMP35v9/SbL2zfHjejxJsgRZgu4IMkmy/3+Q8Xo8SbL6pi/3/39JsvbNguEEWUmyhMOh2PqmSbKEwz7oBFlJsno8583/f///nipEzP9/SbIIMgPL+qZJsno8y8oENYpJ4AQcOgQ1AEe/AeM9doExTOJF34QohG1OG0K+gRtCvoH+OAS14kXfhHU2BLV1NgS1lqf6Sv44BLU4pvpKK0UWXpBpMEqQYNU16VroastxtsDZdGa3iHzytVF7LLT3b9XAF124ND3a8q3iRu5bsv7UR62KogBl+UosDXD4SP1Y9m6hl/Mnm54VsHaRqOmVzNiGmaZVoBGlCbrYhkvykKT9gx+wb6jAhhbpZqZ/nnakX7yusaCnTp3AsC6ec7ipr8KaM5mmsfevWJh1m+ew8jV3A9VABxC2QDMOLTStBIPLSzGZ1fwtf9U+Lb7JBTKRFx4/3B1GRLhaGG/SPLmmuDvbnVZnqTdfTBZpiXIWvIt2mbiB+ZapCEmjZl9n4oi/Y3Jqp4PEhzFtujgZkHUNjGw8CVWnH9MwohSj8qNM1gvYX49CpFWhYJ+gtu+I2/HJtTKEXKtzoIOhQLr7rjSjuakBtj6DyoekhqfKFa5drz+hhqEhziUxZtFGL+6rJp1vp6KeHqhNoBc8dQ2aOHMJWDXhz3c2h8kJN6PDuiYtQ1YMS0D8b7Bc5WPlY7NNk3bhQJGXNThRrRZd0oeMTxdtzfpGNWdzn4mA/Es+tmzZXMuXhW0w/revmZuBQ+vw/6WxktgWcEqhTUBOCUYPj7gISmYEMulk5hE6jagEwHHOA71Woj4IaTBCG0YlY+RnxWIGYLppN3Q6uj95FretcIS703FYvqjQbqJpn7uoyJ5WrGfTe4mUi4nv0p6dsznFcoUIqQ2gkIea8qO9pYRFoOK4Z62BoYiG8/CCrf2DHaOkuoeGNO7ur4mlnpo+hFGndLgMhznfUY/3hH2vyKsSrOGyh4IyohqeDaj9q6eefaCmvOqpnbc1r7qvR7C0oRY3vwZnNyYLOzrHC4U7UQ9ZPisOpMxiMffM+jGuz1Aw39AcMGzTWC7sns6ngaBeqKOdqqyFNXnK9DXMzrg1b8R6NbDTLTXp1PQ1Zb21N8G82i0VRVItykewJQ5GZB81QYgVY0LlDss8I3rnU593SlPebX9bpGWkZVNZyWzATnN5M0PljrM/VoycPYeVyT5kn/A5sKXpOtmt/FOqbllesW3XS2VquGjYZE9Hz2E6bx9T6kcaVUdv1T8dahs071L5PgNYDTnnYUsycEr7Tl1QPUZIXB052WU5NaxjmDRWaPc7fkZLV69ItGbOUIRqu1Ufa45p8lvgaUBTkmQ2Z7x3lLVpcla5+G8hvoygk6VznVCsXZ9gpKijlJ8/qTSeZq7Sn5Cd67QlnxO7D6eEukKiF71usVGk7bCCq8Cs57OUNUMIVzmWDSE+BxDWzigxKMspMjjTKS+8qw6bJ6QnpAGjAaOum7+s")
}, {
"aabb": AABB(-5.8837, -1.7423, 2.42101, 2.30852, 1.04355, 1e-05),
"attribute_data": PackedByteArray("//8AAFLoYI9S6AAA//9gjw=="),
"format": 34896613399,
"index_count": 6,
"index_data": PackedByteArray("AAABAAIAAAADAAEA"),
"material": SubResource("StandardMaterial3D_f3mmc"),
"name": "Material.006",
"primitive": 3,
"uv_scale": Vector4(3.37258, 1.23179, 0, 0),
"vertex_count": 4,
"vertex_data": PackedByteArray("//8AAAAAt8UAAP//AAC3xf////8AAH/AAAAAAAAAf8CYiWCgZnaeXxle8nXloQyK")
}, {
"aabb": AABB(-6.20538, -1.74789, 2.43067, 2.62285, 1.00891, 1e-05),
"attribute_data": PackedByteArray("ZQOBB5n8ffhlA334mfyBBw=="),
"format": 34896613399,
"index_count": 6,
"index_data": PackedByteArray("AAABAAIAAAADAAEA"),
"material": SubResource("StandardMaterial3D_cuv30"),
"name": "Material.011",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 4,
"vertex_data": PackedByteArray("AAD+/54kAID//wAAAAAAgAAAAACeJACA/////wAAAID/f////3////9/////f///")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_xnulk")
[node name="SteleA" type="Node3D"]
[node name="Steles_" type="Node3D" parent="."]
[node name="Cube_004" type="MeshInstance3D" parent="Steles_"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 2.35051, 1.34928, -0.352509)
mesh = SubResource("ArrayMesh_app7n")
skeleton = NodePath("")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,87 @@
[gd_scene load_steps=7 format=4 uid="uid://bxjcnuf2g8iox"]
[ext_resource type="Texture2D" uid="uid://35g2bx4vh3wd" path="res://src/map/assets/Steles/Steles_IMG0031.png" id="1_nj8pm"]
[ext_resource type="Texture2D" uid="uid://jdweu6rj63e5" path="res://src/map/assets/Steles/Steles_Swirld.png" id="2_ts7fn"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rgye3"]
resource_name = "Material.003"
cull_mode = 2
albedo_texture = ExtResource("1_nj8pm")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_8tat3"]
resource_name = "Material.012"
transparency = 2
alpha_scissor_threshold = 0.5
alpha_antialiasing_mode = 0
cull_mode = 2
albedo_texture = ExtResource("2_ts7fn")
texture_repeat = false
[sub_resource type="ArrayMesh" id="ArrayMesh_yk4v3"]
_surfaces = [{
"aabb": AABB(11.8885, -2.64466, -0.821851, 3.40881, 4.08015, 2.62314),
"format": 34896613377,
"index_count": 672,
"index_data": PackedByteArray("NAABADUANAAAAAEAAAA2AAEANgA1AAEABAA0ADUAAAA3ADYAAAA0ABEAAAARADcANAA4ABEANAAEADgABAA1AAIAOAAEAAIANgAQADUAEAACADUANwAFADYABQAQADYANwADAAUAEAA5AAIAOAACADkABQA6ABAAAwA6AAUAOgA5ABAANwA7AAMAAwA7ADoANwARADsAOgAGADkAOwAGADoABwA4ADkAEQA4AAcABwA5AAYAEQAHADsAOwAHAAYAHAANADwAPQA8AA0APgAcADwAPQA/ADwAPgA8AD8AQAAcAD4AHAAdAA0AHgA+AD8AQABBABwAQQAdABwAQgBAAD4AQgA+AB4AQwBBAEAAIwBAAEIAIwBDAEAAHQBEAA0ARAA9AA0AQQBFAB0AHQAgAEQARQAgAB0AIABGAEQARgA9AEQARQBHACAAIABIAEYARwBIACAAFABFAEEAQwAUAEEAHwBHAEUAFAAfAEUARwBJAEgAHwAWAEcAFgBJAEcACAAWAB8ASgAfABQASgAIAB8ASwAUAEMASwBKABQATABLAEMATABDACMASgBLAE0ACQBMACMACABKABkASgBNABkACAAZACEACAAhABYASwBMACQASwAkAE0ATAAJAE4ATABOACQACQAjABIATgAJABIAEgAjAEIAEgBCAE8ATwBCAB4ATgASABMAEwASAE8AJABOAFAAUABOABMAJABQAFEATQAkAFEAUAATAFIATQBRAFMAGQBNAFMAUQBQACYAJgBQAFIAUwBRACcAUQAmACcAGQBTAFQAIQAZAFQAUwAnAFUAVABTAFUAJwAmAAoAIQBUAFYAVQAnAFcAJwAKAFcAVABVACgAVgBUACgAVQBXAFgAKABVAFgACgAmABcAJgBSABcAVwAKACkACgAXACkAWABXABsAVwApABsAKABYAFkAWAAbAFoAWQBYAFoAWwAoAFkAVgAoAFsAWwBZAAsAWQBaADAACwBZADAAWwALABoACwAwABoAVgBbABgAWwAaABgAVgAYAFwAIQBWAFwAIQBcABYAFgBcAEkAXAAYAF0AXABdAEkAGAAaAF4AGABeAF0AGgBfAF4AGgAwAF8ASQBdADMASQAzAEgAXQBeADIAXQAyADMAXgBfAC8AXgAvADIAMABgAF8AMABaAGAAXwBhAC8AXwBgAGEAWgBiAGAAWgAbAGIAYAAsAGEAYABiACwAGwBjAGIAGwApAGMAYgAqACwAYgBjACoAYQAsAGQAKQBlAGMAKQAXAGUAYwArACoAYwBlACsALAAqAAwALAAMAGQAKgArAGYAKgBmAAwADABmAGcAZAAMAGcAKwBoAGYAZwBmAGgAZQBpACsAKwBpAGgAFwBqAGUAZQBqAGkAFwBSAGoAawBkAGcAYQBkAGsALwBhAGsAUgBsAGoAUgATAGwAEwBPAGwAagBsAC0AagAtAGkAbABPACUAbAAlAC0ATwAeACUAaQAtAC4AaQAuAGgALQAlAA4ALQAOAC4AJQAeAG0AJQBtAA4AHgA/AG0AbgBoAC4AbwAuAA4ADgBtAG8AbgAuAG8AZwBoAG4AFQBtAD8AFQBvAG0APQAVAD8AcABuAG8AcABvABUAMQBnAG4AMQBuAHAAawBnADEAcQAVAD0AcQBwABUARgBxAD0AcgAxAHAAcgBwAHEAcwBrADEAcwAxAHIALwBrAHMAMgAvAHMAIgBxAEYAIgByAHEASAAiAEYASAAzACIAcgAiAA8ADwBzAHIAMwAPACIAMgBzAA8AMwAyAA8A"),
"lods": [0.25111, PackedByteArray("AAABAAIAAQAQAAIABAAAAAIAAAAEABEAEAAGAAIABAACAAYABQAQAAEABQAGABAAAAADAAEAAwAFAAEAAAARAAMABwAGAAUABwAEAAYAAwAHAAUAEQAEAAcAAwARAAcAHAAdAA0AFAAdABwAHgAcAA0AFAAcAB4AFAAfAB0AHwAWAB0ACAAfABQACAAWAB8AHQAWACAAHQAgAA0ACAAhABYAFgAYACAAIQAYABYAIAAiAA0ACAAZACEACQAIABQACAAJABkACQAUACMAIwAUAB4AEgAjAB4ACQAjABIACQAkABkAEgAeACUACQASABMAEwASACUAJQAeAA4AHgANAA4AJAAJACYAJgAJABMAGQAkACcAJAAmACcAGQAnACgAIQAZACgAJwAmAAoAKAAnAAoAIQAoAAsAKAAKAAsAIQALABgACgAmABcAJgATABcACgAXACkACwAKABsACgApABsAKQAXACoAGwApACoAFwATACsAKgAXACsAGwAqACwAEwAtACsAEwAlAC0AKgArAAwALAAqAAwALQAlAA4AKwAtAC4ALQAOAC4AKwAuAAwAGwAsAC8ALwAsAAwAMAAbAC8ACwAbADAACwAwABoAGgAwAC8ACwAaABgAMQAMAC4AMQAuAA4AMQAOABUAFQAOAA0AIgAVAA0AIgAxABUADwAMADEADwAxACIALwAMAA8AGgAvADIAMgAvAA8AGAAaADIAMwAPACIAMwAyAA8AGAAyADMAIAAzACIAGAAzACAA"), 0.393347, PackedByteArray("AAABAAIAAQAQAAIABAAAAAIAAAAEABEAEAAGAAIABAACAAYABQAQAAEABQAGABAAAAADAAEAAwAFAAEAAAARAAMABwAGAAUABwAEAAYAAwAHAAUAEQAEAAcAAwARAAcACQASABMACQAUABIAEgAUAA4AEwASAA4ACQAIABQAFAANAA4AFAAIAA0AEwAOAAwAFQAOAA0AFQAMAA4ADwAVAA0ADwAMABUACAAWAA0AFwATAAwACgATABcACgAXAAwACgAJABMAFgAYAA0AGAAPAA0ACAAYABYACAAJABkAGQAJAAoACAAZAAsAGQAKAAsACAALABgAGAAaAA8ACwAaABgAGgAbAA8ACwAbABoACwAKABsAGwAMAA8AGwAKAAwA"), 0.508738, PackedByteArray("AAABAAIAAAADAAEABAAAAAIAAwAFAAEAAQAFAAIABAACAAYABQAGAAIAAAAEAAcAAwAAAAcABwAEAAYAAwAHAAUABwAGAAUACAAJAAoACAAKAAsACgAJAAwACwAKAAwACQAIAA0ACAALAA0ACQANAA4ACQAOAAwADAAOAA0ADwAMAA0ACwAMAA8ACwAPAA0A")],
"name": "Material.003",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 116,
"vertex_data": PackedByteArray("exYsBWIWAAB7Ft0ZYhYAAHsW3Rmc6QAA1ugsBWIWAAB7FiwFnOkAANbo3RliFgAA1ujdGZzpAADW6CwFnOkAAEEkyQsVMwAAQSTJC+nMAAC928kL6cwAAL7byQsVMwAAvNST3b/LAABCK5PdPzQAAEIrk92/ywAAvNST3T80AACpfwkf/38AAKl/AAD/fwAAsBunJknZAAAUS6cmy+gAAG8NpyYQUQAAV0oq9/9/AAAUS6cmMxcAAOq0pybL6AAA6rSnJjMXAAB9SwUIvlMAAE7kpya1JgAAj/KnJu6uAAC0D7jDIVIAAKsduMOsKAAAtA+4w92tAACwG6cmtSYAACBMuMOTGQAAb07YCsEqAAD8r5PdpScAAG8NpyburgAAfUsFCECsAACrHbjDUtcAAI+x2Ao91QAAgbQFCECsAACBtAUIvlMAAE7kpyZJ2QAAU+K4w1LXAADes7jDa+YAAErwuMPdrQAAIEy4w2vmAAACUJPdWdgAAErwuMMhUgAAj/KnJhBRAACntSr3/38AAFPiuMOsKAAA3rO4w5MZAABDBeED/38AAEMFKBv/fwAAqX8oGwAAAACpf+EDAAAAAKl/4QP//wAAqX8oG///AAAO+igb/38AAA764QP/fwAAfx+T3TlVAADwSIHu2k0AAEkJuMP/fwAAFBqw3v9/AAAAAJd1/38AAN8Gl3VJTwAA3waXdbWwAADkBqcm/38AAAJQk92lJwAAEBaXdU0jAAD/f7De2yAAAAxIl3U6EwAA/3+4w5IRAAD/f5d1wAoAAFgc2ArEVgAAwBbYCv9/AABYHNgKOqkAAH1IBQj/fwAAb07YCj3VAAAQFpd1sdwAAP9/2ArS2wAA/38FCLevAAD/f6cm8vAAAP9/BQj/fwAA/38FCEdQAACBtwUI/38AAP9/2AosJAAApuPYCjqpAAA+6dgK/38AAKbj2ArEVgAAGvmnJv9/AACPsdgKwSoAAP9/pyYMDwAA8reXdToTAADu6Zd1TSMAAB/5l3VJTwAA//+Xdf9/AAC19rjD/38AAB/5l3W1sAAA7umXdbHcAAB/4JPdxaoAAPK3l3XE7AAA/K+T3VnYAAAOt4HuJLIAAP9/sN4j3wAA/3+4w2zuAAD/f5d1PvUAAOrlsN7/fwAADEiXdcTsAAB/H5PdxaoAAP9/KvcZsgAA8EiB7iSyAAD/f////38AAP9/KvflTQAADreB7tpNAAB/4JPdOVUAAA==")
}, {
"aabb": AABB(12.1798, -2.02339, 1.27032, 2.8212, 2.93318, 0.425192),
"format": 34896613377,
"index_count": 72,
"index_data": PackedByteArray("DgABAAIADgAAAAEADwAOAAIADwACAAMAEAAAAA4AEAAFAAAACgAFABAACgALAAUACQAKABAAEQAQAA4ACQAQABEAEQAOAA8ADAAJABEADAARABIAEgARAA8ADQAMABIADQASAAQAEgAPABMABAASABMAEwAPAAMABAATAAYAEwADAAcABgATAAcABgAHAAgA"),
"lods": [0.216457, PackedByteArray("AAABAAIAAwAAAAIABAAAAAMABAAFAAAABAADAAYABgADAAcABgAHAAgACQAFAAQACQAKAAUACgALAAUADAAJAAQADQAMAAQA")],
"name": "Material.012",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 20,
"vertex_data": PackedByteArray("MAl72mtHAACcGXL+AAAAAANGcv68TQAA/3///6R3AAD//8xti2gAAAAAzG2LaAAAzvZ72mtHAAD7uXL+vE0AAGLmcv4AAAAA/38AAH7lAAAPQAAANbMAAMwGAACFUwAA778AADWzAAAy+QAAhVMAAFNBe9qKpAAA/3972u3VAABlPMxtuMsAAP9/zG3//wAAmcPMbbjLAACrvnvaiqQAAA==")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_qi4tq"]
resource_name = "Steles__Cube_009"
_surfaces = [{
"aabb": AABB(11.8885, -2.64466, -0.821851, 3.40881, 4.08015, 2.62314),
"attribute_data": PackedByteArray("lecV/5XnePBphnjwaYYV/7P1Ff+z9Xjw8nd48PJ3Ff9phhX/aYZ48JXnePCV5xX/8ncV//J3ePCz9Xjws/UV//J3VIbydzrms/U65rP1VIaz9VSGs/U65vJ3Oubyd1SGLYBbky2AMtnf7TLZ3+1bk6/pq9hehKvYXoTjk6/p45MtgGn6XoRCZq/pQmbf7Wn63+1p+q/pQmZehEJmLYBp+p2TafrY2UJmJpRCZmHaafph2mn6JpRCZtjZQmadk2n607ZHttO2R7YPe2/nZJdv56nWb+f98m/nqdZv52SXb+eWzG/n7I1v52ihb+cS4G/nopcvovOWR7YZzIR4K9+EeOWhhHjTjoR4aKFv5xLgb+cI1oR4ttNCZs/xhHgEmIR4PnyEeGWZE/sPe2/n5aGEeNOOhHgZzIR4K9+EeJbMb+fsjW/nBJiEeFaaQmY+fIR4CNaEeM/xhHin1BP7/fJv52rWX8qn1PrcopdfymrWL6JlmZOPGtdHtrbTKo5WmmTe/7b///+2ju/Ttv//07aO7/+2////to7v07b//9O2ju///0e207Zk8NO2KnynbUe2p21HttO2ZPDTtip8//9Htq3KQmb/toR4/7Z5ZWjNsa+k4bGv/7axr1KjQmZajLGvlqCxrwikE/v/tm/n/7YT+/fJE/sGt4R4Brd5ZXnYsa9b9rGvBrexr1aaQmayd7GvlJWxrwa3b+cGtxP7p9QT+1KjQmb/toR4/7Z5ZZagsa9ajLGv/7axr63KQmak4bGvaM2xr/fJE/v/tm/n/7YT+wikE/sGt4R4Brd5ZZSVsa+yd7GvBrexr7bTQmZb9rGvedixrwa3b+cGtxP7ZZkT+5ny/8g12Ee28fVHtga38csGt/jfBrdHtpnyj6On1JOPBreWjAa3naBze4+j15VHtht4R7Zze//IZZn63ByWC81WfbPJBrcGzQa3eeHw1wvNttNk3rfws8n080e2GHpHtrfw26IGt0e28NeDnwa3h58GtxWLHJaDn1aaKo5Wfdui"),
"format": 34896613399,
"index_count": 672,
"index_data": PackedByteArray("YAABAGEAYAAAAAEAAwBgAGEAAwBhAAIAYgAFAGMAYgAEAAUABwBiAGMABwBjAAYAZAAJAGUAZAAIAAkACwBkAGUACwBlAAoAZgANAGcAZgAMAA0ADwBmAGcADwBnAA4AMAASAGgAMABpABIAagAwAGgAagBoABMAEAAwAGoAEABrADAAawBpADAAawARAGkAMQAWAGwAMQBtABYAbgAxAGwAbgBsABcAFAAxAG4AFABvADEAbwBtADEAbwAVAG0APgApAHAAPgA/ACkAcQA+AHAAcQBwAHIAcwA/AD4AcwB0AD8AdQA+AHEAdQBzAD4AQABxAHIAQAByAHYAQQBAAHYAQQB2ACoAdwBAAEEAeABxAEAAdwB4AEAAeAB1AHEAOQB4AHcAOQBCAHgAQgB1AHgAKABCADkAKAB5AEIAQgB6AHUAeQB6AEIAegBzAHUAeQB7AHoAegA4AHMAewA4AHoAOAB0AHMAewB8ADgAOABDAHQAfABDADgAfAArAEMARAAlAEUARABGACUAfQBEAEUAfQBFAH4AfwBGAEQAfwCAAEYAgQBEAH0AgQB/AEQARwB9AH4ARwB+AIIASABHAIIASACCACYAgwBHAEgAhAB9AEcAgwCEAEcAhACBAH0ASgCEAIMASgA3AIQANwCBAIQAJwA3AEoAJwBJADcANwCFAIEASQCFADcAhQB/AIEASQCGAIUAhQA2AH8AhgA2AIUANgCAAH8AhgCHADYANgA1AIAAhwA1ADYAhwAkADUASwAtAIgASwBMAC0AiQBLAIgAiQCIAIoAiwBMAEsAiwCMAEwAjQBLAIkAjQCLAEsATQCJAIoATQCKAI4ATgBNAI4ATgCOAC4AjwBNAE4AkACJAE0AjwCQAE0AkACNAIkAOwCQAI8AOwBPAJAATwCNAJAALABPADsALACRAE8ATwCSAI0AkQCSAE8AkgCLAI0AkQCTAJIAkgA6AIsAkwA6AJIAOgCMAIsAkwCUADoAOgBQAIwAlABQADoAlAAvAFAAUQAhAFIAUQBTACEAlQBRAFIAlQBSAJYAlwBTAFEAlwCYAFMAmQBRAJUAmQCXAFEAVACVAJYAVACWAJoAVQBUAJoAVQCaACIAmwBUAFUAnACVAFQAmwCcAFQAnACZAJUAVwCcAJsAVwA0AJwANACZAJwAIwA0AFcAIwBWADQANACdAJkAVgCdADQAnQCXAJkAVgCeAJ0AnQAzAJcAngAzAJ0AMwCYAJcAngCfADMAMwAyAJgAnwAyADMAnwAgADIAWAAaAKAAWABZABoAoQBYAKAAoQCgAKIAowBZAFgAowCkAFkApQBYAKEApQCjAFgAWwChAKIAWwCiAKYApwBbAKYApwCmABsAqABbAKcAqQChAFsAqACpAFsAqQClAKEAXACpAKgAXAA8AKkAPAClAKkAGAA8AFwAGACqADwAPACrAKUAqgCrADwAqwCjAKUAqgCsAKsAqwBaAKMArABaAKsAWgCkAKMArACtAFoAWgCuAKQArQCuAFoArQAZAK4ArwBfAB0AHQCwAK8AsQBfAK8AsQCyAF8APQCvALAAswCyALEAswC0ALIAHAC0ALMAtQAcALMAtgC1ALMAPQCwALcAtgCzAF0AXQCzALEAuAC2AF0AuQCxAK8AuQCvAD0AXQCxALkAuABdALoAugBdALkAHwC4ALoAugBeAB8AugC5ALsAXgC6ALsAuwC5AD0AXgC7ALwAuwA9AL0AvAC7AL0AvQA9ALcAvAC9AL4AvQC3AL8AvgC9AB4AvQC/AB4A"),
"lods": [0.25111, PackedByteArray("AAABAAIAAwAAAAIABAAFAAYABwAEAAYACAAJAAoACwAIAAoADAANAA4ADwAMAA4AMAARABIAEAARADAAEwAwABIAEAAwABMAMQAVABYAFAAVADEAFwAxABYAFAAxABcAPgA/ACkAOAA/AD4AQAA+ACkAOAA+AEAAQAApACoAQQBAACoAOQBAAEEAOQBCAEAAQgA4AEAAKABCADkAKAA4AEIAKAArADgAOABDAD8AKwBDADgARAAlAEUARABGACUARwBEAEUANgBGAEQANgBEAEcARwBFACYANgA1AEYAJAA1ADYASABHACYASQAkADYASAA3AEcANwA2AEcASQA2ADcASgA3AEgAJwBJADcAJwA3AEoASwBMAC0AOgBMAEsATQBLAC0AOgBLAE0ATQAtAC4ATgBNAC4AOwBNAE4AOwBPAE0ATwA6AE0ALABPADsALAA6AE8ALAAvADoAOgBQAEwALwBQADoAUQAhAFIAUQBTACEAVABRAFIAMwBTAFEAMwBRAFQAVABSACIAMwAyAFMAIAAyADMAVQBUACIAVgAgADMAVQA0AFQANAAzAFQAVgAzADQAVwA0AFUAIwBWADQAIwA0AFcAWABZABoAWgBZAFgAWgAZAFkAWwBYABoAWwAaABsAXABbABsAPABYAFsAXAA8AFsAPABaAFgAGQBaADwAGAA8AFwAGAAZADwAHwBdAF4AHwAcAF0AXQAcAF8AXQBfAB0AXgBdAD0AXQAdAD0AXgA9AB4APQAdAB4A"), 0.393347, PackedByteArray("AAABAAIAAwAAAAIABAAFAAYABwAEAAYACAAJAAoACwAIAAoADAANAA4ADwAMAA4AMAARABIAEAARADAAEwAwABIAEAAwABMAMQAVABYAFAAVADEAFwAxABYAFAAxABcAIAAyADMAMwAyACEAIwAgADMAMwAhACIAIwA0ACIANAAzACIAIwAzADQAJAA1ADYANgA1ACUAJwAkADYANgAlACYAJwA3ACYANwA2ACYAJwA2ADcAKAA4ADkAOQA4ACoAKAArADgAOAApACoAOAArACkALAA6ADsAOwA6AC4ALAAvADoAOgAtAC4AOgAvAC0APAAZABoAGAAZADwAPAAaABsAGAA8ABsAPQAcAB0AHwAcAD0APQAdAB4AHwA9AB4A"), 0.508738, PackedByteArray("AAABAAIAAwAAAAIABAAFAAYABwAEAAYACAAJAAoACwAIAAoADAANAA4ADwAMAA4AEAARABIAEwAQABIAFAAVABYAFwAUABYAGAAZABoAGAAaABsAHAAdAB4AHwAcAB4AIAAhACIAIwAgACIAJAAlACYAJwAkACYAKAApACoAKAArACkALAAtAC4ALAAvAC0A")],
"material": SubResource("StandardMaterial3D_rgye3"),
"name": "Material.003",
"primitive": 3,
"uv_scale": Vector4(2.32722, 2.35806, 0, 0),
"vertex_count": 192,
"vertex_data": PackedByteArray("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")
}, {
"aabb": AABB(12.1798, -2.02339, 1.27032, 2.8212, 2.93318, 0.425192),
"attribute_data": PackedByteArray("CncrgieAdW3LmHVt+LiRbP//w8DxccPA5forgiTZdW3I8XVt+Lj//32V/v+2df//c9z//zn8//8xliuC+LgrgnSTw8D4uMPAe97DwL/bK4I="),
"format": 34896613399,
"index_count": 72,
"index_data": PackedByteArray("DgABAAIADgAAAAEADwAOAAIADwACAAMAEAAAAA4AEAAFAAAACgAFABAACgALAAUACQAKABAAEQAQAA4ACQAQABEAEQAOAA8ADAAJABEADAARABIAEgARAA8ADQAMABIADQASAAQAEgAPABMABAASABMAEwAPAAMABAATAAYAEwADAAcABgATAAcABgAHAAgA"),
"lods": [0.216457, PackedByteArray("AAABAAIAAwAAAAIABAAAAAMABAAFAAAABAADAAYABgADAAcABgAHAAgACQAFAAQACQAKAAUACgALAAUADAAJAAQADQAMAAQA")],
"material": SubResource("StandardMaterial3D_8tat3"),
"name": "Material.012",
"primitive": 3,
"uv_scale": Vector4(2.22, 2.34314, 0, 0),
"vertex_count": 20,
"vertex_data": PackedByteArray("MAl72mtHtoycGXL+AADqkQNGcv68TTyQ/3///6R3PY7//8xti2j1iQAAzG2LaPWJzvZ72mtHtoz7uXL+vE07kGLmcv4AAO2R/38AAH7lcYEPQAAANbN7h8wGAACFUxmK778AADWze4cy+QAAhVMZilNBe9qKpDeL/3972u3VL4hlPMxtuMtqh/9/zG3//2yAmcPMbbjLaoervnvaiqQ3ixe1b8SWxo+w38+RqPv//3/bhTkFOYUi+qK7/zRg1xhQjc80RgsA/38paCbqG2xR7idq1hdQbt8TtMBNufb/AID/hl34/v//f6GH/wanxsZA")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_yk4v3")
[node name="SteleA" type="Node3D"]
[node name="Steles_" type="Node3D" parent="."]
[node name="Cube_008" type="MeshInstance3D" parent="Steles_"]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -6.79494, 1.31267, 0)
mesh = SubResource("ArrayMesh_qi4tq")
skeleton = NodePath("")
[node name="Cylinder_006" type="Node3D" parent="Steles_"]

Binary file not shown.

View File

@@ -3,13 +3,13 @@
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bwmifp7f34ch8"
path="res://.godot/imported/Overworld_colision.glb-0277cb99f60a14f702da75d6e9feaad8.scn"
uid="uid://bh3s5la5h541j"
path="res://.godot/imported/Steles..glb-cfac3338410a8623728958b9f8fc20b2.scn"
[deps]
source_file="res://src/map/overworld/Models/Overworld_colision.glb"
dest_files=["res://.godot/imported/Overworld_colision.glb-0277cb99f60a14f702da75d6e9feaad8.scn"]
source_file="res://src/map/assets/Steles/Steles..glb"
dest_files=["res://.godot/imported/Steles..glb-cfac3338410a8623728958b9f8fc20b2.scn"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -2,19 +2,19 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dctq1jf2so5sy"
path="res://.godot/imported/A2-Puer_AREA2_WHITE_CONKRETE.png-b467f89e55a91d1c02900359f252044b.ctex"
uid="uid://br0vjonsyq32m"
path="res://.godot/imported/Steles_ALUMPLAT.jpg-4ca961f857a8c7a5b054f8a60f88abda.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "307b116080fe0254862e45395c4d4f0b"
"md5": "39f69e1ed027aff70afefd525e147972"
}
[deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_AREA2_WHITE_CONKRETE.png"
dest_files=["res://.godot/imported/A2-Puer_AREA2_WHITE_CONKRETE.png-b467f89e55a91d1c02900359f252044b.ctex"]
source_file="res://src/map/assets/Steles/Steles_ALUMPLAT.jpg"
dest_files=["res://.godot/imported/Steles_ALUMPLAT.jpg-4ca961f857a8c7a5b054f8a60f88abda.ctex"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -2,19 +2,19 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bsrqhsiah4glf"
path="res://.godot/imported/A2-Puer_area_2_big_tile.png-b1b07d46e3ca4e89bf713e1e9786196c.ctex"
uid="uid://dcodsa21o3syb"
path="res://.godot/imported/Steles_C024_C.jpg-afd970c2f528ba88971521eb6f9100d4.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "0c25630c903927ac616a7b2238fa2766"
"md5": "a5e08955e0f18fed2a2e12ef1baaf697"
}
[deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_area_2_big_tile.png"
dest_files=["res://.godot/imported/A2-Puer_area_2_big_tile.png-b1b07d46e3ca4e89bf713e1e9786196c.ctex"]
source_file="res://src/map/assets/Steles/Steles_C024_C.jpg"
dest_files=["res://.godot/imported/Steles_C024_C.jpg-afd970c2f528ba88971521eb6f9100d4.ctex"]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bwelhd4sx7mkw"
path="res://.godot/imported/Steles_COPPEROX.jpg-c0f141108ca52d9fb95daa997c87ba84.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "2e3c355994487da7381dd4a95afb11ed"
}
[deps]
source_file="res://src/map/assets/Steles/Steles_COPPEROX.jpg"
dest_files=["res://.godot/imported/Steles_COPPEROX.jpg-c0f141108ca52d9fb95daa997c87ba84.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dj2upntyeqryx"
path="res://.godot/imported/Steles_COPPWIR.jpg-19b19df4f75891a819beef8e510b0c86.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "6993f197f90ec71e92119d6081910c46"
}
[deps]
source_file="res://src/map/assets/Steles/Steles_COPPWIR.jpg"
dest_files=["res://.godot/imported/Steles_COPPWIR.jpg-19b19df4f75891a819beef8e510b0c86.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://35g2bx4vh3wd"
path="res://.godot/imported/Steles_IMG0031.png-9fab8a370a2d11b26a0fc5c8067ff0ac.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "025a54d582ba921e5dc1868adba751cb"
}
[deps]
source_file="res://src/map/assets/Steles/Steles_IMG0031.png"
dest_files=["res://.godot/imported/Steles_IMG0031.png-9fab8a370a2d11b26a0fc5c8067ff0ac.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://jdweu6rj63e5"
path="res://.godot/imported/Steles_Swirld.png-9e210714626c299bfa1f7e1006a31cfc.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "2ca941f6193580d6266d745305b74c95"
}
[deps]
source_file="res://src/map/assets/Steles/Steles_Swirld.png"
dest_files=["res://.godot/imported/Steles_Swirld.png-9e210714626c299bfa1f7e1006a31cfc.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c8nvb5jn8f6k1"
path="res://.godot/imported/Steles_Untitled-1.png-4c61e71520d8a451f8cedacabaf86be6.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "f8746c27d1fb3961a095690a23600a9a"
}
[deps]
source_file="res://src/map/assets/Steles/Steles_Untitled-1.png"
dest_files=["res://.godot/imported/Steles_Untitled-1.png-4c61e71520d8a451f8cedacabaf86be6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://br8l5h7n6t41d"
path="res://.godot/imported/Steles_eye.png-f2e7c9b4ca8d574aa73e6f719e7d2787.ctex"
metadata={
"vram_texture": false
}
generator_parameters={
"md5": "4eadc1cfd192b2a068a02c443920d999"
}
[deps]
source_file="res://src/map/assets/Steles/Steles_eye.png"
dest_files=["res://.godot/imported/Steles_eye.png-f2e7c9b4ca8d574aa73e6f719e7d2787.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -54,5 +54,6 @@ public partial class Altar : Node3D, IDungeonFloor
public void ExitReached() => Game.FloorExitReached();
public void InitializeDungeon() { return; }
public Transform3D GetPlayerSpawnPoint() { return new Transform3D(PlayerSpawnPoint.Basis, new Vector3(PlayerSpawnPoint.GlobalPosition.X, -3, PlayerSpawnPoint.GlobalPosition.Z)); }
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawnPoint.Rotation, new Vector3(PlayerSpawnPoint.GlobalPosition.X, 0, PlayerSpawnPoint.GlobalPosition.Z)); }
}

View File

@@ -15,19 +15,17 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
[Node] public Marker3D PlayerSpawn { get; set; } = default!;
//[Node] public Node3D HorseHeadStatue { get; set; } = default!;
[Node] public Node3D HorseHeadStatue { get; set; } = default!;
[Node] public Node3D OxFaceStatue { get; set; } = default!;
[Node] public BossTypeA OxFace { get; set; } = default!;
//[Node] public BossTypeA HorseFace { get; set; } = default!;
[Node] public BossTypeA HorseHead { get; set; } = default!;
[Node] public Area3D ActivateTrap { get; set; } = default!;
[Node] public Node3D GateCollision { get; set; } = default!;
[Node] public MeshInstance3D LOCKEDGATE { get; set; } = default!;
[Node] public Node3D BossDoor { get; set; } = default!;
[Node] private Area3D _exit { get; set; } = default!;
public ImmutableList<IDungeonRoom> Rooms { get; }
@@ -38,7 +36,7 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
ActivateTrap.BodyEntered += ActivateTrap_BodyEntered;
_exit.AreaEntered += Exit_AreaEntered;
OxFace.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
//HorseFace.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
HorseHead.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
}
private void ActivateTrap_BodyEntered(Node3D body)
@@ -50,21 +48,20 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
public void StartBossFight()
{
OxFaceStatue.Hide();
//HorseHeadStatue.Hide();
HorseHeadStatue.Hide();
OxFace.StartFight();
//HorseFace.StartFight();
HorseHead.StartFight();
}
private void CheckForBossFightEnd()
{
if (OxFace.HealthComponent.CurrentHP.Value <= 0) //&& HorseFace.HealthComponent.CurrentHP.Value <= 0)
if (OxFace.HealthComponent.CurrentHP.Value <= 0 && HorseHead.HealthComponent.CurrentHP.Value <= 0)
OnBossFightEnded();
}
public void OnBossFightEnded()
{
GateCollision.CallDeferred(MethodName.QueueFree);
LOCKEDGATE.Hide();
BossDoor.CallDeferred(MethodName.QueueFree);
}
public void ExitReached()
@@ -81,5 +78,5 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
}
public Transform3D GetPlayerSpawnPoint() => PlayerSpawn.GlobalTransform;
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawn.Rotation, new Vector3(PlayerSpawn.GlobalPosition.X, -2.5f, PlayerSpawn.GlobalPosition.Z)); }
}

View File

@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Collections.Immutable;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
@@ -10,6 +11,8 @@ public partial class BossRoomB : Node3D, IBossRoom, IDungeonFloor
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] public IGame Game => this.DependOn<IGame>();
[Node] public Marker3D PlayerSpawn { get; set; } = default!;
[Node] public DemonWall DemonWall { get; set; } = default!;
@@ -18,9 +21,12 @@ public partial class BossRoomB : Node3D, IBossRoom, IDungeonFloor
public ImmutableList<IDungeonRoom> Rooms { get; }
public bool FloorIsLoaded { get; set; }
[Node] private Area3D _exit { get; set; } = default!;
public void OnReady()
{
ActivateTrap.BodyEntered += ActivateTrap_AreaEntered;
ActivateTrap.BodyEntered += ActivateTrap_AreaEntered;
_exit.AreaEntered += Exit_AreaEntered;
}
private void ActivateTrap_AreaEntered(Node3D area) => StartBossFight();
@@ -32,7 +38,7 @@ public partial class BossRoomB : Node3D, IBossRoom, IDungeonFloor
public void StartBossFight()
{
DemonWall.Activate();
DemonWall.Activate();
}
public void InitializeDungeon()
@@ -40,5 +46,14 @@ public partial class BossRoomB : Node3D, IBossRoom, IDungeonFloor
}
public Transform3D GetPlayerSpawnPoint() => PlayerSpawn.GlobalTransform;
public void ExitReached()
=> Game.FloorExitReached();
private void Exit_AreaEntered(Area3D area)
{
if (area.GetOwner() is IPlayer)
ExitReached();
}
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawn.Rotation, new Vector3(PlayerSpawn.GlobalPosition.X, 0, PlayerSpawn.GlobalPosition.Z)); }
}

View File

@@ -18,13 +18,13 @@ public partial class CorridorRoom : Node3D
public void Setup()
{
if (_room != null)
_room.BodyEntered += Room_BodyEntered;
if (_room != null)
_room.BodyEntered += Room_BodyEntered;
}
private void Room_BodyEntered(Node3D body)
{
if (!Game.CurrentFloor.FloorIsLoaded)
return;
if (!Game.CurrentFloor.FloorIsLoaded)
return;
}
}

View File

@@ -12,7 +12,7 @@ public partial class DungeonFloor : Node3D, IDungeonFloor
{
public override void _Notification(int what) => this.Notify(what);
private Transform3D _playerSpawnPoint;
private Marker3D _playerSpawnPoint;
public ImmutableList<IDungeonRoom> Rooms { get; private set; }
@@ -50,16 +50,17 @@ public partial class DungeonFloor : Node3D, IDungeonFloor
room.SpawnEnemies(enemyOdds);
}
public Transform3D GetPlayerSpawnPoint() => new Transform3D(_playerSpawnPoint.Basis, new Vector3(_playerSpawnPoint.Origin.X, 0f, _playerSpawnPoint.Origin.Z));
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (_playerSpawnPoint.Rotation, new Vector3(_playerSpawnPoint.GlobalPosition.X, 0, _playerSpawnPoint.GlobalPosition.Z)); }
private Transform3D RandomizePlayerSpawnPoint()
private Marker3D RandomizePlayerSpawnPoint()
{
var randomSpawnLocations = Rooms
.OfType<MonsterRoom>()
.Select(x => x.PlayerSpawn);
var godotCollection = new Godot.Collections.Array<Marker3D>(randomSpawnLocations);
var result = godotCollection.PickRandom();
return result.GlobalTransform;
return result;
}
private static ImmutableList<IDungeonRoom> FindAllDungeonRooms(List<Node> nodesToSearch, ImmutableList<IDungeonRoom> roomsFound)

View File

@@ -28,47 +28,47 @@ public abstract partial class DungeonRoom : Node3D, IDungeonRoom
public void Setup()
{
_enemiesInRoom = [];
if (_room != null)
{
_room.BodyEntered += Room_BodyEntered;
_room.BodyExited += Room_BodyExited;
}
_enemiesInRoom = [];
if (_room != null)
{
_room.BodyEntered += Room_BodyEntered;
_room.BodyExited += Room_BodyExited;
}
}
private void Room_BodyExited(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Remove(enemy);
if (body is IPlayer)
_isPlayerInRoom = false;
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Remove(enemy);
if (body is IPlayer)
_isPlayerInRoom = false;
}
private void Room_BodyEntered(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Add(enemy);
if (body is IPlayer)
if (_playerDiscoveredRoom)
_isPlayerInRoom = true;
else
OnPlayerDiscoveringRoom();
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Add(enemy);
if (body is IPlayer)
if (_playerDiscoveredRoom)
_isPlayerInRoom = true;
else
OnPlayerDiscoveringRoom();
}
public ImmutableList<IEnemy> GetEnemiesInCurrentRoom()
{
return _enemiesInRoom;
return _enemiesInRoom;
}
private void OnPlayerDiscoveringRoom()
{
_isPlayerInRoom = true;
_playerDiscoveredRoom = true;
MinimapShadow.Hide();
_isPlayerInRoom = true;
_playerDiscoveredRoom = true;
MinimapShadow.Hide();
}
public void OnExitTree()
{
_room.BodyEntered -= Room_BodyEntered;
_room.BodyExited -= Room_BodyExited;
_room.BodyEntered -= Room_BodyEntered;
_room.BodyExited -= Room_BodyExited;
}
}

View File

@@ -19,31 +19,31 @@ public partial class MonsterRoom : DungeonRoom
public override void _Ready()
{
SpawnItems();
SpawnItems();
}
public void SpawnEnemies(Godot.Collections.Dictionary<EnemyType, float> enemyInfo)
{
if (enemyInfo == null || !enemyInfo.Any(x => x.Value > 0))
return;
if (enemyInfo == null || !enemyInfo.Any(x => x.Value > 0))
return;
var rng = new RandomNumberGenerator();
rng.Randomize();
var enemySpawnPoints = EnemySpawnPoints.GetChildren();
var numberOfEnemiesToSpawn = rng.RandiRange(1, enemySpawnPoints.Count);
var rng = new RandomNumberGenerator();
rng.Randomize();
var enemySpawnPoints = EnemySpawnPoints.GetChildren();
var numberOfEnemiesToSpawn = rng.RandiRange(1, enemySpawnPoints.Count);
foreach (var spawnPoint in enemySpawnPoints.Cast<Marker3D>())
{
if (numberOfEnemiesToSpawn <= 0)
break;
numberOfEnemiesToSpawn--;
foreach (var spawnPoint in enemySpawnPoints.Cast<Marker3D>())
{
if (numberOfEnemiesToSpawn <= 0)
break;
numberOfEnemiesToSpawn--;
var index = rng.RandWeighted([.. enemyInfo.Values]);
var selectedEnemy = enemyInfo.ElementAt((int)index);
var instantiatedEnemy = EnemyTypeToEnemyConverter.Convert(selectedEnemy.Key);
instantiatedEnemy.Position = new Vector3(spawnPoint.Position.X, 0f, spawnPoint.Position.Z);
AddChild(instantiatedEnemy);
}
var index = rng.RandWeighted([.. enemyInfo.Values]);
var selectedEnemy = enemyInfo.ElementAt((int)index);
var instantiatedEnemy = EnemyTypeToEnemyConverter.Convert(selectedEnemy.Key);
instantiatedEnemy.Position = new Vector3(spawnPoint.Position.X, 0f, spawnPoint.Position.Z);
AddChild(instantiatedEnemy);
}
}
@@ -51,25 +51,25 @@ public partial class MonsterRoom : DungeonRoom
//
private void SpawnItems()
{
if (ItemSpawnPoints == null)
return;
if (ItemSpawnPoints == null)
return;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
var numberOfItemsToSpawn = rng.RandiRange(1, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
var numberOfItemsToSpawn = rng.RandiRange(1, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var selectedItem = database.PickItem<InventoryItem>();
var duplicated = selectedItem.Duplicate((int)DuplicateFlags.UseInstantiation) as Node3D;
duplicated.Position = new Vector3(spawnPoint.Position.X, 0, spawnPoint.Position.Z);
AddChild(duplicated);
}
var selectedItem = database.PickItem<InventoryItem>();
var duplicated = selectedItem.Duplicate((int)DuplicateFlags.UseInstantiation) as Node3D;
duplicated.Position = new Vector3(spawnPoint.Position.X, 0, spawnPoint.Position.Z);
AddChild(duplicated);
}
}
}

View File

@@ -73,5 +73,6 @@ public partial class Overworld : Node3D, IDungeonFloor
public void ExitReached() => Game.FloorExitReached();
public Transform3D GetPlayerSpawnPoint() => new Transform3D(PlayerSpawnPoint.Basis, new Vector3(PlayerSpawnPoint.GlobalPosition.X, 2.4f, PlayerSpawnPoint.GlobalPosition.Z));
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawnPoint.Rotation, new Vector3(PlayerSpawnPoint.GlobalPosition.X, 2.4f, PlayerSpawnPoint.GlobalPosition.Z)); }
}

View File

@@ -16,10 +16,11 @@ public partial class SpecialFloor : Node3D, IDungeonFloor
public void InitializeDungeon()
{
FloorIsLoaded = true;
FloorIsLoaded = true;
}
public bool FloorIsLoaded { get; set; }
public Transform3D GetPlayerSpawnPoint() => PlayerSpawn.GlobalTransform;
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() => (PlayerSpawn.Rotation, PlayerSpawn.Position);
}

File diff suppressed because one or more lines are too long

View File

@@ -105,7 +105,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -59.9942, -0.0174925, 27.8728
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -59.9126, 0.0301168, 12.1208)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -28.017, 0.373, 36.8768)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -28.017, -0.621108, 36.8768)
layers = 2
mesh = SubResource("PlaneMesh_wji58")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -101,7 +101,8 @@ transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -9.909
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -35.2776, 0.00105417, 33.9955)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.0145, 0.373, 49.5146)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.0145, -2.51298, 49.5146)
layers = 2
mesh = SubResource("PlaneMesh_54mxl")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -166,7 +166,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 31.0298, 0.0294389, -12.0652)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -49.0813, 0.0171744, 4.04785)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.81506, 0.373, -3.07342)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.81506, -0.678744, -3.07342)
layers = 2
mesh = SubResource("PlaneMesh_5v5l6")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -110,7 +110,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 76, 0, -18)
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 62, 0, -4.495)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 77.1591, 0.373, -6.01604)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 77.1591, -0.337722, -6.01604)
layers = 2
mesh = SubResource("PlaneMesh_7j2in")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -142,7 +142,8 @@ transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 73.156
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 63, 0, -34)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 28.9476, 0.373, 36.4698)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 28.9476, -1.95209, 36.4698)
layers = 2
mesh = SubResource("PlaneMesh_gw6gx")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -163,7 +163,8 @@ transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 43.18,
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -48.4658, 0, 17.9486)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.3474, 0.373, -36.0745)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.3474, -2.627, -36.0745)
layers = 2
mesh = SubResource("PlaneMesh_ckihq")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -133,7 +133,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.00045, 0, 53)
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -42.0005, 0, 46)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.88379, 0.373, 10.9144)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.88379, -1.627, 10.9144)
mesh = SubResource("PlaneMesh_ferpc")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

View File

@@ -145,7 +145,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.9012, 0, 58.0875)
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 27.3277, 0.145948, 45.946)
[node name="Minimap2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.87502, 0.373, 11.4857)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.87502, -1.627, 11.4857)
mesh = SubResource("PlaneMesh_2edmy")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Minimap2"]

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