public static async Task <byte[]> ReadBytesLargeAsync(this SwitchConnectionAsync connection, uint offset, int length, int chunkSize, CancellationToken token) { List <byte> read = new List <byte>(); for (int i = 0; i < length; i += chunkSize) { read.AddRange(await connection.ReadBytesAsync(offset + (uint)i, Math.Min(chunkSize, length - i), token).ConfigureAwait(false)); } return(read.ToArray()); }
public async Task GetDodoCode(ulong CoordinateAddress, uint Offset, bool isRetry, CancellationToken token) { // Navigate through dialog with Dodo to open gates and to get Dodo code. await Task.Delay(0_500, token).ConfigureAwait(false); var Hold = SwitchCommand.Hold(SwitchButton.L); await Connection.SendAsync(Hold, token).ConfigureAwait(false); await Task.Delay(0_700, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 4_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_000, token).ConfigureAwait(false); if (!isRetry) { await BotRunner.Click(SwitchButton.A, 2_100, token).ConfigureAwait(false); } await BotRunner.Click(SwitchButton.DDOWN, 0_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.DDOWN, 0_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 20_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.DUP, 0_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.DUP, 0_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.DUP, 0_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 1_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_500, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 3_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_000, token).ConfigureAwait(false); await BotRunner.Click(SwitchButton.A, 2_000, token).ConfigureAwait(false); await Task.Delay(0_500, token).ConfigureAwait(false); var Release = SwitchCommand.Release(SwitchButton.L); await Connection.SendAsync(Release, token).ConfigureAwait(false); // Clear incase opening the gate took too long for (int i = 0; i < 6; ++i) { await BotRunner.Click(SwitchButton.B, 1_000, token).ConfigureAwait(false); } // Obtain Dodo code from offset and store it. byte[] bytes = await Connection.ReadBytesAsync(Offset, 0x5, token).ConfigureAwait(false); DodoCode = Encoding.UTF8.GetString(bytes, 0, 5); LogUtil.LogInfo($"Retrieved Dodo code: {DodoCode}.", Config.IP); // Wait for loading screen. while (await GetOverworldState(CoordinateAddress, token).ConfigureAwait(false) != OverworldState.Overworld) { await Task.Delay(0_500, token).ConfigureAwait(false); } }