继续调整,创建 Procedure 与 Presentation 程序集

- 创建 Procedure 与 Presentation 两个程序集
- 初步解决这两个程序集与原程序集的引用关系
This commit is contained in:
SepComet
2026-06-02 23:26:08 +08:00
parent affa44e4d0
commit 6b8a6a8789
50 changed files with 907 additions and 688 deletions
@@ -1,14 +1,5 @@
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
using CustomComponent;
using CustomComponent;
using Simulation;
using StarForce;
using UI;
using UnityEngine;
/// <summary>
@@ -22,10 +13,6 @@ public partial class GameEntry : MonoBehaviour
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 SimulationWorld SimulationWorld { get; private set; }
@@ -39,17 +26,8 @@ public partial class GameEntry : MonoBehaviour
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
HPBar = UnityGameFramework.Runtime.GameEntry.GetComponent<HPBarComponent>();
DamageText = UnityGameFramework.Runtime.GameEntry.GetComponent<DamageTextComponent>();
#if UNITY_EDITOR || DEVELOPMENT_BUILD
RuntimeDebugPanel = UnityGameFramework.Runtime.GameEntry.GetComponent<RuntimeDebugPanelComponent>();
#endif
EnemyManager = UnityGameFramework.Runtime.GameEntry.GetComponent<EnemyManagerComponent>();
SimulationWorld = UnityGameFramework.Runtime.GameEntry.GetComponent<SimulationWorld>();
if (SimulationWorld == null && Base != null)
{
SimulationWorld = Base.gameObject.AddComponent<SimulationWorld>();
}
SpriteCache = UnityGameFramework.Runtime.GameEntry.GetComponent<SpriteCacheComponent>();
UIRouter = UnityGameFramework.Runtime.GameEntry.GetComponent<UIRouterComponent>();
}
@@ -0,0 +1,188 @@
using System;
using System.Collections.Generic;
using SepCore.Definition;
using Entity.EntityData;
using UnityGameFramework.Runtime;
using SepCore.DataTable;
using CustomUtility;
namespace Entity
{
public static class EntityExtension
{
private static int s_SerialId = -10;
private const string EntityNamespace = "Entity.";
private static readonly Dictionary<string, Type> _typeDict;
private static readonly Dictionary<int, string> _assetNameDict;
static EntityExtension()
{
_typeDict = new Dictionary<string, Type>();
_assetNameDict = new Dictionary<int, string>();
}
public static EntityBase GetGameEntity(this EntityComponent entityComponent, int entityId)
{
UnityGameFramework.Runtime.Entity entity = entityComponent.GetEntity(entityId);
if (entity == null)
{
return null;
}
return (EntityBase)entity.Logic;
}
public static void HideEntity(this EntityComponent entityComponent, EntityBase entity)
{
entityComponent.HideEntity(entity.Entity);
}
public static void AttachEntity(this EntityComponent entityComponent, EntityBase entityBase, int ownerId,
string parentTransformPath = null, object userData = null)
{
entityComponent.AttachEntity(entityBase.Entity, ownerId, parentTransformPath, userData);
}
public static void ShowPlayer(this EntityComponent entityComponent, PlayerData data)
{
entityComponent.ShowEntity(typeof(Player), "Player", Constant.AssetPriority.PlayerAsset, data);
}
public static void ShowEnemy(this EntityComponent entityComponent, EnemyData data)
{
if (data == null)
{
Log.Warning("Enemy data is invalid.");
return;
}
var enemyType = TryGetType(data.EnemyType.ToString());
var assetName = TryGetAssetName(data.EntityTypeId);
entityComponent.ShowEntity(
entityId: data.Id,
entityLogicType: enemyType,
entityAssetName: AssetUtility.GetEntityAsset(assetName),
entityGroupName: "Enemy",
priority: Constant.AssetPriority.BulletAsset,
userData: data);
}
public static void ShowWeapon(this EntityComponent entityComponent, WeaponData data)
{
if (data == null)
{
Log.Warning("Weapon data is invalid.");
return;
}
var weaponType = TryGetType("Weapon." + data.WeaponType);
var assetName = TryGetAssetName(data.EntityTypeId);
entityComponent.ShowEntity(
entityId: data.Id,
entityLogicType: weaponType,
entityAssetName: AssetUtility.GetEntityAsset(assetName),
entityGroupName: "Weapon",
priority: Constant.AssetPriority.BulletAsset,
userData: data);
}
// public static void ShowBullet(this EntityComponent entityComponent, BulletData data)
// {
// if (data == null)
// {
// Log.Warning("Bullet data is invalid.");
// return;
// }
//
// var bulletType = TryGetType(data.BulletType.ToString());
// string assetName = TryGetAssetName(data.EntityTypeId);
//
// entityComponent.ShowEntity(
// entityId: data.Id,
// entityLogicType: bulletType,
// entityAssetName: AssetUtility.GetEntityAsset(assetName),
// entityGroupName: "Bullet",
// priority: Constant.AssetPriority.BulletAsset,
// userData: data);
// }
public static void ShowEffect(this EntityComponent entityComponent, EffectData data)
{
entityComponent.ShowEntity(typeof(Effect), "Effect", Constant.AssetPriority.EffectAsset, data);
}
public static void ShowCoin(this EntityComponent entityComponent, CoinData data)
{
entityComponent.ShowEntity(typeof(CoinEntity), "Drop", Constant.AssetPriority.EffectAsset, data);
}
public static void ShowExp(this EntityComponent entityComponent, ExpData data)
{
entityComponent.ShowEntity(typeof(ExpEntity), "Drop", Constant.AssetPriority.EffectAsset, data);
}
private static void ShowEntity(this EntityComponent entityComponent, Type logicType, string entityGroup,
int priority, EntityDataBase data)
{
if (data == null)
{
Log.Warning("Data is invalid.");
return;
}
DREntity drEntity = GameEntry.DataTable.GetDataTableRow<DREntity>(data.TypeId);
if (drEntity == null)
{
Log.Warning("Can not load entity id '{0}' from data table.", data.TypeId.ToString());
return;
}
entityComponent.ShowEntity(data.Id, logicType, AssetUtility.GetEntityAsset(drEntity.AssetName), entityGroup,
priority, data);
}
private static Type TryGetType(string rawTypeName)
{
string typeName = EntityNamespace + rawTypeName;
if (!_typeDict.TryGetValue(typeName, out Type type))
{
type = Type.GetType(typeName);
if (type == null)
{
Log.Warning("Can not load entity type '{0}'.", typeName);
return null;
}
_typeDict.Add(typeName, type);
}
return type;
}
private static string TryGetAssetName(int entityId)
{
if (!_assetNameDict.TryGetValue(entityId, out string assetName))
{
DREntity drEntity = GameEntry.DataTable.GetDataTableRow<DREntity>(entityId);
if (drEntity == null)
{
Log.Warning("Can not load bullet entity id '{0}' from data table.", entityId.ToString());
return null;
}
assetName = drEntity.AssetName;
_assetNameDict.Add(entityId, assetName);
}
return assetName;
}
public static int GenerateSerialId(this EntityComponent entityComponent)
{
return --s_SerialId;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 626632079980ad34595c3b43a062a664
timeCreated: 1528026153
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -10,48 +10,37 @@ using GameFramework;
using StarForce;
using UI;
using UnityEngine;
using UnityEngine.Serialization;
using UnityGameFramework.Runtime;
namespace CustomComponent
{
public class BuiltinDataComponent : GameFrameworkComponent
{
[SerializeField]
private TextAsset m_BuildInfoTextAsset = null;
[FormerlySerializedAs("m_BuildInfoTextAsset")] [SerializeField]
private TextAsset _buildInfoTextAsset = null;
[SerializeField]
private TextAsset m_DefaultDictionaryTextAsset = null;
[FormerlySerializedAs("m_DefaultDictionaryTextAsset")] [SerializeField]
private TextAsset _defaultDictionaryTextAsset = null;
[SerializeField]
private UpdateResourceForm m_UpdateResourceFormTemplate = null;
[FormerlySerializedAs("m_UpdateResourceFormTemplate")] [SerializeField]
private GameObject _updateResourceFormTemplate = null;
private BuildInfo m_BuildInfo = null;
public BuildInfo BuildInfo
{
get
{
return m_BuildInfo;
}
}
public BuildInfo BuildInfo => m_BuildInfo;
public UpdateResourceForm UpdateResourceFormTemplate
{
get
{
return m_UpdateResourceFormTemplate;
}
}
public GameObject UpdateResourceFormTemplate => _updateResourceFormTemplate;
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.");
return;
}
m_BuildInfo = Utility.Json.ToObject<BuildInfo>(m_BuildInfoTextAsset.text);
m_BuildInfo = Utility.Json.ToObject<BuildInfo>(_buildInfoTextAsset.text);
if (m_BuildInfo == null)
{
Log.Warning("Parse build info failure.");
@@ -61,13 +50,13 @@ namespace CustomComponent
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.");
return;
}
if (!GameEntry.Localization.ParseData(m_DefaultDictionaryTextAsset.text))
if (!GameEntry.Localization.ParseData(_defaultDictionaryTextAsset.text))
{
Log.Warning("Parse default dictionary failure.");
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.EntityData;
using GameFramework.Event;
using Procedure;
using StarForce;
using UnityEngine;
using UnityGameFramework.Runtime;
using Random = UnityEngine.Random;
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a11ef2e359b24bfdb6c9120cc2ec81b8
guid: 710248cee26a898459031e4336703628
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -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;
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 1d8ada5157a04921a6e543a040e57960
guid: bd682bb88cf9b8c4fac0fe7002d3646b
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -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 CustomUtility;
using Entity.Weapon;
using Procedure;
namespace UI
{
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)
@@ -72,4 +71,4 @@ namespace UI
};
}
}
}
}
@@ -1,20 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SepCore.DataTable;
using SepCore.Definition;
using Entity;
using Procedure;
using UnityEngine;
using Random = UnityEngine.Random;
using UnityGameFramework.Runtime;
using CustomUtility;
using GameFramework.DataTable;
namespace UI
{
internal class LevelUpFormUseCase : IUIUseCase
public class LevelUpFormUseCase : IUIUseCase
{
private const int BaseRefreshPrice = 2;
private readonly GameStateLevelUp _gameStateLevelUp;
private readonly Action _onCompleted;
private readonly DRLevelUpReward[] _allRewards;
private readonly IDataTable<DRLevelRarity> _levelRarityTable;
private readonly Dictionary<ItemRarity, List<DRLevelUpReward>> _rewardsByRarity = new();
@@ -22,13 +22,13 @@ namespace UI
private int _refreshCount;
private LevelUpFormRawData _currentModel;
private readonly Player _player;
public LevelUpFormUseCase(Player player, GameStateLevelUp gameStateLevelUp)
public LevelUpFormUseCase(Player player, Action onCompleted)
{
_player = player;
_gameStateLevelUp = gameStateLevelUp;
_onCompleted = onCompleted;
_allRewards = GameEntry.DataTable.GetDataTable<DRLevelUpReward>().ToArray();
_levelRarityTable = GameEntry.DataTable.GetDataTable<DRLevelRarity>();
@@ -39,7 +39,7 @@ namespace UI
{
_refreshCount = 0;
if (_gameStateLevelUp == null || _player.PendingLevelPoints <= 0)
if (_player == null || _player.PendingLevelPoints <= 0)
{
_currentModel = null;
return null;
@@ -90,7 +90,7 @@ namespace UI
return _currentModel;
}
_gameStateLevelUp.IsCompleted = true;
_onCompleted?.Invoke();
_currentModel = 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 RefreshPrice;
public int PlayerCoin;
public List<GoodsItemContext> GoodsItems;
public List<GoodsItemRawData> GoodsItems;
public IReadOnlyList<PropItem> PropItems;
public int PropMaxCount = -1;
public IReadOnlyList<WeaponBase> WeaponItems;
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SepCore.DataTable;
@@ -6,30 +7,30 @@ using Entity;
using Entity.EntityData;
using CustomUtility;
using GameFramework.DataTable;
using Procedure;
using UnityEngine;
using UnityGameFramework.Runtime;
using Random = UnityEngine.Random;
namespace UI
{
internal sealed class ShopRefreshResult
public sealed class ShopRefreshResult
{
public List<GoodsItemContext> GoodsItems;
public List<GoodsItemRawData> GoodsItems;
public int RefreshPrice;
}
internal sealed class ShopPurchaseResult
public sealed class ShopPurchaseResult
{
public int GoodsIndex;
public DisplayItemContext DisplayItem;
public DisplayItemRawData DisplayItem;
}
internal class ShopFormUseCase : IUIUseCase
public class ShopFormUseCase : IUIUseCase
{
private readonly ProcedureGame _procedureGame;
private readonly GameStateShop _gameStateShop;
private readonly Player _player;
private readonly int _currentLevel;
private readonly Action _onShopFinish;
private readonly DRGoods[] _allGoods;
private readonly IDataTable<DRProp> _propDataTable;
private readonly IDataTable<DRWeapon> _weaponDataTable;
@@ -41,7 +42,7 @@ namespace UI
private readonly List<ShopGoodsSelection> _selections = new();
private int _refreshTime;
private Player Player => _procedureGame.Player;
private Player Player => _player;
private sealed class ShopGoodsSelection
{
@@ -50,10 +51,11 @@ namespace UI
public int Price;
}
public ShopFormUseCase(ProcedureGame procedureGame, GameStateShop gameStateShop)
public ShopFormUseCase(Player player, int currentLevel, Action onShopFinish)
{
_procedureGame = procedureGame;
_gameStateShop = gameStateShop;
_player = player;
_currentLevel = currentLevel;
_onShopFinish = onShopFinish;
_allGoods = GameEntry.DataTable.GetDataTable<DRGoods>().ToArray();
_propDataTable = GameEntry.DataTable.GetDataTable<DRProp>();
_weaponDataTable = GameEntry.DataTable.GetDataTable<DRWeapon>();
@@ -67,12 +69,12 @@ namespace UI
_refreshTime = 0;
Player player = Player;
if (_procedureGame == null || player == null)
if (_player == null || player == null)
{
return null;
}
int currentLevel = _procedureGame.CurrentLevel;
int currentLevel = _currentLevel;
return new ShopFormRawData
{
CurrentLevel = currentLevel,
@@ -89,14 +91,14 @@ namespace UI
public ShopRefreshResult TryRefresh(int cost)
{
Player player = Player;
if (player == null || _procedureGame == null || player.Coin < cost)
if (player == null || _player == null || player.Coin < cost)
{
return null;
}
player.Coin -= cost;
int refreshPrice = (_refreshTime + 1) * _procedureGame.CurrentLevel;
int refreshPrice = (_refreshTime + 1) * _currentLevel;
_refreshTime++;
return new ShopRefreshResult
@@ -127,7 +129,7 @@ namespace UI
return null;
}
DisplayItemContext displayItem = ApplyGoodsPurchase(selection);
DisplayItemRawData displayItem = ApplyGoodsPurchase(selection);
if (displayItem == null)
{
return null;
@@ -145,10 +147,10 @@ namespace UI
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)
{
@@ -157,10 +159,10 @@ namespace UI
}
int finalCount = Mathf.Min(count, _allGoods.Length);
List<GoodsItemContext> goodsItems = new List<GoodsItemContext>(finalCount);
List<GoodsItemRawData> goodsItems = new List<GoodsItemRawData>(finalCount);
_selections.Clear();
int currentLevel = _procedureGame != null ? _procedureGame.CurrentLevel : 1;
int currentLevel = _currentLevel > 0 ? _currentLevel : 1;
for (int i = 0; i < finalCount; i++)
{
@@ -172,7 +174,7 @@ namespace UI
break;
}
GoodsItemContext goodsItem = new GoodsItemContext();
GoodsItemRawData goodsItem = new GoodsItemRawData();
int price;
if (drGoods.GoodsType == GoodsType.Prop)
@@ -318,7 +320,7 @@ namespace UI
return Mathf.Max(1, finalPrice);
}
private DisplayItemContext ApplyGoodsPurchase(ShopGoodsSelection goods)
private DisplayItemRawData ApplyGoodsPurchase(ShopGoodsSelection goods)
{
if (goods == null || Player == null)
{
@@ -335,7 +337,7 @@ namespace UI
}
Player.AddProp(new PropItem(drProp.Modifiers, drProp.Rarity, drProp.Title, drProp.IconAssetName));
return new DisplayItemContext
return new DisplayItemRawData
{
IconAssetName = drProp.IconAssetName,
Rarity = drProp.Rarity,
@@ -368,7 +370,7 @@ namespace UI
GameEntry.Entity.ShowWeapon(weaponData);
return new DisplayItemContext
return new DisplayItemRawData
{
IconAssetName = drWeapon.IconAssetName,
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 SepCore.DataTable;
using GameFramework.DataTable;
using Procedure;
using UnityEngine;
using Random = UnityEngine.Random;
namespace UI
{
@@ -10,13 +10,13 @@ namespace UI
{
private readonly IDataTable<DRRole> _roleDataTable;
private readonly ProcedureStartMenu _procedureStartMenu;
private readonly Action<int> _onStartGame;
public int SelectedRoleId { get; private set; }
public SelectRoleFormUseCase(ProcedureStartMenu procedureStartMenu)
public SelectRoleFormUseCase(Action<int> onStartGame)
{
_procedureStartMenu = procedureStartMenu;
_onStartGame = onStartGame;
_roleDataTable = GameEntry.DataTable.GetDataTable<DRRole>();
}
@@ -48,7 +48,7 @@ namespace UI
bool result = SelectedRoleId >= 0;
if (result)
{
_procedureStartMenu.StartGame(SelectedRoleId);
_onStartGame?.Invoke(SelectedRoleId);
}
return result;
@@ -96,4 +96,4 @@ namespace UI
return sb.ToString();
}
}
}
}