Files
aibis-dream/Assets/Scripts/FixSystemNew/WhackMole/WhackMoleSystem.cs
T
2025-07-23 19:43:45 +08:00

115 lines
3.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using AibisDream.Framework;
using UnityEngine;
using Yarn.Unity;
namespace AibisDream.FixSystem
{
[RequireComponent(typeof(BodyModuleSystem))]
public class WhackMoleSystem : MonoBehaviour
{
private BodyModuleSystem _bodyModuleSystem;
private WhackMoleHandler _handler;
private WhackMoleLog _log;
private Dictionary<string, MoleModule> _moleModules;
private void Awake()
{
_bodyModuleSystem = GetComponent<BodyModuleSystem>();
FixSystemCenter.SystemDic.Register(this);
_log = GetComponentInChildren<WhackMoleLog>();
}
#region 打地鼠游戏流程控制
public void StartWhack(WhackMoleData levelData)
{
_handler = WhackMoleHandler.Create(levelData, this);
_handler.OnGameEnd += OnWhackEnd;
// 获取当前所有模块
_moleModules =
_bodyModuleSystem.BodyModules.ToDictionary(item => item.data.moduleName, item => item as MoleModule);
_moleModules.Values.ToList().ForEach(item => item.isInMoleGame = true);
_log.Init();
_handler.StartGame();
}
private void OnWhackEnd(bool isSuccess)
{
_moleModules.Values.ToList().ForEach(item => item.isInMoleGame = false);
// TODO 触发游戏结束
_log.OnGameEnd(isSuccess);
DialogController.Instance.StartDialogNode(isSuccess ? "打地鼠游戏通过" : "打地鼠游戏失败");
}
public void OnPlugIn(string moduleName)
{
_handler?.OnPlugIn(moduleName);
}
public void OnPlugOut(string moduleName)
{
_handler?.OnPlugOut(moduleName);
}
#endregion
#region 效果相关, 控制BodyModuleSystem实现
public void StartAllFlicker()
{
foreach (var module in _moleModules.Values)
{
module.StartFlicker();
}
}
public void StopAllFlicker()
{
foreach (var module in _moleModules.Values)
{
module.StopFlicker();
}
}
public void LightOnModule(string moduleName)
{
if (_moleModules.TryGetValue(moduleName, out var moleModule))
{
moleModule.LightOn(Color.red);
}
else
{
Debug.LogError($"没有找到模块:{moduleName}");
}
}
public void LightOffModule(string moduleName)
{
if (_moleModules.TryGetValue(moduleName, out var moleModule))
{
moleModule.LightOff();
}
else
{
Debug.LogError($"没有找到模块:{moduleName}");
}
}
#endregion
}
public static class WholeMoleCommand
{
private static WhackMoleSystem WhackMoleSystem => FixSystemCenter.SystemDic.Get<WhackMoleSystem>();
[YarnCommand("start_whack_game")]
public static void StartWhack(string levelName)
{
var levelData = ResourceKit.LoadAssetSync<WhackMoleData>($"WhackMoleData/{levelName}.asset");
WhackMoleSystem.StartWhack(levelData);
}
}
}