From 154a959e8a1e015b2287862c159e34e087c190fd Mon Sep 17 00:00:00 2001 From: Cameron Smart Date: Sun, 19 Apr 2020 19:14:04 -0700 Subject: [PATCH] basic player idle animation. --- triple-dungeon/config.py | 1 + triple-dungeon/main.py | 235 ++++++++++++++++-- triple-dungeon/map.py | 1 - triple-dungeon/mobs.py | 37 +-- .../knight/knight iso char_idle_0.png | Bin 0 -> 597 bytes .../knight/knight iso char_idle_1.png | Bin 0 -> 597 bytes .../knight/knight iso char_idle_2.png | Bin 0 -> 621 bytes .../knight/knight iso char_idle_3.png | Bin 0 -> 621 bytes .../knight/knight iso char_run down_0.png | Bin 0 -> 547 bytes .../knight/knight iso char_run down_1.png | Bin 0 -> 566 bytes .../knight/knight iso char_run down_2.png | Bin 0 -> 545 bytes .../knight/knight iso char_run down_3.png | Bin 0 -> 570 bytes .../knight/knight iso char_run down_4.png | Bin 0 -> 583 bytes .../knight/knight iso char_run left_0.png | Bin 0 -> 438 bytes .../knight/knight iso char_run left_1.png | Bin 0 -> 498 bytes .../knight/knight iso char_run left_2.png | Bin 0 -> 508 bytes .../knight/knight iso char_run left_3.png | Bin 0 -> 444 bytes .../knight/knight iso char_run left_4.png | Bin 0 -> 476 bytes .../knight/knight iso char_run left_5.png | Bin 0 -> 488 bytes .../knight/knight iso char_run right_0.png | Bin 0 -> 441 bytes .../knight/knight iso char_run right_1.png | Bin 0 -> 499 bytes .../knight/knight iso char_run right_2.png | Bin 0 -> 509 bytes .../knight/knight iso char_run right_3.png | Bin 0 -> 451 bytes .../knight/knight iso char_run right_4.png | Bin 0 -> 480 bytes .../knight/knight iso char_run right_5.png | Bin 0 -> 498 bytes .../knight/knight iso char_run up_0.png | Bin 0 -> 409 bytes .../knight/knight iso char_run up_1.png | Bin 0 -> 429 bytes .../knight/knight iso char_run up_2.png | Bin 0 -> 435 bytes .../knight/knight iso char_run up_3.png | Bin 0 -> 449 bytes .../knight/knight iso char_run up_4.png | Bin 0 -> 498 bytes .../knight/knight iso char_slice down_0.png | Bin 0 -> 547 bytes .../knight/knight iso char_slice down_1.png | Bin 0 -> 552 bytes .../knight/knight iso char_slice down_2.png | Bin 0 -> 767 bytes .../knight/knight iso char_slice left_0.png | Bin 0 -> 441 bytes .../knight/knight iso char_slice left_1.png | Bin 0 -> 569 bytes .../knight/knight iso char_slice left_2.png | Bin 0 -> 481 bytes .../knight/knight iso char_slice right_0.png | Bin 0 -> 438 bytes .../knight/knight iso char_slice right_1.png | Bin 0 -> 563 bytes .../knight/knight iso char_slice right_2.png | Bin 0 -> 486 bytes .../knight/knight iso char_slice up_0.png | Bin 0 -> 383 bytes .../knight/knight iso char_slice up_1.png | Bin 0 -> 396 bytes .../knight/knight iso char_slice up_2.png | Bin 0 -> 633 bytes 42 files changed, 234 insertions(+), 40 deletions(-) create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_idle_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_idle_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_idle_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_idle_3.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run down_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run down_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run down_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run down_3.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run down_4.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run left_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run left_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run left_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run left_3.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run left_4.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run left_5.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run right_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run right_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run right_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run right_3.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run right_4.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run right_5.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run up_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run up_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run up_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run up_3.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_run up_4.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice down_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice down_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice down_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice left_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice left_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice left_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice right_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice right_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice right_2.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice up_0.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice up_1.png create mode 100644 triple-dungeon/resources/images/character/knight/knight iso char_slice up_2.png diff --git a/triple-dungeon/config.py b/triple-dungeon/config.py index 313b102..8f933e9 100644 --- a/triple-dungeon/config.py +++ b/triple-dungeon/config.py @@ -15,6 +15,7 @@ class Config(object): SCREEN_HEIGHT = 1000 SCREEN_TITLE = "Triple Dungeon" TILE_WIDTH = 63 + UPDATES_PER_FRAME = 20 # Constants used to scale our sprites from their original size CHARACTER_SCALING = 1 diff --git a/triple-dungeon/main.py b/triple-dungeon/main.py index ff0841c..8b3b8f6 100644 --- a/triple-dungeon/main.py +++ b/triple-dungeon/main.py @@ -29,7 +29,51 @@ class Game(arcade.Window): self.player_list = None # Separate variable that holds the player sprite - self.player_sprite = None + self.player = None + + # Our physics engine + self.physics_engine = None + + # list to keep track of keypresses + self.prev_keypress = [] + + # Used to keep track of our scrolling + self.view_bottom = 0 + self.view_left = 0 + + arcade.set_background_color(arcade.csscolor.BLACK) +""" +main.py +The main class used to load the game. +Holds the main game window, as well as manages basic functions for organizing the game. +""" + +import arcade + +from config import Config +from map import Dungeon +from mobs import Player +from mobs import Enemy + + +class Game(arcade.Window): + """ + Main application class. + """ + + def __init__(self): + # Call the parent class and set up the window + super().__init__(Config.SCREEN_WIDTH, Config.SCREEN_HEIGHT, Config.SCREEN_TITLE) + + # These are 'lists' that keep track of our sprites. Each sprite should + # go into a list. + self.wall_list = None + self.floor_list = None + self.enemy_list = None + self.player_list = None + + # Separate variable that holds the player sprite + self.player = None # Our physics engine self.physics_engine = None @@ -47,12 +91,18 @@ class Game(arcade.Window): """ Set up the game here. Call this function to restart the game. """ # Create the Sprite lists + self.player_list = arcade.SpriteList() self.wall_list = arcade.SpriteList() self.floor_list = arcade.SpriteList() self.enemy_list = arcade.SpriteList() - # Set up the player, specifically placing it at these coordinates. - Player.setup(self) + # Set up the player, specifically placing it at these coordinates. + self.player = Player() + self.player.scale = 1 + self.player.center_x = Config.SCREEN_WIDTH / 2 + self.player.center_y = Config.SCREEN_HEIGHT / 2 + self.player_list = self.player + # Create the dungeon dungeon = Dungeon() @@ -60,11 +110,11 @@ class Game(arcade.Window): # Create monsters - self.enemy_list.append(Enemy("resources/images/monsters/ghost/ghost1.png", 200, 200).get_enemy()) - self.enemy_list.append(Enemy("resources/images/monsters/frog/frog1.png", 200, 1000).get_enemy()) + #self.enemy_list.append(Enemy("resources/images/monsters/ghost/ghost1.png", 200, 200, 4).get_enemy()) + #self.enemy_list.append(Enemy("resources/images/monsters/frog/frog1.png", 200, 1000, 4).get_enemy()) # Create the 'physics engine' - self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list) + self.physics_engine = arcade.PhysicsEngineSimple(self.player, self.wall_list) def on_draw(self): """ Render the screen. """ @@ -74,7 +124,7 @@ class Game(arcade.Window): # Draw our sprites self.floor_list.draw() - self.player_sprite.draw() + self.player_list.draw() self.enemy_list.draw() self.wall_list.draw() @@ -82,34 +132,35 @@ class Game(arcade.Window): """Called whenever a key is pressed. """ if key == arcade.key.UP or key == arcade.key.W: - self.player_sprite.change_y = Config.PLAYER_MOVEMENT_SPEED + self.player_list.change_y = Config.PLAYER_MOVEMENT_SPEED self.prev_keypress.append(key) elif key == arcade.key.DOWN or key == arcade.key.S: - self.player_sprite.change_y = -Config.PLAYER_MOVEMENT_SPEED + self.player_list.change_y = -Config.PLAYER_MOVEMENT_SPEED self.prev_keypress.append(key) elif key == arcade.key.LEFT or key == arcade.key.A: - self.player_sprite.change_x = -Config.PLAYER_MOVEMENT_SPEED + self.player_list.change_x = -Config.PLAYER_MOVEMENT_SPEED self.prev_keypress.append(key) elif key == arcade.key.RIGHT or key == arcade.key.D: - self.player_sprite.change_x = Config.PLAYER_MOVEMENT_SPEED + self.player_list.change_x = Config.PLAYER_MOVEMENT_SPEED self.prev_keypress.append(key) + elif key == 65307: + self.close() def on_key_release(self, key, modifiers): """Called when the user releases a key. """ if key == arcade.key.UP or key == arcade.key.W: - self.player_sprite.change_y = 0 + self.player_list.change_y = 0 self.prev_keypress.remove(key) elif key == arcade.key.DOWN or key == arcade.key.S: - self.player_sprite.change_y = 0 + self.player_list.change_y = 0 self.prev_keypress.remove(key) elif key == arcade.key.LEFT or key == arcade.key.A: - self.player_sprite.change_x = 0 + self.player_list.change_x = 0 self.prev_keypress.remove(key) elif key == arcade.key.RIGHT or key == arcade.key.D: - self.player_sprite.change_x = 0 + self.player_list.change_x = 0 self.prev_keypress.remove(key) - if self.prev_keypress: self.on_key_press(self.prev_keypress.pop(0), 0) @@ -118,28 +169,164 @@ class Game(arcade.Window): # Move the player with the physics engine self.physics_engine.update() + + self.player_list.update_animation() changed = False # Track if we need to change the viewport # Below manages all scrolling mechanics # Scroll left left_boundary = self.view_left + Config.LEFT_VIEWPORT_MARGIN - if self.player_sprite.left < left_boundary: - self.view_left -= left_boundary - self.player_sprite.left + if self.player_list.left < left_boundary: + self.view_left -= left_boundary - self.player_list.left changed = True # Scroll right right_boundary = self.view_left + Config.SCREEN_WIDTH - Config.RIGHT_VIEWPORT_MARGIN - if self.player_sprite.right > right_boundary: - self.view_left += self.player_sprite.right - right_boundary + if self.player_list.right > right_boundary: + self.view_left += self.player_list.right - right_boundary changed = True # Scroll up top_boundary = self.view_bottom + Config.SCREEN_HEIGHT - Config.TOP_VIEWPORT_MARGIN - if self.player_sprite.top > top_boundary: - self.view_bottom += self.player_sprite.top - top_boundary + if self.player_list.top > top_boundary: + self.view_bottom += self.player_list.top - top_boundary changed = True # Scroll down bottom_boundary = self.view_bottom + Config.BOTTOM_VIEWPORT_MARGIN - if self.player_sprite.bottom < bottom_boundary: - self.view_bottom -= bottom_boundary - self.player_sprite.bottom + if self.player_list.bottom < bottom_boundary: + self.view_bottom -= bottom_boundary - self.player_list.bottom + changed = True + + if changed: + # Only scroll to integers. Otherwise we end up with pixels that + # don't line up on the screen + self.view_bottom = int(self.view_bottom) + self.view_left = int(self.view_left) + + # Do the scrolling + arcade.set_viewport(self.view_left, + Config.SCREEN_WIDTH + self.view_left, + self.view_bottom, + Config.SCREEN_HEIGHT + self.view_bottom) + + +def main() -> None: + """ + Setups up window classes and runs the game. + """ + + window = Game() + window.setup() + arcade.run() + + +if __name__ == "__main__": + main() + + def setup(self): + """ Set up the game here. Call this function to restart the game. """ + # Create the Sprite lists + + self.player_list = arcade.SpriteList() + self.wall_list = arcade.SpriteList() + self.floor_list = arcade.SpriteList() + self.enemy_list = arcade.SpriteList() + + # Set up the player, specifically placing it at these coordinates. + self.player = Player() + self.player.scale = 4 + self.player.center_x = Config.SCREEN_WIDTH / 2 + self.player.center_y = Config.SCREEN_HEIGHT / 2 + self.player_list.append(self.player) + + + # Create the dungeon + dungeon = Dungeon() + self.floor_list, self.wall_list = dungeon.get_lists() + + + # Create monsters + self.enemy_list.append(Enemy("resources/images/monsters/ghost/ghost1.png", 200, 200, 4).get_enemy()) + self.enemy_list.append(Enemy("resources/images/monsters/frog/frog1.png", 200, 1000, 4).get_enemy()) + + # Create the 'physics engine' + self.physics_engine = arcade.PhysicsEngineSimple(self.player_list, self.wall_list) + + def on_draw(self): + """ Render the screen. """ + + # Clear the screen to the background color + arcade.start_render() + + # Draw our sprites + self.floor_list.draw() + self.player_list.draw() + self.enemy_list.draw() + self.wall_list.draw() + + def on_key_press(self, key, modifiers): + """Called whenever a key is pressed. """ + + if key == arcade.key.UP or key == arcade.key.W: + self.player_list.change_y = Config.PLAYER_MOVEMENT_SPEED + self.prev_keypress.append(key) + elif key == arcade.key.DOWN or key == arcade.key.S: + self.player_list.change_y = -Config.PLAYER_MOVEMENT_SPEED + self.prev_keypress.append(key) + elif key == arcade.key.LEFT or key == arcade.key.A: + self.player_list.change_x = -Config.PLAYER_MOVEMENT_SPEED + self.prev_keypress.append(key) + elif key == arcade.key.RIGHT or key == arcade.key.D: + self.player_list.change_x = Config.PLAYER_MOVEMENT_SPEED + self.prev_keypress.append(key) + elif key == 65307: + self.close() + + def on_key_release(self, key, modifiers): + """Called when the user releases a key. """ + + if key == arcade.key.UP or key == arcade.key.W: + self.player_list.change_y = 0 + self.prev_keypress.remove(key) + elif key == arcade.key.DOWN or key == arcade.key.S: + self.player_list.change_y = 0 + self.prev_keypress.remove(key) + elif key == arcade.key.LEFT or key == arcade.key.A: + self.player_list.change_x = 0 + self.prev_keypress.remove(key) + elif key == arcade.key.RIGHT or key == arcade.key.D: + self.player_list.change_x = 0 + self.prev_keypress.remove(key) + if self.prev_keypress: + self.on_key_press(self.prev_keypress.pop(0), 0) + + def on_update(self, delta_time): + """ Movement and game logic """ + + # Move the player with the physics engine + self.physics_engine.update() + + self.player_list.update_animation() + changed = False # Track if we need to change the viewport + + # Below manages all scrolling mechanics + # Scroll left + left_boundary = self.view_left + Config.LEFT_VIEWPORT_MARGIN + if self.player_list.left < left_boundary: + self.view_left -= left_boundary - self.player_list.left + changed = True + # Scroll right + right_boundary = self.view_left + Config.SCREEN_WIDTH - Config.RIGHT_VIEWPORT_MARGIN + if self.player_list.right > right_boundary: + self.view_left += self.player_list.right - right_boundary + changed = True + # Scroll up + top_boundary = self.view_bottom + Config.SCREEN_HEIGHT - Config.TOP_VIEWPORT_MARGIN + if self.player_list.top > top_boundary: + self.view_bottom += self.player_list.top - top_boundary + changed = True + # Scroll down + bottom_boundary = self.view_bottom + Config.BOTTOM_VIEWPORT_MARGIN + if self.player_list.bottom < bottom_boundary: + self.view_bottom -= bottom_boundary - self.player_list.bottom changed = True if changed: diff --git a/triple-dungeon/map.py b/triple-dungeon/map.py index c61304a..dbbdae3 100644 --- a/triple-dungeon/map.py +++ b/triple-dungeon/map.py @@ -154,7 +154,6 @@ class Level: def rotate_level(self, times_rotated): m = np.array(self.level) - print(m) for i in range(0, times_rotated): m = np.rot90(m) self.level = m.tolist() \ No newline at end of file diff --git a/triple-dungeon/mobs.py b/triple-dungeon/mobs.py index d6656ab..57037fb 100644 --- a/triple-dungeon/mobs.py +++ b/triple-dungeon/mobs.py @@ -7,19 +7,18 @@ import arcade from config import Config - -class Mob(object): +class Mob(arcade.Sprite): """ Represents a Mob. No defined behaviour, it has no intelligence. """ - def __init__(self, sprite, x, y, max_health=100, max_armor=0) -> None: - self.sprite_path = sprite - self.sprite = arcade.Sprite(self.sprite_path, Config.CHARACTER_SCALING) + def __init__(self, max_health=100, max_armor=0, *args, **kwargs) -> None: + # Set up parent class + super().__init__() + self.max_health, self.max_armor = max_health, max_armor self.health, self.armor = max_health, max_armor - self.sprite.scale = 4 - self.sprite.center_x = x - self.sprite.center_y = y + self.idle_textures = [] + self.cur_texture = 0 def tick(self) -> None: """ @@ -36,12 +35,20 @@ class Player(Mob): def __init__(self, *args, **kwargs) -> None: super(Player, self).__init__(*args, **kwargs) - def setup(self): - image_source = "resources/images/monsters/skeleton.png" - self.player_sprite = arcade.Sprite(image_source, Config.CHARACTER_SCALING) - self.player_sprite.center_x = Config.SCREEN_WIDTH / 2 - self.player_sprite.center_y = Config.SCREEN_HEIGHT / 2 - self.player_sprite.scale = 4 + main_path = "resources/images/character/knight/" + + # Load textures for idle standing + for i in range(4): + texture = arcade.load_texture(f"{main_path}knight iso char_idle_{i}.png") + self.idle_textures.append(texture) + + def update_animation(self, delta_time: float = 1/60): + # idle animation + self.cur_texture += 1 + if self.cur_texture > 3 * Config.UPDATES_PER_FRAME: + self.cur_texture = 0 + self.texture = self.idle_textures[self.cur_texture // Config.UPDATES_PER_FRAME] + print('test') def tick(self): """ @@ -60,7 +67,7 @@ class Enemy(Mob): super(Enemy, self).__init__(*args, **kwargs) def get_enemy(self): - return self.sprite + return self def tick(self) -> None: """ diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_idle_0.png b/triple-dungeon/resources/images/character/knight/knight iso char_idle_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fa72f3e2853d5faae1f77611465fb1874d4822fa GIT binary patch literal 597 zcmV-b0;>IqP)?_dX5yJ?Sg*)7&2x} z0oo$y&EZmrw?+!kX6voj&x>?tW<%budm)0yUO$q6riFZ1 z-3S>0H4<`6KcIjnfV8ntRr>)2v|dQitO^=~ z1r*R~pdQTYQx>wnz7nE7Z>|0qETDi+HuCyfP7oHV>{{pbzN!5T1vD{eRY*JXfC8Ep zRLO@2A%gSP_8g#qHUk=iw3iW}fVMO8u>cBaT2K#0Bkhg4@_DfpVt)~U0$T6L5AQES z>}6vC?Q?} zsD-V1DFF&7pnw9}iC#8bN`STtdbQgN5tMyy;nfc)pv{6R9;odD6wqctJs^8I0Sail zBX41}X5;~F=L=^G9U#hIRz-7fC36A jpnw7jD4>8+)IYB;nx#~Vl}4=700000NkvXXu0mjfEu#Ra literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_idle_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_idle_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa72f3e2853d5faae1f77611465fb1874d4822fa GIT binary patch literal 597 zcmV-b0;>IqP)?_dX5yJ?Sg*)7&2x} z0oo$y&EZmrw?+!kX6voj&x>?tW<%budm)0yUO$q6riFZ1 z-3S>0H4<`6KcIjnfV8ntRr>)2v|dQitO^=~ z1r*R~pdQTYQx>wnz7nE7Z>|0qETDi+HuCyfP7oHV>{{pbzN!5T1vD{eRY*JXfC8Ep zRLO@2A%gSP_8g#qHUk=iw3iW}fVMO8u>cBaT2K#0Bkhg4@_DfpVt)~U0$T6L5AQES z>}6vC?Q?} zsD-V1DFF&7pnw9}iC#8bN`STtdbQgN5tMyy;nfc)pv{6R9;odD6wqctJs^8I0Sail zBX41}X5;~F=L=^G9U#hIRz-7fC36A jpnw7jD4>8+)IYB;nx#~Vl}4=700000NkvXXu0mjfEu#Ra literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_idle_2.png b/triple-dungeon/resources/images/character/knight/knight iso char_idle_2.png new file mode 100644 index 0000000000000000000000000000000000000000..39195f5b6519b13615eed90fd6df5ae318c5508d GIT binary patch literal 621 zcmV-z0+RiSP)90>DA?TZ2GhwNkH?!?sQK3B1n53NI)l3i%aWe6$_|n9w|U43;Oe?%YZQj zXvTVPcgiXPyFFTV@r~7w9H4n1Us_u(t(jSukDIoOAT`#!`hf*B59H(8ri-pySUr?9 zuYOy|As1LHnIzRzU0BK{_*)$dw(9Do}2-(*n8(&{zU;!O-)rGWBzHwbxKmq-` z>Ou|+8iEBB(7~WSkhkZ;GX+Z13`ql#qXj)Lgg#sv`X+T3D_66P^b$jH$ zF1KCmKLk)fM?3PphbtG~L&gI7`UI-|8hZ}~bWEW7;2}^88=ANK0t)D8u={iKF0n^D z_Ew;M0R?n4*i@iX4+v;xPzxLTP||g+2NY010R`0m8svK@0Sf43K<#{}4^TkUf?n^n zU1CAi4=A8{K`oT+_w@k^XdX}>jK-P=6wth1INPJ_TNgU=MN90>DA?TZ2GhwNkH?!?sQK3B1n53NI)l3i%aWe6$_|n9w|U43;Oe?%YZQj zXvTVPcgiXPyFFTV@r~7w9H4n1Us_u(t(jSukDIoOAT`#!`hf*B59H(8ri-pySUr?9 zuYOy|As1LHnIzRzU0BK{_*)$dw(9Do}2-(*n8(&{zU;!O-)rGWBzHwbxKmq-` z>Ou|+8iEBB(7~WSkhkZ;GX+Z13`ql#qXj)Lgg#sv`X+T3D_66P^b$jH$ zF1KCmKLk)fM?3PphbtG~L&gI7`UI-|8hZ}~bWEW7;2}^88=ANK0t)D8u={iKF0n^D z_Ew;M0R?n4*i@iX4+v;xPzxLTP||g+2NY010R`0m8svK@0Sf43K<#{}4^TkUf?n^n zU1CAi4=A8{K`oT+_w@k^XdX}>jK-P=6wth1INPJ_TNgU=MN)5JCtcgb+dqA>`lX_2#r0wX6An0@@Dp_GBeAcb(<~ z3uw1F+g@l!70_qz9>1>5(|RNUoeb>O@Hq7F=sHx88tXiefKDd@b67u)6rkPYxgIv( zb#ZAe)B#nUM-tF(ARh)BWA)<#OI7Ot1++|3km_J&HuUOXIaGie>%3nFP(a&7ASqaZ zy#L!;kba{81vD=L zbI^;OIy45UbsGB((0pA-)eQs`(7fp7qQ+pGxBamS(#L|-XOv$LP(aIq3MK`qaSRer zK+9~B#6TS`))c5-T7UxD4%9bA1R8tf)flL6ssIXTJJ1-EANTX>`}t<5gQ|c6+731a zmV#7$y?57|$4^TkMCiQZPf%<0`uz+?8n)_1H@!0ix4-07FXoI;FsKe^> z3Q$1HfTn;nzaoH66f^~uI}cDmdE^1@V^W|z@__zsP#$?e{{|>hfC36A`S~9JBme~z lPy#5RfD%9f1(cAU<^$9V$3EsG#XtZ6002ovPDHLkV1mu(?LPnj literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run down_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_run down_1.png new file mode 100644 index 0000000000000000000000000000000000000000..127857ebd2a57eed1451edaf070f023c777b7b7e GIT binary patch literal 566 zcmV-60?GY}P)>ab7uMXJDF&bz5vud$Ag`Z@+Epu;1m z9H{CbJFCm74yWt-dcTeeD4@f)ytZr()*%I_v4AwzEg-s{{yw09ejh=q0&xJrlyAEO z6`YSFNH3s(R*SO(041s2eDK>b$mQ&5N1>lL7Y)&o^@K)LfKK7h8g<*UL23TQLQfwJWR{okN$c|gYl z98f^V^OisW1r$({|A~qOpnw8O00k6K0w|z>5;CFr1kB~48b6MfmH+?%07*qoM6N<$ Eg4B2T(EtDd literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run down_2.png b/triple-dungeon/resources/images/character/knight/knight iso char_run down_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac538c69e7daa0a0de30c234f8bcebba33adefe5 GIT binary patch literal 545 zcmV++0^a?JP)`lX_2#r0wbXn-0qq8Pd$JPRcAe$} z3uxJ#Z7(#V3h1+Uk6+j3X+4sFP6l>scpQ3obR8;4jddPKK&KOdIjkQ?3eYlnu7}Nc zU0hlVbwE|;kp#31khYC<*o%ekJ1+-fPl7bc3 z%Viy^bs9TpZ(#u~1iCvnADV*ISdjjD<@3CN0@@AKVV~}+P>0%EUkz;w=@$x6K-)!N z4tlXuhsGeaPGi3Sny-CST|htqZ5KUU)EI2@wm()u`dE;9jq?2f1vD?HU{a78#~=X( zG|xwp7^uU=ngZ2B3s6Awz&dE`mRDn-{!s-`K)Zp)p!~R>SKrS!LmgBF6worD4jY41 z{ljzBw*We2*w~+f*gQZ1&70K2DF*64?g0yES%A_P)-|IP{=ubHkQ!?qNI>)Cspyx(-uG6m z0`su`bM1=?D4_L1YCJc;Z1sSu=KVfDZXGP34MS=yuvAmm@dXsn@gOzsO-)-bb{DJy z)L8S;bxt=6>()%y3Min};&0gZ@vdVP*z;Lo6{NW^^rx&8nVB%px)4m7%P|F99H;57F0+813{`vC>C9#BD*uRB&hR#TAvp#~_Rqobpj z0*xU3I0DsIf?0u)d{0R^;vPy#5RfD%9fC1fJ<0q|a{wltsJUjP6A07*qo IM6N<$f={Uck^lez literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run down_4.png b/triple-dungeon/resources/images/character/knight/knight iso char_run down_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2d41db1e10dcd2fb3a150c62fdbb8735b831f05a GIT binary patch literal 583 zcmV-N0=WH&P)bURC$%0>K*xi;J6Vnv zeNO9v1$46MZq4`l70`F@p9a^~>3Jjptp;|pa~wT9x{eA`W6c8z=yW15hxN~2+MS_A z63}uZh=s+~r~|5+e{8Ks^_-7u4-06?kOC1{t|>^3{c}J89S>6D*34}5YJVvzK#et@ zf;``DM*#)2Tu6-t_IlBd3Q}Xu`{5(Vow;UIa{S`5;gJ5&Ve&pkghq7JF*c|ZXj z4O9@SfE;#rZ6%ueTt5L0sqfW$0R^-esJ5U01R@{@6Nt~}ApKAS6wu-EYm6Tv4%>U* zi~3mg3%-A!Kvh5iEe0xp6le<4$68<8zjp#!a{T(@unwB4U=Nzj=;!Ta6i`6R+46o! z_%%pisV%Q{A7>jsDquhX9WAMAj6n+@bVa(Ar<00IdjA>wF$LK&y%Vot%Txyw)QJXtkg@ zsG{ot1(YohC|e#-K>sQzVt`I3MGqyU00k6Kl0KY}02EL_37~)iN&p2EP(sMSd;xF} VypqpT6wUwu002ovPDHLkV1hiD^D_Vd literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run left_0.png b/triple-dungeon/resources/images/character/knight/knight iso char_run left_0.png new file mode 100644 index 0000000000000000000000000000000000000000..189c36a4cd39dbd580145e40c8e583e5be61c1ba GIT binary patch literal 438 zcmV;n0ZIOeP)c7{}p_+AM!=Q3s?j%VKWF~74PxM48GvLFbsk_ z-zd)y{$Xb~JurO3?oK9>BuSDaNx#th-DPP;0_eE9zt||vfC3#Ef>zJQFyby7fwZFOy{G|PZ-J$7<-+m0B}I-qaY({}k5j{yZ*H=scO251-L z)6Q-?Qb6k-PI&p*6>Sbm=z&|yI{;NkY>-16rfQb32P3-Ib- z+O7|lAkf9Ov$R~A1yDfd0R>tY^yP8VE?&p_Kpjp%7h8txf<4_^X$KVOu*Iz$kohqQ zDA2lK z*vF>6Ln#j^P@q78{v6a}6VP$N_JNWE3KXdNLG$MwLO{n2Dxg4t3Mf#ZK!Gk2mIzRw gKm`;iQ2lGrPlLFc_qtCa!vFvP07*qoM6N<$f;{ZMJ^%m! literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run left_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_run left_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a6290f55383a28796f94a01f2278f024fbe42ae5 GIT binary patch literal 498 zcmVT4|%Dg;;nIOG_`{1#AQ_VP_$Tt$2@-3_LJD7-n|O z{E7R0@QP%UEPR&POeS4N2qAhi3JJ)+T(x)v`k`vr-%E4#-ITOG|!L^0otbi zB>)QOIJrFDa(&-lI$y!eHZ}(Z7SOt&f)cE@Ev$}@fvznqpqYn!3|7ad!U76t+VY%g zKi9&t;N16_Z)n;iSe>WsRM^P_1DY9BL)pGQPKC9g`kqwS$pZsgIjKWlKa4%!!md3q zpoKy0YvjMhtxUj1}qB0K!v~5@<0WAv)D4@Us3TS>Hq)$ literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run left_2.png b/triple-dungeon/resources/images/character/knight/knight iso char_run left_2.png new file mode 100644 index 0000000000000000000000000000000000000000..02def5d5ed14ad70e66fbde31c9d1eb682f00919 GIT binary patch literal 508 zcmV9G+Sv$Vr=XBROJR#(XQhpn7GmKIJb|U97sv%{1TSG{A&9MbkC7dCz&o-(o@)yzpp`+s zyt}rK7rQ~Vju4<_ax%Mde``UtjufDIv%PcR+FC%ZtC!bLzK8)@2K4Kp@wFqa0t#r^ z01D`8fW{!-rbj^$1GMZ#O0|%m&CC~AK=a1J*`6Kl2jvt1XjxE=wuQ8yoB{yN6Tw)> z`_m?<)~}AYe1QctPXzYyI`I|IbYnB9z9&#%0nHP^Xru+J&lXmjC^68{!vebG=7$;s zwUDV{V+9n@5L8h1<(%N$&$(~x#y%BnY#q?Cf%Z)otOeC^g0+vdi;n)wvypkIV8Y9s>%rZa{&~2WS`M z)6Q-gDWG*PPI&p*6>Sbm=z(0)NP;NkY>)bi(Cq=5EQ7vR;w zxa>Drfw*OebQq_6hRvYy^K#e26tF=1Ipu)@oiEV*7agEL>wtDGKx6S0;Pwe< zzqd_)9Z;Y^fdc(mexTe1>b42!e1Vb!ItK&Z literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run left_4.png b/triple-dungeon/resources/images/character/knight/knight iso char_run left_4.png new file mode 100644 index 0000000000000000000000000000000000000000..60f8c05bf5385c570f9de3a230f9ebedf9973f4d GIT binary patch literal 476 zcmV<20VDp2P)IGwX+e#PC+4smO_fOR@!K3Ar@Z5($Wif0h@rAu(JpRTk#$vGw{HDIJ^mD z@@B~Q!N16|)em+zyTd?4L_|bHM2+%9*#mBpnx_8IsXiC&)0{e$#H}L z_32`EAO22*%5kIs-E8{@Cm~J)%5mAv-Afu`fck)bJx$Z}B`yOLP~S>HKPG2shym&Y zYC-BD2dK|ON|u9MPG_Sb2WZ`La26!6fNmxM$pKDwc1N>-0R^-!Yz`7wKz+MBJq~e; z_aRMSIU$Kr3JJ`gabr6n5)AssLK~k`F&uY5JigAEE^^ z_bO|_TEN}kG5}q3@}XHS=^U&DS_*5u@&XFz|DdwmB`>!I3pDq6a8=-LA4-5$PJ?Rj zQcwc4E~rd{>RSO~fcm_OmJTsM+k(^|N00*)P(XoP9THeT+W@s7fd$kTRL%ny&^BT9 zc@`kBfVK(C|0O_uVF3jcSU>??KP;etwh0R;pnU}_pnbt20Vtq=5}<$*b=fa7U@2y+ SA=#<`0000P)Q!WyK)|HpLgOm#>pp`*R-&5}6 z<^Dpoju4t$&~70;C}07N1@+En2mu-cx$5&A-000041L+Sv$Vr=XBROCd$Dv(iRO3$gG9p1{)53wVJvf|szf5X4rz$I1@;Xnt4% zLNX&fFMLIoR1XZZkc>u>BuSDaNlWbW@uurX0%+Tyv+JEQB0$?{_Vn8IyFc453($B@ z2x#4ordM6R0FA}-7%8B2I=_7A`fYCQ%`F4Rb7Da2faW6}kRNxGGN3@)1|PywwO jNT5K03Mf#Z`q!Y}ryH90gdH__00000NkvXXu0mjfi`uxh literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run right_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_run right_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4b879bc3d482349bd82a4ad0a5e3c18886edea78 GIT binary patch literal 499 zcmV=J%3+1c5uB7_h^2qA}PJH-Y0^)#;wD4?;B zeL;}}G$x<(Mau083n-wmQ(d4QtX)1K2WTv$2kQZA97#Z9rnq`}dfaFmFra|OKVLjDh4F_TS-A51dLRuv(H5JCtcgb+dqA%u`o~DTeYw%pnwhosS0quwcV=jdw;Eb^*cZTO$!+U)uD%l)KV9u#<~wsKsVc% z+op!pI0ULglhGcY0Gb#uwBi0Qq^frwZBy*afZU2tea5PzyPk^GZMy ze|%z(*R(WaK`ktxfX0FT^*Q!$U_b#aD|TCBK?N5of`IlLyR>7MJaT~Mf$f6Sb;JNI z6B1BB%YqDn0t;vvkbnZ32U7E0kfHl04-06|iG>6d(6T@`eRTi|Xc>^PA2~n)O$*xB zb_`HJ^Fjg&=r}+p3kzsZphF$P017CefF{fjAe>@SopX&s00000NkvXXu0mjfkgC)X literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run right_3.png b/triple-dungeon/resources/images/character/knight/knight iso char_run right_3.png new file mode 100644 index 0000000000000000000000000000000000000000..b4714e0dab6b4f3906308542fe11d2608a126c04 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^At21b1|(&&1r9PWFm`#mIEGZ*dV9;zi#br>*hk&1 z-pUS#6pz%p%GoPxNAas{V#w}XfFy~ii3KQu~8tl4C&{hxnd zQhSKK#JyzmSa%M^76B&^vFT{dS$S_=p@wH{u{JW>l$bL5bne-CzdilcakYb~JI93^ zbI!l>Uh5EgHgpL?@5!@wvsd1|ZGUeC>oplehh&GhUED=~?`&t{%E$`<$shl+$dZ+eyfv|M+MZc@Xs2Cg$q)fY}MTAfi$IjHB~XZGr#632@TtMe4+ z>-`Gjmv96c$eOwOzJGaHv>=PgGXtRo53W3|zRsnwz;MC#^vT!uD}3!yS+H@zw_Pe8 zw#u9td;#2%`_@NIWGUG_K`dl`_ui@ED%$)RegR=}7i1Rva%Nu8@N9=(=26y_T<5eG zH1Ki1TDv3Mfss`tV4d&3^pvan3Z8uxT5y;pz~MOSDodbZt0iw_0vw9jfdY(KiXep! roC_NMO=sZLSkNE@)H$U`>I?g|hwYz3ezV*FMh=6gtDnm{r-UW|7`V3= literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run right_4.png b/triple-dungeon/resources/images/character/knight/knight iso char_run right_4.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd1626aeb9e64caf6600f4bb6371568beb0de5e GIT binary patch literal 480 zcmV<60U!Q}P)EG^xD8<=LmP1sooVk_<=k_!jS2O+tr z`5E5>rQ4iT2QU4NC8?W7grC?cYEg`s0G$KVu02GwIeRb_q+L6KmjeA=h>0-%>_ja z(6W%WF<3wWEt9wT!hLTH)*hdb1GFq;F03t*fR=$2&}?HfXbf2EfC5?vG6u_&320r& z)5HCs`u^+FFjnh;0$S!+B*@F-t)POlkopWLpg+6hm^$hfGzR(aMjp`2k}_c04*Ck+7?uhfCAbEXsU<-T4ytgT`U6&D4>7>nuY`x&^{oi!U76t9mw2+KcImA zE@TQg_pd2WCZKhofdsTqP{aTQ5>OHc1rpFcKoJ78&CQ4a+6E{RfC36A0TfU|);eG8 W3@K(MMI}D~0000jqsu9Hk-xXdPLuK0@sC z^$N}mz#MiAo03-n&cZkn+c6-fz4p2aSA#Y2I?!Lk z(t=yB+kJJ&8j!-;MsoPQO10~D3~1}1n$q@K4qESH8^hKTsKRc|yAn|6S3>T4B~XQJ zes%}cIR=-5)dzqWpyNiDLk4WefC5?vsBV(z&_@bT-$|)7IUxn8FJuW6SU`Ot0R^;f zNI(It1Cq%J&}l>J=Ya*Zu1Tu2i2^8~b-WTv0T$4@K@}EIK)wY#pOFUoBXW%Ab%^) zxJH0usjsrJKDv`m7M+?XTvX+ad(~nH>cekU-mA)K7ab0 z?)&PTU+NS3!^Q8OJNJIK>xmy$b$miE(z+5fbAH)rE-0;vlxdr@w4v~0@g#@WPV1(x z&Z}Mjd)ho^t}Qw*1XA?Ayh&^nd-txyev34>bqSxw1)~K!3wBP}+|0UbVYFTO=62So z9owI)ZF#->>Hl2|k83Y*_*}I=wykWbLi&FR){@f>zZ)8vWWOtO1}t!BWMbtK(eYSt zn@4*6<{LNPvWaBK-nh@Se8S5HCf#7JiNBX`y7QWmHA>8+eCPGQdn{i86-WkbH-c!j y3XK385yd}61Sk?J7Xvg<6v$!~(Fn+VRLdymvdlHOMKcu`41L+Is;lgcNonM6mS$wiaR`b{@hbcmXe9BX|ir3qfoJ&#|%tzr~P&Su?wd z9k<)ly{=yX z{qFf~`Lg@s{Um|5>2-e8EnC2xoL!||Tt1`)WW0{+zL`MBf&5sUrIlXip!wo@+z%A! zG>|3Oe5Lz=0&Q~$4TT;0exN|xKJxiW*TDjv_L2YVwjLJf$d7#MZ5=Goe+F86m;nX4 zywCeZ*RS>AH1sC`DA3J3tlnQ{X+VK)25fv@{M5vN0$mSie%R%QAyA;Jb$)oz^&1LX zg53Imt{F6k{JuL*oA2zV0R=iv0aE)flDNM#pg_j~&0$L`!GQ%j4QTCZKMyF-wxG4p zwVxY*UI7K#7Sy8*6ev)j!(o8}1qu}C`VKDv-OQf^0R;+FK!E}kP@q783Mf#Zk_!C* X2<2e)M$x@=00000NkvXXu0mjfO-H^S literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run up_2.png b/triple-dungeon/resources/images/character/knight/knight iso char_run up_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d93bc8b9ac2dbf64e545524e96aa62e62a6c0cfa GIT binary patch literal 435 zcmV;k0ZjghP)X3W;7BJ5fKp)5fKsDxO_g}7G=BI4;1KfkS{m;sddkb{a}H1o4d1} zqHF;DboTapvwd+sNud3}o=&e*FRz|b12Wd}I!K_aNr2_B`EgP}yUpwPxcI9%V03ry zFqI(CZXw?%)6{wEx&;cfU&vVJt%3&%wB0YEy0DAhB7g#2&B(h209}ufU$ldT1={n- zFWY(72MV+qXjjeO2Pn{b`FNZZWxEC)%*X@XkkJPUv{`@x9p>o!2OlUc` zfdX9**c>u1P@wJP;^?3#JMU4+qK`NR4-2&AJe*I8vN=Q!7{}uSsJd?K|GGa(1q!qs z&?=zVKN6t5f>uG*-3Jt?kq0`&RDl|Kpz954o(z5xl{xLxBK*J%I%002ovPDHLkV1o3xzGeUb literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_run up_3.png b/triple-dungeon/resources/images/character/knight/knight iso char_run up_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ad6f8c723b67d8a1afc2c531a48d3ddb9b27ea GIT binary patch literal 449 zcmV;y0Y3hTP)}&~72yUN@~9%|`&x!jMg1tNsIk0$mNXEo9pn?ZXLZp(Ee-00sK9BM%hl zxIyFZz245#00laXhf)p+6zDKO{r(Abz2fL~4IA%sGM%OY3UpXsr*hEI!vgKNgIEee93-8$B%0o^zMJ z7SLgHxxdo170`DdU*^}0(|jZW%>%nPJ99lby>k_$uJs&9K*x!|EUdl%Jl*-VNCKKR zf>>SKabnLM&@_;-6<7$e*slOU2ZHngh2Uag0R=PkT(rLT z-X5*H0t#ri<56G8(2{?Bs$2mDG!8U1pbzx@rv6bt0qwRarH0h!0Sf41(eWiUXt96O z0h&1W_>%fS4=AAh;@c#;!fM{<)voLDWa0`aplLx5w>O)%v9KDad4jYB6wovgObFKg zFtGFVzT#m49T?QY#zNW@3kzr_*y+-;tG%}OL+=%+j#q#J+7HwR*A=w*;}f8nKsC-j zM-I?Dxjv|ywjn4z*LdUr%?lcWiX8_ipe%VnS@M7a`d2{_19Y6kZc0c23Min&zd0cR oD4>86Kmi4m017Cegpj%U0!=QBx&3i(SO5S307*qoM6N<$g46`uC;$Ke literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice down_0.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice down_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa29bc8ce58d5099ae5b31372e3d226f30c7b41 GIT binary patch literal 547 zcmV+;0^I$HP)G@HF)J%3nFP(bq{kQA)I-mdFVt<%^+ zdkYI_N1*!)i=io4jRonSS3b`RD4=lxu&nUkhpn#SI6-)|J;}|5MfR@=LiGey? ztSL~vv;YM(57akB1R8tf)flL6ssIXT9%u~8kNbJ`^Kv`XK~+Ej&4W#Wr65(`c&_>u zK&K2F`zeUc0~FA*Nxht6p#IqfETG+jwtXq-c>{59GOG_`{1#AQ_VP_$Tt>`&cGVp{v z{4u*G8T04+;1#nw8}PHt?j~!iMF=5;5K<%`_m@?_T>`EbhMCO2W>Abrrw^crwUMG?brOdg$1Q4$v~us|$Z60w|!94I2H6 zj^-l=Xj#w*N}#!U1kf@|KAOjp2lRiF17*nrIvwDE0y>?S1On(}JYFFID4>86Kmi4m q017Cegb+dqA%qY@2qA<_LB0Wz#Hv<06K6C40000505di%wDDIp1(Hs9xO7UK#~4U08EDM-*XfJg16k!sM{x$9C5i>|D1 zNeN2OG>{rlKMqi<{lO>c!REGKW zf(7VFuPw#vu(m)O3ro;Mpc)drbMcbY1&cKxt=lcEkDtAg#)2)*LeQpxx*&A{bGXxz zYN)$6u1PIO-Nu~)2$~2|AD9KYb-OLKAOVfF{sCZn>wT+^{K?P1Qi9eE6c-B|7!F8p zhXZ^0cunepEq>n{DIoP4kot?j=hq!+Sic@@6oCC|K&#kZ z?665~wev{ve_615i|hxgb&fXT7SU4oHIL2I>oGfmVgJ0IgF2Aaz3_ z0e5brPSD7ZF3?a|YxJ#)6}H2O`$Fo^r$?Khxq+62j13DQJ-V*P%Z|1SlAyVOT9DR_ zZdp(laBNW5XuBW@nhU7wgIJ9XTNTvWe_2R^<_cOBHWV~fU69E~ouG+9Lt%3P&K8oO zQwHn0nD_#o+kb`-G;`ok=up7gKoT@lVBfE_p>Y9b4@uC>fn#5sY70ovngaU*HWreg xnLvlaO)Vfn8HQmPhG7_nVHk#C7=~e*k$*C=R=f|UXwCot002ovPDHLkV1gBiSkeFh literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice left_0.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice left_0.png new file mode 100644 index 0000000000000000000000000000000000000000..50c30e01919c4a199d051b7a7c95abc148e09b13 GIT binary patch literal 441 zcmV;q0Y?6bP)41L+Sv$Vr=XBROCd$Dv(iRO3$gG9p1{)53wVJvf|szf5X4rz$LbFJXntG* zf|)6v7rr7(st1NyNJb+`k|arzq+fc!zv}vt0NOU_>~gD&2+%f~Jv?{)ZcjGL0yLfz z0$R6&=|$HsKx6SdMha-1PS5YUe(M`MbIZW-oEXqLp!tXgo)`o6lfcuvHbevG6Gts*U7Z|xeS{}3}_wD0L#Eb(ByzF=Mu_bN4wi|8-gVWbh$@8 zLtYV? z127LL(B*>W4P8oJn}7lZ3Us;<7AVlV{S}lPP@q8deM#l#K!LU$P@q780tE^bsDRcC jBv7D01r#Vy0sZO|KHr-6_K5yG00000NkvXXu0mjf>vF$G literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice left_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice left_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d1463a0881fd2e3f2b5fc3da13d75452d213251f GIT binary patch literal 569 zcmV-90>=G`P)9GdH_M}6ckd}3R?s_D{X8o#KIeR0!vFT;04kMIe@KTVIhcMCEjCX2VO~D z9A@jtqKj{=@?`QbPYi7~Llf(0>A{&x`f=4p2b*f%?vi{h%38K;wck z`hb=J?Yj=3fYu2KD4=yix?lkXv~JMRzyg{GH1%}=9XaR^^hjTr4e<*n00000NkvXX Hu0mjfbocfp literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice left_2.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice left_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fdbb239823e73a8e42f6398fc7cb84ca6b0754cc GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^At21b1|(&&1r9PWFs|@)aSW-r_4cN{*AWMawvSV) z7#!b-h-}*+8l+PecI!q|N2~bWfdKczfGx= zUBwx4xs+Ga;rPo>uM9(O-?WXH$$G8y2!ky96}dvkx;xVg8+oLbRki} zl(9o#VQ3u*2#_6gx0eO3!H72ZCtUhu8dbHgu* z0EgeLZ@97)4_~j8S&}nvau<9Qrq^Y`M`ajI2A22WQ%mvv4FO#l{i&cpx! literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice right_0.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice right_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1d094cc6ac0661f735fffbd5cbb0f9954a1cd1b9 GIT binary patch literal 438 zcmV;n0ZIOeP)3XL$0}6Cxkk4=0Q zP6%k7j^wtdV&D!N#JO&hK-GBmJ4bU#g z*Xcn!Qb6k-PI&p*6>Sbm=z&|yI{;K}~(!t&=FQb32P3-I=M z)~*khAkgJDU0W~B0w^H!fC8-x`u;L$7q4S|pbjUX%Pm88!CoA0v;zus*y2_W$o!ZD z6lmSb_i1U?1q&4DIBxk2n?d8}<*qMNzyclSmIn%SH9!M0|3wEV&^n-b88jBxJw5>) z_OYq&P|5=e6ev)j{|EKh1aw@meW2uk0tKpm(ENFa5YTah3Mf#Z0tyr;P@v0%B?1&E gPyq!BRHFp_0qgXd_e0-GRR91007*qoM6N<$f}6{_9RL6T literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice right_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice right_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd0b2ae30b0ab9999f3b4191d7b7aa8585c5f8e GIT binary patch literal 563 zcmV-30?hr1P)7}^#Fp{DJX1VD{QgYS!rWyAr{`i6Ifb$0WV-9cmP|$!a@+iO1wv8f-kr) z8)u7CpC z805pNvHbY=H%|P6TYawr(r1GVZDibmd_IO$@0)-ySEn@>%MF)z_z$g#|S7ucg$tg*9Mb z*wOz4j2=`kEO$deWqooT5=ebba(z!VSU?klnnHVgdgEd~o{BG9LoPqVD4 zqUViWr@(1gA872>kA?-b5a>`?-@LJ)u7)0ZuE&DOU;!-*8VlWbzP^W&Z>ww2&T~OcNoRKY5}wr&{D9m(6NV7U)WUFJ3w=R=7Q}D-gh1WO|`D%kMRJ_ zoKnEGTKvg6pp6AMK*ya>u+Ud8fC8E)t_ywa%SJ!}%?s%Q4Fv`i(6U<{P(a%NjhzQj zK-&fd7SOz)spnl;SU?-y>VN|JKeoCH7SKjOe*gm>Uzp}V8^Hho002ovPDHLkV1kjM B_3i)w literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice right_2.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice right_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c2406542b304133a862f22a4c84e192102a152 GIT binary patch literal 486 zcmV@P)zzx_4ZoH zN$!ui?+agHiUc0XB%@73L_|bHL_|bHL_|b1y3dDe=Z6HKW%YQq>-+!(v@po0R~PmJ zdUv)HCdUy1G*3s%OZR&MDU;(!0h+e0?S1E`0p+;t{Ng?gF+lTxe%!WU`WBY~3TWQC zKwlPze-1f7(}G&Jx&`{)E?0&mpm85gdR>6}I3ERorpW?4IoMkn4=X_PWC7kBw_(5n znzzNqrt=e6fwX3U0t;wAn05E|+=S`l7OZ}KnjI{lh5jP?!pdeybcMZeoeAK ztuF}G!vZ>S?(5X~S+G-qRs#!Yq+4FY4h01k(72%1G^qUC_s@dW!2%ljp(K-k=E;VF zR{J^yXe3ZQ4XVG2u6w=N!vdP=p)?if>|p^-1Q{E&y7x~&Cx!$R(6S-BK&yuZ^q+uM z3kzr_Nb5Yn0-6_e=y?GJG%o1a^8yNJ*`O9Ipn#48jdh)BU;&K;n(BJ9hXoW+Kmkn% c3uqyr-x9fI>W;^xCIA2c07*qoM6N<$f_VAQ{r~^~ literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice up_0.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice up_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d2115e97eda88314998a7a0c8c16e655751b1748 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^At21b1|(&&1r9PWFuHlVIEGZ*dVAB*>u`X~@sEAG zw0BrploW_+eGyv6cgb;2yZZ;GxC2L%ckJw3E#CR$;QqshFD*Igo%QMGp?r_oI`SI) zmySA3QtY)J9o(IT-aoLcV6gMri|U+&+ngpSN!~B z7Au}NXMZWaefLjQSK+bMK6cKMIZQh3XYJKlOXk>3yB@k%#-OaOaH<>EiwzC!eF_&g zHN>wjy|wRkO+w=|*0)@oVlN6En^>!4+Al7gu(_Gl>VyBjx3dm0vEEwq{&{HVdhI2L zIWr{FQS1a!*V0wyjIjerFXjZLhaU+njq-28gy(-RY3jSGbd-yNSZb8VT=lyE&> zH8=kJSvj!`#S1l-3DGNV9%9nv;o<=6W16d_1Jci=%kISm6nP~d1LTMTg;;?GXFmGN Zw7fBDZ))rxGho0nc)I$ztaD0e0swm@qE7$- literal 0 HcmV?d00001 diff --git a/triple-dungeon/resources/images/character/knight/knight iso char_slice up_1.png b/triple-dungeon/resources/images/character/knight/knight iso char_slice up_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0862a51235d9a5fa2cc8db99802edab21ec995a7 GIT binary patch literal 396 zcmV;70dxL|P)C0CWfB$UJn_ib@6(VK+C|Mt**jcT;7L?knuQv4iadYo)@R>_C&B0Ha$-cXc@@Yl{e0H8pJ+48$i^{_xk-tt3D zwXi_{2xwn$pg@5F1-m=w+ubq@P@rW%yS^ud1PZhaXx~>P)&7kKbRyUsTWhbXA0W&m_!cfG@!YgR<#f8KxYp6({(_BjtdJE q=>G&4P@q5s6ev&ul_W`$GJOEtNpSu6!AJ4{0000(-1si;G0yGk6Q&`{8HbI)Iuk(d9{UHNr?w~eU*U=6I84K3+g#u_QP#yO1 zY;UAC$hshP8w=L=*av88P|5qjVp;X&vQRz!w>47vfgX1ERc!#dz_vc}fVPywmA~cB z>Id-9kg;K-ADaM86cbP^NZa%1_ZM9Ypow8))$|K&I`V+_71RdXb~``vfVKo18rb&r zdIt$;N8SqR{)?m-mjIdxtO-&+Rx}k*K;y#NM!X<^COKBwMjSan+lju3*gjkV6wo|C z8F@hS1T}41V}D==G*i%~>i`8bF0AWy0%+dg1W-T$C4d47C;^lZLI@#*5JUb09LGT? T%cZEc00000NkvXXu0mjfjM*9z literal 0 HcmV?d00001