コード例 #1
0
    /// <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;
            }
        }
    }
コード例 #2
0
    /// <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");
        /*}*/
    }