private unsafe void GameUpdater() { if (Interface.ClientState.TerritoryType != 144) // Golden Saucer { return; } var ready = false; var isVisible = false; AddonLotteryDaily *addon = null; var addonPtr = Interface.Framework.Gui.GetUiObjectByName("LotteryDaily", 1); if (addonPtr != IntPtr.Zero) { addon = (AddonLotteryDaily *)addonPtr; var rootNode = addon->AtkUnitBase.RootNode; if (rootNode != null) { isVisible = addon->AtkUnitBase.IsVisible; ready = true; } } if (!ready) { for (int i = 0; i < TotalNumbers; i++) { GameState[i] = 0; } } if (!isVisible) { return; } var gameState = GetGameState(addon); if (!Enumerable.SequenceEqual(gameState, GameState)) { GameState = gameState; if (!gameState.Contains(0)) { // Perform this check for when the entire board is revealed, no unknowns/zeroes for (var i = 0; i < TotalNumbers; i++) { ToggleGameNode(addon, i, false); } for (var i = 0; i < TotalLanes; i++) { ToggleLaneNode(addon, i, false); } } else { for (var i = 0; i < TotalNumbers; i++) { ToggleGameNode(addon, i, false); // Reset the number colors } var solution = PerfectCactpot.Solve(gameState); if (solution.Length == 8) { // The PerfectCactbot lane array is formatted differently than the UI when it gives lane solutions. solution = new bool[] { solution[6], // major diagonal solution[3], // left column solution[4], // center column solution[5], // right column solution[7], // minor diagonal solution[0], // top row solution[1], // middle row solution[2], // bottom row }; for (var i = 0; i < TotalNumbers; i++) { ToggleGameNode(addon, i, false); // Reset the number colors } for (var i = 0; i < TotalLanes; i++) { ToggleLaneNode(addon, i, solution[i]); } } else { for (var i = 0; i < TotalNumbers; i++) { ToggleGameNode(addon, i, solution[i]); } } } } }
private unsafe void ToggleGameNode(AddonLotteryDaily *addon, int i, bool enable) { ToggleNode(addon->GameBoard[i]->AtkComponentButton.AtkComponentBase.OwnerNode, enable); }
private unsafe void ToggleLaneNode(AddonLotteryDaily *addon, int i, bool enable) { ToggleNode(addon->LaneSelector[i]->AtkComponentBase.OwnerNode, enable); }
private unsafe int[] GetGameState(AddonLotteryDaily *addon) { return(Enumerable.Range(0, TotalNumbers).Select(i => addon->GameNumbers[i]).ToArray()); }