summaryrefslogtreecommitdiffhomepage
path: root/samples/99_genre_rpg_roguelike/roguelike_starting_point
diff options
context:
space:
mode:
Diffstat (limited to 'samples/99_genre_rpg_roguelike/roguelike_starting_point')
-rw-r--r--samples/99_genre_rpg_roguelike/roguelike_starting_point/app/main.rb438
-rw-r--r--samples/99_genre_rpg_roguelike/roguelike_starting_point/license-for-sample.txt9
-rw-r--r--samples/99_genre_rpg_roguelike/roguelike_starting_point/replay.txt555
3 files changed, 0 insertions, 1002 deletions
diff --git a/samples/99_genre_rpg_roguelike/roguelike_starting_point/app/main.rb b/samples/99_genre_rpg_roguelike/roguelike_starting_point/app/main.rb
deleted file mode 100644
index 7ed8d60..0000000
--- a/samples/99_genre_rpg_roguelike/roguelike_starting_point/app/main.rb
+++ /dev/null
@@ -1,438 +0,0 @@
-=begin
-
- APIs listing that haven't been encountered in previous sample apps:
-
- - lambda: A way to define a block and its parameters with special syntax.
- For example, the syntax of lambda looks like this:
- my_lambda = -> { puts "This is my lambda" }
-
- Reminders:
- - args.outputs.labels: An array. The values generate a label.
- The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
-
- - ARRAY#inside_rect?: Returns whether or not the point is inside a rect.
-
- - product: Returns an array of all combinations of elements from all arrays.
-
- - find: Finds all elements of a collection that meet requirements.
-
- - abs: Returns the absolute value.
-
-=end
-
-# This sample app allows the player to move around in the dungeon, which becomes more or less visible
-# depending on the player's location, and also has enemies.
-
-class Game
- attr_accessor :args, :state, :inputs, :outputs, :grid
-
- # Calls all the methods needed for the game to run properly.
- def tick
- defaults
- render_canvas
- render_dungeon
- render_player
- render_enemies
- print_cell_coordinates
- calc_canvas
- input_move
- input_click_map
- end
-
- # Sets default values and initializes variables
- def defaults
- outputs.background_color = [0, 0, 0] # black background
-
- # Initializes empty canvas, dungeon, and enemies collections.
- state.canvas ||= []
- state.dungeon ||= []
- state.enemies ||= []
-
- # If state.area doesn't have value, load_area_one and derive_dungeon_from_area methods are called
- if !state.area
- load_area_one
- derive_dungeon_from_area
-
- # Changing these values will change the position of player
- state.x = 7
- state.y = 5
-
- # Creates new enemies, sets their values, and adds them to the enemies collection.
- state.enemies << state.new_entity(:enemy) do |e| # declares each enemy as new entity
- e.x = 13 # position
- e.y = 5
- e.previous_hp = 3
- e.hp = 3
- e.max_hp = 3
- e.is_dead = false # the enemy is alive
- end
-
- update_line_of_sight # updates line of sight by adding newly visible cells
- end
- end
-
- # Adds elements into the state.area collection
- # The dungeon is derived using the coordinates of this collection
- def load_area_one
- state.area ||= []
- state.area << [8, 6]
- state.area << [7, 6]
- state.area << [7, 7]
- state.area << [8, 9]
- state.area << [7, 8]
- state.area << [7, 9]
- state.area << [6, 4]
- state.area << [7, 3]
- state.area << [7, 4]
- state.area << [6, 5]
- state.area << [7, 5]
- state.area << [8, 5]
- state.area << [8, 4]
- state.area << [1, 1]
- state.area << [0, 1]
- state.area << [0, 2]
- state.area << [1, 2]
- state.area << [2, 2]
- state.area << [2, 1]
- state.area << [2, 3]
- state.area << [1, 3]
- state.area << [1, 4]
- state.area << [2, 4]
- state.area << [2, 5]
- state.area << [1, 5]
- state.area << [2, 6]
- state.area << [3, 6]
- state.area << [4, 6]
- state.area << [4, 7]
- state.area << [4, 8]
- state.area << [5, 8]
- state.area << [5, 9]
- state.area << [6, 9]
- state.area << [7, 10]
- state.area << [7, 11]
- state.area << [7, 12]
- state.area << [7, 12]
- state.area << [7, 13]
- state.area << [8, 13]
- state.area << [9, 13]
- state.area << [10, 13]
- state.area << [11, 13]
- state.area << [12, 13]
- state.area << [12, 12]
- state.area << [8, 12]
- state.area << [9, 12]
- state.area << [10, 12]
- state.area << [11, 12]
- state.area << [12, 11]
- state.area << [13, 11]
- state.area << [13, 10]
- state.area << [13, 9]
- state.area << [13, 8]
- state.area << [13, 7]
- state.area << [13, 6]
- state.area << [12, 6]
- state.area << [14, 6]
- state.area << [14, 5]
- state.area << [13, 5]
- state.area << [12, 5]
- state.area << [12, 4]
- state.area << [13, 4]
- state.area << [14, 4]
- state.area << [1, 6]
- state.area << [6, 6]
- end
-
- # Starts with an empty dungeon collection, and adds dungeon cells into it.
- def derive_dungeon_from_area
- state.dungeon = [] # starts as empty collection
-
- state.area.each do |a| # for each element of the area collection
- state.dungeon << state.new_entity(:dungeon_cell) do |d| # declares each dungeon cell as new entity
- d.x = a.x # dungeon cell position using coordinates from area
- d.y = a.y
- d.is_visible = false # cell is not visible
- d.alpha = 0 # not transparent at all
- d.border = [left_margin + a.x * grid_size,
- bottom_margin + a.y * grid_size,
- grid_size,
- grid_size,
- *blue,
- 255] # sets border definition for dungeon cell
- d # returns dungeon cell
- end
- end
- end
-
- def left_margin
- 40 # sets left margin
- end
-
- def bottom_margin
- 60 # sets bottom margin
- end
-
- def grid_size
- 40 # sets size of grid square
- end
-
- # Updates the line of sight by calling the thick_line_of_sight method and
- # adding dungeon cells to the newly_visible collection
- def update_line_of_sight
- variations = [-1, 0, 1]
- # creates collection of newly visible dungeon cells
- newly_visible = variations.product(variations).flat_map do |rise, run| # combo of all elements
- thick_line_of_sight state.x, state.y, rise, run, 15, # calls thick_line_of_sight method
- lambda { |x, y| dungeon_cell_exists? x, y } # checks whether or not cell exists
- end.uniq# removes duplicates
-
- state.dungeon.each do |d| # perform action on each element of dungeons collection
- d.is_visible = newly_visible.find { |v| v.x == d.x && v.y == d.y } # finds match inside newly_visible collection
- end
- end
-
- #Returns a boolean value
- def dungeon_cell_exists? x, y
- # Finds cell coordinates inside dungeon collection to determine if dungeon cell exists
- state.dungeon.find { |d| d.x == x && d.y == y }
- end
-
- # Calls line_of_sight method to add elements to result collection
- def thick_line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
- result = []
- result += line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
- result += line_of_sight start_x - 1, start_y, rise, run, distance, cell_exists_lambda # one left
- result += line_of_sight start_x + 1, start_y, rise, run, distance, cell_exists_lambda # one right
- result
- end
-
- # Adds points to the result collection to create the player's line of sight
- def line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
- result = [] # starts as empty collection
- points = points_on_line start_x, start_y, rise, run, distance # calls points_on_line method
- points.each do |p| # for each point in collection
- if cell_exists_lambda.call(p.x, p.y) # if the cell exists
- result << p # add it to result collection
- else # if cell does not exist
- return result # return result collection as it is
- end
- end
-
- result # return result collection
- end
-
- # Finds the coordinates of the points on the line by performing calculations
- def points_on_line start_x, start_y, rise, run, distance
- distance.times.map do |i| # perform an action
- [start_x + run * i, start_y + rise * i] # definition of point
- end
- end
-
- def render_canvas
- return
- outputs.borders << state.canvas.map do |c| # on each element of canvas collection
- c.border # outputs border
- end
- end
-
- # Outputs the dungeon cells.
- def render_dungeon
- outputs.solids << [0, 0, grid.w, grid.h] # outputs black background for grid
-
- # Sets the alpha value (opacity) for each dungeon cell and calls the cell_border method.
- outputs.borders << state.dungeon.map do |d| # for each element in dungeon collection
- d.alpha += if d.is_visible # if cell is visible
- 255.fdiv(30) # increment opacity (transparency)
- else # if cell is not visible
- 255.fdiv(600) * -1 # decrease opacity
- end
- d.alpha = d.alpha.cap_min_max(0, 255)
- cell_border d.x, d.y, [*blue, d.alpha] # sets blue border using alpha value
- end.reject_nil
- end
-
- # Sets definition of a cell border using the parameters
- def cell_border x, y, color = nil
- [left_margin + x * grid_size,
- bottom_margin + y * grid_size,
- grid_size,
- grid_size,
- *color]
- end
-
- # Sets the values for the player and outputs it as a label
- def render_player
- outputs.labels << [grid_x(state.x) + 20, # positions "@" text in center of grid square
- grid_y(state.y) + 35,
- "@", # player is represented by a white "@" character
- 1, 1, *white]
- end
-
- def grid_x x
- left_margin + x * grid_size # positions horizontally on grid
- end
-
- def grid_y y
- bottom_margin + y * grid_size # positions vertically on grid
- end
-
- # Outputs enemies onto the screen.
- def render_enemies
- state.enemies.map do |e| # for each enemy in the collection
- alpha = 255 # set opacity (full transparency)
-
- # Outputs an enemy using a label.
- outputs.labels << [
- left_margin + 20 + e.x * grid_size, # positions enemy's "r" text in center of grid square
- bottom_margin + 35 + e.y * grid_size,
- "r", # enemy's text
- 1, 1, *white, alpha]
-
- # Creates a red border around an enemy.
- outputs.borders << [grid_x(e.x), grid_y(e.y), grid_size, grid_size, *red]
- end
- end
-
- #White labels are output for the cell coordinates of each element in the dungeon collection.
- def print_cell_coordinates
- return unless state.debug
- state.dungeon.each do |d|
- outputs.labels << [grid_x(d.x) + 2,
- grid_y(d.y) - 2,
- "#{d.x},#{d.y}",
- -2, 0, *white]
- end
- end
-
- # Adds new elements into the canvas collection and sets their values.
- def calc_canvas
- return if state.canvas.length > 0 # return if canvas collection has at least one element
- 15.times do |x| # 15 times perform an action
- 15.times do |y|
- state.canvas << state.new_entity(:canvas) do |c| # declare canvas element as new entity
- c.x = x # set position
- c.y = y
- c.border = [left_margin + x * grid_size,
- bottom_margin + y * grid_size,
- grid_size,
- grid_size,
- *white, 30] # sets border definition
- end
- end
- end
- end
-
- # Updates x and y values of the player, and updates player's line of sight
- def input_move
- x, y, x_diff, y_diff = input_target_cell
-
- return unless dungeon_cell_exists? x, y # player can't move there if a dungeon cell doesn't exist in that location
- return if enemy_at x, y # player can't move there if there is an enemy in that location
-
- state.x += x_diff # increments x by x_diff (so player moves left or right)
- state.y += y_diff # same with y and y_diff ( so player moves up or down)
- update_line_of_sight # updates visible cells
- end
-
- def enemy_at x, y
- # Finds if coordinates exist in enemies collection and enemy is not dead
- state.enemies.find { |e| e.x == x && e.y == y && !e.is_dead }
- end
-
- #M oves the user based on their keyboard input and sets values for target cell
- def input_target_cell
- if inputs.keyboard.key_down.up # if "up" key is in "down" state
- [state.x, state.y + 1, 0, 1] # user moves up
- elsif inputs.keyboard.key_down.down # if "down" key is pressed
- [state.x, state.y - 1, 0, -1] # user moves down
- elsif inputs.keyboard.key_down.left # if "left" key is pressed
- [state.x - 1, state.y, -1, 0] # user moves left
- elsif inputs.keyboard.key_down.right # if "right" key is pressed
- [state.x + 1, state.y, 1, 0] # user moves right
- else
- nil # otherwise, empty
- end
- end
-
- # Goes through the canvas collection to find if the mouse was clicked inside of the borders of an element.
- def input_click_map
- return unless inputs.mouse.click # return unless the mouse is clicked
- canvas_entry = state.canvas.find do |c| # find element from canvas collection that meets requirements
- inputs.mouse.click.inside_rect? c.border # find border that mouse was clicked inside of
- end
- puts canvas_entry # prints canvas_entry value
- end
-
- # Sets the definition of a label using the parameters.
- def label text, x, y, color = nil
- color ||= white # color is initialized to white
- [x, y, text, 1, 1, *color] # sets label definition
- end
-
- def green
- [60, 200, 100] # sets color saturation to shade of green
- end
-
- def blue
- [50, 50, 210] # sets color saturation to shade of blue
- end
-
- def white
- [255, 255, 255] # sets color saturation to white
- end
-
- def red
- [230, 80, 80] # sets color saturation to shade of red
- end
-
- def orange
- [255, 80, 60] # sets color saturation to shade of orange
- end
-
- def pink
- [255, 0, 200] # sets color saturation to shade of pink
- end
-
- def gray
- [75, 75, 75] # sets color saturation to shade of gray
- end
-
- # Recolors the border using the parameters.
- def recolor_border border, r, g, b
- border[4] = r
- border[5] = g
- border[6] = b
- border
- end
-
- # Returns a boolean value.
- def visible? cell
- # finds cell's coordinates inside visible_cells collections to determine if cell is visible
- state.visible_cells.find { |c| c.x == cell.x && c.y == cell.y}
- end
-
- # Exports dungeon by printing dungeon cell coordinates
- def export_dungeon
- state.dungeon.each do |d| # on each element of dungeon collection
- puts "state.dungeon << [#{d.x}, #{d.y}]" # prints cell coordinates
- end
- end
-
- def distance_to_cell cell
- distance_to state.x, cell.x, state.y, cell.y # calls distance_to method
- end
-
- def distance_to from_x, x, from_y, y
- (from_x - x).abs + (from_y - y).abs # finds distance between two cells using coordinates
- end
-end
-
-$game = Game.new
-
-def tick args
- $game.args = args
- $game.state = args.state
- $game.inputs = args.inputs
- $game.outputs = args.outputs
- $game.grid = args.grid
- $game.tick
-end
diff --git a/samples/99_genre_rpg_roguelike/roguelike_starting_point/license-for-sample.txt b/samples/99_genre_rpg_roguelike/roguelike_starting_point/license-for-sample.txt
deleted file mode 100644
index 100dcec..0000000
--- a/samples/99_genre_rpg_roguelike/roguelike_starting_point/license-for-sample.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Copyright 2019 DragonRuby LLC
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/samples/99_genre_rpg_roguelike/roguelike_starting_point/replay.txt b/samples/99_genre_rpg_roguelike/roguelike_starting_point/replay.txt
deleted file mode 100644
index a2b4c52..0000000
--- a/samples/99_genre_rpg_roguelike/roguelike_starting_point/replay.txt
+++ /dev/null
@@ -1,555 +0,0 @@
-replay_version 2.0
-stopped_at 1731
-seed 100
-recorded_at Sun Sep 29 22:38:52 2019
-[:mouse_move, 785, 468, 2, 1, 114]
-[:mouse_move, 756, 468, 2, 2, 115]
-[:mouse_move, 745, 468, 2, 3, 117]
-[:mouse_move, 718, 470, 2, 4, 118]
-[:mouse_move, 705, 472, 2, 5, 119]
-[:mouse_move, 680, 476, 2, 6, 120]
-[:mouse_move, 668, 478, 2, 7, 121]
-[:mouse_move, 606, 492, 2, 8, 122]
-[:mouse_move, 581, 499, 2, 9, 123]
-[:mouse_move, 523, 511, 2, 10, 124]
-[:mouse_move, 417, 527, 2, 11, 125]
-[:mouse_move, 387, 528, 2, 12, 126]
-[:mouse_move, 344, 528, 2, 13, 127]
-[:mouse_move, 324, 526, 2, 14, 128]
-[:mouse_move, 295, 520, 2, 15, 129]
-[:mouse_move, 285, 518, 2, 16, 130]
-[:mouse_move, 276, 515, 2, 17, 131]
-[:mouse_move, 255, 512, 2, 18, 132]
-[:mouse_move, 244, 511, 2, 19, 133]
-[:mouse_move, 228, 511, 2, 20, 134]
-[:mouse_move, 213, 513, 2, 21, 135]
-[:mouse_move, 194, 523, 2, 22, 136]
-[:mouse_move, 190, 526, 2, 23, 137]
-[:mouse_move, 183, 532, 2, 24, 138]
-[:mouse_move, 180, 533, 2, 25, 139]
-[:mouse_move, 177, 536, 2, 26, 140]
-[:mouse_move, 177, 537, 2, 27, 141]
-[:mouse_move, 193, 537, 2, 28, 142]
-[:mouse_move, 208, 536, 2, 29, 143]
-[:mouse_move, 222, 536, 2, 30, 144]
-[:mouse_move, 232, 535, 2, 31, 145]
-[:mouse_move, 241, 535, 2, 32, 146]
-[:mouse_move, 245, 535, 2, 33, 147]
-[:mouse_move, 249, 535, 2, 34, 148]
-[:mouse_move, 250, 535, 2, 35, 149]
-[:mouse_move, 251, 535, 2, 36, 150]
-[:mouse_move, 252, 534, 2, 37, 151]
-[:mouse_move, 256, 531, 2, 38, 152]
-[:mouse_move, 259, 527, 2, 39, 153]
-[:mouse_move, 265, 520, 2, 40, 154]
-[:mouse_move, 270, 515, 2, 41, 155]
-[:mouse_move, 274, 511, 2, 42, 156]
-[:mouse_move, 282, 501, 2, 43, 157]
-[:mouse_move, 293, 490, 2, 44, 159]
-[:mouse_move, 295, 489, 2, 45, 160]
-[:mouse_move, 299, 487, 2, 46, 161]
-[:mouse_move, 301, 485, 2, 47, 162]
-[:mouse_move, 303, 484, 2, 48, 163]
-[:mouse_move, 304, 484, 2, 49, 164]
-[:mouse_move, 306, 484, 2, 50, 165]
-[:mouse_move, 307, 484, 2, 51, 166]
-[:mouse_move, 308, 484, 2, 52, 167]
-[:mouse_move, 310, 484, 2, 53, 168]
-[:mouse_move, 314, 484, 2, 54, 169]
-[:mouse_move, 316, 484, 2, 55, 170]
-[:mouse_move, 317, 484, 2, 56, 171]
-[:mouse_move, 318, 484, 2, 57, 172]
-[:mouse_move, 319, 484, 2, 58, 173]
-[:key_down_raw, 1073741906, 0, 2, 59, 232]
-[:key_up_raw, 1073741906, 0, 2, 60, 237]
-[:key_down_raw, 1073741906, 0, 2, 61, 243]
-[:key_up_raw, 1073741906, 0, 2, 62, 247]
-[:key_down_raw, 1073741906, 0, 2, 63, 254]
-[:key_up_raw, 1073741906, 0, 2, 64, 257]
-[:key_down_raw, 1073741906, 0, 2, 65, 266]
-[:key_up_raw, 1073741906, 0, 2, 66, 272]
-[:key_down_raw, 1073741906, 0, 2, 67, 279]
-[:key_up_raw, 1073741906, 0, 2, 68, 284]
-[:key_down_raw, 1073741905, 0, 2, 69, 326]
-[:key_up_raw, 1073741905, 0, 2, 70, 334]
-[:key_down_raw, 1073741904, 0, 2, 71, 421]
-[:key_up_raw, 1073741904, 0, 2, 72, 428]
-[:key_down_raw, 1073741904, 0, 2, 73, 438]
-[:key_up_raw, 1073741904, 0, 2, 74, 445]
-[:key_down_raw, 1073741905, 0, 2, 75, 459]
-[:key_up_raw, 1073741905, 0, 2, 76, 466]
-[:key_down_raw, 1073741904, 0, 2, 77, 480]
-[:key_up_raw, 1073741904, 0, 2, 78, 488]
-[:key_down_raw, 1073741905, 0, 2, 79, 499]
-[:key_up_raw, 1073741905, 0, 2, 80, 507]
-[:mouse_move, 289, 484, 2, 81, 545]
-[:mouse_move, 274, 484, 2, 82, 546]
-[:mouse_move, 244, 484, 2, 83, 547]
-[:mouse_move, 231, 485, 2, 84, 548]
-[:mouse_move, 208, 485, 2, 85, 549]
-[:mouse_move, 199, 485, 2, 86, 550]
-[:mouse_move, 178, 485, 2, 87, 551]
-[:mouse_move, 174, 485, 2, 88, 552]
-[:mouse_move, 162, 483, 2, 89, 553]
-[:mouse_move, 159, 482, 2, 90, 554]
-[:mouse_move, 157, 477, 2, 91, 555]
-[:mouse_move, 157, 473, 2, 92, 556]
-[:mouse_move, 161, 465, 2, 93, 557]
-[:mouse_move, 165, 459, 2, 94, 558]
-[:mouse_move, 174, 449, 2, 95, 559]
-[:mouse_move, 179, 443, 2, 96, 560]
-[:mouse_move, 191, 431, 2, 97, 561]
-[:mouse_move, 196, 425, 2, 98, 562]
-[:mouse_move, 205, 413, 2, 99, 563]
-[:mouse_move, 210, 408, 2, 100, 564]
-[:mouse_move, 212, 406, 2, 101, 565]
-[:mouse_move, 219, 397, 2, 102, 566]
-[:mouse_move, 223, 395, 2, 103, 567]
-[:mouse_move, 228, 390, 2, 104, 568]
-[:mouse_move, 230, 388, 2, 105, 569]
-[:mouse_move, 233, 386, 2, 106, 570]
-[:mouse_move, 234, 385, 2, 107, 571]
-[:mouse_move, 235, 384, 2, 108, 573]
-[:mouse_move, 234, 384, 2, 109, 580]
-[:mouse_move, 234, 382, 2, 110, 622]
-[:mouse_move, 234, 379, 2, 111, 623]
-[:mouse_move, 236, 374, 2, 112, 624]
-[:mouse_move, 237, 371, 2, 113, 625]
-[:mouse_move, 240, 366, 2, 114, 626]
-[:mouse_move, 241, 364, 2, 115, 627]
-[:mouse_move, 243, 362, 2, 116, 628]
-[:mouse_move, 243, 361, 2, 117, 629]
-[:mouse_move, 242, 361, 2, 118, 632]
-[:mouse_move, 239, 361, 2, 119, 633]
-[:mouse_move, 229, 367, 2, 120, 634]
-[:mouse_move, 223, 372, 2, 121, 635]
-[:mouse_move, 208, 385, 2, 122, 636]
-[:mouse_move, 198, 393, 2, 123, 637]
-[:mouse_move, 179, 410, 2, 124, 638]
-[:mouse_move, 169, 421, 2, 125, 639]
-[:mouse_move, 149, 440, 2, 126, 640]
-[:mouse_move, 139, 451, 2, 127, 641]
-[:mouse_move, 127, 465, 2, 128, 642]
-[:mouse_move, 119, 473, 2, 129, 643]
-[:mouse_move, 108, 486, 2, 130, 644]
-[:mouse_move, 103, 491, 2, 131, 645]
-[:mouse_move, 98, 496, 2, 132, 646]
-[:mouse_move, 96, 498, 2, 133, 647]
-[:mouse_move, 94, 500, 2, 134, 648]
-[:mouse_move, 92, 501, 2, 135, 649]
-[:mouse_move, 91, 502, 2, 136, 650]
-[:mouse_move, 92, 500, 2, 137, 653]
-[:mouse_move, 95, 498, 2, 138, 654]
-[:mouse_move, 105, 488, 2, 139, 655]
-[:mouse_move, 112, 482, 2, 140, 656]
-[:mouse_move, 128, 463, 2, 141, 657]
-[:mouse_move, 138, 450, 2, 142, 658]
-[:mouse_move, 159, 419, 2, 143, 659]
-[:mouse_move, 168, 403, 2, 144, 660]
-[:mouse_move, 182, 382, 2, 145, 661]
-[:mouse_move, 188, 370, 2, 146, 662]
-[:mouse_move, 200, 354, 2, 147, 663]
-[:mouse_move, 205, 348, 2, 148, 664]
-[:mouse_move, 214, 338, 2, 149, 665]
-[:mouse_move, 218, 335, 2, 150, 666]
-[:mouse_move, 222, 331, 2, 151, 667]
-[:mouse_move, 224, 330, 2, 152, 668]
-[:mouse_move, 226, 328, 2, 153, 669]
-[:mouse_move, 227, 328, 2, 154, 670]
-[:mouse_move, 222, 329, 2, 155, 674]
-[:mouse_move, 219, 332, 2, 156, 675]
-[:mouse_move, 207, 342, 2, 157, 676]
-[:mouse_move, 201, 350, 2, 158, 677]
-[:mouse_move, 184, 370, 2, 159, 678]
-[:mouse_move, 173, 384, 2, 160, 679]
-[:mouse_move, 151, 415, 2, 161, 680]
-[:mouse_move, 140, 431, 2, 162, 681]
-[:mouse_move, 119, 458, 2, 163, 682]
-[:mouse_move, 114, 463, 2, 164, 683]
-[:mouse_move, 99, 478, 2, 165, 684]
-[:mouse_move, 97, 480, 2, 166, 685]
-[:mouse_move, 88, 490, 2, 167, 686]
-[:mouse_move, 85, 493, 2, 168, 687]
-[:mouse_move, 82, 496, 2, 169, 688]
-[:mouse_move, 81, 497, 2, 170, 689]
-[:mouse_move, 82, 497, 2, 171, 692]
-[:mouse_move, 84, 496, 2, 172, 693]
-[:mouse_move, 94, 489, 2, 173, 694]
-[:mouse_move, 101, 482, 2, 174, 695]
-[:mouse_move, 119, 463, 2, 175, 696]
-[:mouse_move, 129, 451, 2, 176, 697]
-[:mouse_move, 151, 426, 2, 177, 698]
-[:mouse_move, 155, 420, 2, 178, 699]
-[:mouse_move, 172, 401, 2, 179, 700]
-[:mouse_move, 178, 393, 2, 180, 701]
-[:mouse_move, 185, 387, 2, 181, 702]
-[:mouse_move, 197, 376, 2, 182, 703]
-[:mouse_move, 202, 371, 2, 183, 704]
-[:mouse_move, 209, 365, 2, 184, 705]
-[:mouse_move, 215, 360, 2, 185, 706]
-[:mouse_move, 218, 357, 2, 186, 707]
-[:mouse_move, 222, 353, 2, 187, 708]
-[:mouse_move, 225, 351, 2, 188, 709]
-[:mouse_move, 226, 350, 2, 189, 710]
-[:mouse_move, 227, 348, 2, 190, 711]
-[:mouse_move, 228, 348, 2, 191, 712]
-[:mouse_move, 229, 347, 2, 192, 713]
-[:mouse_move, 229, 346, 2, 193, 715]
-[:mouse_move, 225, 352, 2, 194, 721]
-[:mouse_move, 219, 361, 2, 195, 722]
-[:mouse_move, 201, 385, 2, 196, 723]
-[:mouse_move, 193, 393, 2, 197, 724]
-[:mouse_move, 165, 424, 2, 198, 725]
-[:mouse_move, 151, 439, 2, 199, 726]
-[:mouse_move, 127, 468, 2, 200, 727]
-[:mouse_move, 116, 480, 2, 201, 728]
-[:mouse_move, 106, 490, 2, 202, 729]
-[:mouse_move, 92, 504, 2, 203, 730]
-[:mouse_move, 84, 512, 2, 204, 731]
-[:mouse_move, 77, 519, 2, 205, 732]
-[:mouse_move, 73, 523, 2, 206, 733]
-[:mouse_move, 69, 527, 2, 207, 734]
-[:mouse_move, 68, 527, 2, 208, 735]
-[:mouse_move, 68, 528, 2, 209, 736]
-[:mouse_move, 70, 525, 2, 210, 738]
-[:mouse_move, 73, 522, 2, 211, 739]
-[:mouse_move, 86, 511, 2, 212, 740]
-[:mouse_move, 93, 503, 2, 213, 741]
-[:mouse_move, 117, 477, 2, 214, 742]
-[:mouse_move, 123, 469, 2, 215, 743]
-[:mouse_move, 156, 427, 2, 216, 744]
-[:mouse_move, 169, 407, 2, 217, 745]
-[:mouse_move, 187, 376, 2, 218, 746]
-[:mouse_move, 199, 356, 2, 219, 747]
-[:mouse_move, 221, 318, 2, 220, 748]
-[:mouse_move, 231, 302, 2, 221, 749]
-[:mouse_move, 250, 276, 2, 222, 750]
-[:mouse_move, 260, 266, 2, 223, 751]
-[:mouse_move, 267, 259, 2, 224, 752]
-[:mouse_move, 272, 254, 2, 225, 753]
-[:mouse_move, 279, 247, 2, 226, 754]
-[:mouse_move, 281, 245, 2, 227, 755]
-[:mouse_move, 282, 245, 2, 228, 756]
-[:mouse_move, 283, 244, 2, 229, 757]
-[:key_down_raw, 1073741906, 0, 2, 230, 813]
-[:key_up_raw, 1073741906, 0, 2, 231, 820]
-[:key_down_raw, 1073741903, 0, 2, 232, 833]
-[:key_up_raw, 1073741903, 0, 2, 233, 840]
-[:key_down_raw, 1073741903, 0, 2, 234, 848]
-[:key_up_raw, 1073741903, 0, 2, 235, 855]
-[:key_down_raw, 1073741906, 0, 2, 236, 862]
-[:key_up_raw, 1073741906, 0, 2, 237, 870]
-[:key_down_raw, 1073741903, 0, 2, 238, 880]
-[:key_up_raw, 1073741903, 0, 2, 239, 901]
-[:key_down_raw, 1073741903, 0, 2, 240, 917]
-[:key_up_raw, 1073741903, 0, 2, 241, 924]
-[:key_down_raw, 1073741905, 0, 2, 242, 943]
-[:key_up_raw, 1073741905, 0, 2, 243, 948]
-[:key_down_raw, 1073741905, 0, 2, 244, 952]
-[:key_up_raw, 1073741905, 0, 2, 245, 956]
-[:key_down_raw, 1073741905, 0, 2, 246, 960]
-[:key_up_raw, 1073741905, 0, 2, 247, 963]
-[:key_down_raw, 1073741905, 0, 2, 248, 967]
-[:key_up_raw, 1073741905, 0, 2, 249, 972]
-[:mouse_move, 244, 247, 2, 250, 997]
-[:mouse_move, 229, 253, 2, 251, 998]
-[:mouse_move, 174, 283, 2, 252, 999]
-[:mouse_move, 152, 299, 2, 253, 1000]
-[:mouse_move, 133, 313, 2, 254, 1001]
-[:mouse_move, 63, 372, 2, 255, 1002]
-[:mouse_move, 53, 384, 2, 256, 1003]
-[:mouse_move, 40, 399, 2, 257, 1004]
-[:mouse_move, 20, 424, 2, 258, 1005]
-[:mouse_move, 13, 440, 2, 259, 1006]
-[:mouse_move, 12, 445, 2, 260, 1007]
-[:mouse_move, 12, 450, 2, 261, 1008]
-[:mouse_move, 12, 451, 2, 262, 1009]
-[:mouse_move, 13, 454, 2, 263, 1010]
-[:mouse_move, 14, 454, 2, 264, 1011]
-[:mouse_move, 15, 455, 2, 265, 1012]
-[:mouse_move, 15, 454, 2, 266, 1014]
-[:mouse_move, 15, 452, 2, 267, 1015]
-[:mouse_move, 15, 447, 2, 268, 1016]
-[:mouse_move, 15, 443, 2, 269, 1017]
-[:mouse_move, 16, 438, 2, 270, 1018]
-[:mouse_move, 17, 435, 2, 271, 1019]
-[:mouse_move, 19, 431, 2, 272, 1020]
-[:mouse_move, 20, 430, 2, 273, 1021]
-[:mouse_move, 22, 428, 2, 274, 1022]
-[:mouse_move, 23, 427, 2, 275, 1023]
-[:mouse_move, 25, 426, 2, 276, 1024]
-[:mouse_move, 26, 426, 2, 277, 1025]
-[:mouse_move, 29, 426, 2, 278, 1026]
-[:mouse_move, 30, 426, 2, 279, 1028]
-[:mouse_move, 31, 427, 2, 280, 1029]
-[:mouse_move, 32, 428, 2, 281, 1030]
-[:mouse_move, 33, 431, 2, 282, 1031]
-[:mouse_move, 34, 432, 2, 283, 1032]
-[:mouse_move, 35, 437, 2, 284, 1033]
-[:mouse_move, 36, 439, 2, 285, 1034]
-[:mouse_move, 37, 444, 2, 286, 1035]
-[:mouse_move, 39, 449, 2, 287, 1036]
-[:mouse_move, 44, 460, 2, 288, 1037]
-[:mouse_move, 45, 464, 2, 289, 1038]
-[:mouse_move, 52, 475, 2, 290, 1039]
-[:mouse_move, 55, 479, 2, 291, 1040]
-[:mouse_move, 62, 485, 2, 292, 1041]
-[:mouse_move, 66, 487, 2, 293, 1042]
-[:mouse_move, 74, 488, 2, 294, 1043]
-[:mouse_move, 79, 488, 2, 295, 1044]
-[:mouse_move, 89, 484, 2, 296, 1045]
-[:mouse_move, 95, 480, 2, 297, 1046]
-[:mouse_move, 111, 468, 2, 298, 1047]
-[:mouse_move, 115, 466, 2, 299, 1048]
-[:mouse_move, 134, 453, 2, 300, 1049]
-[:mouse_move, 142, 447, 2, 301, 1050]
-[:mouse_move, 160, 437, 2, 302, 1051]
-[:mouse_move, 170, 431, 2, 303, 1052]
-[:mouse_move, 179, 425, 2, 304, 1053]
-[:mouse_move, 192, 417, 2, 305, 1054]
-[:mouse_move, 200, 411, 2, 306, 1055]
-[:mouse_move, 213, 401, 2, 307, 1056]
-[:mouse_move, 219, 396, 2, 308, 1057]
-[:mouse_move, 230, 386, 2, 309, 1058]
-[:mouse_move, 238, 375, 2, 310, 1059]
-[:mouse_move, 244, 363, 2, 311, 1060]
-[:mouse_move, 247, 355, 2, 312, 1061]
-[:mouse_move, 253, 341, 2, 313, 1062]
-[:mouse_move, 255, 335, 2, 314, 1063]
-[:mouse_move, 257, 321, 2, 315, 1064]
-[:mouse_move, 258, 309, 2, 316, 1065]
-[:mouse_move, 257, 298, 2, 317, 1066]
-[:mouse_move, 255, 291, 2, 318, 1067]
-[:mouse_move, 249, 281, 2, 319, 1068]
-[:mouse_move, 242, 271, 2, 320, 1069]
-[:mouse_move, 233, 264, 2, 321, 1070]
-[:mouse_move, 226, 260, 2, 322, 1071]
-[:mouse_move, 207, 252, 2, 323, 1072]
-[:mouse_move, 203, 251, 2, 324, 1073]
-[:mouse_move, 185, 249, 2, 325, 1074]
-[:mouse_move, 178, 249, 2, 326, 1075]
-[:mouse_move, 161, 249, 2, 327, 1076]
-[:mouse_move, 153, 250, 2, 328, 1077]
-[:mouse_move, 139, 256, 2, 329, 1078]
-[:mouse_move, 132, 259, 2, 330, 1079]
-[:mouse_move, 120, 269, 2, 331, 1080]
-[:mouse_move, 110, 279, 2, 332, 1081]
-[:mouse_move, 104, 287, 2, 333, 1082]
-[:mouse_move, 93, 304, 2, 334, 1083]
-[:mouse_move, 87, 313, 2, 335, 1084]
-[:mouse_move, 80, 326, 2, 336, 1085]
-[:mouse_move, 75, 335, 2, 337, 1086]
-[:mouse_move, 69, 351, 2, 338, 1087]
-[:mouse_move, 67, 359, 2, 339, 1088]
-[:mouse_move, 64, 376, 2, 340, 1089]
-[:mouse_move, 64, 383, 2, 341, 1090]
-[:mouse_move, 62, 399, 2, 342, 1091]
-[:mouse_move, 62, 406, 2, 343, 1092]
-[:mouse_move, 62, 418, 2, 344, 1093]
-[:mouse_move, 62, 423, 2, 345, 1094]
-[:mouse_move, 66, 433, 2, 346, 1095]
-[:mouse_move, 69, 437, 2, 347, 1096]
-[:mouse_move, 78, 444, 2, 348, 1097]
-[:mouse_move, 86, 450, 2, 349, 1098]
-[:mouse_move, 102, 457, 2, 350, 1099]
-[:mouse_move, 112, 458, 2, 351, 1100]
-[:mouse_move, 136, 461, 2, 352, 1101]
-[:mouse_move, 142, 461, 2, 353, 1102]
-[:mouse_move, 162, 460, 2, 354, 1103]
-[:mouse_move, 172, 459, 2, 355, 1104]
-[:mouse_move, 188, 454, 2, 356, 1105]
-[:mouse_move, 195, 451, 2, 357, 1106]
-[:mouse_move, 211, 443, 2, 358, 1107]
-[:mouse_move, 214, 440, 2, 359, 1108]
-[:mouse_move, 222, 432, 2, 360, 1109]
-[:mouse_move, 233, 412, 2, 361, 1110]
-[:mouse_move, 238, 400, 2, 362, 1111]
-[:mouse_move, 248, 375, 2, 363, 1112]
-[:mouse_move, 250, 370, 2, 364, 1113]
-[:mouse_move, 258, 351, 2, 365, 1114]
-[:mouse_move, 261, 343, 2, 366, 1115]
-[:mouse_move, 264, 328, 2, 367, 1116]
-[:mouse_move, 264, 321, 2, 368, 1117]
-[:mouse_move, 265, 307, 2, 369, 1118]
-[:mouse_move, 265, 305, 2, 370, 1119]
-[:mouse_move, 264, 296, 2, 371, 1120]
-[:mouse_move, 262, 289, 2, 372, 1121]
-[:mouse_move, 257, 282, 2, 373, 1122]
-[:mouse_move, 252, 277, 2, 374, 1123]
-[:mouse_move, 237, 271, 2, 375, 1124]
-[:mouse_move, 227, 269, 2, 376, 1125]
-[:mouse_move, 211, 268, 2, 377, 1126]
-[:mouse_move, 201, 268, 2, 378, 1127]
-[:mouse_move, 177, 268, 2, 379, 1128]
-[:mouse_move, 168, 269, 2, 380, 1129]
-[:mouse_move, 149, 274, 2, 381, 1130]
-[:mouse_move, 137, 279, 2, 382, 1131]
-[:mouse_move, 124, 288, 2, 383, 1132]
-[:mouse_move, 116, 294, 2, 384, 1133]
-[:mouse_move, 102, 307, 2, 385, 1134]
-[:mouse_move, 91, 319, 2, 386, 1135]
-[:mouse_move, 88, 323, 2, 387, 1136]
-[:mouse_move, 73, 344, 2, 388, 1137]
-[:mouse_move, 68, 353, 2, 389, 1138]
-[:mouse_move, 57, 374, 2, 390, 1139]
-[:mouse_move, 52, 386, 2, 391, 1140]
-[:mouse_move, 44, 412, 2, 392, 1141]
-[:mouse_move, 42, 418, 2, 393, 1142]
-[:mouse_move, 36, 437, 2, 394, 1143]
-[:mouse_move, 34, 445, 2, 395, 1144]
-[:mouse_move, 33, 453, 2, 396, 1145]
-[:mouse_move, 32, 457, 2, 397, 1146]
-[:mouse_move, 32, 466, 2, 398, 1147]
-[:mouse_move, 33, 468, 2, 399, 1148]
-[:mouse_move, 38, 475, 2, 400, 1149]
-[:mouse_move, 44, 482, 2, 401, 1150]
-[:mouse_move, 56, 492, 2, 402, 1151]
-[:mouse_move, 64, 496, 2, 403, 1152]
-[:mouse_move, 81, 503, 2, 404, 1153]
-[:mouse_move, 92, 503, 2, 405, 1154]
-[:mouse_move, 106, 503, 2, 406, 1155]
-[:mouse_move, 115, 501, 2, 407, 1156]
-[:mouse_move, 134, 492, 2, 408, 1157]
-[:mouse_move, 147, 485, 2, 409, 1158]
-[:mouse_move, 163, 471, 2, 410, 1159]
-[:mouse_move, 171, 463, 2, 411, 1160]
-[:mouse_move, 183, 451, 2, 412, 1161]
-[:mouse_move, 202, 425, 2, 413, 1163]
-[:mouse_move, 215, 401, 2, 414, 1164]
-[:mouse_move, 217, 395, 2, 415, 1165]
-[:mouse_move, 226, 373, 2, 416, 1166]
-[:mouse_move, 234, 357, 2, 417, 1167]
-[:mouse_move, 238, 343, 2, 418, 1168]
-[:mouse_move, 240, 334, 2, 419, 1169]
-[:mouse_move, 247, 310, 2, 420, 1170]
-[:mouse_move, 249, 299, 2, 421, 1171]
-[:mouse_move, 250, 290, 2, 422, 1172]
-[:mouse_move, 251, 283, 2, 423, 1173]
-[:mouse_move, 251, 269, 2, 424, 1174]
-[:mouse_move, 248, 263, 2, 425, 1175]
-[:mouse_move, 237, 256, 2, 426, 1176]
-[:mouse_move, 229, 254, 2, 427, 1177]
-[:mouse_move, 210, 250, 2, 428, 1178]
-[:mouse_move, 199, 249, 2, 429, 1179]
-[:mouse_move, 184, 248, 2, 430, 1180]
-[:mouse_move, 173, 248, 2, 431, 1181]
-[:mouse_move, 153, 248, 2, 432, 1182]
-[:mouse_move, 145, 249, 2, 433, 1183]
-[:mouse_move, 138, 251, 2, 434, 1184]
-[:mouse_move, 125, 257, 2, 435, 1185]
-[:mouse_move, 121, 260, 2, 436, 1186]
-[:mouse_move, 112, 267, 2, 437, 1187]
-[:mouse_move, 101, 280, 2, 438, 1188]
-[:mouse_move, 97, 287, 2, 439, 1189]
-[:mouse_move, 86, 306, 2, 440, 1190]
-[:mouse_move, 81, 316, 2, 441, 1191]
-[:mouse_move, 79, 322, 2, 442, 1192]
-[:mouse_move, 70, 345, 2, 443, 1193]
-[:mouse_move, 63, 365, 2, 444, 1194]
-[:mouse_move, 59, 389, 2, 445, 1195]
-[:mouse_move, 59, 401, 2, 446, 1196]
-[:mouse_move, 59, 416, 2, 447, 1197]
-[:mouse_move, 59, 425, 2, 448, 1198]
-[:mouse_move, 60, 439, 2, 449, 1199]
-[:mouse_move, 60, 442, 2, 450, 1200]
-[:mouse_move, 64, 454, 2, 451, 1201]
-[:mouse_move, 66, 457, 2, 452, 1202]
-[:mouse_move, 70, 462, 2, 453, 1203]
-[:mouse_move, 74, 464, 2, 454, 1204]
-[:mouse_move, 81, 467, 2, 455, 1205]
-[:mouse_move, 85, 468, 2, 456, 1206]
-[:mouse_move, 97, 469, 2, 457, 1207]
-[:mouse_move, 107, 469, 2, 458, 1208]
-[:mouse_move, 124, 471, 2, 459, 1209]
-[:mouse_move, 134, 471, 2, 460, 1210]
-[:mouse_move, 148, 471, 2, 461, 1211]
-[:mouse_move, 161, 468, 2, 462, 1212]
-[:mouse_move, 178, 457, 2, 463, 1213]
-[:mouse_move, 186, 451, 2, 464, 1214]
-[:mouse_move, 202, 434, 2, 465, 1215]
-[:mouse_move, 210, 424, 2, 466, 1216]
-[:mouse_move, 227, 400, 2, 467, 1217]
-[:mouse_move, 234, 388, 2, 468, 1218]
-[:mouse_move, 237, 383, 2, 469, 1219]
-[:mouse_move, 250, 360, 2, 470, 1220]
-[:mouse_move, 254, 351, 2, 471, 1221]
-[:mouse_move, 261, 334, 2, 472, 1222]
-[:mouse_move, 262, 326, 2, 473, 1223]
-[:mouse_move, 264, 312, 2, 474, 1224]
-[:mouse_move, 265, 305, 2, 475, 1225]
-[:mouse_move, 265, 293, 2, 476, 1226]
-[:mouse_move, 265, 287, 2, 477, 1227]
-[:mouse_move, 259, 272, 2, 478, 1228]
-[:mouse_move, 255, 267, 2, 479, 1229]
-[:mouse_move, 246, 260, 2, 480, 1230]
-[:mouse_move, 239, 257, 2, 481, 1231]
-[:mouse_move, 226, 253, 2, 482, 1232]
-[:mouse_move, 213, 251, 2, 483, 1233]
-[:mouse_move, 194, 251, 2, 484, 1234]
-[:mouse_move, 184, 252, 2, 485, 1235]
-[:mouse_move, 163, 259, 2, 486, 1236]
-[:mouse_move, 153, 263, 2, 487, 1237]
-[:mouse_move, 133, 274, 2, 488, 1238]
-[:mouse_move, 128, 278, 2, 489, 1239]
-[:mouse_move, 107, 297, 2, 490, 1240]
-[:mouse_move, 100, 305, 2, 491, 1241]
-[:mouse_move, 86, 324, 2, 492, 1242]
-[:mouse_move, 79, 335, 2, 493, 1243]
-[:mouse_move, 74, 348, 2, 494, 1244]
-[:mouse_move, 66, 388, 2, 495, 1245]
-[:mouse_move, 66, 399, 2, 496, 1246]
-[:mouse_move, 68, 429, 2, 497, 1247]
-[:mouse_move, 73, 441, 2, 498, 1248]
-[:mouse_move, 83, 452, 2, 499, 1249]
-[:mouse_move, 89, 457, 2, 500, 1250]
-[:mouse_move, 97, 462, 2, 501, 1251]
-[:key_down_raw, 1073741906, 0, 2, 502, 1292]
-[:key_up_raw, 1073741906, 0, 2, 503, 1296]
-[:key_down_raw, 1073741906, 0, 2, 504, 1309]
-[:key_up_raw, 1073741906, 0, 2, 505, 1314]
-[:key_down_raw, 1073741906, 0, 2, 506, 1319]
-[:key_up_raw, 1073741906, 0, 2, 507, 1322]
-[:key_down_raw, 1073741906, 0, 2, 508, 1327]
-[:key_up_raw, 1073741906, 0, 2, 509, 1331]
-[:key_down_raw, 1073741906, 0, 2, 510, 1336]
-[:key_up_raw, 1073741906, 0, 2, 511, 1339]
-[:key_down_raw, 1073741906, 0, 2, 512, 1345]
-[:key_up_raw, 1073741906, 0, 2, 513, 1348]
-[:key_down_raw, 1073741906, 0, 2, 514, 1354]
-[:key_up_raw, 1073741906, 0, 2, 515, 1358]
-[:key_down_raw, 1073741906, 0, 2, 516, 1362]
-[:key_up_raw, 1073741906, 0, 2, 517, 1370]
-[:key_down_raw, 1073741903, 0, 2, 518, 1386]
-[:key_up_raw, 1073741903, 0, 2, 519, 1392]
-[:key_down_raw, 1073741903, 0, 2, 520, 1397]
-[:key_up_raw, 1073741903, 0, 2, 521, 1401]
-[:key_down_raw, 1073741903, 0, 2, 522, 1407]
-[:key_up_raw, 1073741903, 0, 2, 523, 1412]
-[:key_down_raw, 1073741903, 0, 2, 524, 1415]
-[:key_up_raw, 1073741903, 0, 2, 525, 1421]
-[:key_down_raw, 1073741903, 0, 2, 526, 1428]
-[:key_up_raw, 1073741903, 0, 2, 527, 1436]
-[:key_down_raw, 1073741905, 0, 2, 528, 1446]
-[:key_up_raw, 1073741905, 0, 2, 529, 1458]
-[:key_down_raw, 1073741905, 0, 2, 530, 1466]
-[:key_up_raw, 1073741905, 0, 2, 531, 1472]
-[:key_down_raw, 1073741903, 0, 2, 532, 1479]
-[:key_up_raw, 1073741903, 0, 2, 533, 1489]
-[:key_down_raw, 1073741905, 0, 2, 534, 1513]
-[:key_up_raw, 1073741905, 0, 2, 535, 1517]
-[:key_down_raw, 1073741905, 0, 2, 536, 1522]
-[:key_up_raw, 1073741905, 0, 2, 537, 1526]
-[:key_down_raw, 1073741905, 0, 2, 538, 1531]
-[:key_up_raw, 1073741905, 0, 2, 539, 1535]
-[:key_down_raw, 1073741905, 0, 2, 540, 1540]
-[:key_up_raw, 1073741905, 0, 2, 541, 1544]
-[:key_down_raw, 1073741905, 0, 2, 542, 1549]
-[:key_up_raw, 1073741905, 0, 2, 543, 1554]
-[:key_down_raw, 1073741905, 0, 2, 544, 1558]
-[:key_up_raw, 1073741905, 0, 2, 545, 1564]
-[:key_down_raw, 1073742051, 1024, 2, 546, 1663]
-[:key_down_raw, 114, 1024, 2, 547, 1664]
-[:key_up_raw, 114, 1024, 2, 548, 1669]
-[:key_up_raw, 1073742051, 0, 2, 549, 1677]
-[:key_down_raw, 1073742051, 1024, 2, 550, 1729]
-[:key_down_raw, 113, 1024, 2, 551, 1730]