using Core.Input;
using TowerDefense.Level;
using TowerDefense.Towers;
using TowerDefense.UI.HUD;
using UnityEngine;
using UnityInput = UnityEngine.Input;
using State = TowerDefense.UI.HUD.EndlessGameUI.State;
using KTGMGemClient;
namespace TowerDefense.Input
{
[RequireComponent(typeof(EndlessGameUI))]
public class EndlessTowerDefenseKeyboardMouseInput : KeyboardMouseInput
{
///
/// Cached eference to gameUI
///
EndlessGameUI m_GameUI;
///
/// 是否处于拖动状态。
///
protected bool isInDragState = false;
///
/// Register input events
///
protected override void OnEnable()
{
base.OnEnable();
m_GameUI = GetComponent();
if (InputController.instanceExists)
{
InputController controller = InputController.instance;
controller.tapped += OnTap;
controller.mouseMoved += OnMouseMoved;
// River Add for Mouse Start Drag & Draged.
controller.startedDrag += OnStartDrag;
controller.dragged += this.OnDrag;
controller.pressed += OnPressed;
controller.released += this.OnEndDrag;
}
}
///
/// Deregister input events
///
protected override void OnDisable()
{
if (!InputController.instanceExists)
{
return;
}
InputController controller = InputController.instance;
controller.tapped -= OnTap;
controller.mouseMoved -= OnMouseMoved;
controller.startedDrag -= this.OnStartDrag;
controller.dragged -= this.OnDrag;
controller.pressed -= OnPressed;
controller.released -= this.OnEndDrag;
}
///
/// Handle camera panning behaviour
///
protected override void Update()
{
base.Update();
// Escape handling
if (UnityInput.GetKeyDown(KeyCode.Escape))
{
switch (m_GameUI.state)
{
case State.Normal:
if (m_GameUI.isTowerSelected)
{
m_GameUI.DeselectTower();
}
else
{
m_GameUI.Pause();
}
break;
case State.BuildingWithDrag:
case State.Building:
m_GameUI.CancelGhostPlacement();
break;
}
}
// place towers with keyboard numbers
if (EndlessLevelManager.instanceExists)
{
int towerLibraryCount = EndlessLevelManager.instance.TowerLibrary.Count;
// find the lowest value between 9 (keyboard numbers)
// and the amount of towers in the library
int count = Mathf.Min(9, towerLibraryCount);
KeyCode highestKey = KeyCode.Alpha1 + count;
for (var key = KeyCode.Alpha1; key < highestKey; key++)
{
// add offset for the KeyCode Alpha 1 index to find correct keycodes
if (UnityInput.GetKeyDown(key))
{
Tower controller = EndlessLevelManager.instance.TowerLibrary[key - KeyCode.Alpha1];
if (m_GameUI.isBuilding)
{
m_GameUI.CancelGhostPlacement();
}
EndlessGameUI.instance.SetToBuildMode(controller);
EndlessGameUI.instance.TryMoveGhost(InputController.instance.basicMouseInfo);
break;
}
}
// special case for 0 mapping to index 9
if (count < 10 && UnityInput.GetKeyDown(KeyCode.Alpha0))
{
Tower controller = EndlessLevelManager.instance.TowerLibrary[9];
EndlessGameUI.instance.SetToBuildMode(controller);
EndlessGameUI.instance.TryMoveGhost(InputController.instance.basicMouseInfo);
}
}
}
///
/// Ghost follows pointer
///
void OnMouseMoved(PointerInfo pointer)
{
// We only respond to mouse info
var mouseInfo = pointer as MouseCursorInfo;
if ((mouseInfo != null) && (m_GameUI.isBuilding))
{
m_GameUI.TryMoveGhost(pointer, false);
}
}
float currentTimeScale = 1.0f;
protected virtual void OnStartDrag(PointerActionInfo pointer)
{
if (GameConfig.IsNewbie)
{
if (!GameConfig.CanDragTower)
{
Debug.Log("新手不可以拖拽");
return;
}
}
// select towers
m_GameUI.TrySelectTower(pointer);
// River: 为了开始拖动后可以直接显示GhostTower
m_GameUI.TryMoveGhost(pointer, false);
if (m_GameUI.HasTower)
{
EndlessUIStart.instance.SetDarkGround(true);
this.isInDragState = true;
AudioSourceManager.Ins.Play(AudioEnum.DragTower);
m_GameUI.CheckAllCanPlace();//检查上阵宝石有么有可以合成的位置
if (!GameConfig.IsNewbie)
{
//新手引导这里会把引导的速度变慢
currentTimeScale = Time.timeScale;
Time.timeScale = 0.5f;
}
else
{
GuideCtrl.Ins.BeginDrag5_1();
}
}
}
protected override void OnDrag(PointerActionInfo pointer)
{
if ((pointer != null) && (m_GameUI.isBuilding))
{
m_GameUI.TryMoveGhost(pointer, false);
m_GameUI.CheckTowerPlace(pointer);
}
}
///
/// 鼠标抬起
///
///
protected void OnEndDrag(PointerActionInfo pointer)
{
// EndDrag 只能放置相关的GhostTower.
if (this.isInDragState)
{
EndlessUIStart.instance.SetDarkGround(false);
AudioSourceManager.Ins.Play(AudioEnum.PutTower);
m_GameUI.CloseCanPlaceRenderer();//关闭所有宝石示意
m_GameUI.onEndTowerDrag(pointer);
this.isInDragState = false;
if (!GameConfig.IsNewbie)
Time.timeScale = currentTimeScale;
}
}
private void OnPressed(PointerActionInfo pointer)
{
m_GameUI.OnPressed(pointer);
}
///
/// Select towers or position ghosts
///
void OnTap(PointerActionInfo pointer)
{
// 不允许点击放置,只能拖拽
}
}
}