431 lines
13 KiB
C#
431 lines
13 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace TBTK{
|
|
|
|
public class GridIndicator : MonoBehaviour {
|
|
|
|
[Header("Square")]
|
|
public Transform sqCursor;
|
|
public Transform sqSelect;
|
|
public Transform sqMovable;
|
|
public Transform sqHostile;
|
|
public Transform sqAbility;
|
|
public Transform sqDeploy;
|
|
public Transform sqFog;
|
|
|
|
[HideInInspector] public List<Transform> sqMovableList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> sqHostileList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> sqAbilityList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> sqDeployList=new List<Transform>();
|
|
|
|
|
|
|
|
[Header("Hex")]
|
|
public Transform hexCursor;
|
|
public Transform hexSelect;
|
|
public Transform hexMovable;
|
|
public Transform hexHostile;
|
|
public Transform hexAbility;
|
|
public Transform hexDeploy;
|
|
public Transform hexFog;
|
|
|
|
[HideInInspector] public List<Transform> hexMovableList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> hexHostileList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> hexAbilityList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> hexDeployList=new List<Transform>();
|
|
|
|
|
|
|
|
[Header("Common")]
|
|
public Transform coverOverlayF;
|
|
public Transform coverOverlayH;
|
|
|
|
[HideInInspector] public List<Transform> coverOverlayFList=new List<Transform>();
|
|
[HideInInspector] public List<Transform> coverOverlayHList=new List<Transform>();
|
|
|
|
[HideInInspector] public List<Transform> fogList=new List<Transform>();
|
|
|
|
|
|
|
|
[Header("Runtime")]
|
|
public Transform cursor;
|
|
public Transform select;
|
|
|
|
[HideInInspector] public List<Transform> extraCursorList=new List<Transform>(); //for aoe
|
|
|
|
|
|
public static GridIndicator instance;
|
|
|
|
public void Awake(){
|
|
instance=this;
|
|
}
|
|
|
|
void Start(){
|
|
bool manualDeployment=UnitManager.RequireManualDeployment();
|
|
|
|
if(GridManager.IsHexGrid()){
|
|
for(int i=0; i<30; i++) AddElement(hexMovable, hexMovableList);
|
|
for(int i=0; i<15; i++) AddElement(hexHostile, hexHostileList);
|
|
for(int i=0; i<20; i++) AddElement(hexAbility, hexAbilityList);
|
|
if(manualDeployment){ for(int i=0; i<10; i++) AddElement(hexDeploy, hexDeployList); }
|
|
}
|
|
else{
|
|
for(int i=0; i<30; i++) AddElement(sqMovable, sqMovableList);
|
|
for(int i=0; i<15; i++) AddElement(sqHostile, sqHostileList);
|
|
for(int i=0; i<20; i++) AddElement(sqAbility, sqAbilityList);
|
|
if(manualDeployment){ for(int i=0; i<10; i++) AddElement(sqDeploy, hexDeployList); }
|
|
}
|
|
|
|
if(GameControl.EnableFogOfWar()){
|
|
if(GridManager.IsHexGrid() && hexFog!=null){
|
|
for(int i=0; i<GridManager.GetNodeCount(); i++) AddElement(hexFog, fogList);
|
|
}
|
|
if(GridManager.IsSquareGrid() && sqFog!=null){
|
|
for(int i=0; i<GridManager.GetNodeCount(); i++) AddElement(sqFog, fogList);
|
|
}
|
|
}
|
|
|
|
if(GameControl.EnableCoverSystem()){
|
|
int count=GridManager.IsHexGrid() ? 6 : 4 ;
|
|
float scale=GridManager.IsHexGrid() ? 0.45f : 0.6f ;
|
|
for(int i=0; i<count; i++) AddElement(coverOverlayF, coverOverlayFList, false, scale);
|
|
for(int i=0; i<count; i++) AddElement(coverOverlayH, coverOverlayHList, false, scale);
|
|
}
|
|
|
|
select=GridManager.IsHexGrid() ? hexSelect : sqSelect ;
|
|
select=AddElement(select);
|
|
select.gameObject.SetActive(true);
|
|
|
|
cursor=GridManager.IsHexGrid() ? hexCursor : sqCursor ;
|
|
cursor=AddElement(cursor);
|
|
cursor.gameObject.SetActive(true);
|
|
|
|
SetCursor(null); cursor.position=new Vector3(0, 9999, 0);
|
|
SetSelect(null);
|
|
}
|
|
|
|
|
|
void OnEnable(){ TBTK.onActionInProgressE += OnActionInProgress ; }
|
|
void OnDisable(){ TBTK.onActionInProgressE -= OnActionInProgress ; }
|
|
|
|
void OnActionInProgress(bool flag){ if(flag) HideAll(); }
|
|
|
|
|
|
|
|
|
|
private Node lastNode;
|
|
|
|
|
|
private void CheckCursorCount(int count){
|
|
while(count>extraCursorList.Count){
|
|
Transform cursorX=AddElement(cursor, extraCursorList, true);
|
|
cursorX.localScale=cursor.localScale;
|
|
}
|
|
}
|
|
|
|
|
|
public static void SetCursor(Node node){ instance._SetCursor(node); }
|
|
public void _SetCursor(Node node){
|
|
if(node==lastNode) return;
|
|
|
|
lastNode=node;
|
|
|
|
if(AbilityManager.IsWaitingForTarget()){
|
|
if(node!=null){
|
|
|
|
List<Node> list=new List<Node>();
|
|
|
|
if(AbilityManager.IsCurAbilityCone()){
|
|
int fov=AbilityManager.GetCurAbilityFOV();
|
|
list=GridManager.GetNodesInACone(AbilityManager.GetCurNode(), node, AbilityManager.GetCurAbilityRange(), fov);
|
|
|
|
CheckCursorCount(list.Count);
|
|
|
|
node=null;
|
|
}
|
|
else{
|
|
int aoe=AbilityManager.GetCurAbilityAOE();
|
|
if(aoe>0){
|
|
list=GridManager.GetNodesWithinDistance(node, aoe);
|
|
|
|
CheckCursorCount(list.Count);
|
|
}
|
|
}
|
|
|
|
for(int i=0; i<extraCursorList.Count; i++){
|
|
if(i<list.Count) extraCursorList[i].position=list[i].GetPos();
|
|
else extraCursorList[i].position=new Vector3(0, 9999, 0);
|
|
}
|
|
}
|
|
else{
|
|
for(int i=0; i<extraCursorList.Count; i++) extraCursorList[i].position=new Vector3(0, 9999, 0);
|
|
}
|
|
}
|
|
|
|
cursor.position=node!=null ? node.GetPos() : new Vector3(0, 9999, 0);
|
|
|
|
if(AbilityManager.IsWaitingForTarget()) return;
|
|
if(!GameControl.EnableCoverSystem()) return;
|
|
|
|
for(int i=0; i<coverOverlayFList.Count; i++) coverOverlayFList[i].gameObject.SetActive(false);
|
|
for(int i=0; i<coverOverlayHList.Count; i++) coverOverlayHList[i].gameObject.SetActive(false);
|
|
|
|
if(GridManager.CanMoveTo(node)){
|
|
for(int i=0; i<node.coverList.Count; i++){
|
|
if(node.coverList[i]==0) continue;
|
|
|
|
Transform coverOverlay=node.coverList[i]==1 ? coverOverlayHList[i] : coverOverlayFList[i] ;
|
|
|
|
coverOverlay.rotation=Quaternion.Euler(0, 360-Utility.Vector3ToAngle(GridManager.nodeDirList[i])-90, 0);
|
|
coverOverlay.position=node.GetPos()+GridManager.nodeDirList[i]*GridManager.GetNodeSize()*0.375f;
|
|
coverOverlay.gameObject.SetActive(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void SetSelect(Node node){
|
|
instance.select.position=node!=null ? node.GetPos() : new Vector3(0, 9999, 0);
|
|
}
|
|
|
|
|
|
|
|
public static void ShowFog(){ instance._ShowFog(); }
|
|
public void _ShowFog(){
|
|
if(GridManager.IsHexGrid() && hexFog==null) return;
|
|
if(GridManager.IsSquareGrid() && sqFog==null) return;
|
|
|
|
List<List<Node>> grid=GridManager.GetGrid();
|
|
|
|
int count=0;
|
|
for(int x=0; x<grid.Count; x++){
|
|
for(int z=0; z<grid[x].Count; z++){
|
|
if(grid[x][z].IsVisible()) continue;
|
|
|
|
if(count>=fogList.Count) AddElement(GridManager.IsHexGrid() ? hexFog : sqFog, fogList);
|
|
|
|
fogList[count].position=grid[x][z].GetPos();
|
|
fogList[count].gameObject.SetActive(true);
|
|
count+=1;
|
|
}
|
|
}
|
|
|
|
for(int i=count; i<fogList.Count; i++) fogList[i].gameObject.SetActive(false);
|
|
|
|
//~ if(nList.Count>hexDeployList.Count){
|
|
//~ int count=nList.Count-hexDeployList.Count;
|
|
//~ for(int i=0; i<count; i++) AddElement(hexDeploy, hexDeployList);
|
|
//~ }
|
|
|
|
//~ for(int i=0; i<hexDeployList.Count; i++){
|
|
//~ if(i<nList.Count) hexDeployList[i].position=nList[i].GetPos();
|
|
//~ hexDeployList[i].gameObject.SetActive(i<nList.Count);
|
|
//~ }
|
|
}
|
|
//~ public static void ClearFog(){ instance._ClearFog(); }
|
|
//~ public void _ClearFog(){
|
|
//~ if(GridManager.IsHexGrid()){ for(int i=0; i<hexFogList.Count; i++) hexFogList[i].gameObject.SetActive(false); }
|
|
//~ else{ for(int i=0; i<sqFogList.Count; i++) sqFogList[i].gameObject.SetActive(false); }
|
|
//~ }
|
|
|
|
|
|
|
|
public static void ShowDeployment(List<Node> nList){ instance._ShowDeployment(nList); }
|
|
public void _ShowDeployment(List<Node> nList){
|
|
|
|
if(GridManager.IsHexGrid()){
|
|
if(nList.Count>hexDeployList.Count){
|
|
int count=nList.Count-hexDeployList.Count;
|
|
for(int i=0; i<count; i++) AddElement(hexDeploy, hexDeployList);
|
|
}
|
|
|
|
for(int i=0; i<hexDeployList.Count; i++){
|
|
if(i<nList.Count) hexDeployList[i].position=nList[i].GetPos();
|
|
hexDeployList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
else{
|
|
if(nList.Count>sqDeployList.Count){
|
|
int count=nList.Count-sqDeployList.Count;
|
|
for(int i=0; i<count; i++) AddElement(sqDeploy, sqDeployList);
|
|
}
|
|
|
|
for(int i=0; i<sqDeployList.Count; i++){
|
|
if(i<nList.Count) sqDeployList[i].position=nList[i].GetPos();
|
|
sqDeployList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
}
|
|
public static void HideDeployment(){ instance._HideDeployment(); }
|
|
public void _HideDeployment(){
|
|
if(GridManager.IsHexGrid()){
|
|
for(int i=0; i<hexDeployList.Count; i++) hexDeployList[i].gameObject.SetActive(false);
|
|
}
|
|
else{
|
|
for(int i=0; i<sqDeployList.Count; i++) sqDeployList[i].gameObject.SetActive(false);
|
|
}
|
|
}
|
|
|
|
|
|
public static void ShowMovable(List<Node> nList){ instance._ShowMovable(nList); }
|
|
public void _ShowMovable(List<Node> nList){
|
|
HideAbility();
|
|
|
|
if(GridManager.IsHexGrid()){
|
|
if(nList.Count>hexMovableList.Count){
|
|
int count=nList.Count-hexMovableList.Count;
|
|
for(int i=0; i<count; i++) AddElement(hexMovable, hexMovableList);
|
|
}
|
|
|
|
for(int i=0; i<hexMovableList.Count; i++){
|
|
if(i<nList.Count) hexMovableList[i].position=nList[i].GetPos();
|
|
hexMovableList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
else{
|
|
if(nList.Count>sqMovableList.Count){
|
|
int count=nList.Count-sqMovableList.Count;
|
|
for(int i=0; i<count; i++) AddElement(sqMovable, sqMovableList);
|
|
}
|
|
|
|
for(int i=0; i<sqMovableList.Count; i++){
|
|
if(i<nList.Count) sqMovableList[i].position=nList[i].GetPos();
|
|
sqMovableList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[HideInInspector] public List<Node> cachedHostileList=new List<Node>();
|
|
|
|
public static void ShowHostile(List<Node> nList){ instance._ShowHostile(nList); }
|
|
public void _ShowHostile(List<Node> nList, bool cacheList=true){
|
|
HideAbility();
|
|
|
|
if(GridManager.IsHexGrid()){
|
|
if(nList.Count>hexHostileList.Count){
|
|
int count=nList.Count-hexHostileList.Count;
|
|
for(int i=0; i<count; i++) AddElement(hexHostile, hexHostileList);
|
|
}
|
|
|
|
for(int i=0; i<hexHostileList.Count; i++){
|
|
if(i<nList.Count) hexHostileList[i].position=nList[i].GetPos();
|
|
hexHostileList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
else{
|
|
if(nList.Count>sqHostileList.Count){
|
|
int count=nList.Count-sqHostileList.Count;
|
|
for(int i=0; i<count; i++) AddElement(sqHostile, sqHostileList);
|
|
}
|
|
|
|
for(int i=0; i<sqHostileList.Count; i++){
|
|
if(i<nList.Count) sqHostileList[i].position=nList[i].GetPos();
|
|
sqHostileList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
|
|
if(cacheList) cachedHostileList=nList;
|
|
}
|
|
|
|
private static bool previewingHostile=false;
|
|
public static void PreviewHostile(List<Node> nList){ instance._PreviewHostile(nList); }
|
|
public void _PreviewHostile(List<Node> nList){
|
|
previewingHostile=true;
|
|
_ShowHostile(nList, false);
|
|
}
|
|
public static void ClearPreviewHostile(){
|
|
if(!previewingHostile) return;
|
|
previewingHostile=false;
|
|
ShowHostile(instance.cachedHostileList);
|
|
}
|
|
|
|
|
|
|
|
public static void ShowAbility(List<Node> nList){ instance._ShowAbility(nList); }
|
|
public void _ShowAbility(List<Node> nList){
|
|
HideNormal();
|
|
|
|
if(GridManager.IsHexGrid()){
|
|
if(nList.Count>hexAbilityList.Count){
|
|
int count=nList.Count-hexAbilityList.Count;
|
|
for(int i=0; i<count; i++) AddElement(hexAbility, hexAbilityList);
|
|
}
|
|
|
|
for(int i=0; i<hexAbilityList.Count; i++){
|
|
if(i<nList.Count) hexAbilityList[i].position=nList[i].GetPos();
|
|
hexAbilityList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
else{
|
|
if(nList.Count>sqAbilityList.Count){
|
|
int count=nList.Count-sqAbilityList.Count;
|
|
for(int i=0; i<count; i++) AddElement(sqAbility, sqAbilityList);
|
|
}
|
|
|
|
for(int i=0; i<sqAbilityList.Count; i++){
|
|
if(i<nList.Count) sqAbilityList[i].position=nList[i].GetPos();
|
|
sqAbilityList[i].gameObject.SetActive(i<nList.Count);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public static void HideAll(){ instance._HideAll(); }
|
|
public void _HideAll(){
|
|
SetSelect(null);
|
|
|
|
HideNormal();
|
|
_HideAbility();
|
|
}
|
|
|
|
public void HideNormal(){
|
|
HideMove();
|
|
HideHostile();
|
|
}
|
|
public void HideMove(){
|
|
if(GridManager.IsHexGrid()){
|
|
for(int i=0; i<hexMovableList.Count; i++) hexMovableList[i].gameObject.SetActive(false);
|
|
}
|
|
else{
|
|
for(int i=0; i<sqMovableList.Count; i++) sqMovableList[i].gameObject.SetActive(false);
|
|
}
|
|
}
|
|
public void HideHostile(){
|
|
if(GridManager.IsHexGrid()){
|
|
for(int i=0; i<hexHostileList.Count; i++) hexHostileList[i].gameObject.SetActive(false);
|
|
}
|
|
else{
|
|
for(int i=0; i<sqHostileList.Count; i++) sqHostileList[i].gameObject.SetActive(false);
|
|
}
|
|
}
|
|
|
|
public static void HideAbility(){ instance._HideAbility(); }
|
|
public void _HideAbility(){
|
|
if(GridManager.IsHexGrid()){
|
|
for(int i=0; i<hexAbilityList.Count; i++) hexAbilityList[i].gameObject.SetActive(false);
|
|
}
|
|
else{
|
|
for(int i=0; i<sqAbilityList.Count; i++) sqAbilityList[i].gameObject.SetActive(false);
|
|
}
|
|
|
|
for(int i=0; i<extraCursorList.Count; i++) extraCursorList[i].position=new Vector3(0, 9999, 0);
|
|
}
|
|
|
|
|
|
private Transform AddElement(Transform prefab, List<Transform> tgtList=null, bool activeState=false, float scale=1){
|
|
Transform newItem=(Transform)Instantiate(prefab);
|
|
newItem.localScale*=GridManager.GetNodeSize(false) * scale;
|
|
newItem.parent=transform;
|
|
newItem.gameObject.SetActive(activeState);
|
|
|
|
if(tgtList!=null) tgtList.Add(newItem);
|
|
|
|
return newItem;
|
|
}
|
|
|
|
}
|
|
|
|
} |