summaryrefslogtreecommitdiffhomepage
path: root/samples/99_genre_rpg_tactical
diff options
context:
space:
mode:
authorAmir Rajan <[email protected]>2021-01-18 12:08:34 -0600
committerAmir Rajan <[email protected]>2021-01-18 12:08:34 -0600
commita4b9c048a1d751f5226833bb0c527ba1a8ac5d09 (patch)
tree3f2535e7a6272e796d50e7f07c906d4c9eb1b14a /samples/99_genre_rpg_tactical
parenta24a71805b1924ae7f80776c736f94575c171d2c (diff)
downloaddragonruby-game-toolkit-contrib-a4b9c048a1d751f5226833bb0c527ba1a8ac5d09.tar.gz
dragonruby-game-toolkit-contrib-a4b9c048a1d751f5226833bb0c527ba1a8ac5d09.zip
Synced with 2.3.
Diffstat (limited to 'samples/99_genre_rpg_tactical')
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/app/main.rb529
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/border-black.pngbin0 -> 908 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-black.pngbin0 -> 1882 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-blue.pngbin0 -> 2901 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-gray.pngbin0 -> 3006 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-green.pngbin0 -> 2887 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-indigo.pngbin0 -> 2433 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-orange.pngbin0 -> 2670 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-red.pngbin0 -> 2233 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-violet.pngbin0 -> 2439 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-white.pngbin0 -> 1754 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-yellow.pngbin0 -> 2456 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-0.pngbin0 -> 12896 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-1.pngbin0 -> 2964 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-2.pngbin0 -> 3047 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-3.pngbin0 -> 2655 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-4.pngbin0 -> 2725 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-5.pngbin0 -> 2655 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-0.pngbin0 -> 267 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-1.pngbin0 -> 4585 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-2.pngbin0 -> 4675 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-3.pngbin0 -> 4724 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-4.pngbin0 -> 4773 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-5.pngbin0 -> 4742 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-6.pngbin0 -> 4665 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-sheet.pngbin0 -> 2584 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-black.pngbin0 -> 2602 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-blue.pngbin0 -> 4842 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-gray.pngbin0 -> 5184 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-green.pngbin0 -> 4695 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-indigo.pngbin0 -> 4918 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-orange.pngbin0 -> 4825 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-red.pngbin0 -> 3753 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-violet.pngbin0 -> 5069 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-white.pngbin0 -> 5326 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-yellow.pngbin0 -> 5249 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-black.pngbin0 -> 264 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-blue.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-gray.pngbin0 -> 493 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-green.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-indigo.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-orange.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-red.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-violet.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-white.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-yellow.pngbin0 -> 361 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-0.pngbin0 -> 20775 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-1.pngbin0 -> 3132 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-black.pngbin0 -> 250 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-blue.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-gray.pngbin0 -> 251 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-green.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-indigo.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-orange.pngbin0 -> 282 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-red.pngbin0 -> 274 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-violet.pngbin0 -> 284 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-white.pngbin0 -> 279 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-yellow.pngbin0 -> 286 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/star.pngbin0 -> 711 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-1.pngbin0 -> 656794 bytes
-rw-r--r--samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-2.pngbin0 -> 655810 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/app/main.rb189
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/run.bat6
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/circle-blue.pngbin0 -> 2901 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/circle-gray.pngbin0 -> 3006 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/circle-green.pngbin0 -> 2887 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/circle-orange.pngbin0 -> 2670 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-0.pngbin0 -> 267 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-1.pngbin0 -> 4585 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-2.pngbin0 -> 4675 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-3.pngbin0 -> 4724 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-4.pngbin0 -> 4773 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-5.pngbin0 -> 4742 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-6.pngbin0 -> 4665 bytes
-rw-r--r--samples/99_genre_rpg_tactical/taking_turns/sprites/star.pngbin0 -> 711 bytes
75 files changed, 724 insertions, 0 deletions
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/app/main.rb b/samples/99_genre_rpg_tactical/gameboard_movement/app/main.rb
new file mode 100644
index 0000000..8eb935e
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/app/main.rb
@@ -0,0 +1,529 @@
+# Size of board is always 1280x720
+
+def tick args
+ size = 64
+
+ # Draw a checkerboard as a placeholder game board
+ i = 0
+ j = 0
+ while i < 12 do
+ while j < 21 do
+ args.outputs.solids << [(j*size), (i*size), size, size, 255, 100, 0, ((i+j) % 2 == 0) ? 255 : 0]
+ j += 1
+ end
+ j = 0
+ i += 1
+ end
+ k = 0
+ ary = Array.new(220)
+ while k < 220
+ ary[k] = 1
+ if k > 20 and k < 36
+ ary[k] = 0
+ end
+ if k > 40 and k < 56
+ ary[k] = 0
+ end
+ if k > 60 and k < 76
+ ary[k] = 0
+ end
+ if k > 80 and k < 96
+ ary[k] = 0
+ end
+ if k > 100 and k < 116
+ ary[k] = 0
+ end
+ if k > 120 and k < 136
+ ary[k] = 0
+ end
+ if k == 161 and args.state.bot3.hp >= 1
+ ary[k] = 0
+ end
+ if k == 147 and args.state.bot1.hp >= 1
+ ary[k] = 0
+ end
+ if k == 215 and args.state.bot2.hp >= 1
+ ary[k] = 0
+ end
+ k += 1
+ end
+ ary2 = ary;
+ htarget = 161
+ target = 160
+ targetb = 181
+ targetc = 141
+ targetd = 162
+ target2 = 146
+ target2b = 167
+ target2c = 148
+ htarget2 = 147
+ target3 = 214
+ target3c = 216
+ target3b = 195
+ htarget3 = 215
+ # player attributes
+ args.state.player.x ||= 0
+ args.state.player.y ||= 0
+ args.state.player.w ||= 64
+ args.state.player.h ||= 64
+ args.state.player.direction ||= 1
+ args.state.player.hp ||= 100
+ args.state.player.strength ||= 100
+ args.state.player.pos ||= 0
+
+ # bot1 attributes
+ args.state.bot1.x ||= 448
+ args.state.bot1.y ||= 448
+ args.state.bot1.w ||= 64
+ args.state.bot1.h ||= 64
+ args.state.bot1.direction ||= 1
+ args.state.bot1.hp ||= 100
+ args.state.bot1.strength ||= 5
+
+ # bot2 attributes
+ args.state.bot2.x ||= 960
+ args.state.bot2.y ||= 640
+ args.state.bot2.w ||= 64
+ args.state.bot2.h ||= 64
+ args.state.bot2.direction ||= 1
+ args.state.bot2.hp ||= 100
+ args.state.bot2.strength ||= 8
+
+ # bot3 attributes
+ args.state.bot3.x ||= 64
+ args.state.bot3.y ||= 512
+ args.state.bot3.w ||= 64
+ args.state.bot3.h ||= 64
+ args.state.bot3.direction ||= 1
+ args.state.bot3.hp ||= 100
+ args.state.bot3.strength ||= 8
+
+ # obstacle attributes
+ args.state.obs1.x ||= 64
+ args.state.obs1.y ||= 64
+ args.state.obs1.w ||= 960
+ args.state.obs1.h ||= 384
+ args.state.obs1.direction ||= 1
+
+
+ @menu_shown ||= :hidden
+
+ # display menu
+ if @menu_shown == :hidden
+ args.state.menu_button ||= new_button :menu, 1081, 650, "Menu"
+ args.outputs.primitives << args.state.menu_button[:primitives]
+
+ if button_clicked? args, args.state.menu_button
+ @menu_shown = :visible
+ end
+
+ else
+ args.state.menu_overlay = [1080, 0, 200, 720, 100, 0, 0, 250]
+
+ # first overlay
+ if args.state.menu_overlay
+ args.outputs.solids << args.state.menu_overlay
+
+ # move button
+ args.state.move_button ||= new_button :move, 1081, 650, "Move"
+ args.outputs.primitives << args.state.move_button[:primitives]
+
+ if button_clicked? args, args.state.move_button
+ args.gtk.notify! "Move button was clicked!"
+ end
+
+ # attack button
+ args.state.attack_button ||= new_button :attack, 1081, 600, "Attack"
+ args.outputs.primitives << args.state.attack_button[:primitives]
+
+ if button_clicked? args, args.state.attack_button
+
+ if args.state.player.pos+1 == htarget or args.state.player.pos-1 == htarget or args.state.player.pos+20 == htarget or args.state.player.pos-20 == htarget
+ damage = rand(100)
+ dealt = "#{damage} Damage Dealt!"
+ args.gtk.notify! dealt
+ args.state.bot3.hp -= damage
+
+ end
+ if args.state.player.pos+1 == htarget2 or args.state.player.pos-1 == htarget2 or args.state.player.pos+20 == htarget2 or args.state.player.pos-20 == htarget2
+ damage = rand(100)
+ dealt = "#{damage} Damage Dealt!"
+ args.gtk.notify! dealt
+
+ args.state.bot1.hp -= damage
+
+ end
+ if args.state.player.pos+1 == htarget3 or args.state.player.pos-1 == htarget3 or args.state.player.pos+20 == htarget3 or args.state.player.pos-20 == htarget3
+ damage = rand(100)
+ dealt = "#{damage} Damage Dealt!"
+ args.gtk.notify! dealt
+ args.state.bot2.hp -= damage
+
+ end
+ end
+
+ # items button
+ args.state.items_button ||= new_button :items, 1081, 550, "Items"
+ args.outputs.primitives << args.state.items_button[:primitives]
+
+ if button_clicked? args, args.state.items_button
+ args.state.itemMenu_overlay = [880, 0, 200, 720, 150, 0, 0, 250]
+ args.gtk.notify! "Items button was clicked!"
+ end
+
+ # second overlay
+ if args.state.itemMenu_overlay
+ args.outputs.solids << args.state.itemMenu_overlay
+ args.outputs.labels << [960, 700, "Items"]
+
+ # create items
+ args.state.potion_button ||= new_button :potion, 881, 600, "Potion"
+ args.outputs.primitives << args.state.potion_button[:primitives]
+
+ if button_clicked? args, args.state.potion_button
+ args.gtk.notify! "Potion Used!"
+ end
+
+ args.state.elixer_button ||= new_button :potion, 881, 550, "Elixer"
+ args.outputs.primitives << args.state.elixer_button[:primitives]
+
+ if button_clicked? args, args.state.elixer_button
+ args.gtk.notify! "Elixer Used!"
+ end
+
+ end
+
+ # wait button
+ args.state.wait_button ||= new_button :wait, 1081, 500, "Wait"
+ args.outputs.primitives << args.state.wait_button[:primitives]
+
+ if button_clicked? args, args.state.wait_button
+ args.gtk.notify! "Wait button was clicked!"
+ end
+
+ # close button
+ args.state.close_button ||= new_button :close, 1081, 450, "Close"
+ args.outputs.primitives << args.state.close_button[:primitives]
+
+ # hide menu
+ if button_clicked? args, args.state.close_button
+ @menu_shown = :hidden
+ end
+
+ end
+ end
+
+ # left and right movement
+ if args.inputs.keyboard.key_down.right and ary[args.state.player.pos+1] == 1 and args.state.player.pos%20 < 19
+ args.state.player.direction = 1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.x += size
+ args.state.player.pos += 1
+ elsif args.inputs.keyboard.key_down.left and ary[args.state.player.pos-1] == 1 and args.state.player.pos%20 > 0
+ args.state.player.direction = -1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.x -= size
+ args.state.player.pos -= 1
+ end
+
+
+
+
+ # up and down movement
+ if args.inputs.keyboard.key_down.up and ary[args.state.player.pos+20] == 1 and args.state.player.pos < 200
+ args.state.player.direction = 1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.y += size
+ args.state.player.pos += 20
+ elsif args.inputs.keyboard.key_down.down and ary[args.state.player.pos-20] == 1 and args.state.player.pos >= 20
+ args.state.player.direction = -1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.y -= size
+ args.state.player.pos -= 20
+ end
+
+ pigga = args.state.player.intersect_rect? args.state.obs1
+ if pigga
+ args.gtk.notify! "sprites collide!"
+ args.state.player.y -= size
+ end
+ looping = true
+ cangoup = false
+ cangoright = false
+ cangodown = false
+ cangoleft = false
+ ftarget = 10000
+ hold = 9
+ testtarget = args.state.player.pos
+ if args.state.bot3.hp > 0
+ ftarget = (target-testtarget).abs
+ hold = target
+ end
+ if(ftarget > (targetb-testtarget).abs and args.state.bot3.hp > 0)
+ ftarget = (targetb-testtarget).abs
+ hold = targetb
+ end
+ if(ftarget > (targetc-testtarget).abs and args.state.bot3.hp > 0)
+ ftarget = (targetc-testtarget).abs
+ hold = targetc
+ end
+ if(ftarget > (targetd-testtarget).abs and args.state.bot3.hp > 0)
+ ftarget = (targetd-testtarget).abs
+ hold = targetd
+ end
+ if(ftarget > (target2-testtarget).abs and args.state.bot1.hp > 0)
+ ftarget = (target2-testtarget).abs
+ hold = target2
+ end
+ if(ftarget > (target2b-testtarget).abs and args.state.bot1.hp > 0)
+ ftarget = (target2b-testtarget).abs
+ hold = target2b
+ end
+ if(ftarget > (target2c-testtarget).abs and args.state.bot1.hp > 0)
+ ftarget = (target2c-testtarget).abs
+ hold = target2c
+ end
+ if(ftarget > (target3-testtarget).abs and args.state.bot2.hp > 0)
+ ftarget = (target3-testtarget).abs
+ hold = target3
+ end
+ if(ftarget > (target3b-testtarget).abs and args.state.bot2.hp > 0)
+ ftarget = (target3b-testtarget).abs
+ hold = target3b
+ end
+ if(ftarget > (target3c-testtarget).abs and args.state.bot2.hp > 0)
+ ftarget = (target3c-testtarget).abs
+ hold = target3c
+ end
+ if ftarget == 10000
+ looping = false
+ end
+ if args.inputs.keyboard.key_down.f
+ while looping and target != testtarget and targetb != testtarget and targetc != testtarget and targetd != testtarget and target2 != testtarget and target2b != testtarget and target2c != testtarget and target3 != testtarget and target3b != testtarget and target3c != testtarget
+ cangoup = false
+ cangoright = false
+ cangodown = false
+ cangoleft = false
+
+ if hold-testtarget >= 20 and ary2[args.state.player.pos+20] == 1 and args.state.player.pos < 200
+ cangoup = true
+ elsif testtarget-hold >= 20 and ary2[args.state.player.pos-20] == 1 and args.state.player.pos > 20
+ cangodown = true
+ cangoup = false
+ elsif hold%20-testtarget%20 > 0 and ary2[args.state.player.pos+1] == 1 and args.state.player.pos%20 < 19
+ cangodown = false
+ cangoup = false
+ cangoright = true
+ elsif testtarget%20-hold%20 > 0 and ary2[args.state.player.pos-1] == 1 and args.state.player.pos%20 > 0
+ cangodown = false
+ cangoup = false
+ cangoright = false
+ cangoleft = true
+ end
+ if cangodown == false and cangoup == false and cangoleft == false and cangoright == false
+ if ary2[args.state.player.pos+20] == 1 and args.state.player.pos < 200
+ cangoup = true
+ elsif ary2[args.state.player.pos-20] == 1 and args.state.player.pos > 20
+ cangodown = true
+ cangoup = false
+ elsif ary2[args.state.player.pos+1] == 1 and args.state.player.pos%20 < 19
+ cangodown = false
+ cangoup = false
+ cangoright = true
+ elsif ary2[args.state.player.pos-1] == 1 and args.state.player.pos%20 > 0
+ cangodown = false
+ cangoup = false
+ cangoright = false
+ cangoleft = true
+ end
+ end
+ if cangodown == true
+ args.state.player.direction = -1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.y -= size
+ ary2[args.state.player.pos] = 0
+ args.state.player.pos -= 20
+ testtarget -= 20
+
+ elsif cangoup == true
+ args.state.player.direction = 1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.y += size
+ ary2[args.state.player.pos] = 0
+ args.state.player.pos += 20
+ testtarget+=20
+
+ elsif cangoright == true
+ args.state.player.direction = 1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.x += size
+ ary2[args.state.player.pos] = 0
+ args.state.player.pos += 1
+ testtarget += 1
+
+ elsif cangoleft == true
+ args.state.player.direction = -1
+ args.state.player.started_running_at = args.state.tick_count
+ args.state.player.x -= size
+ ary2[args.state.player.pos] = 0
+ args.state.player.pos -= 1
+ testtarget -= 1
+ end
+
+ end
+ end
+
+
+ #Wrap player around the stage
+ if args.state.player.x > 1280
+ args.state.player.x = -64
+ args.state.player.started_running_at ||= args.state.tick_count
+ elsif args.state.player.x < -64
+ args.state.player.x = 1280
+ args.state.player.started_running_at ||= args.state.tick_count
+ end
+
+ if args.state.player.y > 720
+ args.state.player.y = -64
+ args.state.player.started_running_at ||= args.state.tick_count
+ elsif args.state.player.y < -64
+ args.state.player.y = 720
+ args.state.player.started_running_at ||= args.state.tick_count
+ end
+
+ # Display obstacles
+ args.outputs.sprites << display_obs1(args)
+
+ #Display the flying dragon and bots
+ args.outputs.sprites << display_dragon(args)
+ if args.state.bot1.hp >= 1
+ args.outputs.sprites << display_bot1(args)
+ end
+ if args.state.bot2.hp >= 1
+ args.outputs.sprites << display_bot2(args)
+ end
+ if args.state.bot3.hp >= 1
+ args.outputs.sprites << display_bot3(args)
+ end
+ if args.state.bot1.hp <= 0 and args.state.bot3.hp <= 0 and args.state.bot2.hp <= 0
+ args.gtk.notify! "You Win!"
+ end
+end
+
+# helper method to create a button
+def new_button id, x, y, text
+ # create a hash ("entity") that has some metadata
+ # about what it represents
+ entity =
+ {
+ id: id,
+ rect: { x: x, y: y, w: 200, h: 50 }
+ }
+
+ # for that entity, define the primitives
+ # that form it
+ entity[:primitives] =
+ [
+ { x: x, y: y, w: 200, h: 50 }.border,
+ { x: x + 75, y: y + 30, text: text }.label
+ ]
+
+ entity
+end
+
+# helper method for determining if a button was clicked
+def button_clicked? args, button
+ return false unless args.inputs.mouse.click
+ return args.inputs.mouse.point.inside_rect? button[:rect]
+end
+
+def display_dragon args
+ start_looping_at = 0
+ number_of_sprites = 2
+ number_of_frames_to_show_each_sprite = 8
+ does_sprite_loop = true
+ sprite_index = start_looping_at.frame_index number_of_sprites,
+ number_of_frames_to_show_each_sprite,
+ does_sprite_loop
+ {
+ pos: args.state.player.pos,
+ x: args.state.player.x,
+ y: args.state.player.y,
+ w: args.state.player.w,
+ h: args.state.player.h,
+ path: "sprites/roy-#{sprite_index}.png",
+ flip_horizontally: args.state.player.direction < 0
+ }
+end
+
+def display_bot1 args
+ start_looping_at = 0
+ number_of_sprites = 6
+ number_of_frames_to_show_each_sprite = 4
+ does_sprite_loop = true
+ sprite_index = start_looping_at.frame_index number_of_sprites,
+ number_of_frames_to_show_each_sprite,
+ does_sprite_loop
+ {
+ x: args.state.bot1.x,
+ y: args.state.bot1.y,
+ w: args.state.bot1.w,
+ h: args.state.bot1.h,
+ path: "sprites/dragon-#{sprite_index}.png",
+ flip_horizontally: args.state.bot1.direction < 0
+ }
+end
+
+def display_bot2 args
+ start_looping_at = 0
+ number_of_sprites = 6
+ number_of_frames_to_show_each_sprite = 4
+ does_sprite_loop = true
+ sprite_index = start_looping_at.frame_index number_of_sprites,
+ number_of_frames_to_show_each_sprite,
+ does_sprite_loop
+ {
+ x: args.state.bot2.x,
+ y: args.state.bot2.y,
+ w: args.state.bot2.w,
+ h: args.state.bot2.h,
+ path: "sprites/dragon-#{sprite_index}.png",
+ flip_horizontally: args.state.bot2.direction < 0
+ }
+end
+
+def display_bot3 args
+ start_looping_at = 0
+ number_of_sprites = 6
+ number_of_frames_to_show_each_sprite = 4
+ does_sprite_loop = true
+ sprite_index = start_looping_at.frame_index number_of_sprites,
+ number_of_frames_to_show_each_sprite,
+ does_sprite_loop
+ {
+ x: args.state.bot3.x,
+ y: args.state.bot3.y,
+ w: args.state.bot3.w,
+ h: args.state.bot3.h,
+ path: "sprites/dragon-#{sprite_index}.png",
+ flip_horizontally: args.state.bot3.direction < 0
+ }
+end
+
+def display_obs1 args
+ start_looping_at = 0
+ number_of_sprites = 1
+ number_of_frames_to_show_each_sprite = 8
+ does_sprite_loop = true
+ sprite_index = start_looping_at.frame_index number_of_sprites,
+ number_of_frames_to_show_each_sprite,
+ does_sprite_loop
+ {
+ x: args.state.obs1.x,
+ y: args.state.obs1.y,
+ w: args.state.obs1.w,
+ h: args.state.obs1.h,
+ path: "sprites/water-1.png",
+ flip_horizontally: args.state.obs1.direction < 0
+ }
+end
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/border-black.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/border-black.png
new file mode 100644
index 0000000..c9d0bad
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/border-black.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-black.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-black.png
new file mode 100644
index 0000000..c98e23d
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-black.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-blue.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-blue.png
new file mode 100644
index 0000000..1726d2a
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-blue.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-gray.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-gray.png
new file mode 100644
index 0000000..960f191
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-gray.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-green.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-green.png
new file mode 100644
index 0000000..43cf7ee
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-green.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-indigo.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-indigo.png
new file mode 100644
index 0000000..598e240
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-indigo.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-orange.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-orange.png
new file mode 100644
index 0000000..5604a42
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-orange.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-red.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-red.png
new file mode 100644
index 0000000..7f17ca6
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-red.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-violet.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-violet.png
new file mode 100644
index 0000000..681d210
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-violet.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-white.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-white.png
new file mode 100644
index 0000000..bd32155
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-white.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-yellow.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-yellow.png
new file mode 100644
index 0000000..94992eb
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/circle-yellow.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-0.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-0.png
new file mode 100644
index 0000000..fb179af
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-0.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-1.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-1.png
new file mode 100644
index 0000000..8cfe531
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-1.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-2.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-2.png
new file mode 100644
index 0000000..cb462e1
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-2.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-3.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-3.png
new file mode 100644
index 0000000..04c4977
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-3.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-4.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-4.png
new file mode 100644
index 0000000..b29fa3d
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-4.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-5.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-5.png
new file mode 100644
index 0000000..99f4e74
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/dragon-5.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-0.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-0.png
new file mode 100644
index 0000000..f48636f
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-0.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-1.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-1.png
new file mode 100644
index 0000000..b4018d9
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-1.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-2.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-2.png
new file mode 100644
index 0000000..3abaedd
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-2.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-3.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-3.png
new file mode 100644
index 0000000..fe94a5a
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-3.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-4.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-4.png
new file mode 100644
index 0000000..ed04237
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-4.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-5.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-5.png
new file mode 100644
index 0000000..2cd8f06
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-5.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-6.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-6.png
new file mode 100644
index 0000000..e55909c
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-6.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-sheet.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-sheet.png
new file mode 100644
index 0000000..8559a5c
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/explosion-sheet.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-black.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-black.png
new file mode 100644
index 0000000..f50c872
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-black.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-blue.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-blue.png
new file mode 100644
index 0000000..1696bae
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-blue.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-gray.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-gray.png
new file mode 100644
index 0000000..e8c4c5a
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-gray.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-green.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-green.png
new file mode 100644
index 0000000..a700602
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-green.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-indigo.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-indigo.png
new file mode 100644
index 0000000..15f6f4f
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-indigo.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-orange.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-orange.png
new file mode 100644
index 0000000..1587173
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-orange.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-red.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-red.png
new file mode 100644
index 0000000..d442f39
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-red.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-violet.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-violet.png
new file mode 100644
index 0000000..3be5731
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-violet.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-white.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-white.png
new file mode 100644
index 0000000..c1ad970
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-white.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-yellow.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-yellow.png
new file mode 100644
index 0000000..63f5f34
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/hexagon-yellow.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-black.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-black.png
new file mode 100644
index 0000000..fa9e463
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-black.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-blue.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-blue.png
new file mode 100644
index 0000000..a3d8524
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-blue.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-gray.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-gray.png
new file mode 100644
index 0000000..85dcc1d
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-gray.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-green.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-green.png
new file mode 100644
index 0000000..ec2773e
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-green.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-indigo.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-indigo.png
new file mode 100644
index 0000000..e6be50c
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-indigo.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-orange.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-orange.png
new file mode 100644
index 0000000..154d81c
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-orange.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-red.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-red.png
new file mode 100644
index 0000000..3448c4d
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-red.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-violet.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-violet.png
new file mode 100644
index 0000000..f09bf21
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-violet.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-white.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-white.png
new file mode 100644
index 0000000..a45793d
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-white.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-yellow.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-yellow.png
new file mode 100644
index 0000000..9be20c7
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/isometric-yellow.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-0.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-0.png
new file mode 100644
index 0000000..dd122e1
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-0.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-1.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-1.png
new file mode 100644
index 0000000..d3ac548
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/roy-1.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-black.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-black.png
new file mode 100644
index 0000000..cea7bd7
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-black.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-blue.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-blue.png
new file mode 100644
index 0000000..b840849
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-blue.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-gray.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-gray.png
new file mode 100644
index 0000000..2142b30
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-gray.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-green.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-green.png
new file mode 100644
index 0000000..5ef7f75
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-green.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-indigo.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-indigo.png
new file mode 100644
index 0000000..2384108
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-indigo.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-orange.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-orange.png
new file mode 100644
index 0000000..bb1eee7
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-orange.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-red.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-red.png
new file mode 100644
index 0000000..3ed5f13
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-red.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-violet.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-violet.png
new file mode 100644
index 0000000..333540c
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-violet.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-white.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-white.png
new file mode 100644
index 0000000..378c565
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-white.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-yellow.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-yellow.png
new file mode 100644
index 0000000..0edeeec
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/square-yellow.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/star.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/star.png
new file mode 100644
index 0000000..e0ee0f9
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/star.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-1.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-1.png
new file mode 100644
index 0000000..527385a
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-1.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-2.png b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-2.png
new file mode 100644
index 0000000..7f73b1b
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/gameboard_movement/sprites/water-2.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/app/main.rb b/samples/99_genre_rpg_tactical/taking_turns/app/main.rb
new file mode 100644
index 0000000..aac6de7
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/app/main.rb
@@ -0,0 +1,189 @@
+def tick args
+ args.state.base_columns ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }
+ args.state.base_rows ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }
+ args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }
+ args.state.offset_rows = 5.map { 0 }
+ args.state.columns = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }
+ args.state.rows = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }
+ args.state.explosions ||= []
+ args.state.enemies ||= []
+ args.state.score ||= 0
+ args.state.wave ||= 0
+ if args.state.enemies.empty?
+ args.state.wave += 1
+ args.state.wave_root = Math.sqrt(args.state.wave)
+ args.state.enemies = make_enemies
+ end
+ args.state.player ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}
+ args.state.enemy_bullets ||= []
+ args.state.player_bullets ||= []
+ args.state.lives ||= 3
+ args.state.missed_shots ||= 0
+ args.state.fired_shots ||= 0
+
+ update_explosions args
+ update_enemy_positions args
+
+ if args.inputs.left && args.state.player[:x] > (300 + 5)
+ args.state.player[:x] -= 5
+ end
+ if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)
+ args.state.player[:x] += 5
+ end
+
+ args.state.enemy_bullets.each do |bullet|
+ bullet[:x] += bullet[:dx]
+ bullet[:y] += bullet[:dy]
+ end
+ args.state.player_bullets.each do |bullet|
+ bullet[:x] += bullet[:dx]
+ bullet[:y] += bullet[:dy]
+ end
+
+ args.state.enemy_bullets = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }
+ args.state.player_bullets = args.state.player_bullets.find_all do |bullet|
+ if bullet[:y].between?(-16, 736)
+ true
+ else
+ args.state.missed_shots += 1
+ false
+ end
+ end
+
+ args.state.enemies = args.state.enemies.reject do |enemy|
+ if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2
+ args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+ args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+ args.state.player[:alive] = false
+ true
+ else
+ false
+ end
+ end
+ args.state.enemy_bullets.each do |bullet|
+ if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2
+ args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+ args.state.player[:alive] = false
+ bullet[:despawn] = true
+ end
+ end
+ args.state.enemies = args.state.enemies.reject do |enemy|
+ args.state.player_bullets.any? do |bullet|
+ if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2
+ args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+ bullet[:despawn] = true
+ args.state.score += 1000 * args.state.wave
+ true
+ else
+ false
+ end
+ end
+ end
+
+ args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }
+ args.state.enemy_bullets = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }
+
+ args.state.player[:cooldown] -= 1
+ if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]
+ args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite
+ args.state.fired_shots += 1
+ args.state.player[:cooldown] = 10 + 20 / args.state.wave
+ end
+ args.state.enemies.each do |enemy|
+ if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal
+ args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite
+ end
+ end
+
+ args.outputs.background_color = [0, 0, 0]
+ args.outputs.primitives << args.state.enemies.map do |enemy|
+ [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite
+ end
+ args.outputs.primitives << args.state.player if args.state.player[:alive]
+ args.outputs.primitives << args.state.explosions
+ args.outputs.primitives << args.state.player_bullets
+ args.outputs.primitives << args.state.enemy_bullets
+ accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots
+ args.outputs.primitives << [
+ [0, 0, 300, 720, 96, 0, 0].solid,
+ [1280 - 300, 0, 300, 720, 96, 0, 0].solid,
+ [1280 - 290, 60, "Wave #{args.state.wave}", 255, 255, 255].label,
+ [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,
+ [1280 - 290, 20, "Score #{(args.state.score * accuracy).floor}", 255, 255, 255].label,
+ ]
+ args.outputs.primitives << args.state.lives.times.map do |n|
+ [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite
+ end
+ #args.outputs.debug << args.gtk.framerate_diagnostics_primitives
+
+ if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }
+ args.state.player[:alive] = true
+ args.state.player[:x] = 624
+ args.state.player[:y] = 80
+ args.state.lives -= 1
+ if args.state.lives == -1
+ args.state.clear!
+ end
+ end
+end
+
+def make_enemies
+ enemies = []
+ enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }
+ enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }
+ enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }
+ enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }
+ enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }
+ enemies
+end
+
+def update_explosions args
+ args.state.explosions.each do |explosion|
+ explosion[:age] += 0.5
+ explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"
+ end
+ args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }
+end
+
+def update_enemy_positions args
+ args.state.enemies.each do |enemy|
+ if enemy[:move_state] == :normal
+ enemy[:x] = args.state.columns[enemy[:col]]
+ enemy[:y] = args.state.rows[enemy[:row]]
+ enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]
+ elsif enemy[:move_state] == :dive
+ enemy[:target_x] ||= args.state.player[:x]
+ enemy[:target_y] ||= args.state.player[:y]
+ dx = enemy[:target_x] - enemy[:x]
+ dy = enemy[:target_y] - enemy[:y]
+ vel = Math.sqrt(dx * dx + dy * dy)
+ speed_limit = 2 + args.state.wave_root
+ if vel > speed_limit
+ dx /= vel / speed_limit
+ dy /= vel / speed_limit
+ end
+ if vel < 1 || !args.state.player[:alive]
+ enemy[:move_state] = :retreat
+ end
+ enemy[:x] += dx
+ enemy[:y] += dy
+ elsif enemy[:move_state] == :retreat
+ enemy[:target_x] = args.state.columns[enemy[:col]]
+ enemy[:target_y] = args.state.rows[enemy[:row]]
+ dx = enemy[:target_x] - enemy[:x]
+ dy = enemy[:target_y] - enemy[:y]
+ vel = Math.sqrt(dx * dx + dy * dy)
+ speed_limit = 2 + args.state.wave_root
+ if vel > speed_limit
+ dx /= vel / speed_limit
+ dy /= vel / speed_limit
+ elsif vel < 1
+ enemy[:move_state] = :normal
+ enemy[:target_x] = nil
+ enemy[:target_y] = nil
+ end
+ enemy[:x] += dx
+ enemy[:y] += dy
+ end
+ end
+end
diff --git a/samples/99_genre_rpg_tactical/taking_turns/run.bat b/samples/99_genre_rpg_tactical/taking_turns/run.bat
new file mode 100644
index 0000000..36335e3
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/run.bat
@@ -0,0 +1,6 @@
+cd /d %~dp0
+
+cd ..
+cd ..
+cd ..
+dragonruby samples/99_genre_arcade/dragalaga
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-blue.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-blue.png
new file mode 100644
index 0000000..1726d2a
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-blue.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-gray.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-gray.png
new file mode 100644
index 0000000..960f191
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-gray.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-green.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-green.png
new file mode 100644
index 0000000..43cf7ee
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-green.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-orange.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-orange.png
new file mode 100644
index 0000000..5604a42
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/circle-orange.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-0.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-0.png
new file mode 100644
index 0000000..f48636f
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-0.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-1.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-1.png
new file mode 100644
index 0000000..b4018d9
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-1.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-2.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-2.png
new file mode 100644
index 0000000..3abaedd
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-2.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-3.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-3.png
new file mode 100644
index 0000000..fe94a5a
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-3.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-4.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-4.png
new file mode 100644
index 0000000..ed04237
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-4.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-5.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-5.png
new file mode 100644
index 0000000..2cd8f06
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-5.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-6.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-6.png
new file mode 100644
index 0000000..e55909c
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/explosion-6.png
Binary files differ
diff --git a/samples/99_genre_rpg_tactical/taking_turns/sprites/star.png b/samples/99_genre_rpg_tactical/taking_turns/sprites/star.png
new file mode 100644
index 0000000..e0ee0f9
--- /dev/null
+++ b/samples/99_genre_rpg_tactical/taking_turns/sprites/star.png
Binary files differ