public void NextRound() { while ((int)SharedRefs.ReplayJson[SharedRefs.ReplayCursor]["gamestate"] != 2) { ++SharedRefs.ReplayCursor; if (ErrorParser.HandleErrorCheck(this)) { return; } } DoneAndGoBackToPreparation(); }
/// <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; } }
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; } }