/// <summary> /// tooltip coroutine /// </summary> /// <returns></returns> private IEnumerator ShowTooltip() { float alphaCurrent; //delay before tooltip kicks in yield return(new WaitForSeconds(mouseOverDelay)); //activate tool tip if mouse still over node if (onMouseFlag == true) { switch (menuType) { case ActionMenuType.Node: case ActionMenuType.NodeGear: //need to regularly update node details, rather than just at game start nodeObject = GameManager.i.dataScript.GetNodeObject(nodeID); if (nodeObject != null) { node = nodeObject.GetComponent <Node>(); } //do once while (GameManager.i.tooltipNodeScript.CheckTooltipActive() == false) { List <string> activeList = new List <string>(); switch (GameManager.i.turnScript.currentSide.level) { case 1: //Authority activeList = GameManager.i.dataScript.GetActiveContactsAtNodeAuthority(nodeID); break; case 2: activeList = GameManager.i.dataScript.GetActiveContactsAtNodeResistance(nodeID); break; } List <EffectDataTooltip> effectsList = node.GetListOfOngoingEffectTooltips(); List <string> targetList = GameManager.i.targetScript.GetTargetTooltip(node.targetName, node.isTargetKnown); List <string> teamList = new List <string>(); List <Team> listOfTeams = node.GetListOfTeams(); if (listOfTeams.Count > 0) { foreach (Team team in listOfTeams) { teamList.Add(string.Format("{0} team", team.arc.name)); } } //adjust position prior to sending (rectTransform is in World units) Vector3 positionNode = rectTransform.position; positionNode.x += 150; positionNode.y -= 125; positionNode = Camera.main.ScreenToWorldPoint(positionNode); NodeTooltipData nodeTooltip = new NodeTooltipData() { nodeName = node.nodeName, type = string.Format("{0} ID {1}", node.Arc.name, nodeID), arrayOfStats = new int[] { node.Stability, node.Support, node.Security }, listOfContactsCurrent = activeList, listOfEffects = effectsList, listOfTeams = teamList, listOfTargets = targetList, tooltipPos = positionNode }; GameManager.i.tooltipNodeScript.SetTooltip(nodeTooltip); yield return(null); } //fade in while (GameManager.i.tooltipNodeScript.GetOpacity() < 1.0) { alphaCurrent = GameManager.i.tooltipNodeScript.GetOpacity(); alphaCurrent += Time.deltaTime / mouseOverFade; GameManager.i.tooltipNodeScript.SetOpacity(alphaCurrent); yield return(null); } break; case ActionMenuType.Gear: Gear gear = GameManager.i.dataScript.GetGear(gearName); if (gear != null) { GenericTooltipDetails details = GameManager.i.gearScript.GetGearTooltip(gear); if (details != null) { //do once while (GameManager.i.tooltipGenericScript.CheckTooltipActive() == false) { //adjust position prior to sending Vector3 positionGear = rectTransform.position; GenericTooltipData data = new GenericTooltipData() { screenPos = positionGear, main = details.textMain, header = details.textHeader, details = details.textDetails }; GameManager.i.tooltipGenericScript.SetTooltip(data); yield return(null); //fade in while (GameManager.i.tooltipGenericScript.GetOpacity() < 1.0) { alphaCurrent = GameManager.i.tooltipGenericScript.GetOpacity(); alphaCurrent += Time.deltaTime / mouseOverFade; GameManager.i.tooltipGenericScript.SetOpacity(alphaCurrent); yield return(null); } } } } break; case ActionMenuType.Actor: GlobalSide side = GameManager.i.sideScript.PlayerSide; Actor actor = GameManager.i.dataScript.GetCurrentActor(actorSlotID, side); if (actor != null) { //do once while (GameManager.i.tooltipActorScript.CheckTooltipActive() == false) { //adjust position prior to sending Vector3 positionActor = rectTransform.position; positionActor.x += 70; positionActor.y -= 100; ActorTooltipData actorTooltip = actor.GetTooltipData(positionActor); GameManager.i.tooltipActorScript.SetTooltip(actorTooltip, actor.slotID); yield return(null); //fade in while (GameManager.i.tooltipActorScript.GetOpacity() < 1.0) { alphaCurrent = GameManager.i.tooltipActorScript.GetOpacity(); alphaCurrent += Time.deltaTime / mouseOverFade; GameManager.i.tooltipActorScript.SetOpacity(alphaCurrent); yield return(null); } } } break; case ActionMenuType.Player: //do once while (GameManager.i.tooltipPlayerScript.CheckTooltipActive() == false) { //adjust position prior to sending Vector3 positionPlayer = rectTransform.position; positionPlayer.x += 70; positionPlayer.y -= 100; GameManager.i.tooltipPlayerScript.SetTooltip(positionPlayer); yield return(null); //fade in while (GameManager.i.tooltipPlayerScript.GetOpacity() < 1.0) { alphaCurrent = GameManager.i.tooltipPlayerScript.GetOpacity(); alphaCurrent += Time.deltaTime / mouseOverFade; GameManager.i.tooltipPlayerScript.SetOpacity(alphaCurrent); yield return(null); } } break; } } }
/// <summary> /// Initialise node tooltip /// </summary> /// <param name="data"></param> public void SetTooltip(NodeTooltipData data) { /*//final modal check to prevent inappropriate display of tooltip, eg. of MainInfoApp * if (GameManager.instance.guiScript.CheckIsBlocked() == false) EDIT: Removed as doesn't work for menu tooltip as modal 1 in this situation * {*/ bool proceedFlag; int numRecordsCurrent, numRecordsOther; GlobalSide playerSide = GameManager.i.sideScript.PlayerSide; GlobalSide currentSide = GameManager.i.turnScript.currentSide; //open panel at start tooltipNodeCanvas.gameObject.SetActive(true); tooltipNodeObject.SetActive(true); /*//set opacity to zero (invisible) * //SetOpacity(0f);*/ //set state of all items in tooltip window nodeName.gameObject.SetActive(true); nodeType.gameObject.SetActive(true); /*nodeStatsVar.gameObject.SetActive(true); * nodeStatsFixed.gameObject.SetActive(true);*/ nodeStats.gameObject.SetActive(true); ongoingEffects.gameObject.SetActive(false); dividerTop.gameObject.SetActive(true); //show only if node active for at least one actor nodeActive.gameObject.SetActive(false); dividerCrisis.gameObject.SetActive(false); dividerUpperMiddle.gameObject.SetActive(false); dividerLowerMiddle.gameObject.SetActive(true); dividerStats.gameObject.SetActive(false); //target nodeTarget.gameObject.SetActive(true); dividerBottom.gameObject.SetActive(true); //show spider only if present and known if (data.isSpiderKnown == true) { spider.gameObject.SetActive(true); spiderTimer.gameObject.SetActive(true); spiderTimer.text = Convert.ToString(data.spiderTimer); } else { spider.gameObject.SetActive(false); spiderTimer.gameObject.SetActive(false); spiderTimer.text = ""; } // // - - - Tracer (if present and known) // proceedFlag = false; if (data.isTracer == true) { switch (playerSide.level) { case 1: //authority if (data.isTracerKnown == true) { proceedFlag = true; } break; case 2: //resistance proceedFlag = true; break; } } if (proceedFlag == true) { tracer.gameObject.SetActive(true); tracerTimer.gameObject.SetActive(true); if (data.isTracer) { //show Yellow Timer if tracer in node, otherise ignore timer tracerTimer.text = string.Format("{0}{1}{2}", colourNeutral, data.tracerTimer, colourEnd); } else { tracerTimer.text = ""; } } else { tracer.gameObject.SetActive(false); tracer.gameObject.SetActive(false); tracerTimer.text = ""; } //set up tooltipNode object if (string.IsNullOrEmpty(data.specialName) == false) { nodeName.text = string.Format("{0}{1}{2}{3}{4}", data.nodeName, "\n", colourAlert, data.specialName, colourEnd); } else { nodeName.text = string.Format("{0}{1}{2}", colourDefault, data.nodeName, colourEnd); } nodeType.text = string.Format("{0}{1}{2}", colourAlert, data.type, colourEnd); // // - - - Stats (BEFORE Crisis)- - - // int checkCounter = 0; int statData; bool isPossibleCrisis = false; if (data.arrayOfStats.Length == 3) { StringBuilder builderStats = new StringBuilder(); for (int i = 0; i < data.arrayOfStats.Length; i++) { statData = data.arrayOfStats[i]; if (i > 0) { builderStats.AppendLine(); } builderStats.AppendFormat("{0} {1}<pos=57%>{2}", arrayOfIcons[i], (NodeData)i, GameManager.i.guiScript.GetNormalStars(statData)); //idiot check to handle case of being too many stats checkCounter++; if (checkCounter >= 3) { break; } } nodeStats.text = builderStats.ToString(); /* * //fixed node stat tags -> show red (authority) / green (resistance) if in the danger zone (possible or actual crisis), default white otherwise * string colourCrisis = colourGood; * if (playerSide.level == 1) { colourCrisis = colourBad; } * StringBuilder builderFixed = new StringBuilder(); * if (data.arrayOfStats[0] == minStatValue) { builderFixed.AppendFormat("{0}Stability{1}", colourCrisis, colourEnd); isPossibleCrisis = true; } * else { builderFixed.Append("Stability"); } * builderFixed.AppendLine(); * if (data.arrayOfStats[1] == maxStatValue) { builderFixed.AppendFormat("{0}Support{1}", colourCrisis, colourEnd); isPossibleCrisis = true; } * else { builderFixed.Append("Support"); } * builderFixed.AppendLine(); * if (data.arrayOfStats[2] == minStatValue) { builderFixed.AppendFormat("{0}Security{1}", colourCrisis, colourEnd); isPossibleCrisis = true; } * else { builderFixed.Append("Security"); } */ } else { Debug.LogWarning("Invalid length for arrayOfStats (not 3)"); } // // - - - Crisis - - - // int numOfCrisis = 0; if (data.listOfCrisis != null) { numOfCrisis = data.listOfCrisis.Count; } if (numOfCrisis > 0) { StringBuilder builderCrisis = new StringBuilder(); //listOfCrisis has 4 fixed topic entries for (int index = 0; index < numOfCrisis; index++) { switch (index) { case 0: //'x' CRISIS builderCrisis.AppendFormat("{0}<b>{1}</b>{2}", colourBad, data.listOfCrisis[index], colourEnd); break; case 1: //'x' turns left builderCrisis.AppendFormat("{0}{1}{2}{3}", "\n", colourNeutral, data.listOfCrisis[index], colourEnd); break; case 2: case 3: //info dump builderCrisis.AppendFormat("{0}<size=90%>{1}<b>{2}</b>{3}</size>", "\n", colourAlert, data.listOfCrisis[index], colourEnd); break; default: Debug.LogWarningFormat("Invalid listOfCrisis[{0}] \"{1}\"", index, data.listOfCrisis[index]); break; } } //divider dividerCrisis.gameObject.SetActive(true); crisis.text = builderCrisis.ToString(); crisis.gameObject.SetActive(true); } else if (isPossibleCrisis == true) { crisis.text = string.Format("{0}Potential Crisis{1}", colourAlert, colourEnd); crisis.gameObject.SetActive(true); dividerCrisis.gameObject.SetActive(true); } else { crisis.text = ""; crisis.gameObject.SetActive(false); } // // - - - Contacts - - - // //set tooltip elements to show nodeActive.gameObject.SetActive(true); dividerUpperMiddle.gameObject.SetActive(true); //build string StringBuilder builderActor = new StringBuilder(); builderActor.Append(colourActive); //ascertain whether actors shown or not proceedFlag = false; numRecordsCurrent = data.listOfContactsCurrent.Count; if (data.listOfContactsOther != null) { numRecordsOther = data.listOfContactsOther.Count; } else { numRecordsOther = 0; } //contact info depends on side status if (currentSide.level == globalResistance.level) { //Resistance if (numRecordsCurrent > 0) { //contacts present for (int i = 0; i < numRecordsCurrent; i++) { if (i > 0) { builderActor.AppendLine(); } builderActor.AppendFormat("{0}<b>{1}</b>{2}", colourNeutral, data.listOfContactsCurrent[i], colourEnd); } } else { //no contacts present builderActor.AppendFormat("{0}<size=90%>No Contacts</size>{1}", colourDefault, colourEnd); } } else if (currentSide.level == globalAuthority.level) { //Authority if (numRecordsCurrent > 0) { //contacts present for (int i = 0; i < numRecordsCurrent; i++) { if (i > 0) { builderActor.AppendLine(); } builderActor.AppendFormat("{0}<b>{1}</b>{2}", colourNeutral, data.listOfContactsCurrent[i], colourEnd); } } else { //no contacts present builderActor.AppendFormat("{0}<size=90%>No Contacts</size>{1}", colourDefault, colourEnd); } builderActor.AppendLine(); //Authority comment on resistance contacts if (GameManager.i.optionScript.isFogOfWar == true) { //FOW ON if (data.isContactKnown == true) { if (numRecordsOther > 0) { //other contacts present builderActor.AppendFormat("{0}<b>Resistance Contact</b>{1}{2}", colourAlert, numRecordsOther != 1 ? "s" : "", colourEnd); } else { //no other contacts present builderActor.AppendFormat("{0}<size=90%>No Resistance Contacts</size>{1}", colourNormal, colourEnd); } } else { builderActor.AppendFormat("{0}<size=90%>Resistance Contacts unknown</size>{1}", colourNormal, colourEnd); } } else { //FOW OFF if (numRecordsOther > 0) { //other contacts present builderActor.AppendFormat("{0}<b>Resistance Contact</b>{1}{2}", colourAlert, numRecordsOther != 1 ? "s" : "", colourEnd); } else { //no other contacts present builderActor.AppendFormat("{0}<size=90%>No Resistance Contacts</size>{1}", colourDefault, colourEnd); } } } nodeActive.text = builderActor.ToString(); // // - - - Ongoing effects - - - // if (data.listOfEffects.Count > 0) { string effectText = "Unknown"; ongoingEffects.gameObject.SetActive(true); dividerStats.gameObject.SetActive(true); StringBuilder effectBuilder = new StringBuilder(); effectBuilder.AppendFormat("{0}<size=90%>Ongoing Effects</size>{1}", colourDefault, colourEnd); for (int i = 0; i < data.listOfEffects.Count; i++) { switch (data.listOfEffects[i].typeLevel) { case 2: //Good effectText = string.Format("{0}{1}{2}", colourGoodSide, data.listOfEffects[i].text, colourEnd); break; case 1: //Neutral effectText = string.Format("{0}{1}{2}", colourNeutral, data.listOfEffects[i].text, colourEnd); break; case 0: //Bad effectText = string.Format("{0}{1}{2}", colourBadSide, data.listOfEffects[i].text, colourEnd); break; default: effectText = string.Format("{0}{1}{2}", colourDefault, data.listOfEffects[i].text, colourEnd); Debug.LogError(string.Format("Invalid ongoingEffect.type \"{0}\"", data.listOfEffects[i].typeLevel)); break; } effectBuilder.AppendLine(); effectBuilder.Append(effectText); } ongoingEffects.text = effectBuilder.ToString(); } else { ongoingEffects.text = ""; } // // - - - Teams - - - // proceedFlag = false; if (playerSide.level == globalAuthority.level) { proceedFlag = true; } else if (playerSide.level == globalResistance.level) { if (GameManager.i.optionScript.isFogOfWar == true) { if (data.isTracer == true || data.isTeamKnown == true || data.isActiveContact == true) { proceedFlag = true; } } else { proceedFlag = true; } } //show teams show only (Resistance) if node has a tracer or actor has a contact there or isTeamKnown true (if FOW option 'true') if (proceedFlag == true) { if (data.listOfTeams.Count > 0) { StringBuilder teamBuilder = new StringBuilder(); foreach (string teamText in data.listOfTeams) { if (teamBuilder.Length > 0) { teamBuilder.AppendLine(); } teamBuilder.AppendFormat("{0}<b>{1}</b>{2}", colourTeam, teamText, colourEnd); } nodeTeams.text = teamBuilder.ToString(); } else { nodeTeams.text = string.Format("{0}{1}{2}", colourDefault, "<size=90%>No Teams present</size>", colourEnd); } } else { nodeTeams.text = string.Format("{0}Team Info unavailable{1}{2}{3}<size=90%>requires Tracer or Contact</size>{4}", colourBadSide, colourEnd, "\n", colourDefault, colourEnd); } // // - - Target (multipurpose, shows activity data if NodeManager.cs -> activityState > 'None') - - - // StringBuilder builder = new StringBuilder(); //NO Activity if (GameManager.i.nodeScript.activityState == ActivityUI.None) { if (GameManager.i.optionScript.isTargets == true) { if (data.listOfTargets.Count > 0) { //normal target info builder.Append(colourDefault); //foreach (string target in listOfTarget) for (int i = 0; i < data.listOfTargets.Count; i++) { if (i > 0) { builder.AppendLine(); builder.AppendFormat("<size=90%>{0}</size>", data.listOfTargets[i]); } else { builder.Append(data.listOfTargets[i]); } } builder.Append(colourEnd); } else { builder.AppendFormat("{0}{1}{2}", colourDefault, "<size=90%>No Target present</size>", colourEnd); } nodeTarget.text = builder.ToString(); } else { nodeTarget.text = string.Format("{0}{1}{2}", colourDefault, "<size=90%>Targets Disabled</size>", colourEnd); } } //Activity else { //show one line at top for target/no target and activity data for the rest if (GameManager.i.optionScript.isTargets == true) { if (data.listOfTargets.Count > 0) { builder.Append(data.listOfTargets[0]); } else { builder.AppendFormat("{0}{1}{2}", colourDefault, "<size=90%>No Target present</size>", colourEnd); } } else { builder.AppendFormat("{0}{1}{2}", colourDefault, "<size=90%>Targets Disabled</size>", colourEnd); } builder.AppendLine(); builder.AppendLine(); //Activity information if (data.listOfActivity != null && data.listOfActivity.Count > 0) { //activity info builder.Append(colourNormal); for (int i = 0; i < data.listOfActivity.Count; i++) { if (i > 0) { builder.AppendLine(); } builder.Append(data.listOfActivity[i]); } builder.Append(colourEnd); } else { builder.AppendFormat("{0}<b>Unknown Activity Info</b>{1}", colourBadSide, colourEnd); } nodeTarget.text = builder.ToString(); } //convert coordinates Vector3 screenPos = Camera.main.WorldToScreenPoint(data.tooltipPos); Canvas.ForceUpdateCanvases(); rectTransform = tooltipNodeObject.GetComponent <RectTransform>(); //get dimensions of dynamic tooltip 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 / 2 + offset; } else { screenPos.y -= height / 2 + offset; } //width - default centred if (screenPos.x + width / 2 >= Screen.width) { screenPos.x -= width / 2 + screenPos.x - Screen.width; } else if (screenPos.x - width / 2 <= 0) { screenPos.x += width / 2 - screenPos.x; } //set new position tooltipNodeObject.transform.position = screenPos; Debug.LogFormat("[UI] TooltipNode.cs -> SetTooltip, node \"{0}\"{1}", data.nodeName, "\n"); /*}*/ }