// Update is called once per frame void Update() { //this is the only way I could fix the hover panel remaining persistent when it shouldn't HoverPanelOff(); switch (state) { case CursorState.SelectingUnit: #region Selecting Unit MoveCursor(); ///TILE VISIBILITY //Activate/Deactivate Tiles if (hoverUnit != null) //get the hover unit's range { gridManager.DeactivateAllTiles(gridManager.greenTiles); gridManager.DeactivateAllTiles(gridManager.redTiles); gridManager.ActivateAroundTile(gridManager.greenTiles, hoverUnit.Energy, hoverUnit.pos); gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, hoverUnit.Energy); ///HOVER STAT PANEL ON HoverPanelOn(); } else { gridManager.DeactivateAllTiles(gridManager.greenTiles); gridManager.DeactivateAllTiles(gridManager.redTiles); } ///UNIT SELECTION if (Input.GetMouseButtonUp(0) && canClick) { //selecting the hoverunit: the else if prevents from walking on occupied tiles if (hoverUnit != null) { if (hoverUnit.turn) { selectedUnit = hoverUnit; state = CursorState.SelectingDestination; savedPos = selectedUnit.pos; ///HOVER STAT PANEL OFF HoverPanelOff(); ///CORNER PANEL ON cornerStats.SetActive(true); cornerStats.GetComponent <StatPanelManager>().SetUnit(selectedUnit); } } } break; #endregion case CursorState.SelectingDestination: #region Selecting Destination MoveCursor(); ///TILE VISIBILITY //Activate/Deactivate Tiles if (hoverUnit != null) //get the hover unit's range { gridManager.DeactivateAllTiles(gridManager.greenTiles); gridManager.DeactivateAllTiles(gridManager.redTiles); gridManager.ActivateAroundTile(gridManager.greenTiles, hoverUnit.Energy, hoverUnit.pos); gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, hoverUnit.Energy); if (hoverUnit != selectedUnit) { ///HOVER STAT PANEL ON HoverPanelOn(); } } else if (selectedUnit != null) //if a character is already selected, revert the range to them { gridManager.DeactivateAllTiles(gridManager.greenTiles); gridManager.DeactivateAllTiles(gridManager.redTiles); gridManager.ActivateAroundTile(gridManager.greenTiles, selectedUnit.Energy, selectedUnit.pos); gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, selectedUnit.Energy); ///HOVER STAT PANEL OFF HoverPanelOff(); } else { //this shouldn't happen Debug.Log("SelectingDestination: invalid condition"); } ///UNIT MOVEMENT if (Input.GetMouseButtonUp(0) && canClick) { //Move Unit if (selectedUnit != null) { //Limit movement to range if (gridManager.greenTiles[pos.x, pos.y].activeSelf && tileManager.GetUnit(pos) == null) { //Move Stack <Vector2Int> path = FindPath(selectedUnit.pos, pos); selectedUnit.path = path; selectedUnit.state = UnitState.Moving; selectedUnit.pos = pos; } else if (tileManager.GetUnit(pos) == selectedUnit) { //select own tile selectedUnit.state = UnitState.AwaitingChoice; ///HOVER STAT PANEL OFF HoverPanelOff(); } } } //Cancel selection else if (Input.GetMouseButtonUp(1)) { if (selectedUnit != null) { selectedUnit = null; state = CursorState.SelectingUnit; } } break; #endregion case CursorState.AwaitingChoice: #region Awaiting Choice //cancel if (Input.GetMouseButtonUp(1)) { if (selectedUnit.state == UnitState.AwaitingChoice) { selectedUnit.pos = savedPos; selectedUnit.transform.localPosition = new Vector3(savedPos.x, selectedUnit.transform.localPosition.y, savedPos.y); selectedUnit.state = UnitState.SelectingDestination; state = CursorState.SelectingDestination; var panel = GameObject.FindGameObjectWithTag("ActionPanel"); if (panel != null) { panel.GetComponent <ActionPanelManager>().ClosePanel(); } } else if (selectedUnit.state == UnitState.SelectingTarget) { state = CursorState.SelectingTarget; //probably unnecessary var panel = GameObject.FindGameObjectWithTag("ActionPanel"); if (panel != null) { panel.GetComponent <ActionPanelManager>().ClosePanel(); } } return; } if (GameObject.FindGameObjectWithTag("ActionPanel") != null) { return; } ///ACTION PANEL ON var actionPanel = Instantiate(hoverActions) as GameObject; actionPanel.transform.SetParent(gameObject.transform.parent); var actionManager = actionPanel.GetComponent <ActionPanelManager>(); //Debug.Log("creating panel"); //panel 1 if (selectedUnit.state == UnitState.AwaitingChoice) { //Debug.Log("created action panel"); actionManager.UpdatePosition(selectedUnit); actionManager.AddActionButton(ActionButton.Attack); actionManager.AddActionButton(ActionButton.Wait); } else //panel 2 { //Debug.Log("created attack panel"); actionManager.UpdatePosition(selectedUnit.combatTarget); //change to taget unit //get possible attacks foreach (AttackType attack in selectedUnit.attackTypes) { switch (attack) { case AttackType.Cripple: actionManager.AddActionButton(ActionButton.Cripple); break; case AttackType.Impair: actionManager.AddActionButton(ActionButton.Impair); break; case AttackType.Weaken: actionManager.AddActionButton(ActionButton.Weaken); break; } } } break; #endregion case CursorState.SelectingTarget: #region Selecting Target MoveCursor(); ///TILE VISIBILITY if (selectedUnit != null) //if a character is already selected, revert the range to them { gridManager.DeactivateAllTiles(gridManager.greenTiles); gridManager.DeactivateAllTiles(gridManager.redTiles); gridManager.ActivateAroundTile(gridManager.greenTiles, 0, selectedUnit.pos); //can this be removed? gridManager.ActivateFrontierTiles(gridManager.greenTiles, gridManager.redTiles, selectedUnit.Energy); } if (hoverUnit != null && hoverUnit != selectedUnit) { ///HOVER STAT PANEL ON HoverPanelOn(); } else { ///HOVER PANEL OFF HoverPanelOff(); } ///UNIT SELECTION if (Input.GetMouseButtonUp(0) && canClick) { if (selectedUnit != null) { if (gridManager.redTiles[pos.x, pos.y].activeSelf && tileManager.GetUnit(pos) != null) { //attacking selectedUnit.combatTarget = hoverUnit; //selectedUnit.state = UnitState.Attacking; state = CursorState.AwaitingChoice; //Debug.Log("cursor: awaiting choice"); ///HOVER STAT PANEL OFF HoverPanelOff(); } } } //Cancel selection else if (Input.GetMouseButtonUp(1)) { if (selectedUnit != null) { //TODO: cancelling; selectedUnit.state = UnitState.AwaitingChoice; state = CursorState.AwaitingChoice; } } break; #endregion case CursorState.Inactive: #region Inactive gridManager.DeactivateAllTiles(gridManager.greenTiles); gridManager.DeactivateAllTiles(gridManager.redTiles); if (GetComponent <SpriteRenderer>().enabled) { GetComponent <SpriteRenderer>().enabled = false; } HoverPanelOff(); break; #endregion } }