319 lines
9.5 KiB
C#
319 lines
9.5 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: 游戏进程逻辑
|
||
* @Date: 2025年04月01日 星期二 11:04:00
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using System.Collections.Generic;
|
||
using Logic.AI;
|
||
using Logic.Audio;
|
||
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;
|
||
|
||
//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();
|
||
}
|
||
|
||
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 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 = Main.MapData.PlayerMap.SelfPlayerData;
|
||
Turn++;
|
||
foreach(var playerData in Main.MapData.PlayerMap.PlayerDataList)
|
||
Main.PlayerLogic.StartNextTurn(Main.MapData, playerData);
|
||
foreach (var unitData in Main.MapData.UnitMap.UnitList)
|
||
Main.UnitLogic.StartNextTurn(Main.MapData, unitData);
|
||
|
||
Main.MapData.PlayerMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.CityMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.UnitMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.GridMap.OnTurnStart(Main.MapData);
|
||
|
||
|
||
AudioManager.Instance.InGameOnTurnStart();
|
||
|
||
UIManager.Instance.EndTurn();
|
||
_gameLogic.Main.InputLogic.UnlockInput();
|
||
UIManager.Instance.AIPlaying = false;
|
||
|
||
//gameLogic.EndTurn();
|
||
//uiManager.EndTurn();
|
||
PlayerPrefs.SetInt("Archive", 1);
|
||
MapData.SaveMapData(Main.MapData);
|
||
AchievementDataManager.Instance.OnTurnStart(Main.MapData, _curPlayer);
|
||
|
||
#if GAME_AUTO_DEBUG
|
||
_aiLogic = new AILogic();
|
||
#endif
|
||
}
|
||
|
||
|
||
//玩家结束时出发的End
|
||
public override void End()
|
||
{
|
||
_gameLogic.Main.InputLogic.LockInput();
|
||
|
||
// TODO endturn逻辑要重新梳理
|
||
Main.PlayerLogic.EndThisTurn(Main.MapData, Main.MapData.PlayerMap.SelfPlayerData);
|
||
|
||
//处理当前每一个unit的回合结束前自动行为。每一个选手回合结束自动回血是在这个阶段出发的
|
||
foreach (var unitData in Main.MapData.UnitMap.UnitList)
|
||
if(Main.MapData.GetPlayerDataByUnitId(unitData.Id,out var player)
|
||
&& player.Id == _curPlayer.Id)
|
||
Main.UnitLogic.UnitEndTurn(Main.MapData, unitData);
|
||
|
||
Main.MapData.PlayerMap.OnTurnEnd(Main.MapData, _curPlayer);
|
||
Main.MapData.CityMap.OnTurnEnd(Main.MapData, _curPlayer);
|
||
Main.MapData.UnitMap.OnTurnEnd(Main.MapData, _curPlayer);
|
||
Main.MapData.GridMap.OnTurnEnd(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;
|
||
Main.MapData.PlayerMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.CityMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.UnitMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.GridMap.OnTurnStart(Main.MapData);
|
||
_aiLogic.StartAILogic(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()
|
||
{
|
||
UIManager.Instance.AIPlayingHint.SetActive(true);
|
||
Turn++;
|
||
_aiPlayers.Clear();
|
||
foreach (var playerData in Main.MapData.PlayerMap.PlayerDataList)
|
||
{
|
||
if (playerData.Id == 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 难度加钱
|
||
int tt = 0;
|
||
if (_curPlayer.Turn < 10)
|
||
tt = (int)Main.MapData.MapConfig.AIDiff;
|
||
_curPlayer.PlayerWealth += ((int)_curPlayer.Turn / 10) * (int)Main.MapData.MapConfig.AIDiff + tt;
|
||
|
||
Main.MapData.PlayerMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.CityMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.UnitMap.OnTurnStart(Main.MapData, _curPlayer);
|
||
Main.MapData.GridMap.OnTurnStart(Main.MapData);
|
||
_aiLogic.StartAILogic(Main.MapData, _curPlayer);
|
||
}
|
||
|
||
_aiLogic.Update();
|
||
}
|
||
|
||
private void TryTurnEndCurPlayerTurn()
|
||
{
|
||
if (_curPlayer == null) return;
|
||
Main.MapData.PlayerMap.OnTurnEnd(Main.MapData, _curPlayer);
|
||
Main.MapData.CityMap.OnTurnEnd(Main.MapData, _curPlayer);
|
||
Main.MapData.UnitMap.OnTurnEnd(Main.MapData, _curPlayer);
|
||
Main.MapData.GridMap.OnTurnEnd(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 = Main.MapData.ExportGameRecord();
|
||
GameRecordManager.Instance.AddRecord(record);
|
||
}
|
||
|
||
public override void End()
|
||
{
|
||
|
||
}
|
||
|
||
public override void Update()
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|