summaryrefslogtreecommitdiffhomepage
path: root/samples/99_genre_platformer/gorillas_basic
diff options
context:
space:
mode:
authorAmir Rajan <[email protected]>2020-09-11 02:02:01 -0500
committerAmir Rajan <[email protected]>2020-09-11 02:02:57 -0500
commit33ec37b141e896b47ed642923fd33b0c658ae9fb (patch)
treea40d3e5d41beeb06508200078f6f26b0ee57d6a4 /samples/99_genre_platformer/gorillas_basic
parent958cf43779d2bf528869e80511c4c4f2a433b2db (diff)
downloaddragonruby-game-toolkit-contrib-33ec37b141e896b47ed642923fd33b0c658ae9fb.tar.gz
dragonruby-game-toolkit-contrib-33ec37b141e896b47ed642923fd33b0c658ae9fb.zip
synced samples
Diffstat (limited to 'samples/99_genre_platformer/gorillas_basic')
-rw-r--r--samples/99_genre_platformer/gorillas_basic/CREDITS.txt3
-rw-r--r--samples/99_genre_platformer/gorillas_basic/app/main.rb373
-rw-r--r--samples/99_genre_platformer/gorillas_basic/app/repl.rb17
-rw-r--r--samples/99_genre_platformer/gorillas_basic/app/tests.rb4
-rw-r--r--samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb15
-rw-r--r--samples/99_genre_platformer/gorillas_basic/license-for-sample.txt9
-rw-r--r--samples/99_genre_platformer/gorillas_basic/metadata/game_metadata.txt6
-rw-r--r--samples/99_genre_platformer/gorillas_basic/replay.txt719
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/banana.pngbin0 -> 4771 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion0.pngbin0 -> 4603 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion1.pngbin0 -> 4585 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion2.pngbin0 -> 4675 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion3.pngbin0 -> 4724 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion4.pngbin0 -> 4773 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion5.pngbin0 -> 4742 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/explosion6.pngbin0 -> 4665 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/hole.pngbin0 -> 3637 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/left-0.pngbin0 -> 6352 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/left-1.pngbin0 -> 6243 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/left-2.pngbin0 -> 6339 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/left-idle.pngbin0 -> 5921 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/right-0.pngbin0 -> 6264 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/right-1.pngbin0 -> 6122 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/right-2.pngbin0 -> 6339 bytes
-rw-r--r--samples/99_genre_platformer/gorillas_basic/sprites/right-idle.pngbin0 -> 5933 bytes
25 files changed, 1146 insertions, 0 deletions
diff --git a/samples/99_genre_platformer/gorillas_basic/CREDITS.txt b/samples/99_genre_platformer/gorillas_basic/CREDITS.txt
new file mode 100644
index 0000000..7503a2a
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/CREDITS.txt
@@ -0,0 +1,3 @@
+code: Amir Rajan, https://twitter.com/amirrajan
+graphics: Nick Culbertson, https://twitter.com/MobyPixel
+
diff --git a/samples/99_genre_platformer/gorillas_basic/app/main.rb b/samples/99_genre_platformer/gorillas_basic/app/main.rb
new file mode 100644
index 0000000..53f9a4f
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/app/main.rb
@@ -0,0 +1,373 @@
+class YouSoBasicGorillas
+ attr_accessor :outputs, :grid, :state, :inputs
+
+ def tick
+ defaults
+ render
+ calc
+ process_inputs
+ end
+
+ def defaults
+ outputs.background_color = [33, 32, 87]
+ state.building_spacing = 1
+ state.building_room_spacing = 15
+ state.building_room_width = 10
+ state.building_room_height = 15
+ state.building_heights = [4, 4, 6, 8, 15, 20, 18]
+ state.building_room_sizes = [5, 4, 6, 7]
+ state.gravity = 0.25
+ state.first_strike ||= :player_1
+ state.buildings ||= []
+ state.holes ||= []
+ state.player_1_score ||= 0
+ state.player_2_score ||= 0
+ state.wind ||= 0
+ end
+
+ def render
+ render_stage
+ render_value_insertion
+ render_gorillas
+ render_holes
+ render_banana
+ render_game_over
+ render_score
+ render_wind
+ end
+
+ def render_score
+ outputs.primitives << [0, 0, 1280, 31, fancy_white].solid
+ outputs.primitives << [1, 1, 1279, 29].solid
+ outputs.labels << [ 10, 25, "Score: #{state.player_1_score}", 0, 0, fancy_white]
+ outputs.labels << [1270, 25, "Score: #{state.player_2_score}", 0, 2, fancy_white]
+ end
+
+ def render_wind
+ outputs.primitives << [640, 12, state.wind * 500 + state.wind * 10 * rand, 4, 35, 136, 162].solid
+ outputs.lines << [640, 30, 640, 0, fancy_white]
+ end
+
+ def render_game_over
+ return unless state.over
+ outputs.primitives << [grid.rect, 0, 0, 0, 200].solid
+ outputs.primitives << [640, 370, "Game Over!!", 5, 1, fancy_white].label
+ if state.winner == :player_1
+ outputs.primitives << [640, 340, "Player 1 Wins!!", 5, 1, fancy_white].label
+ else
+ outputs.primitives << [640, 340, "Player 2 Wins!!", 5, 1, fancy_white].label
+ end
+ end
+
+ def render_stage
+ return unless state.stage_generated
+ return if state.stage_rendered
+
+ outputs.static_solids << [grid.rect, 33, 32, 87]
+ outputs.static_solids << state.buildings.map(&:solids)
+ state.stage_rendered = true
+ end
+
+ def render_gorilla gorilla, id
+ return unless gorilla
+ if state.banana && state.banana.owner == gorilla
+ animation_index = state.banana.created_at.frame_index(3, 5, false)
+ end
+ if !animation_index
+ outputs.sprites << [gorilla.solid, "sprites/#{id}-idle.png"]
+ else
+ outputs.sprites << [gorilla.solid, "sprites/#{id}-#{animation_index}.png"]
+ end
+ end
+
+ def render_gorillas
+ render_gorilla state.player_1, :left
+ render_gorilla state.player_2, :right
+ end
+
+ def render_value_insertion
+ return if state.banana
+ return if state.over
+
+ if state.current_turn == :player_1_angle
+ outputs.labels << [ 10, 710, "Angle: #{state.player_1_angle}_", fancy_white]
+ elsif state.current_turn == :player_1_velocity
+ outputs.labels << [ 10, 710, "Angle: #{state.player_1_angle}", fancy_white]
+ outputs.labels << [ 10, 690, "Velocity: #{state.player_1_velocity}_", fancy_white]
+ elsif state.current_turn == :player_2_angle
+ outputs.labels << [1120, 710, "Angle: #{state.player_2_angle}_", fancy_white]
+ elsif state.current_turn == :player_2_velocity
+ outputs.labels << [1120, 710, "Angle: #{state.player_2_angle}", fancy_white]
+ outputs.labels << [1120, 690, "Velocity: #{state.player_2_velocity}_", fancy_white]
+ end
+ end
+
+ def render_banana
+ return unless state.banana
+ rotation = state.tick_count.%(360) * 20
+ rotation *= -1 if state.banana.dx > 0
+ outputs.sprites << [state.banana.x, state.banana.y, 15, 15, 'sprites/banana.png', rotation]
+ end
+
+ def render_holes
+ outputs.sprites << state.holes.map do |s|
+ animation_index = s.created_at.frame_index(7, 3, false)
+ if animation_index
+ [s.sprite, [s.sprite.rect, "sprites/explosion#{animation_index}.png" ]]
+ else
+ s.sprite
+ end
+ end
+ end
+
+ def calc
+ calc_generate_stage
+ calc_current_turn
+ calc_banana
+ end
+
+ def calc_current_turn
+ return if state.current_turn
+
+ state.current_turn = :player_1_angle
+ state.current_turn = :player_2_angle if state.first_strike == :player_2
+ end
+
+ def calc_generate_stage
+ return if state.stage_generated
+
+ state.buildings << building_prefab(state.building_spacing + -20, *random_building_size)
+ 8.numbers.inject(state.buildings) do |buildings, i|
+ buildings <<
+ building_prefab(state.building_spacing +
+ state.buildings.last.right,
+ *random_building_size)
+ end
+
+ building_two = state.buildings[1]
+ state.player_1 = new_player(building_two.x + building_two.w.fdiv(2),
+ building_two.h)
+
+ building_nine = state.buildings[-3]
+ state.player_2 = new_player(building_nine.x + building_nine.w.fdiv(2),
+ building_nine.h)
+ state.stage_generated = true
+ state.wind = 1.randomize(:ratio, :sign)
+ end
+
+ def new_player x, y
+ state.new_entity(:gorilla) do |p|
+ p.x = x - 25
+ p.y = y
+ p.solid = [p.x, p.y, 50, 50]
+ end
+ end
+
+ def calc_banana
+ return unless state.banana
+
+ state.banana.x += state.banana.dx
+ state.banana.dx += state.wind.fdiv(50)
+ state.banana.y += state.banana.dy
+ state.banana.dy -= state.gravity
+ banana_collision = [state.banana.x, state.banana.y, 10, 10]
+
+ if state.player_1 && banana_collision.intersect_rect?(state.player_1.solid)
+ state.over = true
+ if state.banana.owner == state.player_2
+ state.winner = :player_2
+ else
+ state.winner = :player_1
+ end
+
+ state.player_2_score += 1
+ elsif state.player_2 && banana_collision.intersect_rect?(state.player_2.solid)
+ state.over = true
+ if state.banana.owner == state.player_2
+ state.winner = :player_1
+ else
+ state.winner = :player_2
+ end
+ state.player_1_score += 1
+ end
+
+ if state.over
+ place_hole
+ return
+ end
+
+ return if state.holes.any? do |h|
+ h.sprite.scale_rect(0.8, 0.5, 0.5).intersect_rect? [state.banana.x, state.banana.y, 10, 10]
+ end
+
+ return unless state.banana.y < 0 || state.buildings.any? do |b|
+ b.rect.intersect_rect? [state.banana.x, state.banana.y, 1, 1]
+ end
+
+ place_hole
+ end
+
+ def place_hole
+ return unless state.banana
+
+ state.holes << state.new_entity(:banana) do |b|
+ b.sprite = [state.banana.x - 20, state.banana.y - 20, 40, 40, 'sprites/hole.png']
+ end
+
+ state.banana = nil
+ end
+
+ def process_inputs_main
+ return if state.banana
+ return if state.over
+
+ if inputs.keyboard.key_down.enter
+ input_execute_turn
+ elsif inputs.keyboard.key_down.backspace
+ state.as_hash[state.current_turn] ||= ""
+ state.as_hash[state.current_turn] = state.as_hash[state.current_turn][0..-2]
+ elsif inputs.keyboard.key_down.char
+ state.as_hash[state.current_turn] ||= ""
+ state.as_hash[state.current_turn] += inputs.keyboard.key_down.char
+ end
+ end
+
+ def process_inputs_game_over
+ return unless state.over
+ return unless inputs.keyboard.key_down.truthy_keys.any?
+ state.over = false
+ outputs.static_solids.clear
+ state.buildings.clear
+ state.holes.clear
+ state.stage_generated = false
+ state.stage_rendered = false
+ if state.first_strike == :player_1
+ state.first_strike = :player_2
+ else
+ state.first_strike = :player_1
+ end
+ end
+
+ def process_inputs
+ process_inputs_main
+ process_inputs_game_over
+ end
+
+ def input_execute_turn
+ return if state.banana
+
+ if state.current_turn == :player_1_angle && parse_or_clear!(:player_1_angle)
+ state.current_turn = :player_1_velocity
+ elsif state.current_turn == :player_1_velocity && parse_or_clear!(:player_1_velocity)
+ state.current_turn = :player_2_angle
+ state.banana =
+ new_banana(state.player_1,
+ state.player_1.x + 25,
+ state.player_1.y + 60,
+ state.player_1_angle,
+ state.player_1_velocity)
+ elsif state.current_turn == :player_2_angle && parse_or_clear!(:player_2_angle)
+ state.current_turn = :player_2_velocity
+ elsif state.current_turn == :player_2_velocity && parse_or_clear!(:player_2_velocity)
+ state.current_turn = :player_1_angle
+ state.banana =
+ new_banana(state.player_2,
+ state.player_2.x + 25,
+ state.player_2.y + 60,
+ 180 - state.player_2_angle,
+ state.player_2_velocity)
+ end
+
+ if state.banana
+ state.player_1_angle = nil
+ state.player_1_velocity = nil
+ state.player_2_angle = nil
+ state.player_2_velocity = nil
+ end
+ end
+
+ def random_building_size
+ [state.building_heights.sample, state.building_room_sizes.sample]
+ end
+
+ def int? v
+ v.to_i.to_s == v.to_s
+ end
+
+ def random_building_color
+ [[ 99, 0, 107],
+ [ 35, 64, 124],
+ [ 35, 136, 162],
+ ].sample
+ end
+
+ def random_window_color
+ [[ 88, 62, 104],
+ [253, 224, 187]].sample
+ end
+
+ def windows_for_building starting_x, floors, rooms
+ floors.-(1).combinations(rooms - 1).map do |floor, room|
+ [starting_x +
+ state.building_room_width.*(room) +
+ state.building_room_spacing.*(room + 1),
+ state.building_room_height.*(floor) +
+ state.building_room_spacing.*(floor + 1),
+ state.building_room_width,
+ state.building_room_height,
+ random_window_color]
+ end
+ end
+
+ def building_prefab starting_x, floors, rooms
+ state.new_entity(:building) do |b|
+ b.x = starting_x
+ b.y = 0
+ b.w = state.building_room_width.*(rooms) +
+ state.building_room_spacing.*(rooms + 1)
+ b.h = state.building_room_height.*(floors) +
+ state.building_room_spacing.*(floors + 1)
+ b.right = b.x + b.w
+ b.rect = [b.x, b.y, b.w, b.h]
+ b.solids = [[b.x - 1, b.y, b.w + 2, b.h + 1, fancy_white],
+ [b.x, b.y, b.w, b.h, random_building_color],
+ windows_for_building(b.x, floors, rooms)]
+ end
+ end
+
+ def parse_or_clear! game_prop
+ if int? state.as_hash[game_prop]
+ state.as_hash[game_prop] = state.as_hash[game_prop].to_i
+ return true
+ end
+
+ state.as_hash[game_prop] = nil
+ return false
+ end
+
+ def new_banana owner, x, y, angle, velocity
+ state.new_entity(:banana) do |b|
+ b.owner = owner
+ b.x = x
+ b.y = y
+ b.angle = angle % 360
+ b.velocity = velocity / 5
+ b.dx = b.angle.vector_x(b.velocity)
+ b.dy = b.angle.vector_y(b.velocity)
+ end
+ end
+
+ def fancy_white
+ [253, 252, 253]
+ end
+end
+
+$you_so_basic_gorillas = YouSoBasicGorillas.new
+
+def tick args
+ $you_so_basic_gorillas.outputs = args.outputs
+ $you_so_basic_gorillas.grid = args.grid
+ $you_so_basic_gorillas.state = args.state
+ $you_so_basic_gorillas.inputs = args.inputs
+ $you_so_basic_gorillas.tick
+end
diff --git a/samples/99_genre_platformer/gorillas_basic/app/repl.rb b/samples/99_genre_platformer/gorillas_basic/app/repl.rb
new file mode 100644
index 0000000..4428c4b
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/app/repl.rb
@@ -0,0 +1,17 @@
+begin
+ if $gtk.args.state.current_turn == :player_1_angle
+ $gtk.args.state.player_1_angle = "#{60 + 10.randomize(:ratio).to_i}"
+ $you_so_basic_gorillas.input_execute_turn
+ $gtk.args.state.player_1_velocity = "#{30 + 20.randomize(:ratio).to_i}"
+ $you_so_basic_gorillas.input_execute_turn
+ elsif $gtk.args.state.current_turn == :player_2_angle
+ $gtk.args.state.player_2_angle = "#{60 + 10.randomize(:ratio).to_i}"
+ $you_so_basic_gorillas.input_execute_turn
+ $gtk.args.state.player_2_velocity = "#{30 + 20.randomize(:ratio).to_i}"
+ $you_so_basic_gorillas.input_execute_turn
+ else
+ $you_so_basic_gorillas.input_execute_turn
+ end
+rescue Exception => e
+ puts e
+end
diff --git a/samples/99_genre_platformer/gorillas_basic/app/tests.rb b/samples/99_genre_platformer/gorillas_basic/app/tests.rb
new file mode 100644
index 0000000..e108574
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/app/tests.rb
@@ -0,0 +1,4 @@
+$gtk.reset 100
+$gtk.supress_framerate_warning = true
+$gtk.require 'app/tests/building_generation_tests.rb'
+$gtk.tests.start
diff --git a/samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb b/samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb
new file mode 100644
index 0000000..bbad57a
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb
@@ -0,0 +1,15 @@
+def test_solids args, assert
+ game = YouSoBasicGorillas.new
+ game.outputs = args.outputs
+ game.grid = args.grid
+ game.state = args.state
+ game.inputs = args.inputs
+ game.tick
+ assert.true! args.state.stage_generated, "stage wasn't generated but it should have been"
+ game.tick
+ assert.true! args.outputs.static_solids.length > 0, "stage wasn't rendered"
+ number_of_building_components = (args.state.buildings.map { |b| 2 + b.solids[2].length }.inject do |sum, v| (sum || 0) + v end)
+ the_only_background = 1
+ static_solids = args.outputs.static_solids.length
+ assert.true! static_solids == the_only_background.+(number_of_building_components), "not all parts of the buildings and background were rendered"
+end
diff --git a/samples/99_genre_platformer/gorillas_basic/license-for-sample.txt b/samples/99_genre_platformer/gorillas_basic/license-for-sample.txt
new file mode 100644
index 0000000..8fa4d42
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/license-for-sample.txt
@@ -0,0 +1,9 @@
+Copyright 2019 DragonRuby LLC (code), Nick Culbertson @mobypixel (art)
+
+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_platformer/gorillas_basic/metadata/game_metadata.txt b/samples/99_genre_platformer/gorillas_basic/metadata/game_metadata.txt
new file mode 100644
index 0000000..38d9894
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/metadata/game_metadata.txt
@@ -0,0 +1,6 @@
+devid=dragonruby
+devtitle=DragonRuby LLC
+gameid=basicgorillas
+gametitle=Basic Gorillas
+version=1.1
+icon=sprites/left-0.png
diff --git a/samples/99_genre_platformer/gorillas_basic/replay.txt b/samples/99_genre_platformer/gorillas_basic/replay.txt
new file mode 100644
index 0000000..a1d4eab
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/replay.txt
@@ -0,0 +1,719 @@
+replay_version 2.0
+stopped_at 1814
+seed 100
+recorded_at Sun Sep 29 23:27:50 2019
+[:mouse_move, 20, 450, 2, 1, 32]
+[:mouse_move, 61, 422, 2, 2, 33]
+[:mouse_move, 64, 417, 2, 3, 34]
+[:mouse_move, 67, 413, 2, 4, 35]
+[:mouse_move, 77, 402, 2, 5, 36]
+[:mouse_move, 78, 397, 2, 6, 37]
+[:mouse_move, 79, 393, 2, 7, 38]
+[:mouse_move, 79, 392, 2, 8, 39]
+[:mouse_move, 79, 401, 2, 9, 41]
+[:mouse_move, 80, 426, 2, 10, 42]
+[:mouse_move, 85, 444, 2, 11, 43]
+[:mouse_move, 97, 477, 2, 12, 44]
+[:mouse_move, 100, 482, 2, 13, 45]
+[:mouse_move, 113, 496, 2, 14, 46]
+[:mouse_move, 118, 498, 2, 15, 47]
+[:mouse_move, 123, 499, 2, 16, 48]
+[:mouse_move, 131, 493, 2, 17, 49]
+[:mouse_move, 132, 485, 2, 18, 50]
+[:mouse_move, 133, 462, 2, 19, 51]
+[:mouse_move, 133, 448, 2, 20, 52]
+[:mouse_move, 125, 402, 2, 21, 53]
+[:mouse_move, 120, 380, 2, 22, 54]
+[:mouse_move, 106, 336, 2, 23, 55]
+[:mouse_move, 97, 310, 2, 24, 56]
+[:mouse_move, 72, 250, 2, 25, 57]
+[:mouse_move, 58, 216, 2, 26, 58]
+[:mouse_move, 48, 188, 2, 27, 59]
+[:mouse_move, 39, 166, 2, 28, 60]
+[:mouse_move, 35, 156, 2, 29, 61]
+[:mouse_move, 33, 150, 2, 30, 62]
+[:mouse_move, 33, 145, 2, 31, 75]
+[:mouse_move, 33, 128, 2, 32, 76]
+[:mouse_move, 33, 119, 2, 33, 77]
+[:mouse_move, 33, 106, 2, 34, 78]
+[:mouse_move, 33, 101, 2, 35, 79]
+[:mouse_move, 33, 90, 2, 36, 80]
+[:mouse_move, 33, 83, 2, 37, 81]
+[:mouse_move, 31, 74, 2, 38, 82]
+[:mouse_move, 29, 68, 2, 39, 83]
+[:mouse_move, 26, 60, 2, 40, 84]
+[:mouse_move, 25, 59, 2, 41, 85]
+[:mouse_move, 23, 53, 2, 42, 86]
+[:mouse_move, 22, 51, 2, 43, 87]
+[:mouse_move, 21, 50, 2, 44, 88]
+[:mouse_move, 21, 49, 2, 45, 89]
+[:mouse_move, 19, 48, 2, 46, 90]
+[:mouse_move, 15, 46, 2, 47, 92]
+[:mouse_move, 12, 44, 2, 48, 93]
+[:mouse_move, 11, 43, 2, 49, 94]
+[:mouse_move, 9, 42, 2, 50, 95]
+[:mouse_move, 9, 41, 2, 51, 96]
+[:mouse_move, 8, 41, 2, 52, 97]
+[:mouse_move, 9, 41, 2, 53, 104]
+[:mouse_move, 12, 42, 2, 54, 105]
+[:mouse_move, 17, 44, 2, 55, 106]
+[:mouse_move, 21, 44, 2, 56, 107]
+[:mouse_move, 25, 45, 2, 57, 108]
+[:mouse_move, 34, 46, 2, 58, 109]
+[:mouse_move, 43, 46, 2, 59, 110]
+[:mouse_move, 48, 47, 2, 60, 111]
+[:mouse_move, 53, 47, 2, 61, 112]
+[:mouse_move, 61, 48, 2, 62, 113]
+[:mouse_move, 66, 48, 2, 63, 114]
+[:mouse_move, 74, 49, 2, 64, 115]
+[:mouse_move, 84, 51, 2, 65, 116]
+[:mouse_move, 88, 51, 2, 66, 117]
+[:mouse_move, 95, 52, 2, 67, 118]
+[:mouse_move, 98, 52, 2, 68, 119]
+[:mouse_move, 104, 52, 2, 69, 120]
+[:mouse_move, 108, 52, 2, 70, 121]
+[:mouse_move, 111, 52, 2, 71, 122]
+[:mouse_move, 115, 51, 2, 72, 123]
+[:mouse_move, 116, 50, 2, 73, 124]
+[:mouse_move, 118, 49, 2, 74, 125]
+[:mouse_move, 119, 49, 2, 75, 126]
+[:mouse_move, 120, 49, 2, 76, 127]
+[:mouse_move, 121, 48, 2, 77, 128]
+[:mouse_move, 122, 48, 2, 78, 130]
+[:mouse_move, 123, 48, 2, 79, 132]
+[:mouse_move, 124, 48, 2, 80, 133]
+[:mouse_move, 125, 48, 2, 81, 136]
+[:mouse_move, 125, 49, 2, 82, 141]
+[:mouse_move, 115, 67, 2, 83, 152]
+[:mouse_move, 109, 101, 2, 84, 153]
+[:mouse_move, 93, 189, 2, 85, 154]
+[:mouse_move, 81, 254, 2, 86, 155]
+[:mouse_move, 67, 327, 2, 87, 156]
+[:mouse_move, 40, 469, 2, 88, 157]
+[:mouse_move, 35, 496, 2, 89, 158]
+[:mouse_move, 24, 556, 2, 90, 159]
+[:mouse_move, 23, 566, 2, 91, 160]
+[:mouse_move, 20, 586, 2, 92, 161]
+[:mouse_move, 19, 595, 2, 93, 162]
+[:mouse_move, 18, 603, 2, 94, 163]
+[:mouse_move, 18, 605, 2, 95, 164]
+[:mouse_move, 18, 606, 2, 96, 165]
+[:mouse_move, 19, 606, 2, 97, 166]
+[:mouse_move, 20, 606, 2, 98, 168]
+[:mouse_move, 21, 606, 2, 99, 169]
+[:mouse_move, 21, 607, 2, 100, 170]
+[:mouse_move, 24, 608, 2, 101, 171]
+[:mouse_move, 27, 609, 2, 102, 172]
+[:mouse_move, 37, 616, 2, 103, 173]
+[:mouse_move, 45, 621, 2, 104, 174]
+[:mouse_move, 67, 631, 2, 105, 175]
+[:mouse_move, 81, 636, 2, 106, 176]
+[:mouse_move, 114, 645, 2, 107, 177]
+[:mouse_move, 129, 647, 2, 108, 178]
+[:mouse_move, 151, 646, 2, 109, 179]
+[:mouse_move, 176, 635, 2, 110, 180]
+[:mouse_move, 179, 630, 2, 111, 181]
+[:mouse_move, 190, 605, 2, 112, 182]
+[:mouse_move, 193, 582, 2, 113, 183]
+[:mouse_move, 193, 572, 2, 114, 184]
+[:mouse_move, 193, 556, 2, 115, 185]
+[:mouse_move, 190, 535, 2, 116, 186]
+[:mouse_move, 187, 523, 2, 117, 187]
+[:mouse_move, 179, 509, 2, 118, 188]
+[:mouse_move, 172, 502, 2, 119, 189]
+[:mouse_move, 159, 500, 2, 120, 190]
+[:mouse_move, 152, 500, 2, 121, 191]
+[:mouse_move, 142, 507, 2, 122, 192]
+[:mouse_move, 137, 513, 2, 123, 193]
+[:mouse_move, 129, 527, 2, 124, 194]
+[:mouse_move, 125, 540, 2, 125, 195]
+[:mouse_move, 125, 558, 2, 126, 196]
+[:mouse_move, 127, 566, 2, 127, 197]
+[:mouse_move, 135, 578, 2, 128, 198]
+[:mouse_move, 144, 590, 2, 129, 199]
+[:mouse_move, 159, 597, 2, 130, 200]
+[:mouse_move, 171, 599, 2, 131, 201]
+[:mouse_move, 179, 599, 2, 132, 202]
+[:mouse_move, 185, 599, 2, 133, 203]
+[:mouse_move, 200, 590, 2, 134, 204]
+[:mouse_move, 206, 579, 2, 135, 205]
+[:mouse_move, 206, 565, 2, 136, 206]
+[:mouse_move, 206, 558, 2, 137, 207]
+[:mouse_move, 197, 541, 2, 138, 208]
+[:mouse_move, 191, 537, 2, 139, 209]
+[:mouse_move, 183, 535, 2, 140, 210]
+[:mouse_move, 166, 535, 2, 141, 211]
+[:mouse_move, 155, 541, 2, 142, 212]
+[:mouse_move, 133, 569, 2, 143, 213]
+[:mouse_move, 127, 585, 2, 144, 214]
+[:mouse_move, 127, 602, 2, 145, 215]
+[:mouse_move, 132, 626, 2, 146, 216]
+[:mouse_move, 138, 630, 2, 147, 217]
+[:mouse_move, 144, 631, 2, 148, 218]
+[:mouse_move, 162, 627, 2, 149, 219]
+[:mouse_move, 180, 609, 2, 150, 220]
+[:mouse_move, 212, 530, 2, 151, 221]
+[:mouse_move, 221, 476, 2, 152, 222]
+[:mouse_move, 227, 388, 2, 153, 223]
+[:mouse_move, 227, 336, 2, 154, 224]
+[:mouse_move, 219, 256, 2, 155, 225]
+[:mouse_move, 209, 225, 2, 156, 226]
+[:mouse_move, 183, 173, 2, 157, 227]
+[:mouse_move, 175, 163, 2, 158, 228]
+[:mouse_move, 161, 140, 2, 159, 229]
+[:mouse_move, 158, 136, 2, 160, 230]
+[:mouse_move, 147, 121, 2, 161, 231]
+[:mouse_move, 144, 116, 2, 162, 232]
+[:mouse_move, 138, 107, 2, 163, 233]
+[:mouse_move, 136, 104, 2, 164, 234]
+[:mouse_move, 132, 99, 2, 165, 235]
+[:mouse_move, 130, 96, 2, 166, 236]
+[:mouse_move, 128, 95, 2, 167, 237]
+[:mouse_move, 124, 90, 2, 168, 238]
+[:mouse_move, 122, 89, 2, 169, 239]
+[:mouse_move, 120, 87, 2, 170, 240]
+[:mouse_move, 119, 86, 2, 171, 241]
+[:mouse_move, 117, 86, 2, 172, 242]
+[:mouse_move, 117, 85, 2, 173, 243]
+[:mouse_move, 114, 84, 2, 174, 244]
+[:mouse_move, 112, 83, 2, 175, 245]
+[:mouse_move, 109, 82, 2, 176, 246]
+[:key_down_raw, 56, 0, 2, 177, 299]
+[:key_up_raw, 56, 0, 2, 178, 304]
+[:key_down_raw, 48, 0, 2, 179, 309]
+[:key_up_raw, 48, 0, 2, 180, 314]
+[:key_down_raw, 13, 0, 2, 181, 346]
+[:key_up_raw, 13, 0, 2, 182, 353]
+[:key_down_raw, 49, 0, 2, 183, 390]
+[:key_up_raw, 49, 0, 2, 184, 393]
+[:key_down_raw, 49, 0, 2, 185, 398]
+[:key_up_raw, 49, 0, 2, 186, 404]
+[:key_down_raw, 53, 0, 2, 187, 410]
+[:key_up_raw, 53, 0, 2, 188, 415]
+[:key_down_raw, 13, 0, 2, 189, 478]
+[:key_up_raw, 13, 0, 2, 190, 484]
+[:mouse_move, 128, 84, 2, 191, 539]
+[:mouse_move, 153, 89, 2, 192, 540]
+[:mouse_move, 181, 97, 2, 193, 541]
+[:mouse_move, 216, 107, 2, 194, 542]
+[:mouse_move, 292, 129, 2, 195, 543]
+[:mouse_move, 367, 151, 2, 196, 544]
+[:mouse_move, 465, 178, 2, 197, 545]
+[:mouse_move, 520, 193, 2, 198, 546]
+[:mouse_move, 572, 207, 2, 199, 547]
+[:mouse_move, 581, 209, 2, 200, 548]
+[:mouse_move, 600, 215, 2, 201, 549]
+[:mouse_move, 607, 217, 2, 202, 550]
+[:mouse_move, 614, 220, 2, 203, 551]
+[:mouse_move, 614, 221, 2, 204, 684]
+[:mouse_move, 617, 223, 2, 205, 686]
+[:mouse_move, 619, 224, 2, 206, 687]
+[:mouse_move, 629, 230, 2, 207, 688]
+[:mouse_move, 641, 234, 2, 208, 689]
+[:mouse_move, 676, 242, 2, 209, 690]
+[:mouse_move, 718, 248, 2, 210, 691]
+[:mouse_move, 797, 251, 2, 211, 692]
+[:mouse_move, 817, 251, 2, 212, 693]
+[:mouse_move, 888, 236, 2, 213, 694]
+[:mouse_move, 916, 224, 2, 214, 695]
+[:mouse_move, 933, 210, 2, 215, 696]
+[:mouse_move, 957, 191, 2, 216, 697]
+[:mouse_move, 960, 189, 2, 217, 713]
+[:mouse_move, 965, 186, 2, 218, 714]
+[:mouse_move, 975, 180, 2, 219, 715]
+[:mouse_move, 988, 174, 2, 220, 716]
+[:mouse_move, 1021, 161, 2, 221, 717]
+[:mouse_move, 1051, 148, 2, 222, 718]
+[:mouse_move, 1079, 136, 2, 223, 719]
+[:mouse_move, 1096, 127, 2, 224, 720]
+[:mouse_move, 1126, 109, 2, 225, 721]
+[:mouse_move, 1131, 106, 2, 226, 722]
+[:mouse_move, 1149, 90, 2, 227, 723]
+[:mouse_move, 1155, 85, 2, 228, 724]
+[:mouse_move, 1161, 79, 2, 229, 725]
+[:mouse_move, 1164, 76, 2, 230, 726]
+[:mouse_move, 1166, 75, 2, 231, 727]
+[:mouse_move, 1168, 73, 2, 232, 728]
+[:mouse_move, 1169, 72, 2, 233, 729]
+[:mouse_move, 1171, 71, 2, 234, 730]
+[:mouse_move, 1172, 71, 2, 235, 731]
+[:mouse_move, 1172, 70, 2, 236, 733]
+[:mouse_move, 1173, 70, 2, 237, 734]
+[:mouse_move, 1173, 69, 2, 238, 741]
+[:mouse_move, 1175, 67, 2, 239, 742]
+[:mouse_move, 1177, 64, 2, 240, 743]
+[:mouse_move, 1183, 58, 2, 241, 744]
+[:mouse_move, 1187, 53, 2, 242, 745]
+[:mouse_move, 1195, 44, 2, 243, 746]
+[:mouse_move, 1197, 42, 2, 244, 747]
+[:mouse_move, 1202, 37, 2, 245, 748]
+[:mouse_move, 1204, 35, 2, 246, 749]
+[:mouse_move, 1205, 34, 2, 247, 750]
+[:mouse_move, 1205, 33, 2, 248, 751]
+[:mouse_move, 1199, 33, 2, 249, 752]
+[:mouse_move, 1185, 33, 2, 250, 753]
+[:mouse_move, 1168, 33, 2, 251, 754]
+[:mouse_move, 1123, 34, 2, 252, 755]
+[:mouse_move, 1096, 35, 2, 253, 756]
+[:mouse_move, 1074, 37, 2, 254, 757]
+[:mouse_move, 1057, 37, 2, 255, 758]
+[:mouse_move, 1043, 39, 2, 256, 759]
+[:mouse_move, 1037, 39, 2, 257, 760]
+[:mouse_move, 1031, 40, 2, 258, 761]
+[:mouse_move, 1030, 40, 2, 259, 762]
+[:mouse_move, 1029, 41, 2, 260, 763]
+[:mouse_move, 1029, 44, 2, 261, 764]
+[:mouse_move, 1033, 56, 2, 262, 765]
+[:mouse_move, 1044, 72, 2, 263, 766]
+[:mouse_move, 1064, 90, 2, 264, 767]
+[:mouse_move, 1078, 100, 2, 265, 768]
+[:mouse_move, 1109, 113, 2, 266, 769]
+[:mouse_move, 1125, 113, 2, 267, 770]
+[:mouse_move, 1154, 107, 2, 268, 771]
+[:mouse_move, 1168, 98, 2, 269, 772]
+[:mouse_move, 1184, 83, 2, 270, 773]
+[:mouse_move, 1194, 74, 2, 271, 774]
+[:mouse_move, 1202, 65, 2, 272, 775]
+[:mouse_move, 1206, 59, 2, 273, 776]
+[:mouse_move, 1210, 49, 2, 274, 777]
+[:mouse_move, 1210, 44, 2, 275, 778]
+[:mouse_move, 1203, 38, 2, 276, 779]
+[:mouse_move, 1198, 36, 2, 277, 780]
+[:mouse_move, 1191, 32, 2, 278, 781]
+[:mouse_move, 1178, 27, 2, 279, 782]
+[:mouse_move, 1172, 24, 2, 280, 783]
+[:mouse_move, 1160, 20, 2, 281, 784]
+[:mouse_move, 1154, 18, 2, 282, 785]
+[:mouse_move, 1141, 18, 2, 283, 786]
+[:mouse_move, 1133, 18, 2, 284, 787]
+[:mouse_move, 1117, 23, 2, 285, 788]
+[:mouse_move, 1110, 28, 2, 286, 789]
+[:mouse_move, 1099, 44, 2, 287, 790]
+[:mouse_move, 1097, 49, 2, 288, 791]
+[:mouse_move, 1093, 59, 2, 289, 792]
+[:mouse_move, 1091, 65, 2, 290, 793]
+[:mouse_move, 1091, 79, 2, 291, 794]
+[:mouse_move, 1095, 82, 2, 292, 795]
+[:mouse_move, 1121, 91, 2, 293, 796]
+[:mouse_move, 1140, 93, 2, 294, 797]
+[:mouse_move, 1172, 97, 2, 295, 798]
+[:mouse_move, 1194, 97, 2, 296, 799]
+[:mouse_move, 1230, 89, 2, 297, 800]
+[:mouse_move, 1237, 84, 2, 298, 801]
+[:mouse_move, 1255, 69, 2, 299, 802]
+[:mouse_move, 1260, 63, 2, 300, 803]
+[:mouse_move, 1264, 44, 2, 301, 804]
+[:mouse_move, 1262, 36, 2, 302, 805]
+[:mouse_move, 1246, 19, 2, 303, 806]
+[:mouse_move, 1235, 12, 2, 304, 807]
+[:mouse_move, 1210, 1, 2, 305, 808]
+[:mouse_move, 1197, 0, 2, 306, 809]
+[:mouse_move, 1153, 0, 2, 307, 812]
+[:mouse_move, 1143, 4, 2, 308, 812]
+[:mouse_move, 1134, 11, 2, 309, 813]
+[:mouse_move, 1126, 19, 2, 310, 814]
+[:mouse_move, 1117, 30, 2, 311, 814]
+[:mouse_move, 1109, 42, 2, 312, 815]
+[:mouse_move, 1101, 56, 2, 313, 816]
+[:mouse_move, 1094, 71, 2, 314, 816]
+[:mouse_move, 1088, 85, 2, 315, 817]
+[:mouse_move, 1085, 98, 2, 316, 818]
+[:mouse_move, 1083, 125, 2, 317, 819]
+[:mouse_move, 1082, 126, 2, 318, 831]
+[:mouse_move, 1074, 136, 2, 319, 832]
+[:mouse_move, 1049, 174, 2, 320, 833]
+[:mouse_move, 1023, 217, 2, 321, 834]
+[:mouse_move, 958, 326, 2, 322, 835]
+[:mouse_move, 945, 350, 2, 323, 836]
+[:mouse_move, 918, 398, 2, 324, 837]
+[:mouse_move, 894, 443, 2, 325, 838]
+[:mouse_move, 890, 451, 2, 326, 839]
+[:mouse_move, 878, 481, 2, 327, 840]
+[:mouse_move, 877, 490, 2, 328, 841]
+[:mouse_move, 877, 497, 2, 329, 842]
+[:mouse_move, 880, 499, 2, 330, 843]
+[:mouse_move, 886, 500, 2, 331, 844]
+[:mouse_move, 888, 500, 2, 332, 845]
+[:mouse_move, 892, 498, 2, 333, 846]
+[:mouse_move, 894, 498, 2, 334, 847]
+[:mouse_move, 903, 498, 2, 335, 848]
+[:mouse_move, 909, 506, 2, 336, 849]
+[:mouse_move, 923, 524, 2, 337, 850]
+[:mouse_move, 934, 534, 2, 338, 851]
+[:mouse_move, 958, 551, 2, 339, 852]
+[:mouse_move, 970, 555, 2, 340, 853]
+[:mouse_move, 995, 555, 2, 341, 854]
+[:mouse_move, 1007, 551, 2, 342, 855]
+[:mouse_move, 1036, 525, 2, 343, 856]
+[:mouse_move, 1039, 515, 2, 344, 857]
+[:mouse_move, 1052, 467, 2, 345, 858]
+[:mouse_move, 1052, 456, 2, 346, 859]
+[:mouse_move, 1049, 426, 2, 347, 860]
+[:mouse_move, 1041, 415, 2, 348, 861]
+[:mouse_move, 1017, 399, 2, 349, 862]
+[:mouse_move, 994, 394, 2, 350, 863]
+[:mouse_move, 984, 394, 2, 351, 864]
+[:mouse_move, 954, 403, 2, 352, 865]
+[:mouse_move, 937, 413, 2, 353, 866]
+[:mouse_move, 903, 453, 2, 354, 867]
+[:mouse_move, 897, 472, 2, 355, 868]
+[:mouse_move, 893, 501, 2, 356, 869]
+[:mouse_move, 893, 520, 2, 357, 870]
+[:mouse_move, 901, 547, 2, 358, 871]
+[:mouse_move, 909, 557, 2, 359, 872]
+[:mouse_move, 929, 567, 2, 360, 873]
+[:mouse_move, 943, 569, 2, 361, 874]
+[:mouse_move, 982, 565, 2, 362, 875]
+[:mouse_move, 990, 560, 2, 363, 876]
+[:mouse_move, 1034, 532, 2, 364, 877]
+[:mouse_move, 1039, 524, 2, 365, 878]
+[:mouse_move, 1073, 474, 2, 366, 879]
+[:mouse_move, 1088, 424, 2, 367, 880]
+[:mouse_move, 1094, 334, 2, 368, 881]
+[:mouse_move, 1095, 309, 2, 369, 882]
+[:mouse_move, 1098, 220, 2, 370, 883]
+[:mouse_move, 1103, 182, 2, 371, 884]
+[:mouse_move, 1115, 135, 2, 372, 885]
+[:mouse_move, 1124, 111, 2, 373, 886]
+[:mouse_move, 1136, 83, 2, 374, 887]
+[:mouse_move, 1144, 70, 2, 375, 888]
+[:mouse_move, 1151, 58, 2, 376, 889]
+[:mouse_move, 1154, 52, 2, 377, 890]
+[:mouse_move, 1158, 48, 2, 378, 891]
+[:mouse_move, 1161, 43, 2, 379, 892]
+[:mouse_move, 1162, 41, 2, 380, 893]
+[:mouse_move, 1164, 39, 2, 381, 894]
+[:mouse_move, 1165, 38, 2, 382, 895]
+[:mouse_move, 1166, 37, 2, 383, 896]
+[:mouse_move, 1167, 36, 2, 384, 897]
+[:mouse_move, 1167, 35, 2, 385, 898]
+[:mouse_move, 1168, 35, 2, 386, 899]
+[:mouse_move, 1169, 35, 2, 387, 900]
+[:key_down_raw, 56, 0, 2, 388, 940]
+[:key_up_raw, 56, 0, 2, 389, 945]
+[:key_down_raw, 48, 0, 2, 390, 952]
+[:key_up_raw, 48, 0, 2, 391, 957]
+[:key_down_raw, 13, 0, 2, 392, 1001]
+[:key_up_raw, 13, 0, 2, 393, 1006]
+[:key_down_raw, 49, 0, 2, 394, 1030]
+[:key_up_raw, 49, 0, 2, 395, 1035]
+[:key_down_raw, 49, 0, 2, 396, 1041]
+[:key_up_raw, 49, 0, 2, 397, 1045]
+[:key_down_raw, 53, 0, 2, 398, 1098]
+[:key_up_raw, 53, 0, 2, 399, 1101]
+[:mouse_move, 1193, 38, 2, 400, 1121]
+[:mouse_move, 1236, 52, 2, 401, 1122]
+[:mouse_move, 1279, 63, 2, 402, 1123]
+[:mouse_move, 1279, 69, 2, 403, 1124]
+[:mouse_move, 1277, 36, 2, 404, 1134]
+[:mouse_move, 1271, 36, 2, 405, 1135]
+[:mouse_move, 1259, 35, 2, 406, 1136]
+[:mouse_move, 1250, 35, 2, 407, 1136]
+[:mouse_move, 1242, 35, 2, 408, 1137]
+[:mouse_move, 1239, 35, 2, 409, 1138]
+[:mouse_move, 1230, 36, 2, 410, 1138]
+[:mouse_move, 1225, 37, 2, 411, 1139]
+[:mouse_move, 1222, 38, 2, 412, 1140]
+[:mouse_move, 1220, 38, 2, 413, 1140]
+[:mouse_move, 1217, 38, 2, 414, 1141]
+[:mouse_move, 1215, 39, 2, 415, 1142]
+[:mouse_move, 1213, 39, 2, 416, 1142]
+[:mouse_move, 1211, 39, 2, 417, 1143]
+[:mouse_move, 1210, 40, 2, 418, 1144]
+[:mouse_move, 1208, 41, 2, 419, 1145]
+[:mouse_move, 1207, 42, 2, 420, 1146]
+[:mouse_move, 1206, 44, 2, 421, 1147]
+[:mouse_move, 1205, 44, 2, 422, 1148]
+[:mouse_move, 1204, 47, 2, 423, 1149]
+[:mouse_move, 1203, 49, 2, 424, 1150]
+[:mouse_move, 1202, 51, 2, 425, 1151]
+[:mouse_move, 1202, 52, 2, 426, 1152]
+[:mouse_move, 1202, 53, 2, 427, 1153]
+[:mouse_move, 1202, 54, 2, 428, 1154]
+[:mouse_move, 1207, 54, 2, 429, 1155]
+[:mouse_move, 1212, 55, 2, 430, 1156]
+[:mouse_move, 1223, 56, 2, 431, 1157]
+[:mouse_move, 1229, 57, 2, 432, 1158]
+[:mouse_move, 1236, 57, 2, 433, 1159]
+[:mouse_move, 1240, 57, 2, 434, 1160]
+[:mouse_move, 1245, 57, 2, 435, 1161]
+[:mouse_move, 1247, 57, 2, 436, 1162]
+[:mouse_move, 1249, 57, 2, 437, 1163]
+[:mouse_move, 1250, 57, 2, 438, 1163]
+[:mouse_move, 1251, 57, 2, 439, 1164]
+[:mouse_move, 1252, 57, 2, 440, 1165]
+[:mouse_move, 1253, 57, 2, 441, 1165]
+[:mouse_move, 1254, 57, 2, 442, 1166]
+[:mouse_move, 1255, 57, 2, 443, 1167]
+[:mouse_move, 1256, 57, 2, 444, 1168]
+[:mouse_move, 1257, 57, 2, 445, 1169]
+[:mouse_move, 1258, 57, 2, 446, 1171]
+[:mouse_move, 1259, 57, 2, 447, 1171]
+[:mouse_move, 1260, 57, 2, 448, 1173]
+[:mouse_move, 1259, 57, 2, 449, 1177]
+[:mouse_move, 1251, 56, 2, 450, 1178]
+[:mouse_move, 1244, 56, 2, 451, 1179]
+[:mouse_move, 1234, 56, 2, 452, 1180]
+[:mouse_move, 1231, 56, 2, 453, 1181]
+[:mouse_move, 1223, 56, 2, 454, 1182]
+[:mouse_move, 1220, 56, 2, 455, 1183]
+[:mouse_move, 1217, 57, 2, 456, 1184]
+[:mouse_move, 1219, 57, 2, 457, 1187]
+[:mouse_move, 1227, 58, 2, 458, 1188]
+[:mouse_move, 1231, 59, 2, 459, 1189]
+[:mouse_move, 1233, 59, 2, 460, 1190]
+[:mouse_move, 1236, 59, 2, 461, 1190]
+[:mouse_move, 1239, 59, 2, 462, 1191]
+[:mouse_move, 1240, 60, 2, 463, 1192]
+[:mouse_move, 1241, 60, 2, 464, 1192]
+[:mouse_move, 1242, 60, 2, 465, 1193]
+[:mouse_move, 1232, 65, 2, 466, 1205]
+[:mouse_move, 1219, 74, 2, 467, 1206]
+[:mouse_move, 1163, 105, 2, 468, 1207]
+[:mouse_move, 1078, 154, 2, 469, 1208]
+[:mouse_move, 931, 239, 2, 470, 1209]
+[:mouse_move, 896, 263, 2, 471, 1210]
+[:mouse_move, 763, 366, 2, 472, 1211]
+[:mouse_move, 742, 388, 2, 473, 1212]
+[:mouse_move, 667, 471, 2, 474, 1213]
+[:mouse_move, 642, 509, 2, 475, 1214]
+[:mouse_move, 613, 575, 2, 476, 1215]
+[:mouse_move, 611, 588, 2, 477, 1216]
+[:mouse_move, 588, 612, 2, 478, 1230]
+[:mouse_move, 577, 624, 2, 479, 1231]
+[:mouse_move, 532, 667, 2, 480, 1232]
+[:mouse_move, 523, 676, 2, 481, 1233]
+[:mouse_move, 516, 682, 2, 482, 1234]
+[:mouse_move, 511, 686, 2, 483, 1235]
+[:mouse_move, 492, 703, 2, 484, 1236]
+[:mouse_move, 490, 705, 2, 485, 1237]
+[:mouse_move, 489, 706, 2, 486, 1238]
+[:mouse_move, 488, 706, 2, 487, 1239]
+[:mouse_move, 488, 707, 2, 488, 1240]
+[:mouse_move, 488, 708, 2, 489, 1246]
+[:mouse_move, 487, 709, 2, 490, 1247]
+[:mouse_move, 487, 710, 2, 491, 1248]
+[:mouse_move, 488, 710, 2, 492, 1252]
+[:mouse_move, 489, 710, 2, 493, 1252]
+[:mouse_move, 490, 710, 2, 494, 1253]
+[:mouse_move, 492, 709, 2, 495, 1253]
+[:mouse_move, 495, 709, 2, 496, 1254]
+[:mouse_move, 499, 708, 2, 497, 1255]
+[:mouse_move, 501, 708, 2, 498, 1256]
+[:mouse_move, 504, 707, 2, 499, 1257]
+[:mouse_move, 507, 707, 2, 500, 1258]
+[:mouse_move, 509, 707, 2, 501, 1259]
+[:mouse_move, 511, 707, 2, 502, 1260]
+[:mouse_move, 513, 707, 2, 503, 1261]
+[:mouse_move, 515, 707, 2, 504, 1262]
+[:mouse_move, 516, 708, 2, 505, 1263]
+[:mouse_move, 518, 708, 2, 506, 1264]
+[:mouse_move, 520, 708, 2, 507, 1265]
+[:mouse_move, 521, 708, 2, 508, 1266]
+[:mouse_move, 523, 708, 2, 509, 1267]
+[:mouse_move, 525, 708, 2, 510, 1268]
+[:mouse_move, 526, 709, 2, 511, 1269]
+[:mouse_move, 527, 709, 2, 512, 1269]
+[:mouse_move, 528, 709, 2, 513, 1270]
+[:mouse_move, 529, 710, 2, 514, 1271]
+[:mouse_move, 530, 710, 2, 515, 1272]
+[:mouse_move, 531, 711, 2, 516, 1274]
+[:mouse_move, 532, 711, 2, 517, 1275]
+[:mouse_move, 533, 711, 2, 518, 1275]
+[:mouse_move, 536, 712, 2, 519, 1276]
+[:mouse_move, 540, 713, 2, 520, 1278]
+[:mouse_move, 541, 714, 2, 521, 1279]
+[:mouse_move, 543, 714, 2, 522, 1279]
+[:mouse_move, 544, 715, 2, 523, 1280]
+[:mouse_move, 546, 715, 2, 524, 1281]
+[:mouse_move, 548, 715, 2, 525, 1281]
+[:mouse_move, 550, 716, 2, 526, 1282]
+[:mouse_move, 551, 716, 2, 527, 1283]
+[:mouse_move, 555, 716, 2, 528, 1284]
+[:mouse_move, 557, 716, 2, 529, 1285]
+[:mouse_move, 561, 716, 2, 530, 1286]
+[:mouse_move, 563, 716, 2, 531, 1287]
+[:mouse_move, 567, 716, 2, 532, 1288]
+[:mouse_move, 569, 715, 2, 533, 1289]
+[:mouse_move, 572, 715, 2, 534, 1290]
+[:mouse_move, 575, 714, 2, 535, 1291]
+[:mouse_move, 578, 714, 2, 536, 1292]
+[:mouse_move, 580, 714, 2, 537, 1293]
+[:mouse_move, 585, 714, 2, 538, 1294]
+[:mouse_move, 586, 714, 2, 539, 1295]
+[:mouse_move, 588, 714, 2, 540, 1296]
+[:mouse_move, 591, 714, 2, 541, 1296]
+[:mouse_move, 594, 714, 2, 542, 1297]
+[:mouse_move, 596, 714, 2, 543, 1298]
+[:mouse_move, 598, 714, 2, 544, 1298]
+[:mouse_move, 600, 714, 2, 545, 1299]
+[:mouse_move, 602, 714, 2, 546, 1300]
+[:mouse_move, 606, 714, 2, 547, 1300]
+[:mouse_move, 607, 714, 2, 548, 1301]
+[:mouse_move, 611, 714, 2, 549, 1302]
+[:mouse_move, 614, 715, 2, 550, 1302]
+[:mouse_move, 615, 715, 2, 551, 1303]
+[:mouse_move, 619, 716, 2, 552, 1304]
+[:mouse_move, 622, 716, 2, 553, 1304]
+[:mouse_move, 623, 716, 2, 554, 1305]
+[:mouse_move, 628, 717, 2, 555, 1306]
+[:mouse_move, 631, 717, 2, 556, 1306]
+[:mouse_move, 634, 717, 2, 557, 1307]
+[:mouse_move, 637, 717, 2, 558, 1308]
+[:mouse_move, 641, 717, 2, 559, 1308]
+[:mouse_move, 643, 717, 2, 560, 1309]
+[:mouse_move, 647, 717, 2, 561, 1310]
+[:mouse_move, 652, 716, 2, 562, 1311]
+[:mouse_move, 656, 715, 2, 563, 1312]
+[:mouse_move, 660, 713, 2, 564, 1313]
+[:mouse_move, 663, 712, 2, 565, 1314]
+[:mouse_move, 667, 710, 2, 566, 1315]
+[:mouse_move, 669, 709, 2, 567, 1316]
+[:mouse_move, 670, 706, 2, 568, 1317]
+[:mouse_move, 670, 705, 2, 569, 1318]
+[:mouse_move, 669, 702, 2, 570, 1319]
+[:mouse_move, 666, 700, 2, 571, 1320]
+[:mouse_move, 660, 696, 2, 572, 1321]
+[:mouse_move, 656, 695, 2, 573, 1322]
+[:mouse_move, 643, 691, 2, 574, 1323]
+[:mouse_move, 637, 691, 2, 575, 1324]
+[:mouse_move, 628, 690, 2, 576, 1325]
+[:mouse_move, 617, 690, 2, 577, 1325]
+[:mouse_move, 606, 690, 2, 578, 1326]
+[:mouse_move, 596, 690, 2, 579, 1327]
+[:mouse_move, 590, 690, 2, 580, 1327]
+[:mouse_move, 579, 690, 2, 581, 1328]
+[:mouse_move, 569, 691, 2, 582, 1329]
+[:mouse_move, 561, 692, 2, 583, 1329]
+[:mouse_move, 554, 693, 2, 584, 1330]
+[:mouse_move, 546, 693, 2, 585, 1331]
+[:mouse_move, 539, 694, 2, 586, 1331]
+[:mouse_move, 533, 694, 2, 587, 1332]
+[:mouse_move, 527, 695, 2, 588, 1333]
+[:mouse_move, 522, 695, 2, 589, 1333]
+[:mouse_move, 520, 696, 2, 590, 1334]
+[:mouse_move, 516, 696, 2, 591, 1335]
+[:mouse_move, 513, 697, 2, 592, 1335]
+[:mouse_move, 509, 697, 2, 593, 1336]
+[:mouse_move, 507, 698, 2, 594, 1337]
+[:mouse_move, 502, 698, 2, 595, 1338]
+[:mouse_move, 501, 698, 2, 596, 1339]
+[:mouse_move, 500, 699, 2, 597, 1340]
+[:mouse_move, 499, 699, 2, 598, 1341]
+[:mouse_move, 498, 699, 2, 599, 1342]
+[:mouse_move, 498, 700, 2, 600, 1343]
+[:mouse_move, 498, 701, 2, 601, 1344]
+[:mouse_move, 498, 702, 2, 602, 1345]
+[:mouse_move, 503, 704, 2, 603, 1346]
+[:mouse_move, 506, 705, 2, 604, 1347]
+[:mouse_move, 516, 707, 2, 605, 1348]
+[:mouse_move, 521, 708, 2, 606, 1349]
+[:mouse_move, 533, 709, 2, 607, 1350]
+[:mouse_move, 540, 709, 2, 608, 1351]
+[:mouse_move, 555, 710, 2, 609, 1352]
+[:mouse_move, 567, 710, 2, 610, 1353]
+[:mouse_move, 574, 710, 2, 611, 1354]
+[:mouse_move, 583, 710, 2, 612, 1354]
+[:mouse_move, 588, 710, 2, 613, 1355]
+[:mouse_move, 603, 708, 2, 614, 1356]
+[:mouse_move, 611, 707, 2, 615, 1356]
+[:mouse_move, 621, 703, 2, 616, 1357]
+[:mouse_move, 631, 699, 2, 617, 1358]
+[:mouse_move, 642, 694, 2, 618, 1358]
+[:mouse_move, 653, 686, 2, 619, 1359]
+[:mouse_move, 665, 677, 2, 620, 1360]
+[:mouse_move, 686, 659, 2, 621, 1360]
+[:mouse_move, 700, 643, 2, 622, 1361]
+[:mouse_move, 717, 622, 2, 623, 1362]
+[:mouse_move, 765, 543, 2, 624, 1363]
+[:mouse_move, 785, 502, 2, 625, 1364]
+[:mouse_move, 816, 431, 2, 626, 1365]
+[:mouse_move, 835, 388, 2, 627, 1366]
+[:mouse_move, 869, 313, 2, 628, 1367]
+[:mouse_move, 875, 301, 2, 629, 1368]
+[:mouse_move, 906, 233, 2, 630, 1369]
+[:mouse_move, 916, 209, 2, 631, 1370]
+[:mouse_move, 948, 131, 2, 632, 1371]
+[:mouse_move, 962, 87, 2, 633, 1372]
+[:mouse_move, 973, 47, 2, 634, 1373]
+[:mouse_move, 975, 38, 2, 635, 1374]
+[:mouse_move, 979, 9, 2, 636, 1375]
+[:mouse_move, 978, 9, 2, 637, 1391]
+[:mouse_move, 968, 25, 2, 638, 1392]
+[:mouse_move, 959, 37, 2, 639, 1393]
+[:mouse_move, 942, 67, 2, 640, 1394]
+[:mouse_move, 934, 84, 2, 641, 1395]
+[:mouse_move, 912, 130, 2, 642, 1396]
+[:mouse_move, 902, 157, 2, 643, 1397]
+[:mouse_move, 891, 190, 2, 644, 1398]
+[:key_down_raw, 13, 0, 2, 645, 1443]
+[:key_up_raw, 13, 0, 2, 646, 1448]
+[:mouse_move, 890, 190, 2, 647, 1681]
+[:mouse_move, 889, 190, 2, 648, 1682]
+[:mouse_move, 887, 190, 2, 649, 1682]
+[:mouse_move, 884, 191, 2, 650, 1683]
+[:mouse_move, 877, 193, 2, 651, 1684]
+[:mouse_move, 868, 195, 2, 652, 1684]
+[:mouse_move, 852, 199, 2, 653, 1685]
+[:mouse_move, 837, 203, 2, 654, 1686]
+[:mouse_move, 815, 207, 2, 655, 1686]
+[:mouse_move, 790, 212, 2, 656, 1687]
+[:mouse_move, 763, 218, 2, 657, 1688]
+[:mouse_move, 733, 223, 2, 658, 1688]
+[:mouse_move, 705, 229, 2, 659, 1689]
+[:mouse_move, 692, 232, 2, 660, 1690]
+[:mouse_move, 647, 243, 2, 661, 1691]
+[:mouse_move, 639, 244, 2, 662, 1692]
+[:mouse_move, 611, 252, 2, 663, 1693]
+[:mouse_move, 601, 255, 2, 664, 1694]
+[:mouse_move, 589, 259, 2, 665, 1695]
+[:mouse_move, 584, 261, 2, 666, 1696]
+[:mouse_move, 576, 265, 2, 667, 1697]
+[:mouse_move, 572, 267, 2, 668, 1698]
+[:mouse_move, 567, 271, 2, 669, 1699]
+[:mouse_move, 565, 273, 2, 670, 1700]
+[:mouse_move, 561, 280, 2, 671, 1701]
+[:mouse_move, 559, 285, 2, 672, 1702]
+[:mouse_move, 556, 297, 2, 673, 1703]
+[:mouse_move, 555, 304, 2, 674, 1704]
+[:mouse_move, 552, 327, 2, 675, 1705]
+[:mouse_move, 552, 338, 2, 676, 1706]
+[:mouse_move, 552, 350, 2, 677, 1707]
+[:mouse_move, 552, 366, 2, 678, 1707]
+[:mouse_move, 554, 380, 2, 679, 1708]
+[:mouse_move, 559, 397, 2, 680, 1709]
+[:mouse_move, 566, 411, 2, 681, 1709]
+[:mouse_move, 575, 426, 2, 682, 1710]
+[:mouse_move, 594, 450, 2, 683, 1711]
+[:mouse_move, 611, 462, 2, 684, 1711]
+[:mouse_move, 631, 472, 2, 685, 1712]
+[:mouse_move, 713, 494, 2, 686, 1714]
+[:mouse_move, 745, 495, 2, 687, 1715]
+[:mouse_move, 777, 495, 2, 688, 1716]
+[:mouse_move, 808, 490, 2, 689, 1717]
+[:mouse_move, 818, 484, 2, 690, 1717]
+[:mouse_move, 825, 480, 2, 691, 1718]
+[:mouse_move, 856, 454, 2, 692, 1719]
+[:mouse_move, 860, 443, 2, 693, 1719]
+[:mouse_move, 861, 431, 2, 694, 1720]
+[:mouse_move, 858, 408, 2, 695, 1721]
+[:mouse_move, 813, 347, 2, 696, 1722]
+[:mouse_move, 798, 334, 2, 697, 1723]
+[:mouse_move, 731, 285, 2, 698, 1724]
+[:mouse_move, 696, 269, 2, 699, 1725]
+[:mouse_move, 629, 253, 2, 700, 1726]
+[:mouse_move, 597, 251, 2, 701, 1727]
+[:mouse_move, 540, 256, 2, 702, 1728]
+[:mouse_move, 516, 267, 2, 703, 1729]
+[:mouse_move, 474, 299, 2, 704, 1730]
+[:mouse_move, 468, 309, 2, 705, 1731]
+[:mouse_move, 441, 353, 2, 706, 1732]
+[:mouse_move, 434, 372, 2, 707, 1733]
+[:mouse_move, 430, 391, 2, 708, 1734]
+[:mouse_move, 430, 397, 2, 709, 1734]
+[:mouse_move, 430, 421, 2, 710, 1735]
+[:mouse_move, 434, 438, 2, 711, 1736]
+[:mouse_move, 447, 447, 2, 712, 1736]
+[:mouse_move, 462, 454, 2, 713, 1737]
+[:key_down_raw, 1073742051, 1024, 2, 714, 1812]
+[:key_down_raw, 113, 1024, 2, 715, 1813]
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/banana.png b/samples/99_genre_platformer/gorillas_basic/sprites/banana.png
new file mode 100644
index 0000000..b0f4134
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/banana.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion0.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion0.png
new file mode 100644
index 0000000..e94c644
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion0.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion1.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion1.png
new file mode 100644
index 0000000..b4018d9
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion1.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion2.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion2.png
new file mode 100644
index 0000000..3abaedd
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion2.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion3.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion3.png
new file mode 100644
index 0000000..fe94a5a
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion3.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion4.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion4.png
new file mode 100644
index 0000000..ed04237
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion4.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion5.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion5.png
new file mode 100644
index 0000000..2cd8f06
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion5.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/explosion6.png b/samples/99_genre_platformer/gorillas_basic/sprites/explosion6.png
new file mode 100644
index 0000000..e55909c
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/explosion6.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/hole.png b/samples/99_genre_platformer/gorillas_basic/sprites/hole.png
new file mode 100644
index 0000000..cb4e8b3
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/hole.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/left-0.png b/samples/99_genre_platformer/gorillas_basic/sprites/left-0.png
new file mode 100644
index 0000000..096d19c
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/left-0.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/left-1.png b/samples/99_genre_platformer/gorillas_basic/sprites/left-1.png
new file mode 100644
index 0000000..5944578
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/left-1.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/left-2.png b/samples/99_genre_platformer/gorillas_basic/sprites/left-2.png
new file mode 100644
index 0000000..a64f3d8
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/left-2.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/left-idle.png b/samples/99_genre_platformer/gorillas_basic/sprites/left-idle.png
new file mode 100644
index 0000000..21a71dc
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/left-idle.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/right-0.png b/samples/99_genre_platformer/gorillas_basic/sprites/right-0.png
new file mode 100644
index 0000000..57ffd46
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/right-0.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/right-1.png b/samples/99_genre_platformer/gorillas_basic/sprites/right-1.png
new file mode 100644
index 0000000..a921560
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/right-1.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/right-2.png b/samples/99_genre_platformer/gorillas_basic/sprites/right-2.png
new file mode 100644
index 0000000..fc97c90
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/right-2.png
Binary files differ
diff --git a/samples/99_genre_platformer/gorillas_basic/sprites/right-idle.png b/samples/99_genre_platformer/gorillas_basic/sprites/right-idle.png
new file mode 100644
index 0000000..2838588
--- /dev/null
+++ b/samples/99_genre_platformer/gorillas_basic/sprites/right-idle.png
Binary files differ