Compare commits
27 Commits
3e178257aa
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a99771491 | |||
| d45bc67722 | |||
| 13ebe54474 | |||
| b9a1888bfc | |||
| 5ae556cb4b | |||
| 52dc8fb9e4 | |||
| affa5e1f79 | |||
|
|
35a625f636 | ||
|
|
d5de5f7379 | ||
| 3e6e21977e | |||
|
|
4a2d131276 | ||
|
|
d9c2ba7ed1 | ||
| 051ffbbcb1 | |||
| 9747d7d2c5 | |||
| 34dce8c5a2 | |||
| 51010c4f7d | |||
| fd96eb2dc9 | |||
| 51c8f26e50 | |||
| 4c90eb6f07 | |||
| 30f0a078a9 | |||
| 6e4a4d605c | |||
|
|
836b9eb26d | ||
|
|
cb2df83079 | ||
| 0282ef68f3 | |||
|
|
1678d79bbd | ||
|
|
20d2890b37 | ||
|
|
e85c8d51f1 |
@@ -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
|
||||
}
|
||||
@@ -7,4 +7,5 @@ public enum WeaponTag
|
||||
IgnoreAffinity,
|
||||
IgnoreDefense,
|
||||
Knockback,
|
||||
InverseHPAttackPower,
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public interface IDungeonFloor : INode3D
|
||||
{
|
||||
void InitializeDungeon();
|
||||
|
||||
public Transform3D GetPlayerSpawnPoint();
|
||||
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint();
|
||||
|
||||
public ImmutableList<IDungeonRoom> Rooms { get; }
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
42
Zennysoft.Game.Ma/src/enemy/BossAModelView.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
1
Zennysoft.Game.Ma/src/enemy/BossAModelView.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cycffa0wn7sks
|
||||
1
Zennysoft.Game.Ma/src/enemy/BossBModelView.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://brnlf1ybd4mu
|
||||
@@ -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();
|
||||
|
||||
@@ -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 _) =>
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
12
Zennysoft.Game.Ma/src/items/accessory/BoxItemStats.cs
Normal 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;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://vuavr681au06
|
||||
@@ -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")
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
@@ -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]
|
||||
|
||||
37
Zennysoft.Game.Ma/src/items/box/BoxItem.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
1
Zennysoft.Game.Ma/src/items/box/BoxItem.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cqqqj4hgywst4
|
||||
40
Zennysoft.Game.Ma/src/items/box/BoxItem.tscn
Normal 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")
|
||||
@@ -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"
|
||||
26
Zennysoft.Game.Ma/src/items/box/resources/Asceticism.tres
Normal 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"
|
||||
@@ -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"
|
||||
26
Zennysoft.Game.Ma/src/items/box/resources/ChaoticPrayer.tres
Normal 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"
|
||||
25
Zennysoft.Game.Ma/src/items/box/resources/EmptyPromise.tres
Normal 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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
26
Zennysoft.Game.Ma/src/items/box/resources/GlueJar.tres
Normal 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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
26
Zennysoft.Game.Ma/src/items/box/resources/Malfunction.tres
Normal 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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")]
|
||||
|
||||
30
Zennysoft.Game.Ma/src/items/weapons/resources/HopesEdge.tres
Normal 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")
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
85
Zennysoft.Game.Ma/src/map/Placeables/Stele A.tscn
Normal file
112
Zennysoft.Game.Ma/src/map/Placeables/Stele B.tscn
Normal 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("SskAAKhPiv1KyQAAqE+K/UrJYtSoT4r9Ssli1KhPiv245D+YuORsuUYbTaP//7HFuOTx9P//68FGG///uOTH0rjkP5hGG6jGRhtNo///BJm45PH0AABx80Yb//+45Ef+Rhv//0Yb+f0AAPH0RhuQ10Yb//9GG3PXRhtNo///scVGG///uORxuUYb//9GG6bGTzcAAKhPiv1PNwAAqE+K/U83YtSoT4r9Tzdi1KhPiv2d02LU3bG6o2e3AAD5aT/YuOT//7jkdtC45P//uOTy/bjkTaMAADrqRhtNowAAh/QAAE2juOR21bjkTaMAAOTnRhtNowAA5OdGGz+YRhuoxgAATaO45FOwRhs/mLjkbLmiQWLU3bG6o20lAAD5aT/YndNi1LVWB+zw3WLUSYT0xErJAADquP+c9r5i1N2xuqNKyWLUqE/+4p3TYtTdsXGj9r5i1N2xcaOd02LUtVa04PDdYtRJhBnHSskAAOq4/2JKyQAAqE8AHWe3AAD5aagnuORNo///mcFGG/H0//+oxf//8fS45Ha5///x9Ljk2N3//02jRhs417jk//9GG0L+uOT//0YbHdsAAE2jRhud9AAA8fS45Oa5Rhvx9P//kK245E2j//8EmQAATaNGG0fd//9No0YbR92iQWLUtVYH7DFJAAD5aT/Y9Uti1EmE9MRPNwAA6rj/nPwsYtTdsbqjTzdi1KhP/uKiQWLU3bFxo/wsYtTdsXGjokFi1LVWtOD1S2LUSYQZx083AADquP9iTzcAAKhPAB1tJQAA+WmoJzFJAAD5aagnndMAALVWB+ws22LU+Wk/2CzbAAD5aT/Y8N0AAEmE9MQs22LUmp7QsizbAACantCyndMAAN2xuqNKyWLU6rj/nPa+AADdsbqjZ7di1Jqe0LJntwAAmp7QsqO0YtRJhPTEo7QAAEmE9MRnt2LU+Wk/2Pa+YtS1Vgfs9r4AALVWB+ws22LU+WlW2Ge3YtT5aVbY9r5i1LVWtOAs22LUmp7UskrJYtTquP+cZ7di1Jqe1LKjtGLUSYQZx/a+AAC1VkofndMAALVWSh/w3QAASYTlOCzbAAD5aagno7QAAEmE5Tj2vgAA3bGNXGe3AACanipNndMAAN2xjVws2wAAmp4qTf//TaO45My6///x9EYbdu9GG/H0AACs6v//8fRGG0X3Rhvx9AAAuef//02juORTsKJBAAC1VgfsMUli1PlpP9j1SwAASYT0xDFJYtSantCyMUkAAJqe0LKiQQAA3bG6o083YtTquP+c/CwAAN2xuqNtJWLUmp7Qsm0lAACantCyqCJi1EmE9MSoIgAASYT0xG0lYtT5aT/Y/Cxi1LVWB+z8LAAAtVYH7DFJYtT5aVbYbSVi1PlpVtj8LGLUtVa04DFJYtSantSyTzdi1Oq4/5xtJWLUmp7UsqgiYtRJhBnH/CwAALVWSh+iQQAAtVZKH/VLAABJhOU4qCIAAEmE5Tj8LAAA3bGNXG0lAACanipNokEAAN2xjVwxSQAAmp4qTWB4PijBV1/4PaifB56HwNfvA2x3yh6i70fhXxLM2bEp+gOkeDQjBZUEt4a0yH3BuR1+NMQF27u4g6yIrsoeou+1/K2IXvtyh2B4PijBV1/4PaifB56HwNea0VxAr1Ct7pzV1CboOegBbkSeR/FLAEnhz6PyXAWwck4NXIVbB/mDU0dcq5II74Oa0VxAr1Ct7gCpqgiUtkobAAD/f1vAZK7///9/hsySW5LbeLMq5Nx3zcJmYQAA/38AAP9/cC9Xke4QIOAT7rId+r6kDeIqAhJSJrNGAEQ+AlatXquXy07aFOeMxwr2Py8FFcpcVzFXk1gTqE4AqaoIrm5PL5S2ShsAAP9/W8Bkrv///3+GzJJbktt4syrk3HfNwmZhAAD/fwAA/39wL1eRVxGOUFV3ASlPr1ERrm5PL7VklDZ+wOMoHFd+QKM/mlH///9/ZC6iv+KogL+APxvXSZtqyWpJtORQka/QqYj91v5WVPeO0Kdup+5wr9z31JtMv/NW////f/PWscBm4TG91BsiiCIIKmSYHs1CVxGOUDE9mJ54M2ykskALqWwkhkwLKU0/sxdvOK86zx8ZuRy6z7rZnSb3jI9dK6s4VXcBKU+vURG1ZJQ2fsDjKBxXfkCjP5pR/v//f2Quor/iqIC/gD8b10mbaslqSbTkUJGv0KmI/db+VlT3jtCnbqfucK/c99SbTL/zVv///3/z1rHAZuExvdQbIogiCCpkmB7NQjE9mJ54M2ykskALqWwkhkwLKU0/")
|
||||
}]
|
||||
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("")
|
||||
120
Zennysoft.Game.Ma/src/map/Placeables/Stele C.tscn
Normal 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("")
|
||||
141
Zennysoft.Game.Ma/src/map/Placeables/Stele D.tscn
Normal 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("")
|
||||
52
Zennysoft.Game.Ma/src/map/Placeables/Stele E.tscn
Normal file
121
Zennysoft.Game.Ma/src/map/Placeables/Stele F.tscn
Normal file
87
Zennysoft.Game.Ma/src/map/Placeables/Stele G.tscn
Normal 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_"]
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles..glb
Normal 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]
|
||||
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_ALUMPLAT.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
@@ -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]
|
||||
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_C024_C.jpg
Normal file
|
After Width: | Height: | Size: 185 KiB |
@@ -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]
|
||||
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_COPPEROX.jpg
Normal file
|
After Width: | Height: | Size: 110 KiB |
@@ -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
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_COPPWIR.jpg
Normal file
|
After Width: | Height: | Size: 161 KiB |
@@ -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
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_IMG0031.png
Normal file
|
After Width: | Height: | Size: 3.9 MiB |
@@ -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
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_Swirld.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
@@ -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
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_Untitled-1.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
@@ -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
|
||||
BIN
Zennysoft.Game.Ma/src/map/assets/Steles/Steles_eye.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
@@ -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
|
||||
@@ -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)); }
|
||||
}
|
||||
|
||||
@@ -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)); }
|
||||
}
|
||||
|
||||
@@ -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)); }
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)); }
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||