326 lines
10 KiB
C#
326 lines
10 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: 游戏进程逻辑
|
||
* @Date: 2025年04月01日 星期二 11:04:00
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using System.Collections.Generic;
|
||
using Logic.AI;
|
||
using UnityEngine.PlayerLoop;
|
||
using RuntimeData;
|
||
using UnityEngine;
|
||
|
||
|
||
namespace Logic
|
||
{
|
||
public enum GameState
|
||
{
|
||
Menu,
|
||
PlayerRound,
|
||
AIRound,
|
||
Finished,
|
||
}
|
||
|
||
|
||
public class GameLogic
|
||
{
|
||
private GameState _curState;
|
||
private Main _main;
|
||
//private MapData _mapData;
|
||
private Dictionary<GameState, GameStateBase> _gameStateDict;
|
||
private Dictionary<uint, AIDifficult> _AIDifficults;
|
||
public Dictionary<uint, AIDifficult> AIDifficults => _AIDifficults;
|
||
|
||
//public MapData Map => _mapData;
|
||
public Main Main => _main;
|
||
public PlayerData CurPlayer => _gameStateDict[_curState].CurPlayer;
|
||
|
||
|
||
public GameLogic(Main main)//, MapData mapData)
|
||
{
|
||
_main = main;
|
||
//_mapData = mapData;
|
||
_gameStateDict = new Dictionary<GameState, GameStateBase>();
|
||
_gameStateDict.Add(GameState.PlayerRound, new PlayerRoundState(this));
|
||
_gameStateDict.Add(GameState.AIRound, new AIRoundState(this));
|
||
_gameStateDict.Add(GameState.Menu, new MenuState(this));
|
||
_gameStateDict.Add(GameState.Finished, new FinishState(this));
|
||
_curState = GameState.Menu;
|
||
_gameStateDict[_curState].Enter();
|
||
_AIDifficults = new Dictionary<uint, AIDifficult>();
|
||
}
|
||
|
||
public void Update()
|
||
{
|
||
_gameStateDict[_curState].Update();
|
||
Main.PlayerLogic.CalcAllPlayerScore(_main.MapData);
|
||
}
|
||
|
||
|
||
//同一个turn内,切换到AI轮次
|
||
public void ChangeState(GameState newState)
|
||
{
|
||
if (_curState == newState) return;
|
||
_gameStateDict[_curState].End();
|
||
_curState = newState;
|
||
_gameStateDict[_curState].Enter();
|
||
}
|
||
|
||
public void SetAllAIDifficult(AIDifficult level)
|
||
{
|
||
foreach (var player in _main.MapData.PlayerMap.PlayerDataList)
|
||
{
|
||
if (player.Id == _main.MapData.PlayerMap.SelfPlayerId) continue;
|
||
_AIDifficults[player.Id] = level;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
public abstract class GameStateBase
|
||
{
|
||
public int Turn;
|
||
protected GameLogic _gameLogic;
|
||
protected PlayerData _curPlayer;
|
||
|
||
public PlayerData CurPlayer => _curPlayer;
|
||
|
||
|
||
public GameStateBase(GameLogic gameLogic)
|
||
{
|
||
_gameLogic = gameLogic;
|
||
}
|
||
|
||
public abstract GameState State { get; }
|
||
public abstract void Enter();
|
||
public abstract void End();
|
||
public abstract void Update();
|
||
}
|
||
|
||
|
||
public class PlayerRoundState : GameStateBase
|
||
{
|
||
private AILogic _aiLogic;
|
||
|
||
public PlayerRoundState(GameLogic gameLogic) : base(gameLogic)
|
||
{
|
||
|
||
}
|
||
|
||
public override GameState State => GameState.PlayerRound;
|
||
|
||
public override void Enter()
|
||
{
|
||
_curPlayer = _gameLogic.Main.MapData.PlayerMap.SelfPlayerData;
|
||
Turn++;
|
||
foreach(var playerData in _gameLogic.Main.MapData.PlayerMap.PlayerDataList)
|
||
Main.PlayerLogic.StartNextTurn(_gameLogic.Main.MapData, playerData);
|
||
foreach (var unitData in _gameLogic.Main.MapData.UnitMap.UnitList)
|
||
Main.UnitLogic.StartNextTurn(_gameLogic.Main.MapData, unitData);
|
||
|
||
_gameLogic.Main.MapData.PlayerMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.CityMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.UnitMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.GridMap.OnTurnStart(_gameLogic.Main.MapData);
|
||
|
||
_gameLogic.Main.UIManager.EndTurn();
|
||
_gameLogic.Main.UIManager.AIPlayingHint.SetActive(false);
|
||
_gameLogic.Main.InputLogic.UnlockInput();
|
||
//UIManager.AIPlaying = false;
|
||
|
||
//gameLogic.EndTurn();
|
||
//uiManager.EndTurn();
|
||
PlayerPrefs.SetInt("Archive", 1);
|
||
MapData.SaveMapData(_gameLogic.Main.MapData);
|
||
|
||
#if GAME_AUTO_DEBUG
|
||
_aiLogic = new AILogic();
|
||
#endif
|
||
}
|
||
|
||
|
||
//玩家结束时出发的End
|
||
public override void End()
|
||
{
|
||
_gameLogic.Main.InputLogic.LockInput();
|
||
|
||
// TODO endturn逻辑要重新梳理
|
||
Main.PlayerLogic.EndThisTurn(_gameLogic.Main.MapData, _gameLogic.Main.MapData.PlayerMap.SelfPlayerData);
|
||
|
||
//处理当前每一个unit的回合结束前自动行为。每一个选手回合结束自动回血是在这个阶段出发的
|
||
foreach (var unitData in _gameLogic.Main.MapData.UnitMap.UnitList)
|
||
if(_gameLogic.Main.MapData.GetPlayerDataByUnitId(unitData.Id,out var player)
|
||
&& player.Id == _curPlayer.Id)
|
||
Main.UnitLogic.UnitEndTurn(_gameLogic.Main.MapData, unitData);
|
||
|
||
_gameLogic.Main.MapData.PlayerMap.OnTurnEnd(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.CityMap.OnTurnEnd(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.UnitMap.OnTurnEnd(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.GridMap.OnTurnEnd(_gameLogic.Main.MapData);
|
||
}
|
||
|
||
public override void Update()
|
||
{
|
||
#if GAME_AUTO_DEBUG
|
||
if (_aiLogic.AILogicState == AILogicState.Finished)
|
||
{
|
||
_gameLogic.ChangeState(GameState.AIRound);
|
||
return;
|
||
}
|
||
|
||
if (_aiLogic.AILogicState == AILogicState.Prepare)
|
||
{
|
||
_curPlayer.PlayerWealth += (int)_curPlayer.Turn / 10;
|
||
_gameLogic.Main.MapData.PlayerMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.CityMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.UnitMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.GridMap.OnTurnStart(_gameLogic.Main.MapData);
|
||
_aiLogic.StartAILogic(_gameLogic.Main.MapData, _curPlayer);
|
||
}
|
||
|
||
_aiLogic.Update();
|
||
#endif
|
||
}
|
||
}
|
||
|
||
|
||
public class AIRoundState : GameStateBase
|
||
{
|
||
private List<PlayerData> _aiPlayers;
|
||
private AILogic _aiLogic;
|
||
|
||
|
||
public AIRoundState(GameLogic gameLogic) : base(gameLogic)
|
||
{
|
||
_aiLogic = new AILogic();
|
||
_aiPlayers = new List<PlayerData>();
|
||
}
|
||
|
||
public override GameState State => GameState.AIRound;
|
||
|
||
public override void Enter()
|
||
{
|
||
_gameLogic.Main.UIManager.AIPlayingHint.SetActive(true);
|
||
Turn++;
|
||
_aiPlayers.Clear();
|
||
foreach (var playerData in _gameLogic.Main.MapData.PlayerMap.PlayerDataList)
|
||
{
|
||
if (playerData.Id == _gameLogic.Main.MapData.PlayerMap.SelfPlayerId) continue;
|
||
_aiPlayers.Add(playerData);
|
||
}
|
||
|
||
MainEditor.Instance.OnAIStarted();
|
||
Update();
|
||
}
|
||
|
||
public override void End()
|
||
{
|
||
_aiLogic.FinishAILogic();
|
||
TryTurnEndCurPlayerTurn();
|
||
}
|
||
|
||
public override void Update()
|
||
{
|
||
//如果开启了Debug无AI模式
|
||
if (DebugCenter.Instance.DebugNoAI)
|
||
{
|
||
_gameLogic.ChangeState(GameState.PlayerRound);
|
||
return;
|
||
}
|
||
if (_aiLogic.AILogicState == AILogicState.Finished && _aiPlayers.Count == 0)
|
||
{
|
||
TryTurnEndCurPlayerTurn();
|
||
_gameLogic.ChangeState(GameState.PlayerRound);
|
||
return;
|
||
}
|
||
|
||
if (_aiLogic.AILogicState == AILogicState.Finished || _aiLogic.AILogicState == AILogicState.Prepare)
|
||
{
|
||
TryTurnEndCurPlayerTurn();
|
||
|
||
_curPlayer = _aiPlayers[0];
|
||
_aiPlayers.RemoveAt(0);
|
||
// AI 难度加钱
|
||
if (_gameLogic.AIDifficults.TryGetValue(_curPlayer.Id, out var level))
|
||
_curPlayer.PlayerWealth += (int)_curPlayer.Turn / 10 * (int)level;
|
||
else _curPlayer.PlayerWealth += (int)_curPlayer.Turn / 10;
|
||
_gameLogic.Main.MapData.PlayerMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.CityMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.UnitMap.OnTurnStart(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.GridMap.OnTurnStart(_gameLogic.Main.MapData);
|
||
_aiLogic.StartAILogic(_gameLogic.Main.MapData, _curPlayer);
|
||
}
|
||
|
||
_aiLogic.Update();
|
||
}
|
||
|
||
private void TryTurnEndCurPlayerTurn()
|
||
{
|
||
if (_curPlayer == null) return;
|
||
_gameLogic.Main.MapData.PlayerMap.OnTurnEnd(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.CityMap.OnTurnEnd(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.UnitMap.OnTurnEnd(_gameLogic.Main.MapData, _curPlayer);
|
||
_gameLogic.Main.MapData.GridMap.OnTurnEnd(_gameLogic.Main.MapData);
|
||
}
|
||
}
|
||
|
||
|
||
public class MenuState : GameStateBase
|
||
{
|
||
public MenuState(GameLogic gameLogic) : base(gameLogic)
|
||
{
|
||
|
||
}
|
||
|
||
public override GameState State => GameState.Menu;
|
||
|
||
public override void Enter()
|
||
{
|
||
Turn++;
|
||
}
|
||
|
||
public override void End()
|
||
{
|
||
|
||
}
|
||
|
||
public override void Update()
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
|
||
public class FinishState : GameStateBase
|
||
{
|
||
public FinishState(GameLogic gameLogic) : base(gameLogic)
|
||
{
|
||
|
||
}
|
||
|
||
public override GameState State => GameState.Finished;
|
||
|
||
public override void Enter()
|
||
{
|
||
Turn++;
|
||
PlayerPrefs.SetInt("Archive", 0);
|
||
|
||
var record = _gameLogic.Main.MapData.ExportGameRecord();
|
||
GameRecordManager.Instance.AddRecord(record);
|
||
}
|
||
|
||
public override void End()
|
||
{
|
||
|
||
}
|
||
|
||
public override void Update()
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|