public static void Update() { try { RVAFinder.Update(); if (!Memory.IsHooked) { Memory.HookProcess(); } if (Memory.GameState == GameState.TitleScreen) { if (TitleScreenCallback != null) { OnTitleScreen(); } UberStateController.SkipListenersNextUpdate = true; } else if (Memory.GameState == GameState.Game) { UberStateController.Update(); if (InputUnlockCallback != null && InterOp.player_can_move()) { OnInputUnlock(); } SeedController.UpdateGoal(); TrackFileController.Update(); } AHK.Tick(); } catch (Exception e) { Log($"Update error: {e.Message}\n{e.StackTrace}"); } }
public static void Update() { try { var gs = InterOp.get_game_state(); if (gs == GameState.TitleScreen) { UberStateController.SkipListeners = true; if (TitleScreenCallback != null) { OnTitleScreen(); } } else if (gs == GameState.Game) { UberStateController.SkipListeners = false; UberStateController.Update(); if (InputUnlockCallback != null && InterOp.player_can_move()) { OnInputUnlock(); } SeedController.UpdateGoal(); TrackFileController.Update(); } AHK.Tick(); BonusItemController.Update(); DiscordController.Update(); Client.Update(); } catch (Exception e) { Log($"Update error: {e.Message}\n{e.StackTrace}"); } }
public static bool Initialize() { try { if (!Directory.Exists(SaveFolder)) { Directory.CreateDirectory(SaveFolder); } foreach (var fileName in new String[] { LogFile, SeedFile, SeedNameFile }) { if (!File.Exists(fileName)) { File.WriteAllText(fileName, ""); Log($"Wrote blank {fileName} (normal for first-time init)"); } } AHK.Init(); SeedController.ReadSeed(); Memory = new MemoryManager(); if (!Memory.HookProcess()) { return(false); } Memory.PatchNoPause(true); return(true); } catch (Exception e) { Log($"init error: {e.Message}\n{e.StackTrace}"); return(true); } }
public static string GetShopNameReplacement(string orig) { if (RemoveStrings.Contains(orig)) { return(" "); } else if (OpherWeaponDetail.ContainsKey(orig)) { var weapon = OpherWeaponDetail[orig]; if (!OpherWeaponChatter.ContainsKey(weapon)) { OpherWeaponChatter[weapon] = Chatter[new Random().Next(Chatter.Count)]; } return(OpherWeaponChatter[weapon]); } else if (OpherWeaponNames.ContainsKey(orig)) { return(SeedController.OpherWeapon(OpherWeaponNames[orig]).ToString()); } else if (TwillenShardDetail.ContainsKey(orig)) { var shard = TwillenShardDetail[orig]; if (!TwillenShardChatter.ContainsKey(shard)) { TwillenShardChatter[shard] = Chatter[new Random().Next(Chatter.Count)]; } return(TwillenShardChatter[shard]); } else if (TwillenShardNames.ContainsKey(orig)) { return(SeedController.TwillenShard(TwillenShardNames[orig]).ToString()); } return(orig); }
public static void Update() { if (NeedsNewGameInit) { NewGameInit(); } bool SkipListners = SkipListenersNextUpdate; SkipListenersNextUpdate = false; var memory = Randomizer.Memory; Dictionary <long, UberState> uberStates = memory.GetUberStates(); foreach (KeyValuePair <long, UberState> pair in uberStates) { try { UberState state = pair.Value; UberId key = state.GetUberId(); if (UberStates.TryGetValue(key, out UberState oldState)) { UberValue value = state.Value; UberValue oldValue = oldState.Value; if (value.Int != oldValue.Int) { var oldValFmt = oldState.FmtVal(); // get this now because we overwrite the value by reference if (ShouldRevert(state)) { Randomizer.Log($"Reverting state change of {state.Name} from {oldValFmt} to {state.FmtVal()}", false); memory.WriteUberState(oldState); continue; } HandleSpecial(state); UberStates[key].Value = state.Value; if (!SkipListners) { var pos = Randomizer.Memory.Position(); bool found = false; if (value.Int > 0) { found = SeedController.OnUberState(state); } if ((value.Int == 0 || !found) && !(state.GroupName == "statsUberStateGroup" || state.GroupName == "achievementsGroup")) { Randomizer.Log($"State change: {state.Name} {state.ID} {state.GroupName} {state.GroupID} {state.Type} {state.FmtVal()} (was {oldValFmt}, pos ({Math.Round(pos.X)},{Math.Round(pos.Y)}) )", false); } } } } else { UberStates[key] = state.Clone(); } } catch (Exception e) { Randomizer.Error($"USC.Update {pair}", e); } } }
public static void OnNewGame(int slot) { // overwrite the message log TODO: save a backup maybe? File.WriteAllText(Randomizer.MessageLog, ""); SeedController.ReadSeed(); UberStateController.NeedsNewGameInit = true; AHK.OnNewGame(); SaveController.NewGame(slot); }
public static void Tick() { var signal = Engine.ExecFunction("Tick"); if (signal != null && signal != "none") { Engine.SetVar("signal", "none"); switch (signal) { case "reload": if (FramesTillUnlockReload == 0) { SeedController.ReadSeed(); FramesTillUnlockReload = 60; } break; case "dev": Randomizer.Dev = !Randomizer.Dev; Randomizer.Log($"Dev: {Randomizer.Dev}"); break; case "exitapp": Environment.Exit(Environment.ExitCode); break; default: Randomizer.Log($"Recieved unknown signal {signal}"); break; } } FramesTillUnlockReload = Math.Max(0, FramesTillUnlockReload - 1); if (FramesTillNextSend > 0) { FramesTillNextSend--; } else { if (MessageQueue.Count > 0) { Current = MessageQueue.Dequeue(); FramesTillNextSend = Current.Frames(); Engine.ExecFunction("PickupMessage", Current.Text(), (Current.Frames() * 50 / 3).ToString()); if (IniFlag("LogOnPrint")) { Randomizer.Log($"Sending {Current.Text()} for {Current.Frames()} ({MessageQueue.Count} remaining in queue)", false); } } else { Current = null; } } }
public static void OpherBuyWeapon(AbilityType slot) { Sellable item = SeedController.OpherWeapon(slot); if (SaveController.Data.OpherSold.Contains(slot)) { Randomizer.Log($"OBW: not enough money or slot already sold "); return; } SaveController.Data.OpherSold.Add(slot); item.Grant(); return; }
public static void TwillenBuyShard(ShardType slot) { Sellable item = SeedController.TwillenShard(slot); if (SaveController.Data.TwillenSold.Contains(slot)) { Randomizer.Log($"TBS: not enough money or slot already sold "); return; } SaveController.Data.TwillenSold.Add(slot); item.Grant(); return; }
public static void OnBuyOpherWeapon(AbilityType slot) { Pickup item = SeedController.OpherWeapon(slot); if (SaveController.Data.OpherSold.Contains(slot)) { Randomizer.Log($"OBW: not enough money or slot already sold"); return; } SaveController.Data.OpherSold.Add(slot); Randomizer.Log($"sold {item} from {slot} for ${SeedController.OpherWeapon(slot).CostWithMod(GetCostMod(slot))}", false); item.Grant(); return; }
public static void Update(bool NewGameInit = false) { var memory = Randomizer.Memory; Dictionary <long, UberState> uberStates = memory.GetUberStates(); foreach (KeyValuePair <long, UberState> pair in uberStates) { long key = pair.Key; UberState state = pair.Value; if (state.GroupName == "statsUberStateGroup" || (state.GroupName == "achievementsGroup" && state.Name == "spiritLightGainedCounter")) { continue; } if (UberStates.TryGetValue(key, out UberState oldState)) { UberValue value = state.Value; UberValue oldValue = oldState.Value; if (value.Int != oldValue.Int) { var pos = Randomizer.Memory.Position(); if (Ready) { if (value.Int > 0) { SeedController.OnUberState(state); if (!Randomizer.PleaseSave) { Randomizer.Log($"Potential pickup: {state.GroupName}.{state.Name} ({state.GroupID}, {state.ID}) at ({Math.Round(pos.X)},{Math.Round(pos.Y)}) {value.Int}", false); } } else { Randomizer.Log($"State change {state.GroupName}.{state.Name} ({state.GroupID}, {state.ID}) at ({Math.Round(pos.X)},{Math.Round(pos.Y)}): {oldValue.Int}->{value.Int}", false); } } UberStates[key].Value = state.Value; } } else { UberStates[key] = state.Clone(); } } if (!NewGameInit) { Ready = true; } }
public static string GetShopNameReplacement(string orig) { if (RemoveStrings.Contains(orig)) { return(" "); } else if (LupoReplacements.ContainsKey(orig)) { return(LupoReplacements[orig]); } else if (OpherWeaponDetail.ContainsKey(orig)) { var weapon = OpherWeaponDetail[orig]; if (!OpherWeaponChatter.ContainsKey(weapon)) { OpherWeaponChatter[weapon] = Chatter[new Random().Next(Chatter.Count)]; } return(OpherWeaponChatter[weapon]); } else if (OpherWeaponNames.ContainsKey(orig)) { return(SeedController.OpherWeapon(OpherWeaponNames[orig]).ToString()); } else if (TwillenShardDetail.ContainsKey(orig)) { var shard = TwillenShardDetail[orig]; if (!TwillenShardChatter.ContainsKey(shard)) { if (KSOverride(shard)) { TwillenShardChatter[shard] = $"Costs more each time you buy it\\nNever logically required"; } else { TwillenShardChatter[shard] = Chatter[new Random().Next(Chatter.Count)]; } } return(TwillenShardChatter[shard]); } else if (TwillenShardNames.ContainsKey(orig)) { var shard = TwillenShardNames[orig]; return(KSOverride(shard) ? "Black Market Keystone" : SeedController.TwillenShard(shard).ToString()); } return(orig); }
public static void OnNewGame(int slot) { try { // overwrite the message log TODO: save a backup maybe? File.WriteAllText(Randomizer.MessageLog, ""); SeedController.ReadSeed(); UberStateController.NeedsNewGameInit = true; UberStateController.UberStates.Clear(); UberStateController.TickingUberStates.Clear(); AHK.OnNewGame(); SaveController.NewGame(slot); BonusItemController.Refresh(); Client.Connect(); } catch (Exception e) { Randomizer.Error("OnNewGame", e); } }
public static void Tick() { var signal = Engine.ExecFunction("Tick"); if (signal != null && signal != "none") { Engine.SetVar("signal", "none"); switch (signal) { case "reload": if (FramesTillUnlockReload == 0) { iniFlagCache.Clear(); FramesTillNextSend = 0; Randomizer.Client.Connect(); SeedController.ReadSeed(); if (InterOp.get_game_state() == GameState.Game) { PsuedoLocs.RELOAD_SEED.OnCollect(); } FramesTillUnlockReload = 120; } break; case "lastPickup": FramesTillNextSend = 1; // the only reason this isn't = 0 is that spamming this could get really annoying MessageQueue.Enqueue(Last); break; case "hintMessage": HintsController.ProgressWithHints(); break; case "dev": Randomizer.Dev = !Randomizer.Dev; Randomizer.Log($"Dev: {Randomizer.Dev}"); break; case "exitapp": Environment.Exit(Environment.ExitCode); break; case "toggleDebug": InterOp.set_debug_controls(!InterOp.get_debug_controls()); Print($"Debug {(InterOp.get_debug_controls() ? "enabled" : "disabled")}", toMessageLog: false); break; case "toggleCursorLock": Print($"Cursor Lock {(InterOp.toggle_cursorlock() ? "enabled" : "disabled")}", toMessageLog: false); break; case "test1": PsuedoLocs.BINDING_ONE.OnCollect(); break; case "test2": PsuedoLocs.BINDING_TWO.OnCollect(); break; case "test3": PsuedoLocs.BINDING_THREE.OnCollect(); break; case "test4": if (SeedController.HasInternalSpoilers) { UberSet.Bool(34543, 11226, true); Print("spoiler unlocked", toMessageLog: false); } break; case "test5": tpCheatToggle = !tpCheatToggle; Print($"TPCheat {(tpCheatToggle ? "enabled" : "disabled")}", toMessageLog: false); break; case "printcoords": var pos = InterOp.get_position(); Print($"{pos.X}, {pos.Y}", toMessageLog: false); break; case "namespoilertoggle": MapController.NameLabels = !MapController.NameLabels; Print($"Loc name labels {(MapController.NameLabels ? "enabled" : "disabled")}", toMessageLog: false); break; default: Randomizer.Log($"Recieved unknown signal {signal}"); break; } } FramesTillUnlockReload = Math.Max(0, FramesTillUnlockReload - 1); if (FramesTillNextSend > 0) { FramesTillNextSend--; } else { if (CanPrint) { Current = MessageQueue.Peek(); FramesTillNextSend = Current.Frames; try { InterOp.clear_visible_hints(); InterOp.display_hint(Current.Text, Current.Frames / 60f, Current.Pos); if (IniFlag("LogOnPrint")) { Randomizer.Log($"Sending {Current.Text} for {Current.Frames} ({MessageQueue.Count} remaining in queue)", false); } MessageQueue.Dequeue(); } catch (Exception e) { Randomizer.Error("AHK.sendMsg", e, false); } } else { Current = null; } } }
public static void HandleSignal(string signal) { switch (signal) { case "reload": if (FramesTillUnlockReload == 0) { iniFlagCache.Clear(); FramesTillNextSend = 0; Randomizer.Client.Connect(); SeedController.ReadSeed(); if (InterOp.get_game_state() == GameState.Game) { PsuedoLocs.RELOAD_SEED.OnCollect(); } FramesTillUnlockReload = 120; } break; case "lastPickup": FramesTillNextSend = 1; // the only reason this isn't = 0 is that spamming this could get really annoying MessageQueue.Enqueue(Last); break; case "progressAndHints": HintsController.ProgressWithHints(); break; case "dev": Randomizer.Dev = !Randomizer.Dev; Randomizer.Log($"Dev: {Randomizer.Dev}"); break; case "exitapp": Environment.Exit(Environment.ExitCode); break; case "toggleDebug": InterOp.set_debug_controls(!InterOp.get_debug_controls()); Print($"Debug {(InterOp.get_debug_controls() ? "enabled" : "disabled")}", toMessageLog: false); break; case "toggleCursorLock": Print($"Cursor Lock {(InterOp.toggle_cursorlock() ? "enabled" : "disabled")}", toMessageLog: false); break; case "binding1": PsuedoLocs.BINDING_ONE.OnCollect(); break; case "binding2": PsuedoLocs.BINDING_TWO.OnCollect(); break; case "binding3": PsuedoLocs.BINDING_THREE.OnCollect(); break; case "binding4": PsuedoLocs.BINDING_FOUR.OnCollect(); break; case "binding5": PsuedoLocs.BINDING_FIVE.OnCollect(); break; case "unlockSpoiers": if (SeedController.Settings.RaceMode) { return; // no cheat } UberSet.Bool(GameComplete, true); Print("spoiler unlocked", toMessageLog: false); break; case "tpCheat": if (SeedController.Settings.RaceMode) { return; // no cheat } tpCheatToggle = !tpCheatToggle; Print($"TPCheat {(tpCheatToggle ? "enabled" : "disabled")}", toMessageLog: false); break; case "warpCredits": if (UberGet.Bool(GameComplete)) { InterOp.start_credits(); } else { Print($"Credit warp not unlocked!", toMessageLog: false); } break; case "printCoords": var pos = InterOp.get_position(); Print($"{pos.X}, {pos.Y}", toMessageLog: false); break; case "nameSpoilerToggle": MapController.NameLabels = !MapController.NameLabels; Print($"Loc name labels {(MapController.NameLabels ? "enabled" : "disabled")}", toMessageLog: false); break; case "logicprovidertoggle": MapController.RustLogic = !MapController.RustLogic; Print($"Logic Provider: {(MapController.RustLogic ? "Rust" : "Java")}", toMessageLog: false); MapController.UpdateReachable(); break; default: Randomizer.Log($"Recieved unknown signal {signal}"); break; } }
public static void OnTree(AbilityType ability) { SaveController.Data.TreesActivated.Add(ability); SeedController.OnTree(ability); }
public static void Tick() { var signal = Engine.ExecFunction("Tick"); if (signal != null && signal != "none") { Engine.SetVar("signal", "none"); switch (signal) { case "reload": if (FramesTillUnlockReload == 0) { FramesTillNextSend = 0; SeedController.ReadSeed(); Randomizer.Memory.OnInit(); if (Randomizer.Memory.GameState == Memory.GameState.Game) { PsuedoLocs.RELOAD_SEED.Pickup().Grant(); } FramesTillUnlockReload = 60; } break; case "lastPickup": FramesTillNextSend = 1; // the only reason this isn't = 0 is that spamming this could get really annoying MessageQueue.Enqueue(Last); break; case "hintMessage": HintsController.ShowHintMessage(); break; case "dev": Randomizer.Dev = !Randomizer.Dev; Randomizer.Log($"Dev: {Randomizer.Dev}"); break; case "exitapp": Environment.Exit(Environment.ExitCode); break; case "toggleDebug": Randomizer.Memory.Debug = !Randomizer.Memory.Debug; Print($"Debug {(Randomizer.Memory.Debug ? "enabled" : "disabled")}", toMessageLog: false); break; case "toggleCursorLock": Print($"Cursor Lock {(InterOp.toggle_cursorlock() ? "enabled" : "disabled")}", toMessageLog: false); break; case "test1": PsuedoLocs.BINDING_ONE.Pickup().Grant(); break; case "test2": PsuedoLocs.BINDING_TWO.Pickup().Grant(); break; case "test3": PsuedoLocs.BINDING_THREE.Pickup().Grant(); break; case "test4": Print("magic", 180, false); InterOp.magic_function(); break; case "test5": tpCheatToggle = !tpCheatToggle; Print($"TPCheat {(tpCheatToggle ? "enabled" : "disabled")}"); break; default: Randomizer.Log($"Recieved unknown signal {signal}"); break; } } FramesTillUnlockReload = Math.Max(0, FramesTillUnlockReload - 1); if (FramesTillNextSend > 0) { FramesTillNextSend--; } else { if (CanPrint) { Current = MessageQueue.Peek(); FramesTillNextSend = Current.Frames; try { InterOp.clear_visible_hints(); InterOp.display_hint(InterOp.Util.getIl2cppStringPointer(Current.Text), Current.Frames / 60f); if (IniFlag("LogOnPrint")) { Randomizer.Log($"Sending {Current.Text} for {Current.Frames} ({MessageQueue.Count} remaining in queue)", false); } MessageQueue.Dequeue(); } catch (Exception e) { Randomizer.Error("AHK.sendMsg", e, false); } } else { Current = null; } } }
public static bool Initialize() { try { if (logThread == null) { logThread = new Thread(() => { while (true) { try { var txt = logQueue.Take(); while (logQueue.TryTake(out var line)) { txt += line; } File.AppendAllText(LogFile, txt); } catch (Exception e) { if (Dev) { AHK.Print($"error logging: {e}", toMessageLog: false); } } } }); logThread.Start(); } BasePath = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(InterOp.get_base_path()); Debug($"Init: set base path to {BasePath}"); if (!Directory.Exists(SaveFolder)) { Directory.CreateDirectory(SaveFolder); } if (!File.Exists(SeedPathFile)) { File.WriteAllText(SeedPathFile, BasePath + ".currentseed"); } foreach (var fileName in new string[] { LogFile, MessageLog }) { if (!File.Exists(fileName)) { File.WriteAllText(fileName, ""); Log($"Wrote blank {fileName} (normal for first-time init)"); } } AHK.Init(); SeedController.ReadSeed(true); Client.UberStateRegistered = UberStateController.RegisterSyncedUberState; DiscordController.Initialize(); Debug("Init: Complete", false); return(true); } catch (Exception e) { Log($"init error: {e.Message}\n{e.StackTrace}"); return(true); } }
public static void ResolveUberStateChange(UberState state, UberValue old) { try { UberId key = state.GetUberId(); if (!UberStates.TryGetValue(key, out UberState oldState)) { oldState = state.Clone(); oldState.Value = old; UberStates.Add(key, oldState); } UberValue value = state.Value; if (value.Int == old.Int) { return; } var oldValFmt = old.FmtVal(state.Type); // get this now because we overwrite the value by reference if (ShouldRevert(state)) { Randomizer.Log($"Reverting state change of {state.Name} from {oldValFmt} to {state.FmtVal()}", false); oldState.Write(); return; } HandleSpecial(state); UberStates[key].Value = state.Value; var pos = InterOp.get_position(); bool found = false; if (value.Int > 0) { var id = state.GetUberId(); if (SkipUberStateMapCount.GetOrElse(key, 0) > 0) { var p = id.toCond().Pickup().Concat(id.toCond(state.ValueAsInt()).Pickup()); if (p.NonEmpty) { SkipUberStateMapCount[key] -= 1; Randomizer.Log($"Suppressed granting {p} from {id}={state.ValueAsInt()}. Will suppress {SkipUberStateMapCount[key]} more times", false, "DEBUG"); return; } } found = SeedController.OnUberState(state); } if (SyncedUberStates.Contains(key)) { Randomizer.Client.SendUpdate(key, state.ValueAsFloat()); } BonusItemController.OnUberState(state); var zone = ZoneType.Void; if (InterOp.get_game_state() == GameState.Game) { zone = InterOp.get_player_area().toZone(); } if (!NeedsNewGameInit && (value.Int == 0 || !found) && !(state.GroupName == "statsUberStateGroup" || state.GroupName == "achievementsGroup" || state.GroupID == 8 || state.GroupID == 10)) { Randomizer.Debug($"State change: {state.GroupName}.{state.Name} ({state.GroupID}|{state.ID}) {state.Type} {oldValFmt}->{state.FmtVal()} at ({Math.Round(pos.X)}, {Math.Round(pos.Y)}) in {zone}"); } //Randomizer.Debug($"{state.GroupName}.{state.Name}, {state.GroupID}, {state.ID}, {state.Type}, {oldValFmt}, {state.FmtVal()}, {zone}, {Math.Round(pos.X)},{Math.Round(pos.Y)}"); } catch (Exception e) { Randomizer.Error($"USC.Update {state}", e); } }
public static int OpherWeaponCost(AbilityType ability) { return(SeedController.OpherWeapon(ability).DefaultCost()); }
public static int TwillenShardCost(ShardType shard) { return(SeedController.TwillenShard(shard).DefaultCost()); }