This commit is contained in:
daixiawu 2025-07-09 20:40:47 +08:00
commit 71312ac3b9
13 changed files with 201 additions and 35 deletions

View File

@ -27,7 +27,7 @@ MonoBehaviour:
_version: 3.33
_category:
_comments:
_translation: {x: 443, y: 169}
_translation: {x: -215, y: 43}
_zoomFactor: 1
_haltSerialization: 0
_externalSerializationFile: {fileID: 0}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,49 @@
/*
* @Author:
* @Description:
* @Date: 20250606 19:06:16
* @Modify:
*/
using System;
using Logic.AI;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
namespace NodeCanvas.Tasks.Actions
{
[Category("AIAction")]
[Serializable]
public class AIParamCityUnitCountLimit : ActionTask
{
public bool IsGreater;
public int Count;
protected override string info
{
get
{
if (IsGreater) return string.Format($" 城市人数大于 {Count}");
return string.Format($" 城市人数小于 {Count}");
}
}
protected override void OnExecute()
{
// 直接从Blackboard获取AICalculatorData
var data = blackboard.GetVariable<AICalculatorData>("Data");
if (data?.value?.TargetParam.CityData == null)
{
EndAction(false);
return;
}
var city = data.value.TargetParam.CityData;
var count = data.value.TargetParam.MapData.GetUnitCount(city.Id);
if (IsGreater) EndAction(count > Count);
else EndAction(count < Count);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 29d035e4d96c480f8094efcdb6370f03
timeCreated: 1752045507

View File

@ -0,0 +1,51 @@
/*
* @Author:
* @Description:
* @Date: 20250606 19:06:16
* @Modify:
*/
using System;
using System.Collections.Generic;
using Logic.AI;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using RuntimeData;
namespace NodeCanvas.Tasks.Actions
{
[Category("AIAction")]
[Serializable]
public class AIParamCityUnitRatio : ActionTask
{
public bool IsGreater;
public float Ratio;
protected override string info
{
get
{
if (IsGreater) return string.Format($" 城市人数大于 {Ratio}%");
return string.Format($" 城市人数小于 {Ratio}%");
}
}
protected override void OnExecute()
{
// 直接从Blackboard获取AICalculatorData
var data = blackboard.GetVariable<AICalculatorData>("Data");
if (data?.value?.TargetParam.CityData == null)
{
EndAction(false);
return;
}
var city = data.value.TargetParam.CityData;
var ratio = data.value.TargetParam.MapData.GetUnitCount(city.Id) / city.Level;
if (IsGreater) EndAction(ratio > Ratio);
else EndAction(ratio < Ratio);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: abb10756c33f47afb2658b47439ba2c7
timeCreated: 1752045263

View File

@ -1536,8 +1536,8 @@ namespace Logic.AI
var dis = Map.GridMap.CalcDistance(unitGrid, cityGrid);
ratio = dis switch
{
0 => 3,
1 => 2,
0 => 4,
1 => 3,
2 => 1,
3 => 0,
_ => ratio
@ -1553,8 +1553,8 @@ namespace Logic.AI
var dis = Map.GridMap.CalcDistance(unitGrid, cityGrid);
ratio = dis switch
{
0 => 3,
1 => 2,
0 => 4,
1 => 3,
2 => 1,
3 => 0,
_ => ratio

View File

@ -68,9 +68,13 @@ namespace Logic.AI
_logicObject = GameObject.Find("AIBT");
_btOwner = _logicObject.GetComponent<BehaviourTreeOwner>();
_data = new AICalculatorData();
var data = _btOwner.blackboard.GetVariable<AICalculatorData>("Data");
data.value = _data;
if (data.value == null)
{
_data = new AICalculatorData();
data.value = _data;
}
else _data = data.value;
}
// 开始 AI 逻辑

View File

@ -0,0 +1,47 @@
using UnityEditor;
using UnityEngine;
namespace Logic.Editor
{
public class BuildManager
{
// 定义宏名称
public const string GAME_AUTO_DEBUG = "GAME_AUTO_DEBUG";
// 添加宏定义
[MenuItem("Build/开启全自动模式")]
public static void AddMacro()
{
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone);
if (!defines.Contains(GAME_AUTO_DEBUG))
{
defines = string.IsNullOrEmpty(defines)
? GAME_AUTO_DEBUG
: defines + ";" + GAME_AUTO_DEBUG;
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, defines);
}
}
// 移除宏定义
[MenuItem("Build/关闭全自动模式")]
public static void RemoveMacro()
{
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone);
if (defines.Contains(GAME_AUTO_DEBUG))
{
defines = defines.Replace($"{GAME_AUTO_DEBUG};", "")
.Replace($";{GAME_AUTO_DEBUG}", "")
.Replace(GAME_AUTO_DEBUG, "")
.Replace(";;", ";")
.Trim(';');
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, defines);
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8640a67a3b834c90bf7ce4a9063fc7c1
timeCreated: 1752049414

View File

@ -30,8 +30,6 @@ namespace Logic
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;
@ -49,7 +47,6 @@ namespace Logic
_gameStateDict.Add(GameState.Finished, new FinishState(this));
_curState = GameState.Menu;
_gameStateDict[_curState].Enter();
_AIDifficults = new Dictionary<uint, AIDifficult>();
}
public void Update()
@ -67,16 +64,6 @@ namespace Logic
_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;
}
}
}
@ -103,6 +90,8 @@ namespace Logic
public class PlayerRoundState : GameStateBase
{
private AILogic _aiLogic;
public PlayerRoundState(GameLogic gameLogic) : base(gameLogic)
{
@ -123,8 +112,6 @@ namespace Logic
_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);
@ -135,6 +122,10 @@ namespace Logic
//uiManager.EndTurn();
PlayerPrefs.SetInt("Archive", 1);
MapData.SaveMapData(_gameLogic.Main.MapData);
#if GAME_AUTO_DEBUG
_aiLogic = new AILogic();
#endif
}
@ -146,7 +137,6 @@ namespace Logic
// 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)
@ -161,7 +151,25 @@ namespace Logic
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
}
}
@ -223,9 +231,7 @@ namespace Logic
_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;
_curPlayer.PlayerWealth += (int)_curPlayer.Turn / 10 * (int)_gameLogic.Main.MapData.MapConfig.AIDiff;
_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);

View File

@ -128,7 +128,7 @@ public class ChooseUI
"LUNATIC" => AIDifficult.LUNATIC,
_ => AIDifficult.EASY
};
_mapData.MapConfig.AIDiff = diff;
if (_mapData != null) _mapData.MapConfig.AIDiff = diff;
GameMode mode = modeS switch
{
@ -137,8 +137,8 @@ public class ChooseUI
_ => GameMode.CREATIVE
};
_mapData.MapConfig.AIDiff = diff;
_mapData.MapConfig.GameMode = mode;
if (_mapData != null) _mapData.MapConfig.AIDiff = diff;
if (_mapData != null) _mapData.MapConfig.GameMode = mode;
if (!int.TryParse(mapSizeS.Substring(10), out int mapSize))