refactor-assembly #1
|
|
@ -0,0 +1,528 @@
|
||||||
|
#if UNITY_EDITOR || DEVELOPMENT_BUILD
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using Components;
|
||||||
|
using CustomComponent;
|
||||||
|
using SepCore.Event;
|
||||||
|
using SepCore.DataTable;
|
||||||
|
using SepCore.Definition;
|
||||||
|
using Entity;
|
||||||
|
using CustomUtility;
|
||||||
|
using Procedure;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityGameFramework.Runtime;
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
using UnityEngine.InputSystem;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
public class RuntimeDebugPanelComponent : MonoBehaviour
|
||||||
|
|
||||||
|
{
|
||||||
|
private const float MinSpawnRate = 0.1f;
|
||||||
|
private const float CornerTapWindow = 0.6f;
|
||||||
|
private const int RequiredCornerTapCount = 3;
|
||||||
|
private const int DebugHealAmount = 200;
|
||||||
|
|
||||||
|
[Header("Window Content")] [SerializeField]
|
||||||
|
private bool _showBuffSection = true;
|
||||||
|
|
||||||
|
[SerializeField] private bool _showBattleOverview = true;
|
||||||
|
[SerializeField] private bool _showCollisionStats = true;
|
||||||
|
[SerializeField] private bool _showSpawnControls = true;
|
||||||
|
[SerializeField] private bool _showBattleDurationControls = true;
|
||||||
|
[SerializeField] private bool _showPlayerWeaponControls = true;
|
||||||
|
[SerializeField] private bool _showPlayerHealthControls = true;
|
||||||
|
[SerializeField] private bool _showTips = true;
|
||||||
|
|
||||||
|
private Rect _windowRect = new Rect(20f, 60f, 460f, 800f);
|
||||||
|
private bool _isPanelVisible;
|
||||||
|
private int _windowId;
|
||||||
|
|
||||||
|
private string _searchText = string.Empty;
|
||||||
|
private int _selectedIndex;
|
||||||
|
private int _addCount = 1;
|
||||||
|
private Vector2 _buffScroll;
|
||||||
|
|
||||||
|
private float _spawnRateScaleInput = 1f;
|
||||||
|
private float _extendDurationSeconds = 30f;
|
||||||
|
|
||||||
|
private DRProp[] _allProps = Array.Empty<DRProp>();
|
||||||
|
private DRProp[] _filteredProps = Array.Empty<DRProp>();
|
||||||
|
private string[] _displayNames = Array.Empty<string>();
|
||||||
|
|
||||||
|
private int _cornerTapCount;
|
||||||
|
private float _lastCornerTapTime = -10f;
|
||||||
|
private bool _lockPlayerHealthToMax;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
_windowId = GetInstanceID();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (IsTogglePressed())
|
||||||
|
{
|
||||||
|
_isPanelVisible = !_isPanelVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
HandleCornerTapGesture();
|
||||||
|
if (_lockPlayerHealthToMax)
|
||||||
|
{
|
||||||
|
KeepPlayerHealthAtMax();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnGUI()
|
||||||
|
{
|
||||||
|
DrawToggleButton();
|
||||||
|
if (!_isPanelVisible) return;
|
||||||
|
|
||||||
|
_windowRect = GUI.Window(_windowId, _windowRect, DrawWindow, "Runtime Debug Panel");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawToggleButton()
|
||||||
|
{
|
||||||
|
const float width = 64f;
|
||||||
|
const float height = 30f;
|
||||||
|
Rect buttonRect = new Rect(Screen.width - width - 12f, 10f, width, height);
|
||||||
|
if (GUI.Button(buttonRect, "DEBUG"))
|
||||||
|
{
|
||||||
|
_isPanelVisible = !_isPanelVisible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawWindow(int windowId)
|
||||||
|
{
|
||||||
|
if (_showBuffSection)
|
||||||
|
{
|
||||||
|
EnsurePropList();
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.BeginVertical();
|
||||||
|
|
||||||
|
bool hasPreviousSection = false;
|
||||||
|
if (_showBuffSection)
|
||||||
|
{
|
||||||
|
DrawBuffSection();
|
||||||
|
hasPreviousSection = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasVisibleBattleSection())
|
||||||
|
{
|
||||||
|
if (hasPreviousSection)
|
||||||
|
{
|
||||||
|
GUILayout.Space(8f);
|
||||||
|
GUILayout.Label(string.Empty, GUI.skin.horizontalSlider);
|
||||||
|
GUILayout.Space(8f);
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawBattleSection();
|
||||||
|
hasPreviousSection = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_showTips)
|
||||||
|
{
|
||||||
|
if (hasPreviousSection)
|
||||||
|
{
|
||||||
|
GUILayout.Space(8f);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.Label("Tips: press `F8` or tap top-left corner 3 times to toggle.", GUILayout.Height(20f));
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.EndVertical();
|
||||||
|
GUI.DragWindow(new Rect(0, 0, 10000, 22));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawBuffSection()
|
||||||
|
{
|
||||||
|
GUILayout.Label("Buff Debug");
|
||||||
|
GUILayout.BeginHorizontal();
|
||||||
|
GUILayout.Label("Search", GUILayout.Width(52f));
|
||||||
|
_searchText = GUILayout.TextField(_searchText);
|
||||||
|
if (GUILayout.Button("Refresh", GUILayout.Width(80f)))
|
||||||
|
{
|
||||||
|
EnsurePropList(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
|
||||||
|
ApplyFilter(_searchText);
|
||||||
|
if (_displayNames.Length == 0)
|
||||||
|
{
|
||||||
|
GUILayout.Label("No Buff data. Enter battle and try again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_selectedIndex = Mathf.Clamp(_selectedIndex, 0, _displayNames.Length - 1);
|
||||||
|
_buffScroll = GUILayout.BeginScrollView(_buffScroll, GUILayout.Height(120f));
|
||||||
|
_selectedIndex = GUILayout.SelectionGrid(_selectedIndex, _displayNames, 1);
|
||||||
|
GUILayout.EndScrollView();
|
||||||
|
|
||||||
|
DRProp selectedProp = GetSelectedProp();
|
||||||
|
if (selectedProp == null) return;
|
||||||
|
|
||||||
|
GUILayout.Label($"Selected: {selectedProp.Title} ({selectedProp.Rarity})");
|
||||||
|
GUILayout.Label(ItemDescUtility.CreatePropDescription(selectedProp.Modifiers), GUILayout.Height(40f));
|
||||||
|
|
||||||
|
GUILayout.BeginHorizontal();
|
||||||
|
GUILayout.Label("Count", GUILayout.Width(52f));
|
||||||
|
string addCountText = GUILayout.TextField(_addCount.ToString(), GUILayout.Width(60f));
|
||||||
|
if (!int.TryParse(addCountText, out _addCount)) _addCount = 1;
|
||||||
|
_addCount = Mathf.Clamp(_addCount, 1, 99);
|
||||||
|
|
||||||
|
if (GUILayout.Button("Add Buff To Player", GUILayout.Height(24f)))
|
||||||
|
{
|
||||||
|
AddSelectedBuffToPlayer(selectedProp, _addCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawBattleSection()
|
||||||
|
{
|
||||||
|
GUILayout.Label("Battle Debug");
|
||||||
|
ProcedureGame procedure = GameEntry.Procedure.CurrentProcedure as ProcedureGame;
|
||||||
|
EnemyManagerComponent enemyManager = GameEntry.EnemyManager;
|
||||||
|
Player player = FindPlayer();
|
||||||
|
HealthComponent playerHealth = player != null ? player.GetComponent<HealthComponent>() : null;
|
||||||
|
|
||||||
|
if (enemyManager == null)
|
||||||
|
{
|
||||||
|
GUILayout.Label("EnemyManager unavailable.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (procedure == null)
|
||||||
|
{
|
||||||
|
GUILayout.Label("ProcedureGame unavailable.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_showBattleOverview)
|
||||||
|
{
|
||||||
|
GUILayout.Label($"Spawn Rate: {enemyManager.SpawnRateScale:F2}");
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Battle Time: {enemyManager.ElapsedBattleTime:F1}s / {enemyManager.BattleDuration:F1}s");
|
||||||
|
GUILayout.Label($"Enemy Count: {enemyManager.CurrentEnemyCount}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Simulation.SimulationWorld simulationWorld = GameEntry.SimulationWorld;
|
||||||
|
if (_showCollisionStats && simulationWorld != null)
|
||||||
|
{
|
||||||
|
GUILayout.Space(4f);
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Collision Queries: total {simulationWorld.LastCollisionQueryCount} (Projectile {simulationWorld.LastProjectileCollisionQueryCount} / Area {simulationWorld.LastAreaCollisionQueryCount})");
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Collision Candidates: total {simulationWorld.LastCollisionCandidateCount} (Projectile {simulationWorld.LastProjectileCollisionCandidateCount} / Area {simulationWorld.LastAreaCollisionCandidateCount})");
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Area Resolve: hits {simulationWorld.LastResolvedAreaHitCount}");
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Broad Phase: cell {simulationWorld.LastCollisionCellSize:F2}, hasEnemyTargets {(simulationWorld.LastCollisionHasEnemyTargets ? "Yes" : "No")}");
|
||||||
|
if (simulationWorld.LastCollisionCandidateCount != 0)
|
||||||
|
{
|
||||||
|
Log.Info($"LastCollisionCandidateCount:{simulationWorld.LastCollisionCandidateCount}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (simulationWorld.LastResolvedAreaHitCount != 0)
|
||||||
|
{
|
||||||
|
Log.Info($"LastResolvedAreaHitCount:{simulationWorld.LastResolvedAreaHitCount}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_showSpawnControls)
|
||||||
|
{
|
||||||
|
GUILayout.BeginHorizontal();
|
||||||
|
GUILayout.Label("Rate", GUILayout.Width(52f));
|
||||||
|
string rateText = GUILayout.TextField(_spawnRateScaleInput.ToString("F2"), GUILayout.Width(60f));
|
||||||
|
if (float.TryParse(rateText, out float parsedRate))
|
||||||
|
{
|
||||||
|
_spawnRateScaleInput = Mathf.Clamp(parsedRate, MinSpawnRate, 50f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Apply", GUILayout.Width(70f)))
|
||||||
|
{
|
||||||
|
enemyManager.SetSpawnRateScale(_spawnRateScaleInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("x0.5", GUILayout.Width(60f)))
|
||||||
|
{
|
||||||
|
_spawnRateScaleInput = Mathf.Max(MinSpawnRate, enemyManager.SpawnRateScale * 0.5f);
|
||||||
|
enemyManager.SetSpawnRateScale(_spawnRateScaleInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("x2", GUILayout.Width(60f)))
|
||||||
|
{
|
||||||
|
_spawnRateScaleInput = enemyManager.SpawnRateScale * 2f;
|
||||||
|
enemyManager.SetSpawnRateScale(_spawnRateScaleInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_showBattleDurationControls)
|
||||||
|
{
|
||||||
|
GUILayout.BeginHorizontal();
|
||||||
|
GUILayout.Label("Add Sec", GUILayout.Width(52f));
|
||||||
|
string durationText = GUILayout.TextField(_extendDurationSeconds.ToString("F0"), GUILayout.Width(60f));
|
||||||
|
if (float.TryParse(durationText, out float parsedDuration))
|
||||||
|
{
|
||||||
|
_extendDurationSeconds = Mathf.Clamp(parsedDuration, 1f, 3600f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Extend Battle", GUILayout.Height(24f)))
|
||||||
|
{
|
||||||
|
if (procedure.CurrentGameState is GameStateBattle gameState)
|
||||||
|
{
|
||||||
|
gameState.AddBattleDuration(_extendDurationSeconds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_showPlayerWeaponControls)
|
||||||
|
{
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Player Weapon: {(player == null ? "Player not found" : (player.WeaponEnabled ? "Enabled" : "Disabled"))}");
|
||||||
|
GUILayout.BeginHorizontal();
|
||||||
|
GUI.enabled = player != null;
|
||||||
|
if (GUILayout.Button("Disable Weapons", GUILayout.Height(24f)))
|
||||||
|
{
|
||||||
|
player.SetWeaponEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("Enable Weapons", GUILayout.Height(24f)))
|
||||||
|
{
|
||||||
|
player.SetWeaponEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
GUI.enabled = true;
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_showPlayerHealthControls)
|
||||||
|
{
|
||||||
|
GUILayout.Space(4f);
|
||||||
|
GUILayout.Label(
|
||||||
|
$"Player HP: {(playerHealth == null ? "Unavailable" : $"{playerHealth.CurrentHealth}/{playerHealth.MaxHealth}")}");
|
||||||
|
GUILayout.BeginHorizontal();
|
||||||
|
GUI.enabled = playerHealth != null;
|
||||||
|
if (GUILayout.Button($"+{DebugHealAmount} HP", GUILayout.Height(24f)))
|
||||||
|
{
|
||||||
|
AddPlayerHealth(playerHealth, DebugHealAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button(_lockPlayerHealthToMax ? "GodMode: ON" : "GodMode: OFF", GUILayout.Height(24f)))
|
||||||
|
{
|
||||||
|
_lockPlayerHealthToMax = !_lockPlayerHealthToMax;
|
||||||
|
if (_lockPlayerHealthToMax)
|
||||||
|
{
|
||||||
|
RestorePlayerHealthToMax(playerHealth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GUI.enabled = true;
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool HasVisibleBattleSection()
|
||||||
|
{
|
||||||
|
return _showBattleOverview ||
|
||||||
|
_showCollisionStats ||
|
||||||
|
_showSpawnControls ||
|
||||||
|
_showBattleDurationControls ||
|
||||||
|
_showPlayerWeaponControls ||
|
||||||
|
_showPlayerHealthControls;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsurePropList(bool force = false)
|
||||||
|
{
|
||||||
|
if (!force && _allProps != null && _allProps.Length > 0) return;
|
||||||
|
|
||||||
|
if (GameEntry.DataTable == null)
|
||||||
|
{
|
||||||
|
_allProps = Array.Empty<DRProp>();
|
||||||
|
_filteredProps = Array.Empty<DRProp>();
|
||||||
|
_displayNames = Array.Empty<string>();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var table = GameEntry.DataTable.GetDataTable<DRProp>();
|
||||||
|
_allProps = table != null ? table.ToArray() : Array.Empty<DRProp>();
|
||||||
|
_selectedIndex = Mathf.Clamp(_selectedIndex, 0, Mathf.Max(0, _allProps.Length - 1));
|
||||||
|
ApplyFilter(_searchText);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyFilter(string keyword)
|
||||||
|
{
|
||||||
|
if (_allProps == null || _allProps.Length == 0)
|
||||||
|
{
|
||||||
|
_filteredProps = Array.Empty<DRProp>();
|
||||||
|
_displayNames = Array.Empty<string>();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(keyword))
|
||||||
|
{
|
||||||
|
_filteredProps = _allProps;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string search = keyword.Trim();
|
||||||
|
_filteredProps = _allProps.Where(p =>
|
||||||
|
p != null &&
|
||||||
|
(p.Title?.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 ||
|
||||||
|
p.Id.ToString().Contains(search))).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
_displayNames = _filteredProps.Select(p => $"[{p.Id}] {p.Title} ({p.Rarity})").ToArray();
|
||||||
|
if (_displayNames.Length == 0) _selectedIndex = 0;
|
||||||
|
else _selectedIndex = Mathf.Clamp(_selectedIndex, 0, _displayNames.Length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DRProp GetSelectedProp()
|
||||||
|
{
|
||||||
|
if (_filteredProps == null || _filteredProps.Length == 0) return null;
|
||||||
|
_selectedIndex = Mathf.Clamp(_selectedIndex, 0, _filteredProps.Length - 1);
|
||||||
|
return _filteredProps[_selectedIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Player FindPlayer()
|
||||||
|
{
|
||||||
|
return UnityEngine.Object.FindObjectOfType<Player>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void KeepPlayerHealthAtMax()
|
||||||
|
{
|
||||||
|
Player player = FindPlayer();
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
HealthComponent playerHealth = player.GetComponent<HealthComponent>();
|
||||||
|
if (playerHealth == null) return;
|
||||||
|
|
||||||
|
RestorePlayerHealthToMax(playerHealth);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddPlayerHealth(HealthComponent playerHealth, int amount)
|
||||||
|
{
|
||||||
|
if (playerHealth == null || amount <= 0) return;
|
||||||
|
if (playerHealth.CurrentHealth <= 0) return;
|
||||||
|
|
||||||
|
int maxHealth = playerHealth.MaxHealth;
|
||||||
|
if (maxHealth <= 0) return;
|
||||||
|
|
||||||
|
int nextHealth = Mathf.Clamp(playerHealth.CurrentHealth + amount, 0, maxHealth);
|
||||||
|
if (nextHealth == playerHealth.CurrentHealth) return;
|
||||||
|
|
||||||
|
playerHealth.CurrentHealth = nextHealth;
|
||||||
|
PublishPlayerHealthChanged(playerHealth);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RestorePlayerHealthToMax(HealthComponent playerHealth)
|
||||||
|
{
|
||||||
|
if (playerHealth == null) return;
|
||||||
|
if (playerHealth.CurrentHealth <= 0) return;
|
||||||
|
|
||||||
|
int maxHealth = playerHealth.MaxHealth;
|
||||||
|
if (maxHealth <= 0 || playerHealth.CurrentHealth >= maxHealth) return;
|
||||||
|
|
||||||
|
playerHealth.CurrentHealth = maxHealth;
|
||||||
|
PublishPlayerHealthChanged(playerHealth);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PublishPlayerHealthChanged(HealthComponent playerHealth)
|
||||||
|
{
|
||||||
|
if (playerHealth == null || GameEntry.Event == null) return;
|
||||||
|
|
||||||
|
GameEntry.Event.Fire(null,
|
||||||
|
PlayerHealthChangeEventArgs.Create(0, playerHealth.CurrentHealth, playerHealth.MaxHealth));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddSelectedBuffToPlayer(DRProp prop, int count)
|
||||||
|
{
|
||||||
|
Player player = FindPlayer();
|
||||||
|
if (player == null || prop == null || prop.Modifiers == null) return;
|
||||||
|
|
||||||
|
int applyCount = Mathf.Clamp(count, 1, 99);
|
||||||
|
for (int i = 0; i < applyCount; i++)
|
||||||
|
{
|
||||||
|
player.AddProp(new PropItem(prop.Modifiers, prop.Rarity, prop.Title, prop.IconAssetName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleCornerTapGesture()
|
||||||
|
{
|
||||||
|
if (!TryGetTouchReleased(out Vector2 touchPosition)) return;
|
||||||
|
if (touchPosition.x > 80f || touchPosition.y < Screen.height - 80f) return;
|
||||||
|
|
||||||
|
float now = Time.unscaledTime;
|
||||||
|
if (now - _lastCornerTapTime > CornerTapWindow)
|
||||||
|
{
|
||||||
|
_cornerTapCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_lastCornerTapTime = now;
|
||||||
|
_cornerTapCount++;
|
||||||
|
|
||||||
|
if (_cornerTapCount >= RequiredCornerTapCount)
|
||||||
|
{
|
||||||
|
_cornerTapCount = 0;
|
||||||
|
_isPanelVisible = !_isPanelVisible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsTogglePressed()
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
Keyboard keyboard = Keyboard.current;
|
||||||
|
if (keyboard == null) return false;
|
||||||
|
return keyboard.backquoteKey.wasPressedThisFrame || keyboard.f8Key.wasPressedThisFrame;
|
||||||
|
#else
|
||||||
|
return Input.GetKeyDown(KeyCode.BackQuote) || Input.GetKeyDown(KeyCode.F8);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryGetTouchReleased(out Vector2 touchPosition)
|
||||||
|
{
|
||||||
|
#if ENABLE_INPUT_SYSTEM
|
||||||
|
Touchscreen touchscreen = Touchscreen.current;
|
||||||
|
if (touchscreen == null)
|
||||||
|
{
|
||||||
|
touchPosition = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var touch = touchscreen.primaryTouch;
|
||||||
|
if (!touch.press.wasReleasedThisFrame)
|
||||||
|
{
|
||||||
|
touchPosition = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
touchPosition = touch.position.ReadValue();
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
if (Input.touchCount <= 0)
|
||||||
|
{
|
||||||
|
touchPosition = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Touch touch = Input.GetTouch(0);
|
||||||
|
if (touch.phase != TouchPhase.Ended)
|
||||||
|
{
|
||||||
|
touchPosition = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
touchPosition = touch.position;
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -1,11 +1,4 @@
|
||||||
//------------------------------------------------------------
|
using Entity.EntityData;
|
||||||
// Game Framework
|
|
||||||
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
|
|
||||||
// Homepage: https://gameframework.cn/
|
|
||||||
// Feedback: mailto:ellan@gameframework.cn
|
|
||||||
//------------------------------------------------------------
|
|
||||||
|
|
||||||
using Entity.EntityData;
|
|
||||||
using GameFramework;
|
using GameFramework;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,9 @@
|
||||||
"references": [
|
"references": [
|
||||||
"GUID:47a82ffa13c291447ab895cd0bc251cd",
|
"GUID:47a82ffa13c291447ab895cd0bc251cd",
|
||||||
"GUID:363c5eb08ff8e6a439b85e37b8c20d96",
|
"GUID:363c5eb08ff8e6a439b85e37b8c20d96",
|
||||||
"GUID:a2d8a19598eca814496b089021d08d60"
|
"GUID:a2d8a19598eca814496b089021d08d60",
|
||||||
|
"GUID:6f6ea874d7669044095abb01ec4c2f8d",
|
||||||
|
"GUID:0e1d182005e0ae647ab3fa40f5492dbb"
|
||||||
],
|
],
|
||||||
"includePlatforms": [
|
"includePlatforms": [
|
||||||
"Editor"
|
"Editor"
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
using StarForce;
|
using StarForce;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Serialization;
|
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,5 +7,19 @@ namespace UI
|
||||||
public string IconAssetName;
|
public string IconAssetName;
|
||||||
public ItemRarity Rarity;
|
public ItemRarity Rarity;
|
||||||
public bool IsWeapon;
|
public bool IsWeapon;
|
||||||
|
|
||||||
|
public DisplayItemContext()
|
||||||
|
{
|
||||||
|
IconAssetName = string.Empty;
|
||||||
|
Rarity = ItemRarity.None;
|
||||||
|
IsWeapon = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DisplayItemContext(DisplayItemRawData rawData)
|
||||||
|
{
|
||||||
|
this.IconAssetName = rawData.IconAssetName;
|
||||||
|
this.Rarity = rawData.Rarity;
|
||||||
|
this.IsWeapon = rawData.IsWeapon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11,5 +11,15 @@ namespace UI
|
||||||
public Sprite Icon;
|
public Sprite Icon;
|
||||||
public string Description;
|
public string Description;
|
||||||
public int Price;
|
public int Price;
|
||||||
|
|
||||||
|
public GoodsItemContext(GoodsItemRawData rawData)
|
||||||
|
{
|
||||||
|
Title = rawData.Title;
|
||||||
|
Description = rawData.Description;
|
||||||
|
Price = rawData.Price;
|
||||||
|
Rarity = rawData.Rarity;
|
||||||
|
Type = rawData.Type;
|
||||||
|
Icon = rawData.Icon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -51,12 +51,18 @@ namespace UI
|
||||||
|
|
||||||
_rawData = rawData;
|
_rawData = rawData;
|
||||||
|
|
||||||
|
List<GoodsItemContext> goodsItems = new List<GoodsItemContext>();
|
||||||
|
foreach (var item in rawData.GoodsItems)
|
||||||
|
{
|
||||||
|
goodsItems.Add(new GoodsItemContext(item));
|
||||||
|
}
|
||||||
|
|
||||||
return new ShopFormContext
|
return new ShopFormContext
|
||||||
{
|
{
|
||||||
CurrentLevel = rawData.CurrentLevel,
|
CurrentLevel = rawData.CurrentLevel,
|
||||||
RefreshPrice = rawData.RefreshPrice,
|
RefreshPrice = rawData.RefreshPrice,
|
||||||
PlayerCoin = rawData.PlayerCoin,
|
PlayerCoin = rawData.PlayerCoin,
|
||||||
GoodsItems = rawData.GoodsItems,
|
GoodsItems = goodsItems,
|
||||||
PropListContext =
|
PropListContext =
|
||||||
BuildDisplayListAreaContext(DisplayListAreaType.Prop, rawData.PropItems, rawData.PropMaxCount),
|
BuildDisplayListAreaContext(DisplayListAreaType.Prop, rawData.PropItems, rawData.PropMaxCount),
|
||||||
WeaponListContext = BuildDisplayListAreaContext(DisplayListAreaType.Weapon, rawData.WeaponItems,
|
WeaponListContext = BuildDisplayListAreaContext(DisplayListAreaType.Weapon, rawData.WeaponItems,
|
||||||
|
|
@ -267,7 +273,18 @@ namespace UI
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context.GoodsItems = result.GoodsItems;
|
for (int i = 0; i < result.GoodsItems.Count; i++)
|
||||||
|
{
|
||||||
|
if (i < Context.GoodsItems.Count) Context.GoodsItems[i] = new GoodsItemContext(result.GoodsItems[i]);
|
||||||
|
else Context.GoodsItems.Add(new GoodsItemContext(result.GoodsItems[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Context.GoodsItems.Count != result.GoodsItems.Count)
|
||||||
|
{
|
||||||
|
Context.GoodsItems.RemoveRange(Context.GoodsItems.Count,
|
||||||
|
Context.GoodsItems.Count - Context.GoodsItems.Count);
|
||||||
|
}
|
||||||
|
|
||||||
Context.RefreshPrice = result.RefreshPrice;
|
Context.RefreshPrice = result.RefreshPrice;
|
||||||
|
|
||||||
if (Form == null)
|
if (Form == null)
|
||||||
|
|
@ -276,8 +293,8 @@ namespace UI
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Form.RefreshGoodsItems(result.GoodsItems);
|
Form.RefreshGoodsItems(Context.GoodsItems);
|
||||||
Form.RefreshRefreshPrice(result.RefreshPrice);
|
Form.RefreshRefreshPrice(Context.RefreshPrice);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ApplyGoodsPurchased(ShopPurchaseResult result)
|
private void ApplyGoodsPurchased(ShopPurchaseResult result)
|
||||||
|
|
@ -299,19 +316,21 @@ namespace UI
|
||||||
Context.GoodsItems[result.GoodsIndex] = null;
|
Context.GoodsItems[result.GoodsIndex] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisplayItemContext context = new DisplayItemContext(result.DisplayItem);
|
||||||
|
|
||||||
if (result.DisplayItem != null)
|
if (result.DisplayItem != null)
|
||||||
{
|
{
|
||||||
if (result.DisplayItem.IsWeapon)
|
if (result.DisplayItem.IsWeapon)
|
||||||
{
|
{
|
||||||
AppendDisplayItemContext(Context.WeaponListContext, result.DisplayItem);
|
AppendDisplayItemContext(Context.WeaponListContext, context);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AppendDisplayItemContext(Context.PropListContext, result.DisplayItem);
|
AppendDisplayItemContext(Context.PropListContext, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Form?.ApplyGoodsPurchased(result.GoodsIndex, result.DisplayItem);
|
Form?.ApplyGoodsPurchased(result.GoodsIndex, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsCurrentFormEventSender(object sender)
|
private bool IsCurrentFormEventSender(object sender)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name": "SepCore.Presentation",
|
||||||
|
"rootNamespace": "SepCore.UI",
|
||||||
|
"references": [
|
||||||
|
"GUID:6055be8ebefd69e48b49212b09b47b2f",
|
||||||
|
"GUID:47a82ffa13c291447ab895cd0bc251cd",
|
||||||
|
"GUID:363c5eb08ff8e6a439b85e37b8c20d96"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0e1d182005e0ae647ab3fa40f5492dbb
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -1,11 +1,4 @@
|
||||||
//------------------------------------------------------------
|
using GameFramework;
|
||||||
// Game Framework
|
|
||||||
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
|
|
||||||
// Homepage: https://gameframework.cn/
|
|
||||||
// Feedback: mailto:ellan@gameframework.cn
|
|
||||||
//------------------------------------------------------------
|
|
||||||
|
|
||||||
using GameFramework;
|
|
||||||
using GameFramework.Event;
|
using GameFramework.Event;
|
||||||
using GameFramework.Resource;
|
using GameFramework.Resource;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ using GameFramework;
|
||||||
using GameFramework.Event;
|
using GameFramework.Event;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using SepCore.Definition;
|
using SepCore.Definition;
|
||||||
using StarForce;
|
|
||||||
using UI;
|
using UI;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
|
|
@ -19,13 +18,7 @@ namespace Procedure
|
||||||
private List<UpdateLengthData> m_UpdateLengthData = new List<UpdateLengthData>();
|
private List<UpdateLengthData> m_UpdateLengthData = new List<UpdateLengthData>();
|
||||||
private UpdateResourceForm m_UpdateResourceForm = null;
|
private UpdateResourceForm m_UpdateResourceForm = null;
|
||||||
|
|
||||||
public override bool UseNativeDialog
|
public override bool UseNativeDialog => true;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnEnter(ProcedureOwner procedureOwner)
|
protected override void OnEnter(ProcedureOwner procedureOwner)
|
||||||
{
|
{
|
||||||
|
|
@ -55,7 +48,10 @@ namespace Procedure
|
||||||
ConfirmText = GameEntry.Localization.GetString("UpdateResourceViaCarrierDataNetwork.UpdateButton"),
|
ConfirmText = GameEntry.Localization.GetString("UpdateResourceViaCarrierDataNetwork.UpdateButton"),
|
||||||
OnClickConfirm = StartUpdateResources,
|
OnClickConfirm = StartUpdateResources,
|
||||||
CancelText = GameEntry.Localization.GetString("UpdateResourceViaCarrierDataNetwork.QuitButton"),
|
CancelText = GameEntry.Localization.GetString("UpdateResourceViaCarrierDataNetwork.QuitButton"),
|
||||||
OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit); },
|
OnClickCancel = delegate(object userData)
|
||||||
|
{
|
||||||
|
UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
@ -96,7 +92,8 @@ namespace Procedure
|
||||||
{
|
{
|
||||||
if (m_UpdateResourceForm == null)
|
if (m_UpdateResourceForm == null)
|
||||||
{
|
{
|
||||||
m_UpdateResourceForm = Object.Instantiate(GameEntry.BuiltinData.UpdateResourceFormTemplate);
|
m_UpdateResourceForm = Object.Instantiate(GameEntry.BuiltinData.UpdateResourceFormTemplate)
|
||||||
|
.GetComponent<UpdateResourceForm>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Info("Start update resources...");
|
Log.Info("Start update resources...");
|
||||||
|
|
@ -112,7 +109,10 @@ namespace Procedure
|
||||||
}
|
}
|
||||||
|
|
||||||
float progressTotal = (float)currentTotalUpdateLength / m_UpdateTotalCompressedLength;
|
float progressTotal = (float)currentTotalUpdateLength / m_UpdateTotalCompressedLength;
|
||||||
string descriptionText = GameEntry.Localization.GetString("UpdateResource.Tips", m_UpdateSuccessCount.ToString(), m_UpdateCount.ToString(), GetByteLengthString(currentTotalUpdateLength), GetByteLengthString(m_UpdateTotalCompressedLength), progressTotal, GetByteLengthString((int)GameEntry.Download.CurrentSpeed));
|
string descriptionText = GameEntry.Localization.GetString("UpdateResource.Tips",
|
||||||
|
m_UpdateSuccessCount.ToString(), m_UpdateCount.ToString(),
|
||||||
|
GetByteLengthString(currentTotalUpdateLength), GetByteLengthString(m_UpdateTotalCompressedLength),
|
||||||
|
progressTotal, GetByteLengthString((int)GameEntry.Download.CurrentSpeed));
|
||||||
m_UpdateResourceForm.SetProgress(progressTotal, descriptionText);
|
m_UpdateResourceForm.SetProgress(progressTotal, descriptionText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -223,12 +223,14 @@ namespace Procedure
|
||||||
ResourceUpdateFailureEventArgs ne = (ResourceUpdateFailureEventArgs)e;
|
ResourceUpdateFailureEventArgs ne = (ResourceUpdateFailureEventArgs)e;
|
||||||
if (ne.RetryCount >= ne.TotalRetryCount)
|
if (ne.RetryCount >= ne.TotalRetryCount)
|
||||||
{
|
{
|
||||||
Log.Error("Update resource '{0}' failure from '{1}' with error message '{2}', retry count '{3}'.", ne.Name, ne.DownloadUri, ne.ErrorMessage, ne.RetryCount.ToString());
|
Log.Error("Update resource '{0}' failure from '{1}' with error message '{2}', retry count '{3}'.",
|
||||||
|
ne.Name, ne.DownloadUri, ne.ErrorMessage, ne.RetryCount.ToString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Info("Update resource '{0}' failure from '{1}' with error message '{2}', retry count '{3}'.", ne.Name, ne.DownloadUri, ne.ErrorMessage, ne.RetryCount.ToString());
|
Log.Info("Update resource '{0}' failure from '{1}' with error message '{2}', retry count '{3}'.",
|
||||||
|
ne.Name, ne.DownloadUri, ne.ErrorMessage, ne.RetryCount.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < m_UpdateLengthData.Count; i++)
|
for (int i = 0; i < m_UpdateLengthData.Count; i++)
|
||||||
|
|
@ -255,17 +257,10 @@ namespace Procedure
|
||||||
|
|
||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
get
|
get { return m_Name; }
|
||||||
{
|
|
||||||
return m_Name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Length
|
public int Length { get; set; }
|
||||||
{
|
|
||||||
get;
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ namespace Procedure
|
||||||
|
|
||||||
_procedureGame = master;
|
_procedureGame = master;
|
||||||
|
|
||||||
var useCase = new LevelUpFormUseCase(_procedureGame.Player, this);
|
var useCase = new LevelUpFormUseCase(_procedureGame.Player, () => IsCompleted = true);
|
||||||
GameEntry.UIRouter.BindUIUseCase(UIFormType.LevelUpForm, useCase);
|
GameEntry.UIRouter.BindUIUseCase(UIFormType.LevelUpForm, useCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ namespace Procedure
|
||||||
Log.Debug("GameStateShop::OnInit");
|
Log.Debug("GameStateShop::OnInit");
|
||||||
_procedureGame = master;
|
_procedureGame = master;
|
||||||
|
|
||||||
var shopFormUseCase = new ShopFormUseCase(_procedureGame, this);
|
var shopFormUseCase = new ShopFormUseCase(_procedureGame.Player, _procedureGame.CurrentLevel, () => ShopFinish = true);
|
||||||
GameEntry.UIRouter.BindUIUseCase(UIFormType.ShopForm, shopFormUseCase);
|
GameEntry.UIRouter.BindUIUseCase(UIFormType.ShopForm, shopFormUseCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ namespace Procedure
|
||||||
|
|
||||||
GameEntry.UIRouter.OpenUI(UIFormType.StartMenuForm);
|
GameEntry.UIRouter.OpenUI(UIFormType.StartMenuForm);
|
||||||
|
|
||||||
var useCase2 = new SelectRoleFormUseCase(this);
|
var useCase2 = new SelectRoleFormUseCase(roleId => StartGame(roleId));
|
||||||
GameEntry.UIRouter.BindUIUseCase(UIFormType.SelectRoleForm, useCase2);
|
GameEntry.UIRouter.BindUIUseCase(UIFormType.SelectRoleForm, useCase2);
|
||||||
|
|
||||||
QualitySettings.vSyncCount = 0;
|
QualitySettings.vSyncCount = 0;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "SepCore.Procedure",
|
||||||
|
"rootNamespace": "SepCore.Procedure",
|
||||||
|
"references": [
|
||||||
|
"GUID:363c5eb08ff8e6a439b85e37b8c20d96",
|
||||||
|
"GUID:47a82ffa13c291447ab895cd0bc251cd",
|
||||||
|
"GUID:0e1d182005e0ae647ab3fa40f5492dbb",
|
||||||
|
"GUID:6055be8ebefd69e48b49212b09b47b2f"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6f6ea874d7669044095abb01ec4c2f8d
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -1,14 +1,5 @@
|
||||||
//------------------------------------------------------------
|
using CustomComponent;
|
||||||
// Game Framework
|
|
||||||
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
|
|
||||||
// Homepage: https://gameframework.cn/
|
|
||||||
// Feedback: mailto:ellan@gameframework.cn
|
|
||||||
//------------------------------------------------------------
|
|
||||||
|
|
||||||
using CustomComponent;
|
|
||||||
using Simulation;
|
using Simulation;
|
||||||
using StarForce;
|
|
||||||
using UI;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -22,10 +13,6 @@ public partial class GameEntry : MonoBehaviour
|
||||||
|
|
||||||
public static DamageTextComponent DamageText { get; private set; }
|
public static DamageTextComponent DamageText { get; private set; }
|
||||||
|
|
||||||
#if UNITY_EDITOR || DEVELOPMENT_BUILD
|
|
||||||
public static RuntimeDebugPanelComponent RuntimeDebugPanel { get; private set; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public static EnemyManagerComponent EnemyManager { get; private set; }
|
public static EnemyManagerComponent EnemyManager { get; private set; }
|
||||||
|
|
||||||
public static SimulationWorld SimulationWorld { get; private set; }
|
public static SimulationWorld SimulationWorld { get; private set; }
|
||||||
|
|
@ -39,17 +26,8 @@ public partial class GameEntry : MonoBehaviour
|
||||||
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
|
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
|
||||||
HPBar = UnityGameFramework.Runtime.GameEntry.GetComponent<HPBarComponent>();
|
HPBar = UnityGameFramework.Runtime.GameEntry.GetComponent<HPBarComponent>();
|
||||||
DamageText = UnityGameFramework.Runtime.GameEntry.GetComponent<DamageTextComponent>();
|
DamageText = UnityGameFramework.Runtime.GameEntry.GetComponent<DamageTextComponent>();
|
||||||
|
|
||||||
#if UNITY_EDITOR || DEVELOPMENT_BUILD
|
|
||||||
RuntimeDebugPanel = UnityGameFramework.Runtime.GameEntry.GetComponent<RuntimeDebugPanelComponent>();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EnemyManager = UnityGameFramework.Runtime.GameEntry.GetComponent<EnemyManagerComponent>();
|
EnemyManager = UnityGameFramework.Runtime.GameEntry.GetComponent<EnemyManagerComponent>();
|
||||||
SimulationWorld = UnityGameFramework.Runtime.GameEntry.GetComponent<SimulationWorld>();
|
SimulationWorld = UnityGameFramework.Runtime.GameEntry.GetComponent<SimulationWorld>();
|
||||||
if (SimulationWorld == null && Base != null)
|
|
||||||
{
|
|
||||||
SimulationWorld = Base.gameObject.AddComponent<SimulationWorld>();
|
|
||||||
}
|
|
||||||
SpriteCache = UnityGameFramework.Runtime.GameEntry.GetComponent<SpriteCacheComponent>();
|
SpriteCache = UnityGameFramework.Runtime.GameEntry.GetComponent<SpriteCacheComponent>();
|
||||||
UIRouter = UnityGameFramework.Runtime.GameEntry.GetComponent<UIRouterComponent>();
|
UIRouter = UnityGameFramework.Runtime.GameEntry.GetComponent<UIRouterComponent>();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,48 +10,37 @@ using GameFramework;
|
||||||
using StarForce;
|
using StarForce;
|
||||||
using UI;
|
using UI;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using UnityEngine.Serialization;
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
|
|
||||||
namespace CustomComponent
|
namespace CustomComponent
|
||||||
{
|
{
|
||||||
public class BuiltinDataComponent : GameFrameworkComponent
|
public class BuiltinDataComponent : GameFrameworkComponent
|
||||||
{
|
{
|
||||||
[SerializeField]
|
[FormerlySerializedAs("m_BuildInfoTextAsset")] [SerializeField]
|
||||||
private TextAsset m_BuildInfoTextAsset = null;
|
private TextAsset _buildInfoTextAsset = null;
|
||||||
|
|
||||||
[SerializeField]
|
[FormerlySerializedAs("m_DefaultDictionaryTextAsset")] [SerializeField]
|
||||||
private TextAsset m_DefaultDictionaryTextAsset = null;
|
private TextAsset _defaultDictionaryTextAsset = null;
|
||||||
|
|
||||||
[SerializeField]
|
[FormerlySerializedAs("m_UpdateResourceFormTemplate")] [SerializeField]
|
||||||
private UpdateResourceForm m_UpdateResourceFormTemplate = null;
|
private GameObject _updateResourceFormTemplate = null;
|
||||||
|
|
||||||
private BuildInfo m_BuildInfo = null;
|
private BuildInfo m_BuildInfo = null;
|
||||||
|
|
||||||
public BuildInfo BuildInfo
|
public BuildInfo BuildInfo => m_BuildInfo;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_BuildInfo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public UpdateResourceForm UpdateResourceFormTemplate
|
public GameObject UpdateResourceFormTemplate => _updateResourceFormTemplate;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_UpdateResourceFormTemplate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void InitBuildInfo()
|
public void InitBuildInfo()
|
||||||
{
|
{
|
||||||
if (m_BuildInfoTextAsset == null || string.IsNullOrEmpty(m_BuildInfoTextAsset.text))
|
if (_buildInfoTextAsset == null || string.IsNullOrEmpty(_buildInfoTextAsset.text))
|
||||||
{
|
{
|
||||||
Log.Info("Build info can not be found or empty.");
|
Log.Info("Build info can not be found or empty.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_BuildInfo = Utility.Json.ToObject<BuildInfo>(m_BuildInfoTextAsset.text);
|
m_BuildInfo = Utility.Json.ToObject<BuildInfo>(_buildInfoTextAsset.text);
|
||||||
if (m_BuildInfo == null)
|
if (m_BuildInfo == null)
|
||||||
{
|
{
|
||||||
Log.Warning("Parse build info failure.");
|
Log.Warning("Parse build info failure.");
|
||||||
|
|
@ -61,13 +50,13 @@ namespace CustomComponent
|
||||||
|
|
||||||
public void InitDefaultDictionary()
|
public void InitDefaultDictionary()
|
||||||
{
|
{
|
||||||
if (m_DefaultDictionaryTextAsset == null || string.IsNullOrEmpty(m_DefaultDictionaryTextAsset.text))
|
if (_defaultDictionaryTextAsset == null || string.IsNullOrEmpty(_defaultDictionaryTextAsset.text))
|
||||||
{
|
{
|
||||||
Log.Info("Default dictionary can not be found or empty.");
|
Log.Info("Default dictionary can not be found or empty.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GameEntry.Localization.ParseData(m_DefaultDictionaryTextAsset.text))
|
if (!GameEntry.Localization.ParseData(_defaultDictionaryTextAsset.text))
|
||||||
{
|
{
|
||||||
Log.Warning("Parse default dictionary failure.");
|
Log.Warning("Parse default dictionary failure.");
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -1,527 +0,0 @@
|
||||||
#if UNITY_EDITOR || DEVELOPMENT_BUILD
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using Components;
|
|
||||||
using SepCore.Event;
|
|
||||||
using SepCore.DataTable;
|
|
||||||
using SepCore.Definition;
|
|
||||||
using Entity;
|
|
||||||
using CustomUtility;
|
|
||||||
using Procedure;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityGameFramework.Runtime;
|
|
||||||
#if ENABLE_INPUT_SYSTEM
|
|
||||||
using UnityEngine.InputSystem;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace CustomComponent
|
|
||||||
{
|
|
||||||
public class RuntimeDebugPanelComponent : GameFrameworkComponent
|
|
||||||
{
|
|
||||||
private const float MinSpawnRate = 0.1f;
|
|
||||||
private const float CornerTapWindow = 0.6f;
|
|
||||||
private const int RequiredCornerTapCount = 3;
|
|
||||||
private const int DebugHealAmount = 200;
|
|
||||||
|
|
||||||
[Header("Window Content")]
|
|
||||||
[SerializeField] private bool _showBuffSection = true;
|
|
||||||
[SerializeField] private bool _showBattleOverview = true;
|
|
||||||
[SerializeField] private bool _showCollisionStats = true;
|
|
||||||
[SerializeField] private bool _showSpawnControls = true;
|
|
||||||
[SerializeField] private bool _showBattleDurationControls = true;
|
|
||||||
[SerializeField] private bool _showPlayerWeaponControls = true;
|
|
||||||
[SerializeField] private bool _showPlayerHealthControls = true;
|
|
||||||
[SerializeField] private bool _showTips = true;
|
|
||||||
|
|
||||||
private Rect _windowRect = new Rect(20f, 60f, 460f, 800f);
|
|
||||||
private bool _isPanelVisible;
|
|
||||||
private int _windowId;
|
|
||||||
|
|
||||||
private string _searchText = string.Empty;
|
|
||||||
private int _selectedIndex;
|
|
||||||
private int _addCount = 1;
|
|
||||||
private Vector2 _buffScroll;
|
|
||||||
|
|
||||||
private float _spawnRateScaleInput = 1f;
|
|
||||||
private float _extendDurationSeconds = 30f;
|
|
||||||
|
|
||||||
private DRProp[] _allProps = Array.Empty<DRProp>();
|
|
||||||
private DRProp[] _filteredProps = Array.Empty<DRProp>();
|
|
||||||
private string[] _displayNames = Array.Empty<string>();
|
|
||||||
|
|
||||||
private int _cornerTapCount;
|
|
||||||
private float _lastCornerTapTime = -10f;
|
|
||||||
private bool _lockPlayerHealthToMax;
|
|
||||||
|
|
||||||
protected override void Awake()
|
|
||||||
{
|
|
||||||
base.Awake();
|
|
||||||
|
|
||||||
_windowId = GetInstanceID();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Update()
|
|
||||||
{
|
|
||||||
if (IsTogglePressed())
|
|
||||||
{
|
|
||||||
_isPanelVisible = !_isPanelVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
HandleCornerTapGesture();
|
|
||||||
if (_lockPlayerHealthToMax)
|
|
||||||
{
|
|
||||||
KeepPlayerHealthAtMax();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnGUI()
|
|
||||||
{
|
|
||||||
DrawToggleButton();
|
|
||||||
if (!_isPanelVisible) return;
|
|
||||||
|
|
||||||
_windowRect = GUI.Window(_windowId, _windowRect, DrawWindow, "Runtime Debug Panel");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DrawToggleButton()
|
|
||||||
{
|
|
||||||
const float width = 64f;
|
|
||||||
const float height = 30f;
|
|
||||||
Rect buttonRect = new Rect(Screen.width - width - 12f, 10f, width, height);
|
|
||||||
if (GUI.Button(buttonRect, "DEBUG"))
|
|
||||||
{
|
|
||||||
_isPanelVisible = !_isPanelVisible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DrawWindow(int windowId)
|
|
||||||
{
|
|
||||||
if (_showBuffSection)
|
|
||||||
{
|
|
||||||
EnsurePropList();
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.BeginVertical();
|
|
||||||
|
|
||||||
bool hasPreviousSection = false;
|
|
||||||
if (_showBuffSection)
|
|
||||||
{
|
|
||||||
DrawBuffSection();
|
|
||||||
hasPreviousSection = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HasVisibleBattleSection())
|
|
||||||
{
|
|
||||||
if (hasPreviousSection)
|
|
||||||
{
|
|
||||||
GUILayout.Space(8f);
|
|
||||||
GUILayout.Label(string.Empty, GUI.skin.horizontalSlider);
|
|
||||||
GUILayout.Space(8f);
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawBattleSection();
|
|
||||||
hasPreviousSection = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_showTips)
|
|
||||||
{
|
|
||||||
if (hasPreviousSection)
|
|
||||||
{
|
|
||||||
GUILayout.Space(8f);
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.Label("Tips: press `F8` or tap top-left corner 3 times to toggle.", GUILayout.Height(20f));
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.EndVertical();
|
|
||||||
GUI.DragWindow(new Rect(0, 0, 10000, 22));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DrawBuffSection()
|
|
||||||
{
|
|
||||||
GUILayout.Label("Buff Debug");
|
|
||||||
GUILayout.BeginHorizontal();
|
|
||||||
GUILayout.Label("Search", GUILayout.Width(52f));
|
|
||||||
_searchText = GUILayout.TextField(_searchText);
|
|
||||||
if (GUILayout.Button("Refresh", GUILayout.Width(80f)))
|
|
||||||
{
|
|
||||||
EnsurePropList(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.EndHorizontal();
|
|
||||||
|
|
||||||
ApplyFilter(_searchText);
|
|
||||||
if (_displayNames.Length == 0)
|
|
||||||
{
|
|
||||||
GUILayout.Label("No Buff data. Enter battle and try again.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_selectedIndex = Mathf.Clamp(_selectedIndex, 0, _displayNames.Length - 1);
|
|
||||||
_buffScroll = GUILayout.BeginScrollView(_buffScroll, GUILayout.Height(120f));
|
|
||||||
_selectedIndex = GUILayout.SelectionGrid(_selectedIndex, _displayNames, 1);
|
|
||||||
GUILayout.EndScrollView();
|
|
||||||
|
|
||||||
DRProp selectedProp = GetSelectedProp();
|
|
||||||
if (selectedProp == null) return;
|
|
||||||
|
|
||||||
GUILayout.Label($"Selected: {selectedProp.Title} ({selectedProp.Rarity})");
|
|
||||||
GUILayout.Label(ItemDescUtility.CreatePropDescription(selectedProp.Modifiers), GUILayout.Height(40f));
|
|
||||||
|
|
||||||
GUILayout.BeginHorizontal();
|
|
||||||
GUILayout.Label("Count", GUILayout.Width(52f));
|
|
||||||
string addCountText = GUILayout.TextField(_addCount.ToString(), GUILayout.Width(60f));
|
|
||||||
if (!int.TryParse(addCountText, out _addCount)) _addCount = 1;
|
|
||||||
_addCount = Mathf.Clamp(_addCount, 1, 99);
|
|
||||||
|
|
||||||
if (GUILayout.Button("Add Buff To Player", GUILayout.Height(24f)))
|
|
||||||
{
|
|
||||||
AddSelectedBuffToPlayer(selectedProp, _addCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.EndHorizontal();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DrawBattleSection()
|
|
||||||
{
|
|
||||||
GUILayout.Label("Battle Debug");
|
|
||||||
ProcedureGame procedure = GameEntry.Procedure.CurrentProcedure as ProcedureGame;
|
|
||||||
EnemyManagerComponent enemyManager = GameEntry.EnemyManager;
|
|
||||||
Player player = FindPlayer();
|
|
||||||
HealthComponent playerHealth = player != null ? player.GetComponent<HealthComponent>() : null;
|
|
||||||
|
|
||||||
if (enemyManager == null)
|
|
||||||
{
|
|
||||||
GUILayout.Label("EnemyManager unavailable.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (procedure == null)
|
|
||||||
{
|
|
||||||
GUILayout.Label("ProcedureGame unavailable.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_showBattleOverview)
|
|
||||||
{
|
|
||||||
GUILayout.Label($"Spawn Rate: {enemyManager.SpawnRateScale:F2}");
|
|
||||||
GUILayout.Label($"Battle Time: {enemyManager.ElapsedBattleTime:F1}s / {enemyManager.BattleDuration:F1}s");
|
|
||||||
GUILayout.Label($"Enemy Count: {enemyManager.CurrentEnemyCount}");
|
|
||||||
}
|
|
||||||
|
|
||||||
Simulation.SimulationWorld simulationWorld = GameEntry.SimulationWorld;
|
|
||||||
if (_showCollisionStats && simulationWorld != null)
|
|
||||||
{
|
|
||||||
GUILayout.Space(4f);
|
|
||||||
GUILayout.Label(
|
|
||||||
$"Collision Queries: total {simulationWorld.LastCollisionQueryCount} (Projectile {simulationWorld.LastProjectileCollisionQueryCount} / Area {simulationWorld.LastAreaCollisionQueryCount})");
|
|
||||||
GUILayout.Label(
|
|
||||||
$"Collision Candidates: total {simulationWorld.LastCollisionCandidateCount} (Projectile {simulationWorld.LastProjectileCollisionCandidateCount} / Area {simulationWorld.LastAreaCollisionCandidateCount})");
|
|
||||||
GUILayout.Label(
|
|
||||||
$"Area Resolve: hits {simulationWorld.LastResolvedAreaHitCount}");
|
|
||||||
GUILayout.Label(
|
|
||||||
$"Broad Phase: cell {simulationWorld.LastCollisionCellSize:F2}, hasEnemyTargets {(simulationWorld.LastCollisionHasEnemyTargets ? "Yes" : "No")}");
|
|
||||||
if (simulationWorld.LastCollisionCandidateCount != 0)
|
|
||||||
{
|
|
||||||
Log.Info($"LastCollisionCandidateCount:{simulationWorld.LastCollisionCandidateCount}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (simulationWorld.LastResolvedAreaHitCount != 0)
|
|
||||||
{
|
|
||||||
Log.Info($"LastResolvedAreaHitCount:{simulationWorld.LastResolvedAreaHitCount}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_showSpawnControls)
|
|
||||||
{
|
|
||||||
GUILayout.BeginHorizontal();
|
|
||||||
GUILayout.Label("Rate", GUILayout.Width(52f));
|
|
||||||
string rateText = GUILayout.TextField(_spawnRateScaleInput.ToString("F2"), GUILayout.Width(60f));
|
|
||||||
if (float.TryParse(rateText, out float parsedRate))
|
|
||||||
{
|
|
||||||
_spawnRateScaleInput = Mathf.Clamp(parsedRate, MinSpawnRate, 50f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GUILayout.Button("Apply", GUILayout.Width(70f)))
|
|
||||||
{
|
|
||||||
enemyManager.SetSpawnRateScale(_spawnRateScaleInput);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GUILayout.Button("x0.5", GUILayout.Width(60f)))
|
|
||||||
{
|
|
||||||
_spawnRateScaleInput = Mathf.Max(MinSpawnRate, enemyManager.SpawnRateScale * 0.5f);
|
|
||||||
enemyManager.SetSpawnRateScale(_spawnRateScaleInput);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GUILayout.Button("x2", GUILayout.Width(60f)))
|
|
||||||
{
|
|
||||||
_spawnRateScaleInput = enemyManager.SpawnRateScale * 2f;
|
|
||||||
enemyManager.SetSpawnRateScale(_spawnRateScaleInput);
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.EndHorizontal();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_showBattleDurationControls)
|
|
||||||
{
|
|
||||||
GUILayout.BeginHorizontal();
|
|
||||||
GUILayout.Label("Add Sec", GUILayout.Width(52f));
|
|
||||||
string durationText = GUILayout.TextField(_extendDurationSeconds.ToString("F0"), GUILayout.Width(60f));
|
|
||||||
if (float.TryParse(durationText, out float parsedDuration))
|
|
||||||
{
|
|
||||||
_extendDurationSeconds = Mathf.Clamp(parsedDuration, 1f, 3600f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GUILayout.Button("Extend Battle", GUILayout.Height(24f)))
|
|
||||||
{
|
|
||||||
if (procedure.CurrentGameState is GameStateBattle gameState)
|
|
||||||
{
|
|
||||||
gameState.AddBattleDuration(_extendDurationSeconds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GUILayout.EndHorizontal();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_showPlayerWeaponControls)
|
|
||||||
{
|
|
||||||
GUILayout.Label(
|
|
||||||
$"Player Weapon: {(player == null ? "Player not found" : (player.WeaponEnabled ? "Enabled" : "Disabled"))}");
|
|
||||||
GUILayout.BeginHorizontal();
|
|
||||||
GUI.enabled = player != null;
|
|
||||||
if (GUILayout.Button("Disable Weapons", GUILayout.Height(24f)))
|
|
||||||
{
|
|
||||||
player.SetWeaponEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GUILayout.Button("Enable Weapons", GUILayout.Height(24f)))
|
|
||||||
{
|
|
||||||
player.SetWeaponEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
GUI.enabled = true;
|
|
||||||
GUILayout.EndHorizontal();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_showPlayerHealthControls)
|
|
||||||
{
|
|
||||||
GUILayout.Space(4f);
|
|
||||||
GUILayout.Label(
|
|
||||||
$"Player HP: {(playerHealth == null ? "Unavailable" : $"{playerHealth.CurrentHealth}/{playerHealth.MaxHealth}")}");
|
|
||||||
GUILayout.BeginHorizontal();
|
|
||||||
GUI.enabled = playerHealth != null;
|
|
||||||
if (GUILayout.Button($"+{DebugHealAmount} HP", GUILayout.Height(24f)))
|
|
||||||
{
|
|
||||||
AddPlayerHealth(playerHealth, DebugHealAmount);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GUILayout.Button(_lockPlayerHealthToMax ? "GodMode: ON" : "GodMode: OFF", GUILayout.Height(24f)))
|
|
||||||
{
|
|
||||||
_lockPlayerHealthToMax = !_lockPlayerHealthToMax;
|
|
||||||
if (_lockPlayerHealthToMax)
|
|
||||||
{
|
|
||||||
RestorePlayerHealthToMax(playerHealth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GUI.enabled = true;
|
|
||||||
GUILayout.EndHorizontal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool HasVisibleBattleSection()
|
|
||||||
{
|
|
||||||
return _showBattleOverview ||
|
|
||||||
_showCollisionStats ||
|
|
||||||
_showSpawnControls ||
|
|
||||||
_showBattleDurationControls ||
|
|
||||||
_showPlayerWeaponControls ||
|
|
||||||
_showPlayerHealthControls;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void EnsurePropList(bool force = false)
|
|
||||||
{
|
|
||||||
if (!force && _allProps != null && _allProps.Length > 0) return;
|
|
||||||
|
|
||||||
if (GameEntry.DataTable == null)
|
|
||||||
{
|
|
||||||
_allProps = Array.Empty<DRProp>();
|
|
||||||
_filteredProps = Array.Empty<DRProp>();
|
|
||||||
_displayNames = Array.Empty<string>();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var table = GameEntry.DataTable.GetDataTable<DRProp>();
|
|
||||||
_allProps = table != null ? table.ToArray() : Array.Empty<DRProp>();
|
|
||||||
_selectedIndex = Mathf.Clamp(_selectedIndex, 0, Mathf.Max(0, _allProps.Length - 1));
|
|
||||||
ApplyFilter(_searchText);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ApplyFilter(string keyword)
|
|
||||||
{
|
|
||||||
if (_allProps == null || _allProps.Length == 0)
|
|
||||||
{
|
|
||||||
_filteredProps = Array.Empty<DRProp>();
|
|
||||||
_displayNames = Array.Empty<string>();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(keyword))
|
|
||||||
{
|
|
||||||
_filteredProps = _allProps;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string search = keyword.Trim();
|
|
||||||
_filteredProps = _allProps.Where(p =>
|
|
||||||
p != null &&
|
|
||||||
(p.Title?.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0 ||
|
|
||||||
p.Id.ToString().Contains(search))).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
_displayNames = _filteredProps.Select(p => $"[{p.Id}] {p.Title} ({p.Rarity})").ToArray();
|
|
||||||
if (_displayNames.Length == 0) _selectedIndex = 0;
|
|
||||||
else _selectedIndex = Mathf.Clamp(_selectedIndex, 0, _displayNames.Length - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DRProp GetSelectedProp()
|
|
||||||
{
|
|
||||||
if (_filteredProps == null || _filteredProps.Length == 0) return null;
|
|
||||||
_selectedIndex = Mathf.Clamp(_selectedIndex, 0, _filteredProps.Length - 1);
|
|
||||||
return _filteredProps[_selectedIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Player FindPlayer()
|
|
||||||
{
|
|
||||||
return UnityEngine.Object.FindObjectOfType<Player>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void KeepPlayerHealthAtMax()
|
|
||||||
{
|
|
||||||
Player player = FindPlayer();
|
|
||||||
if (player == null) return;
|
|
||||||
|
|
||||||
HealthComponent playerHealth = player.GetComponent<HealthComponent>();
|
|
||||||
if (playerHealth == null) return;
|
|
||||||
|
|
||||||
RestorePlayerHealthToMax(playerHealth);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void AddPlayerHealth(HealthComponent playerHealth, int amount)
|
|
||||||
{
|
|
||||||
if (playerHealth == null || amount <= 0) return;
|
|
||||||
if (playerHealth.CurrentHealth <= 0) return;
|
|
||||||
|
|
||||||
int maxHealth = playerHealth.MaxHealth;
|
|
||||||
if (maxHealth <= 0) return;
|
|
||||||
|
|
||||||
int nextHealth = Mathf.Clamp(playerHealth.CurrentHealth + amount, 0, maxHealth);
|
|
||||||
if (nextHealth == playerHealth.CurrentHealth) return;
|
|
||||||
|
|
||||||
playerHealth.CurrentHealth = nextHealth;
|
|
||||||
PublishPlayerHealthChanged(playerHealth);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void RestorePlayerHealthToMax(HealthComponent playerHealth)
|
|
||||||
{
|
|
||||||
if (playerHealth == null) return;
|
|
||||||
if (playerHealth.CurrentHealth <= 0) return;
|
|
||||||
|
|
||||||
int maxHealth = playerHealth.MaxHealth;
|
|
||||||
if (maxHealth <= 0 || playerHealth.CurrentHealth >= maxHealth) return;
|
|
||||||
|
|
||||||
playerHealth.CurrentHealth = maxHealth;
|
|
||||||
PublishPlayerHealthChanged(playerHealth);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void PublishPlayerHealthChanged(HealthComponent playerHealth)
|
|
||||||
{
|
|
||||||
if (playerHealth == null || GameEntry.Event == null) return;
|
|
||||||
|
|
||||||
GameEntry.Event.Fire(null,
|
|
||||||
PlayerHealthChangeEventArgs.Create(0, playerHealth.CurrentHealth, playerHealth.MaxHealth));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void AddSelectedBuffToPlayer(DRProp prop, int count)
|
|
||||||
{
|
|
||||||
Player player = FindPlayer();
|
|
||||||
if (player == null || prop == null || prop.Modifiers == null) return;
|
|
||||||
|
|
||||||
int applyCount = Mathf.Clamp(count, 1, 99);
|
|
||||||
for (int i = 0; i < applyCount; i++)
|
|
||||||
{
|
|
||||||
player.AddProp(new PropItem(prop.Modifiers, prop.Rarity, prop.Title, prop.IconAssetName));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HandleCornerTapGesture()
|
|
||||||
{
|
|
||||||
if (!TryGetTouchReleased(out Vector2 touchPosition)) return;
|
|
||||||
if (touchPosition.x > 80f || touchPosition.y < Screen.height - 80f) return;
|
|
||||||
|
|
||||||
float now = Time.unscaledTime;
|
|
||||||
if (now - _lastCornerTapTime > CornerTapWindow)
|
|
||||||
{
|
|
||||||
_cornerTapCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_lastCornerTapTime = now;
|
|
||||||
_cornerTapCount++;
|
|
||||||
|
|
||||||
if (_cornerTapCount >= RequiredCornerTapCount)
|
|
||||||
{
|
|
||||||
_cornerTapCount = 0;
|
|
||||||
_isPanelVisible = !_isPanelVisible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsTogglePressed()
|
|
||||||
{
|
|
||||||
#if ENABLE_INPUT_SYSTEM
|
|
||||||
Keyboard keyboard = Keyboard.current;
|
|
||||||
if (keyboard == null) return false;
|
|
||||||
return keyboard.backquoteKey.wasPressedThisFrame || keyboard.f8Key.wasPressedThisFrame;
|
|
||||||
#else
|
|
||||||
return Input.GetKeyDown(KeyCode.BackQuote) || Input.GetKeyDown(KeyCode.F8);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool TryGetTouchReleased(out Vector2 touchPosition)
|
|
||||||
{
|
|
||||||
#if ENABLE_INPUT_SYSTEM
|
|
||||||
Touchscreen touchscreen = Touchscreen.current;
|
|
||||||
if (touchscreen == null)
|
|
||||||
{
|
|
||||||
touchPosition = default;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var touch = touchscreen.primaryTouch;
|
|
||||||
if (!touch.press.wasReleasedThisFrame)
|
|
||||||
{
|
|
||||||
touchPosition = default;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
touchPosition = touch.position.ReadValue();
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
if (Input.touchCount <= 0)
|
|
||||||
{
|
|
||||||
touchPosition = default;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Touch touch = Input.GetTouch(0);
|
|
||||||
if (touch.phase != TouchPhase.Ended)
|
|
||||||
{
|
|
||||||
touchPosition = default;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
touchPosition = touch.position;
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
@ -4,8 +4,6 @@ using SepCore.Definition;
|
||||||
using Entity;
|
using Entity;
|
||||||
using Entity.EntityData;
|
using Entity.EntityData;
|
||||||
using GameFramework.Event;
|
using GameFramework.Event;
|
||||||
using Procedure;
|
|
||||||
using StarForce;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
using Random = UnityEngine.Random;
|
using Random = UnityEngine.Random;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 710248cee26a898459031e4336703628
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: de04e3a2f42efa84798cde2397f505db
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class RoleItemRawData
|
||||||
|
{
|
||||||
|
public int RoleId;
|
||||||
|
public string IconName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bd682bb88cf9b8c4fac0fe7002d3646b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class RolePropertyAreaRawData
|
||||||
|
{
|
||||||
|
public string RoleName;
|
||||||
|
public string InitialPropertyText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3a582029cb4c5e5459ebe6d42335299f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 476e0babdb10df1499873cc46eaaa41e
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -2,19 +2,18 @@ using SepCore.Definition;
|
||||||
using Entity;
|
using Entity;
|
||||||
using CustomUtility;
|
using CustomUtility;
|
||||||
using Entity.Weapon;
|
using Entity.Weapon;
|
||||||
using Procedure;
|
|
||||||
|
|
||||||
namespace UI
|
namespace UI
|
||||||
{
|
{
|
||||||
public class DisplayItemInfoFormUseCase : IUIUseCase
|
public class DisplayItemInfoFormUseCase : IUIUseCase
|
||||||
{
|
{
|
||||||
private readonly ProcedureGame _procedureGame;
|
private readonly Player _player;
|
||||||
|
|
||||||
private Player Player => _procedureGame != null ? _procedureGame.Player : null;
|
private Player Player => _player;
|
||||||
|
|
||||||
public DisplayItemInfoFormUseCase(ProcedureGame procedureGame)
|
public DisplayItemInfoFormUseCase(Player player)
|
||||||
{
|
{
|
||||||
_procedureGame = procedureGame;
|
_player = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DisplayItemInfoFormRawData CreateModel(int index, bool isWeapon)
|
public DisplayItemInfoFormRawData CreateModel(int index, bool isWeapon)
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,20 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using SepCore.DataTable;
|
using SepCore.DataTable;
|
||||||
using SepCore.Definition;
|
using SepCore.Definition;
|
||||||
using Entity;
|
using Entity;
|
||||||
using Procedure;
|
using Random = UnityEngine.Random;
|
||||||
using UnityEngine;
|
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
using CustomUtility;
|
using CustomUtility;
|
||||||
using GameFramework.DataTable;
|
using GameFramework.DataTable;
|
||||||
|
|
||||||
namespace UI
|
namespace UI
|
||||||
{
|
{
|
||||||
internal class LevelUpFormUseCase : IUIUseCase
|
public class LevelUpFormUseCase : IUIUseCase
|
||||||
{
|
{
|
||||||
private const int BaseRefreshPrice = 2;
|
private const int BaseRefreshPrice = 2;
|
||||||
private readonly GameStateLevelUp _gameStateLevelUp;
|
private readonly Action _onCompleted;
|
||||||
private readonly DRLevelUpReward[] _allRewards;
|
private readonly DRLevelUpReward[] _allRewards;
|
||||||
private readonly IDataTable<DRLevelRarity> _levelRarityTable;
|
private readonly IDataTable<DRLevelRarity> _levelRarityTable;
|
||||||
private readonly Dictionary<ItemRarity, List<DRLevelUpReward>> _rewardsByRarity = new();
|
private readonly Dictionary<ItemRarity, List<DRLevelUpReward>> _rewardsByRarity = new();
|
||||||
|
|
@ -25,10 +25,10 @@ namespace UI
|
||||||
|
|
||||||
private readonly Player _player;
|
private readonly Player _player;
|
||||||
|
|
||||||
public LevelUpFormUseCase(Player player, GameStateLevelUp gameStateLevelUp)
|
public LevelUpFormUseCase(Player player, Action onCompleted)
|
||||||
{
|
{
|
||||||
_player = player;
|
_player = player;
|
||||||
_gameStateLevelUp = gameStateLevelUp;
|
_onCompleted = onCompleted;
|
||||||
_allRewards = GameEntry.DataTable.GetDataTable<DRLevelUpReward>().ToArray();
|
_allRewards = GameEntry.DataTable.GetDataTable<DRLevelUpReward>().ToArray();
|
||||||
_levelRarityTable = GameEntry.DataTable.GetDataTable<DRLevelRarity>();
|
_levelRarityTable = GameEntry.DataTable.GetDataTable<DRLevelRarity>();
|
||||||
|
|
||||||
|
|
@ -39,7 +39,7 @@ namespace UI
|
||||||
{
|
{
|
||||||
_refreshCount = 0;
|
_refreshCount = 0;
|
||||||
|
|
||||||
if (_gameStateLevelUp == null || _player.PendingLevelPoints <= 0)
|
if (_player == null || _player.PendingLevelPoints <= 0)
|
||||||
{
|
{
|
||||||
_currentModel = null;
|
_currentModel = null;
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -90,7 +90,7 @@ namespace UI
|
||||||
return _currentModel;
|
return _currentModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
_gameStateLevelUp.IsCompleted = true;
|
_onCompleted?.Invoke();
|
||||||
_currentModel = null;
|
_currentModel = null;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f9cd57f1c1a63854e8ba23be83ead8b4
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
using SepCore.Definition;
|
||||||
|
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class DisplayItemRawData
|
||||||
|
{
|
||||||
|
public string IconAssetName;
|
||||||
|
public ItemRarity Rarity;
|
||||||
|
public bool IsWeapon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8a8892ea402a6ca4b943466ac00676e7
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class DisplayListAreaRawData
|
||||||
|
{
|
||||||
|
public string Title;
|
||||||
|
public int CurrentCount;
|
||||||
|
public int MaxCount = -1;
|
||||||
|
public DisplayItemRawData[] ItemContexts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 06d87c8d30eefa645b7d84c306bf2cb8
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
using SepCore.Definition;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class GoodsItemRawData
|
||||||
|
{
|
||||||
|
public string Title;
|
||||||
|
public ItemRarity Rarity;
|
||||||
|
public string Type;
|
||||||
|
public Sprite Icon;
|
||||||
|
public string Description;
|
||||||
|
public int Price;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9b9270fdc0ddab146bd3b5d9b2261a39
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
using SepCore.Definition;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class LevelUpRewardItemRawData
|
||||||
|
{
|
||||||
|
public string Title;
|
||||||
|
public Sprite Icon;
|
||||||
|
public ItemRarity ItemRarity;
|
||||||
|
public string Description;
|
||||||
|
public string IconAssetName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 56a75fb39cca45c4ea220af2c850e677
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -9,7 +9,7 @@ namespace UI
|
||||||
public int CurrentLevel;
|
public int CurrentLevel;
|
||||||
public int RefreshPrice;
|
public int RefreshPrice;
|
||||||
public int PlayerCoin;
|
public int PlayerCoin;
|
||||||
public List<GoodsItemContext> GoodsItems;
|
public List<GoodsItemRawData> GoodsItems;
|
||||||
public IReadOnlyList<PropItem> PropItems;
|
public IReadOnlyList<PropItem> PropItems;
|
||||||
public int PropMaxCount = -1;
|
public int PropMaxCount = -1;
|
||||||
public IReadOnlyList<WeaponBase> WeaponItems;
|
public IReadOnlyList<WeaponBase> WeaponItems;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using SepCore.DataTable;
|
using SepCore.DataTable;
|
||||||
|
|
@ -6,29 +7,29 @@ using Entity;
|
||||||
using Entity.EntityData;
|
using Entity.EntityData;
|
||||||
using CustomUtility;
|
using CustomUtility;
|
||||||
using GameFramework.DataTable;
|
using GameFramework.DataTable;
|
||||||
using Procedure;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityGameFramework.Runtime;
|
using UnityGameFramework.Runtime;
|
||||||
using Random = UnityEngine.Random;
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
namespace UI
|
namespace UI
|
||||||
{
|
{
|
||||||
internal sealed class ShopRefreshResult
|
public sealed class ShopRefreshResult
|
||||||
{
|
{
|
||||||
public List<GoodsItemContext> GoodsItems;
|
public List<GoodsItemRawData> GoodsItems;
|
||||||
public int RefreshPrice;
|
public int RefreshPrice;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal sealed class ShopPurchaseResult
|
public sealed class ShopPurchaseResult
|
||||||
{
|
{
|
||||||
public int GoodsIndex;
|
public int GoodsIndex;
|
||||||
public DisplayItemContext DisplayItem;
|
public DisplayItemRawData DisplayItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class ShopFormUseCase : IUIUseCase
|
public class ShopFormUseCase : IUIUseCase
|
||||||
{
|
{
|
||||||
private readonly ProcedureGame _procedureGame;
|
private readonly Player _player;
|
||||||
private readonly GameStateShop _gameStateShop;
|
private readonly int _currentLevel;
|
||||||
|
private readonly Action _onShopFinish;
|
||||||
|
|
||||||
private readonly DRGoods[] _allGoods;
|
private readonly DRGoods[] _allGoods;
|
||||||
private readonly IDataTable<DRProp> _propDataTable;
|
private readonly IDataTable<DRProp> _propDataTable;
|
||||||
|
|
@ -41,7 +42,7 @@ namespace UI
|
||||||
private readonly List<ShopGoodsSelection> _selections = new();
|
private readonly List<ShopGoodsSelection> _selections = new();
|
||||||
private int _refreshTime;
|
private int _refreshTime;
|
||||||
|
|
||||||
private Player Player => _procedureGame.Player;
|
private Player Player => _player;
|
||||||
|
|
||||||
private sealed class ShopGoodsSelection
|
private sealed class ShopGoodsSelection
|
||||||
{
|
{
|
||||||
|
|
@ -50,10 +51,11 @@ namespace UI
|
||||||
public int Price;
|
public int Price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShopFormUseCase(ProcedureGame procedureGame, GameStateShop gameStateShop)
|
public ShopFormUseCase(Player player, int currentLevel, Action onShopFinish)
|
||||||
{
|
{
|
||||||
_procedureGame = procedureGame;
|
_player = player;
|
||||||
_gameStateShop = gameStateShop;
|
_currentLevel = currentLevel;
|
||||||
|
_onShopFinish = onShopFinish;
|
||||||
_allGoods = GameEntry.DataTable.GetDataTable<DRGoods>().ToArray();
|
_allGoods = GameEntry.DataTable.GetDataTable<DRGoods>().ToArray();
|
||||||
_propDataTable = GameEntry.DataTable.GetDataTable<DRProp>();
|
_propDataTable = GameEntry.DataTable.GetDataTable<DRProp>();
|
||||||
_weaponDataTable = GameEntry.DataTable.GetDataTable<DRWeapon>();
|
_weaponDataTable = GameEntry.DataTable.GetDataTable<DRWeapon>();
|
||||||
|
|
@ -67,12 +69,12 @@ namespace UI
|
||||||
_refreshTime = 0;
|
_refreshTime = 0;
|
||||||
|
|
||||||
Player player = Player;
|
Player player = Player;
|
||||||
if (_procedureGame == null || player == null)
|
if (_player == null || player == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
int currentLevel = _procedureGame.CurrentLevel;
|
int currentLevel = _currentLevel;
|
||||||
return new ShopFormRawData
|
return new ShopFormRawData
|
||||||
{
|
{
|
||||||
CurrentLevel = currentLevel,
|
CurrentLevel = currentLevel,
|
||||||
|
|
@ -89,14 +91,14 @@ namespace UI
|
||||||
public ShopRefreshResult TryRefresh(int cost)
|
public ShopRefreshResult TryRefresh(int cost)
|
||||||
{
|
{
|
||||||
Player player = Player;
|
Player player = Player;
|
||||||
if (player == null || _procedureGame == null || player.Coin < cost)
|
if (player == null || _player == null || player.Coin < cost)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.Coin -= cost;
|
player.Coin -= cost;
|
||||||
|
|
||||||
int refreshPrice = (_refreshTime + 1) * _procedureGame.CurrentLevel;
|
int refreshPrice = (_refreshTime + 1) * _currentLevel;
|
||||||
_refreshTime++;
|
_refreshTime++;
|
||||||
|
|
||||||
return new ShopRefreshResult
|
return new ShopRefreshResult
|
||||||
|
|
@ -127,7 +129,7 @@ namespace UI
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayItemContext displayItem = ApplyGoodsPurchase(selection);
|
DisplayItemRawData displayItem = ApplyGoodsPurchase(selection);
|
||||||
if (displayItem == null)
|
if (displayItem == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -145,10 +147,10 @@ namespace UI
|
||||||
|
|
||||||
public void Continue()
|
public void Continue()
|
||||||
{
|
{
|
||||||
_gameStateShop.ShopFinish = true;
|
_onShopFinish?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<GoodsItemContext> BuildRandomGoodsItems(int count)
|
private List<GoodsItemRawData> BuildRandomGoodsItems(int count)
|
||||||
{
|
{
|
||||||
if (_allGoods == null || _allGoods.Length == 0)
|
if (_allGoods == null || _allGoods.Length == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -157,10 +159,10 @@ namespace UI
|
||||||
}
|
}
|
||||||
|
|
||||||
int finalCount = Mathf.Min(count, _allGoods.Length);
|
int finalCount = Mathf.Min(count, _allGoods.Length);
|
||||||
List<GoodsItemContext> goodsItems = new List<GoodsItemContext>(finalCount);
|
List<GoodsItemRawData> goodsItems = new List<GoodsItemRawData>(finalCount);
|
||||||
_selections.Clear();
|
_selections.Clear();
|
||||||
|
|
||||||
int currentLevel = _procedureGame != null ? _procedureGame.CurrentLevel : 1;
|
int currentLevel = _currentLevel > 0 ? _currentLevel : 1;
|
||||||
|
|
||||||
for (int i = 0; i < finalCount; i++)
|
for (int i = 0; i < finalCount; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -172,7 +174,7 @@ namespace UI
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GoodsItemContext goodsItem = new GoodsItemContext();
|
GoodsItemRawData goodsItem = new GoodsItemRawData();
|
||||||
int price;
|
int price;
|
||||||
|
|
||||||
if (drGoods.GoodsType == GoodsType.Prop)
|
if (drGoods.GoodsType == GoodsType.Prop)
|
||||||
|
|
@ -318,7 +320,7 @@ namespace UI
|
||||||
return Mathf.Max(1, finalPrice);
|
return Mathf.Max(1, finalPrice);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DisplayItemContext ApplyGoodsPurchase(ShopGoodsSelection goods)
|
private DisplayItemRawData ApplyGoodsPurchase(ShopGoodsSelection goods)
|
||||||
{
|
{
|
||||||
if (goods == null || Player == null)
|
if (goods == null || Player == null)
|
||||||
{
|
{
|
||||||
|
|
@ -335,7 +337,7 @@ namespace UI
|
||||||
}
|
}
|
||||||
|
|
||||||
Player.AddProp(new PropItem(drProp.Modifiers, drProp.Rarity, drProp.Title, drProp.IconAssetName));
|
Player.AddProp(new PropItem(drProp.Modifiers, drProp.Rarity, drProp.Title, drProp.IconAssetName));
|
||||||
return new DisplayItemContext
|
return new DisplayItemRawData
|
||||||
{
|
{
|
||||||
IconAssetName = drProp.IconAssetName,
|
IconAssetName = drProp.IconAssetName,
|
||||||
Rarity = drProp.Rarity,
|
Rarity = drProp.Rarity,
|
||||||
|
|
@ -368,7 +370,7 @@ namespace UI
|
||||||
|
|
||||||
GameEntry.Entity.ShowWeapon(weaponData);
|
GameEntry.Entity.ShowWeapon(weaponData);
|
||||||
|
|
||||||
return new DisplayItemContext
|
return new DisplayItemRawData
|
||||||
{
|
{
|
||||||
IconAssetName = drWeapon.IconAssetName,
|
IconAssetName = drWeapon.IconAssetName,
|
||||||
Rarity = drWeapon.Rarity,
|
Rarity = drWeapon.Rarity,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 07fd450f557f928488983d5aff38ae8f
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using SepCore.DataTable;
|
using SepCore.DataTable;
|
||||||
using GameFramework.DataTable;
|
using GameFramework.DataTable;
|
||||||
using Procedure;
|
using Random = UnityEngine.Random;
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace UI
|
namespace UI
|
||||||
{
|
{
|
||||||
|
|
@ -10,13 +10,13 @@ namespace UI
|
||||||
{
|
{
|
||||||
private readonly IDataTable<DRRole> _roleDataTable;
|
private readonly IDataTable<DRRole> _roleDataTable;
|
||||||
|
|
||||||
private readonly ProcedureStartMenu _procedureStartMenu;
|
private readonly Action<int> _onStartGame;
|
||||||
|
|
||||||
public int SelectedRoleId { get; private set; }
|
public int SelectedRoleId { get; private set; }
|
||||||
|
|
||||||
public SelectRoleFormUseCase(ProcedureStartMenu procedureStartMenu)
|
public SelectRoleFormUseCase(Action<int> onStartGame)
|
||||||
{
|
{
|
||||||
_procedureStartMenu = procedureStartMenu;
|
_onStartGame = onStartGame;
|
||||||
_roleDataTable = GameEntry.DataTable.GetDataTable<DRRole>();
|
_roleDataTable = GameEntry.DataTable.GetDataTable<DRRole>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace UI
|
||||||
bool result = SelectedRoleId >= 0;
|
bool result = SelectedRoleId >= 0;
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
_procedureStartMenu.StartGame(SelectedRoleId);
|
_onStartGame?.Invoke(SelectedRoleId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue