326 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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()
{
}
}
}