public int powerCost; //power cost of an action, eg. dismiss, dispose off public ModalActionDetails() { nodeID = -1; actorDataID = -1; level = -1; gearAction = null; gearName = null; modalLevel = 1; modalState = ModalSubState.None; }
public RestorePoint restorePoint; //if it's a Save and Exit situation, player given option to return to game after saving. This tells where to return to. Optional public ModalConfirmDetails() { bottomText = "Are you sure?"; buttonFalse = "No"; buttonTrue = "Yes"; modalLevel = 1; modalState = ModalSubState.None; eventFalse = EventType.None; eventTrue = EventType.None; restorePoint = RestorePoint.None; }
public EventType triggerEvent; //optional -> when Outcome closes will run this event public ModalOutcomeDetails() { modalLevel = 1; modalState = ModalSubState.None; isAction = false; isSpecial = false; isSpecialGood = true; reason = "Unknown"; side = GameManager.i.sideScript.PlayerSide; sprite = GameManager.i.spriteScript.infoSprite; type = MsgPipelineType.None; listOfNodes = new List <Node>(); triggerEvent = EventType.None; }
/// <summary> /// Initialise ModalOutcome window but in special format (expanding black bars across the screen) /// </summary> /// <param name="details"></param> private void SetModalOutcomeSpecial(ModalOutcomeDetails details) { if (details != null) { isSpecial = true; //ignore if autoRun true if (GameManager.i.turnScript.CheckIsAutoRun() == false) { if (CheckModalOutcomeActive() == false) { //reset input Input.ResetInputAxes(); //exit any generic or node tooltips GameManager.i.tooltipGenericScript.CloseTooltip("ModalOutcome.cs -> SetModalOutcomeSpecial"); GameManager.i.tooltipNodeScript.CloseTooltip("ModalOutcome.cs -> SetModalOutcomeSpecial"); GameManager.i.tooltipHelpScript.CloseTooltip("ModalOutcome.cs -> SetModalOutcomeSpecial"); reason = details.reason; triggerEvent = details.triggerEvent; //set modal true GameManager.i.guiScript.SetIsBlocked(true, details.modalLevel); //toggle panels panelNormal.gameObject.SetActive(false); canvasSpecial.gameObject.SetActive(true); //register action status isAction = details.isAction; #region archive /*//Show Me * if (details.listOfNodes != null && details.listOfNodes.Count > 0) * { * * //showMe data * listOfShowMeNodes = details.listOfNodes; * //disable Confirm, activate Show Me button * confirmButtonNormal.gameObject.SetActive(false); * showMeButtonNormal.gameObject.SetActive(true); * //events to call to handle underlying UI (if any) * hideOtherEvent = details.hideEvent; * restoreOtherEvent = details.restoreEvent; * } * else * { * listOfShowMeNodes.Clear(); * //disable ShowMe, activate Confirm button * confirmButtonNormal.gameObject.SetActive(true); * showMeButtonNormal.gameObject.SetActive(false); * //default settings for events * hideOtherEvent = EventType.None; * restoreOtherEvent = EventType.None; * }*/ //set opacity to zero (invisible) //SetOpacity(0f); #endregion //set up modalOutcome elements topTextSpecial.text = details.textTop; bottomTextSpecial.text = details.textBottom; /*bottomTextSpecial.text = string.Format("{0}{1}{2}<size=80%>Press ANY Key to exit</size>", details.textBottom, "\n", "\n");*/ if (details.sprite != null) { portraitSpecial.sprite = details.sprite; } //open Canvas outcomeCanvas.gameObject.SetActive(true); //set blackBar to min width blackBarTransform.sizeDelta = new Vector2(specialWidth, blackBarTransform.sizeDelta.y); //highlight colour if (details.isSpecialGood == true) { highlight.color = colourGood; } else { highlight.color = colourBad; } //set states ModalStateData package = new ModalStateData() { mainState = ModalSubState.Outcome }; GameManager.i.inputScript.SetModalState(package); //pass through data for when the outcome window is closed modalLevel = details.modalLevel; modalState = details.modalState; Debug.LogFormat("[UI] ModalOutcome.cs -> SetModalOutcomeSpecial{0}", "\n"); //fixed popUps GameManager.i.popUpFixedScript.ExecuteFixed(0.75f); //grow black bars myCoroutineBarGrow = StartCoroutine("GrowBlackBar"); myCoroutineHighlights = StartCoroutine("RunHighlights"); } else { Debug.LogWarning("Can't start a new Modal Outcome as an instance is already active"); } } } else { Debug.LogWarning("Invalid ModalOutcomeDetails package (Null)"); } }
/// <summary> /// Initiate Modal Outcome window /// </summary> /// <param name="details"></param> public void SetModalOutcome(ModalOutcomeDetails details) { if (details != null) { isSpecial = false; //ignore if autoRun true if (GameManager.i.turnScript.CheckIsAutoRun() == false) { //reset input Input.ResetInputAxes(); //exit any generic or node tooltips GameManager.i.tooltipGenericScript.CloseTooltip("ModalOutcome.cs -> SetModalOutcome"); GameManager.i.tooltipNodeScript.CloseTooltip("ModalOutcome.cs -> SetModalOutcome"); GameManager.i.tooltipHelpScript.CloseTooltip("ModalOutcome.cs -> SetModalOutcome"); reason = details.reason; triggerEvent = details.triggerEvent; //set help List <HelpData> listOfHelpData = GameManager.i.helpScript.GetHelpData(details.help0, details.help1, details.help2, details.help3); if (listOfHelpData != null && listOfHelpData.Count > 0) { helpButtonNormal.gameObject.SetActive(true); helpNormal.SetHelpTooltip(listOfHelpData, 100, 200); } else { helpButtonNormal.gameObject.SetActive(false); } //set modal true GameManager.i.guiScript.SetIsBlocked(true, details.modalLevel); //toggle panels panelNormal.gameObject.SetActive(true); canvasSpecial.gameObject.SetActive(false); //register action status isAction = details.isAction; /* * //set confirm button image and sprite states * switch (details.side.name) * { * case "Authority": * //set button sprites * confirmButton.GetComponent<Image>().sprite = GameManager.i.sideScript.button_Authority; * //set sprite transitions * SpriteState spriteStateAuthority = new SpriteState(); * spriteStateAuthority.highlightedSprite = GameManager.i.sideScript.button_highlight_Authority; * spriteStateAuthority.pressedSprite = GameManager.i.sideScript.button_Click; * confirmButton.spriteState = spriteStateAuthority; * break; * case "Resistance": * //set button sprites * confirmButton.GetComponent<Image>().sprite = GameManager.i.sideScript.button_Resistance; * //set sprite transitions * SpriteState spriteStateRebel = new SpriteState(); * spriteStateRebel.highlightedSprite = GameManager.i.sideScript.button_highlight_Resistance; * spriteStateRebel.pressedSprite = GameManager.i.sideScript.button_Click; * confirmButton.spriteState = spriteStateRebel; * break; * default: * Debug.LogError(string.Format("Invalid side \"{0}\"", details.side)); * break; * } * //set transition * confirmButton.transition = Selectable.Transition.SpriteSwap; */ //Show Me if (details.listOfNodes != null && details.listOfNodes.Count > 0) { //showMe data listOfShowMeNodes = details.listOfNodes; //disable Confirm, activate Show Me button confirmButtonNormal.gameObject.SetActive(false); showMeButtonNormal.gameObject.SetActive(true); //events to call to handle underlying UI (if any) hideOtherEvent = details.hideEvent; restoreOtherEvent = details.restoreEvent; } else { listOfShowMeNodes.Clear(); //disable ShowMe, activate Confirm button confirmButtonNormal.gameObject.SetActive(true); showMeButtonNormal.gameObject.SetActive(false); //default settings for events hideOtherEvent = EventType.None; restoreOtherEvent = EventType.None; } //set opacity to zero (invisible) //SetOpacity(0f); //set up modalOutcome elements topTextNormal.text = details.textTop; bottomTextNormal.text = details.textBottom; if (details.sprite != null) { portraitNormal.sprite = details.sprite; } /*//get dimensions of outcome window (dynamic) * float width = rectTransform.rect.width; * float height = rectTransform.rect.height;*/ //set states ModalStateData package = new ModalStateData() { mainState = ModalSubState.Outcome }; GameManager.i.inputScript.SetModalState(package); //open Canvas outcomeCanvas.gameObject.SetActive(true); //pass through data for when the outcome window is closed modalLevel = details.modalLevel; modalState = details.modalState; Debug.LogFormat("[UI] ModalOutcome.cs -> SetModalOutcome{0}", "\n"); //fixed popUps GameManager.i.popUpFixedScript.ExecuteFixed(0.75f); } } else { Debug.LogWarning("Invalid ModalOutcomeDetails package (Null)"); } }
/// <summary> /// Initialise and activate modal Action Menu /// </summary> /// <param name="details"></param> public void SetActionMenu(ModalGenericMenuDetails details) { //set states (done up front to prevent node tooltip reoccuring during menu display) ModalStateData package = new ModalStateData() { mainState = ModalSubState.ActionMenu }; GameManager.i.inputScript.SetModalState(package); //close all tooltips GameManager.i.guiScript.SetTooltipsOff(); //check enough actions if (GameManager.i.turnScript.CheckRemainingActions() == true) { //modalActionObject.SetActive(true); menuCanvas.gameObject.SetActive(true); //set all states to off button1.gameObject.SetActive(false); button2.gameObject.SetActive(false); button3.gameObject.SetActive(false); button4.gameObject.SetActive(false); button5.gameObject.SetActive(false); button6.gameObject.SetActive(false); //set up ModalActionObject itemDetails.text = string.Format("{0}{1}{2}", details.itemName, "\n", details.itemDetails); //tooltip at top of menu -> pass through data ModalMenuUI modal = itemDetails.GetComponent <ModalMenuUI>(); modal.menuType = details.menuType; switch (details.menuType) { case ActionMenuType.Node: case ActionMenuType.NodeGear: modal.nodeID = details.itemID; break; case ActionMenuType.Actor: modal.actorSlotID = details.itemID; break; case ActionMenuType.Player: break; case ActionMenuType.Gear: modal.gearName = details.itemKey; break; } //There can be a max of 6 buttons (5 plus 1 x Cancel) int counter = 0; Button tempButton; Text title; foreach (EventButtonDetails buttonDetails in details.listOfButtonDetails) { tempButton = null; title = null; counter++; //get the relevent UI elements switch (counter) { case 1: tempButton = button1; title = button1Text; break; case 2: tempButton = button2; title = button2Text; break; case 3: tempButton = button3; title = button3Text; break; case 4: tempButton = button4; title = button4Text; break; case 5: tempButton = button5; title = button5Text; break; case 6: tempButton = button6; title = button6Text; break; default: Debug.LogWarning("To many EventButtonDetails in list!\n"); break; } //set up the UI elements if (tempButton != null && title != null) { tempButton.onClick.RemoveAllListeners(); tempButton.onClick.AddListener(CloseActionMenu); tempButton.onClick.AddListener(buttonDetails.action); title.text = buttonDetails.buttonTitle; tempButton.gameObject.SetActive(true); GenericTooltipUI generic = tempButton.GetComponent <GenericTooltipUI>(); generic.tooltipHeader = buttonDetails.buttonTooltipHeader; generic.tooltipMain = buttonDetails.buttonTooltipMain; generic.tooltipDetails = buttonDetails.buttonTooltipDetail; generic.x_offset = 40; } } //convert coordinates Vector3 screenPos = Camera.main.WorldToScreenPoint(details.menuPos); //update rectTransform to get a correct height as it changes every time with the dynamic menu resizing depending on number of buttons Canvas.ForceUpdateCanvases(); rectTransform = modalMenuObject.GetComponent <RectTransform>(); //get dimensions of dynamic menu float width = rectTransform.rect.width; float height = rectTransform.rect.height; //calculate offset - height (default above) if (screenPos.y + height + offset < Screen.height) { screenPos.y += height + offset; } else { screenPos.y -= offset; } //width - default right if (screenPos.x + offset >= Screen.width) { screenPos.x -= offset + screenPos.x - Screen.width; } //go left if needed else if (screenPos.x - offset - width <= 0) { screenPos.x += offset - width; } else { screenPos.x += offset; } //set new position modalMenuObject.transform.position = screenPos; //block raycasts to gameobjects GameManager.i.guiScript.SetIsBlocked(true, details.modalLevel); modalLevel = details.modalLevel; modalState = details.modalState; Debug.LogFormat("[UI] ModalActionMenu.cs -> SetActionMenu{0}", "\n"); } else { //insufficient actions remaining -> create an outcome window to notify player ModalOutcomeDetails outcomeDetails = new ModalOutcomeDetails(); outcomeDetails.side = GameManager.i.sideScript.PlayerSide; outcomeDetails.textTop = "You have used up all your Actions for this turn"; //extra text if player is wounded if (GameManager.i.turnScript.CheckPlayerWounded() == true) { outcomeDetails.textBottom = "Maximum ONE Action allowed while WOUNDED"; } outcomeDetails.sprite = GameManager.i.spriteScript.infoSprite; outcomeDetails.modalLevel = details.modalLevel; outcomeDetails.modalState = details.modalState; EventManager.i.PostNotification(EventType.OutcomeOpen, this, outcomeDetails, "ModalActionMenu.cs -> SetActionMenu"); } }
/// <summary> /// Activate modal Main Menu. Called by InitialiseMainMenu. /// </summary> /// <param name="details"></param> private void SetMainMenu(ModalGenericMenuDetails details) { //game state -> save current state first gameState = GameManager.i.inputScript.GameState; GameManager.i.inputScript.GameState = GameState.MainMenu; //turn off node tooltip if needs be GameManager.i.guiScript.SetTooltipsOff(); //activate main menu mainMenuCanvas.gameObject.SetActive(true); //set all states to off button1.gameObject.SetActive(false); button2.gameObject.SetActive(false); button3.gameObject.SetActive(false); button4.gameObject.SetActive(false); button5.gameObject.SetActive(false); button6.gameObject.SetActive(false); button7.gameObject.SetActive(false); button8.gameObject.SetActive(false); button9.gameObject.SetActive(false); button10.gameObject.SetActive(false); button11.gameObject.SetActive(false); //set up ModalActionObject itemDetails.text = string.Format("{0}{1}{2}", details.itemName, "\n", details.itemDetails); /*//tooltip at top of menu -> pass through data * ModalMenuUI modal = itemDetails.GetComponent<ModalMenuUI>();*/ //There can be a max of 9 buttons int counter = 0; Button tempButton; TextMeshProUGUI title; foreach (EventButtonDetails buttonDetails in details.listOfButtonDetails) { tempButton = null; title = null; counter++; //get the relevent UI elements switch (counter) { case 1: tempButton = button1; title = button1Text; break; case 2: tempButton = button2; title = button2Text; break; case 3: tempButton = button3; title = button3Text; break; case 4: tempButton = button4; title = button4Text; break; case 5: tempButton = button5; title = button5Text; break; case 6: tempButton = button6; title = button6Text; break; case 7: tempButton = button7; title = button7Text; break; case 8: tempButton = button8; title = button8Text; break; case 9: tempButton = button9; title = button9Text; break; case 10: tempButton = button10; title = button10Text; break; case 11: tempButton = button11; title = button11Text; break; default: Debug.LogWarning("To many EventButtonDetails in list!\n"); break; } //set up the UI elements if (tempButton != null && title != null) { tempButton.onClick.RemoveAllListeners(); tempButton.onClick.AddListener(CloseMainMenu); tempButton.onClick.AddListener(buttonDetails.action); title.text = buttonDetails.buttonTitle; tempButton.gameObject.SetActive(true); GenericTooltipUI generic = tempButton.GetComponent <GenericTooltipUI>(); generic.tooltipHeader = buttonDetails.buttonTooltipHeader; generic.tooltipMain = buttonDetails.buttonTooltipMain; generic.tooltipDetails = buttonDetails.buttonTooltipDetail; generic.x_offset = 40; } } //No need to convert coordinates (already screen coords) Vector3 screenPos = details.menuPos; //update rectTransform to get a correct height as it changes every time with the dynamic menu resizing depending on number of buttons Canvas.ForceUpdateCanvases(); rectTransform = modalMenuObject.GetComponent <RectTransform>(); //get dimensions of dynamic menu float width = rectTransform.rect.width; float height = rectTransform.rect.height; //place menu in centre of given position screenPos.x -= width / 2; screenPos.y += height / 2; /*//calculate offset - height (default above) -> No Auto adjust for hitting screen boundaries (it's wonky) * if (screenPos.y + height + offset < Screen.height) * { screenPos.y += height + offset; } * else { screenPos.y -= offset; } * //width - default right * if (screenPos.x + offset >= Screen.width) * { screenPos.x -= offset + screenPos.x - Screen.width; } * //go left if needed * else if (screenPos.x - offset - width <= 0) * { screenPos.x += offset - width; } * else * { screenPos.x += offset; }*/ //set new position modalMenuObject.transform.position = screenPos; //set states ModalStateData package = new ModalStateData() { mainState = ModalSubState.MainMenu }; GameManager.i.inputScript.SetModalState(package); //block raycasts to gameobjects GameManager.i.guiScript.SetIsBlocked(true, details.modalLevel); modalLevel = details.modalLevel; modalState = details.modalState; Debug.LogFormat("[UI] ModalMainMenu.cs -> SetMainMenu{0}", "\n"); }