예제 #1
0
 public void NextRound()
 {
     while ((int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["gamestate"] != 2)
     {
         ++SharedRefs.ReplayCursor;
         if (ErrorParser.HandleErrorCheck(this))
         {
             return;
         }
     }
     DoneAndGoBackToPreparation();
 }
예제 #2
0
        /// <summary>
        ///   <remarks>OFFLINE ONLY!</remarks>
        ///   <para>The method basically reads one record of replay data, handles
        /// it and increment the cursor by one.</para>
        /// </summary>
        public static void MoveCursor(this GameUI gameUI)
        {
            if (ErrorParser.HandleErrorCheck(gameUI))
            {
                return;
            }
            var state        = SharedRefs.ReplayJson[SharedRefs.ReplayCursor];
            var coercedState = SharedRefs.ReplayCursor >= SharedRefs.ReplayJson.Count - 1
                ? 2
                : (int)state["gamestate"];

            switch (coercedState)
            {
            case 2:     // Current round is over
            {
                var gain = (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["score"]
                           - (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 2]["score"];
                gameUI.resultText.text = gain > 0 ? $"{GameUI.MeStr}获胜" : $"{GameUI.EnemyStr}获胜";
                gameUI.gameOverMask.SetActive(true);

                var rounds = (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["rounds"] + 1;
                var score  = (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["score"];
                gameUI.scoreText.text = $"{(rounds - score - 1) / 2}:{(score + rounds - 1) / 2}";

                for (var i = 0; i < 4; i++)
                {
                    if ((int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["players"][(gain + 1) / 2]
                        ["fight_fish"][i]["state"] != 2)
                    {
                        (gain > 0 ? gameUI.enemyStatus : gameUI.myStatus)[i].Current = 0;
                        gameUI.Dissolve(gain > 0, i);
                    }
                }

                if ((int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["rounds"] == 3)
                {
                    gameUI.gameOverText.text = "回到首页";
                    SharedRefs.ReplayCursor--;
                }
                break;
            }

            case 3:     // Process Assertion
            {
                SharedRefs.ReplayCursor++;
                var operation = state["operation"][0];
                var subject   = (int)state["cur_turn"] == 0 ? GameUI.MeStr : GameUI.EnemyStr;
                var target    = (int)state["cur_turn"] == 0 ? GameUI.EnemyStr : GameUI.MeStr;
                if ((string)operation["Action"] == "Assert")
                {
                    gameUI.GameState.AssertionPlayer = (int)operation["ID"];
                    gameUI.GameState.Assertion       = (int)operation["Pos"];
                    gameUI.GameState.AssertionTarget = (int)operation["id"] - 1;
                    gameUI.MakeAGuess(gameUI.GameState.AssertionPlayer == 0, 2000);
                    gameUI.AddLog(
                        $"{subject}断言{target}{operation["Pos"]}号位置鱼为{Constants.FishName[(int) operation["id"] - 1]}。"
                        );
                }
                else
                {
                    gameUI.GameState.Assertion = -1;
                    gameUI.ChangeStatus();
                    gameUI.AddLog($"{subject}放弃断言。");
                }
                break;
            }

            case 4:     // Process Action
            {
                SharedRefs.ReplayCursor++;
                var operation = state["operation"][0];
                if ((string)operation["Action"] == "Action")
                {
                    // Set attacher
                    gameUI.GameState.MyTurn = (int)operation["ID"] == 0;
                    if (gameUI.GameState.MyTurn)
                    {
                        gameUI.GameState.MyFishSelected = (int)operation["MyPos"];
                    }
                    else
                    {
                        gameUI.GameState.EnemyFishSelected = (int)operation["MyPos"];
                    }
                    gameUI.ChangeStatus();

                    // Set attackee
                    if (operation.ContainsKey("EnemyPos"))
                    {
                        (gameUI.GameState.MyTurn
                                ? gameUI.GameState.EnemyFishSelectedAsTarget
                                : gameUI.GameState.MyFishSelectedAsTarget)[(int)operation["EnemyPos"]] = true;
                        gameUI.GameState.NormalAttack = true;
                    }
                    else if (operation["EnemyList"] != null)
                    {
                        gameUI.GameState.NormalAttack = false;
                        if (operation["MyList"] != null)
                        {
                            for (var i = 0; i < operation["MyList"].Count; i++)
                            {
                                (gameUI.GameState.MyTurn
                                            ? gameUI.GameState.MyFishSelectedAsTarget
                                            : gameUI.GameState.EnemyFishSelectedAsTarget)
                                [(int)operation["MyList"][i]] = true;
                            }
                        }
                    }
                    SharedRefs.ActionInfo = operation["ActionInfo"];
                    gameUI.ChangeStatus();
                }

                // Process hp and death
                if (SharedRefs.ReplayJson[SharedRefs.ReplayCursor] != null)
                {
                    if ((int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["gamestate"] == 3)
                    {
                        var players     = SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["players"];
                        var lastPlayers = SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 2]["players"];
                        for (var i = 0; i < 4; i++)
                        {
                            if ((int)players[0]["fight_fish"][i]["state"] == 2 &&
                                (int)lastPlayers[0]["fight_fish"][i]["state"] != 2)
                            {
                                gameUI.Dissolve(false, i);
                            }
                            if ((int)players[1]["fight_fish"][i]["state"] == 2 &&
                                (int)lastPlayers[1]["fight_fish"][i]["state"] != 2)
                            {
                                gameUI.Dissolve(true, i);
                            }
                        }
                    }
                    gameUI.SetTimeout(() =>
                        {
                            if (SharedRefs.AutoPlay)
                            {
                                gameUI.MoveCursor();
                            }
                            else
                            {
                                gameUI.nextStepButton.interactable  = true;
                                gameUI.prevStepButton.interactable  = true;
                                gameUI.prevRoundButton.interactable = true;
                                gameUI.nextRoundButton.interactable =
                                    (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["rounds"] < 2;
                            }
                        }, 3000);
                }
                break;
            }

            default:     // Something should be wrong
                SharedRefs.ReplayCursor++;
                gameUI.SetTimeout(gameUI.MoveCursor, 100);
                break;
            }
        }
예제 #3
0
        public static void AwakeImpl(this GameUI gameUI)
        {
            for (var i = 0; i < 4; i++)
            {
                gameUI.Gom.MyFogs.Add(
                    Object.Instantiate(
                        gameUI.fogPrefab,
                        GameObjectManager.FishRelativePosition(false, i),
                        Quaternion.identity,
                        gameUI.allFishRoot
                        )
                    );
                gameUI.Gom.EnemyFogs.Add(
                    Object.Instantiate(
                        gameUI.fogPrefab,
                        GameObjectManager.FishRelativePosition(true, i),
                        Quaternion.identity,
                        gameUI.allFishRoot
                        )
                    );
            }

            gameUI.DissolveShaderProperty = Shader.PropertyToID("_cutoff");

            if (SharedRefs.Mode == Constants.GameMode.Offline)
            {
                if (ErrorParser.HandleErrorCheck(gameUI))
                {
                    return;
                }
                var players = SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["players"];
                SharedRefs.ReplayCursor++;
                if (ErrorParser.HandleErrorCheck(gameUI))
                {
                    return;
                }
                JsonData[] pickFish =
                {
                    SharedRefs.ReplayJson[
                        SharedRefs.ReplayCursor + (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["cur_turn"] -
                        1
                    ]["operation"][0]["Fish"],
                    SharedRefs.ReplayJson[
                        SharedRefs.ReplayCursor - (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor - 1]["cur_turn"]
                    ]["operation"][0]["Fish"]
                };
                for (var i = 0; i < 4; i++)
                {
                    var myFishId    = (int)pickFish[0][i]["id"] - 1;
                    var enemyFishId = (int)pickFish[1][i]["id"] - 1;
                    gameUI.GameState.MyFishId[i]    = myFishId;
                    gameUI.GameState.EnemyFishId[i] = enemyFishId;
                    gameUI.myStatus[i].Full         = (int)pickFish[0][i]["hp"];
                    gameUI.enemyStatus[i].Full      = (int)pickFish[1][i]["hp"];
                    gameUI.GameState.MyFishPicked.Add(gameUI.GameState.MyFishId[i]);
                    gameUI.GameState.EnemyFishPicked.Add(gameUI.GameState.EnemyFishId[i]);
                    if (pickFish[0][i].ContainsKey("imitate"))
                    {
                        SharedRefs.MyImitate = (int)pickFish[0][i]["imitate"] - 1;
                    }
                    if (pickFish[1][i].ContainsKey("imitate"))
                    {
                        SharedRefs.EnemyImitate = (int)pickFish[1][i]["imitate"] - 1;
                    }
                }
                for (var i = 0; i < players[0]["my_fish"].Count; i++)
                {
                    gameUI.GameState.MyFishAvailable.Add((int)players[0]["my_fish"][i]["id"] - 1);
                }
                for (var i = 0; i < players[1]["my_fish"].Count; i++)
                {
                    gameUI.GameState.EnemyFishAvailable.Add((int)players[1]["my_fish"][i]["id"] - 1);
                }

                var rounds = (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["rounds"] + 1;
                var score  = (int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["score"];
                gameUI.scoreText.text = $"{(rounds - score - 1) / 2}:{(score + rounds - 1) / 2}";
                gameUI.Gom.Init(gameUI);
                SharedRefs.ReplayCursor++;
                if (SharedRefs.AutoPlay)
                {
                    gameUI.MoveCursor();
                }
                else
                {
                    gameUI.prevRoundButton.interactable = true;
                    gameUI.nextRoundButton.interactable = rounds < 3;
                    gameUI.nextStepButton.interactable  = true;
                }
            }
            else
            {
                gameUI.scoreText.text = $"{SharedRefs.OnlineLose}:{SharedRefs.OnlineWin}";
                gameUI.offlineOnlyButtons.SetActive(false);
                gameUI.questionButton.SetActive(true);
                gameUI.Gom.StopCountDown(gameUI);
                gameUI.GameState.GameStatus = Constants.GameStatus.WaitingAnimation;
                if (SharedRefs.PendingMessage != null)
                {
                    GameUI.SendWsMessage(SharedRefs.PendingMessage);
                    SharedRefs.PendingMessage = null;
                }
                SharedRefs.OnlineWaiting = 2;
            }
        }