diff --git a/assets/sprites/box_close.png b/assets/sprites/box_close.png new file mode 100644 index 0000000..11165f7 Binary files /dev/null and b/assets/sprites/box_close.png differ diff --git a/assets/sprites/box_open.png b/assets/sprites/box_open.png new file mode 100644 index 0000000..6cc2086 Binary files /dev/null and b/assets/sprites/box_open.png differ diff --git a/assets/sprites/door_golden.png b/assets/sprites/door_golden.png new file mode 100644 index 0000000..4d41c4b Binary files /dev/null and b/assets/sprites/door_golden.png differ diff --git a/assets/sprites/door_golden_side.png b/assets/sprites/door_golden_side.png new file mode 100644 index 0000000..443a0e5 Binary files /dev/null and b/assets/sprites/door_golden_side.png differ diff --git a/assets/sprites/door_red.png b/assets/sprites/door_red.png new file mode 100644 index 0000000..b7eabd9 Binary files /dev/null and b/assets/sprites/door_red.png differ diff --git a/assets/sprites/door_red_side.png b/assets/sprites/door_red_side.png new file mode 100644 index 0000000..087b081 Binary files /dev/null and b/assets/sprites/door_red_side.png differ diff --git a/assets/sprites/door_silver.png b/assets/sprites/door_silver.png new file mode 100644 index 0000000..f9a795d Binary files /dev/null and b/assets/sprites/door_silver.png differ diff --git a/assets/sprites/door_silver_side.png b/assets/sprites/door_silver_side.png new file mode 100644 index 0000000..187388e Binary files /dev/null and b/assets/sprites/door_silver_side.png differ diff --git a/assets/sprites/door_wood.png b/assets/sprites/door_wood.png new file mode 100644 index 0000000..47ec86e Binary files /dev/null and b/assets/sprites/door_wood.png differ diff --git a/assets/sprites/door_wood_side.png b/assets/sprites/door_wood_side.png new file mode 100644 index 0000000..a020e6c Binary files /dev/null and b/assets/sprites/door_wood_side.png differ diff --git a/assets/sprites/enemy_walk0.png b/assets/sprites/enemy_walk0.png new file mode 100644 index 0000000..a2584e7 Binary files /dev/null and b/assets/sprites/enemy_walk0.png differ diff --git a/assets/sprites/enemy_walk1.png b/assets/sprites/enemy_walk1.png new file mode 100644 index 0000000..2d202d3 Binary files /dev/null and b/assets/sprites/enemy_walk1.png differ diff --git a/assets/sprites/enemy_walk2.png b/assets/sprites/enemy_walk2.png new file mode 100644 index 0000000..ba31bce Binary files /dev/null and b/assets/sprites/enemy_walk2.png differ diff --git a/assets/sprites/enemy_walk3.png b/assets/sprites/enemy_walk3.png new file mode 100644 index 0000000..a382879 Binary files /dev/null and b/assets/sprites/enemy_walk3.png differ diff --git a/assets/sprites/frontwall_left.png b/assets/sprites/frontwall_left.png deleted file mode 100644 index 10c813a..0000000 Binary files a/assets/sprites/frontwall_left.png and /dev/null differ diff --git a/assets/sprites/frontwall_mid.png b/assets/sprites/frontwall_mid.png deleted file mode 100644 index 4f7a799..0000000 Binary files a/assets/sprites/frontwall_mid.png and /dev/null differ diff --git a/assets/sprites/frontwall_right.png b/assets/sprites/frontwall_right.png deleted file mode 100644 index 0778205..0000000 Binary files a/assets/sprites/frontwall_right.png and /dev/null differ diff --git a/assets/sprites/key_golden.png b/assets/sprites/key_golden.png new file mode 100644 index 0000000..c115f91 Binary files /dev/null and b/assets/sprites/key_golden.png differ diff --git a/assets/sprites/key_red.png b/assets/sprites/key_red.png new file mode 100644 index 0000000..d3c3624 Binary files /dev/null and b/assets/sprites/key_red.png differ diff --git a/assets/sprites/key_silver.png b/assets/sprites/key_silver.png new file mode 100644 index 0000000..ffc6e3a Binary files /dev/null and b/assets/sprites/key_silver.png differ diff --git a/assets/sprites/mc_idle.png b/assets/sprites/mc_idle_orig.png similarity index 100% rename from assets/sprites/mc_idle.png rename to assets/sprites/mc_idle_orig.png diff --git a/assets/sprites/mc_walk0.png b/assets/sprites/mc_walk0.png new file mode 100644 index 0000000..95044d7 Binary files /dev/null and b/assets/sprites/mc_walk0.png differ diff --git a/assets/sprites/mc_walk1.png b/assets/sprites/mc_walk1.png new file mode 100644 index 0000000..1785d6b Binary files /dev/null and b/assets/sprites/mc_walk1.png differ diff --git a/assets/sprites/mc_walk2.png b/assets/sprites/mc_walk2.png new file mode 100644 index 0000000..f2f1a44 Binary files /dev/null and b/assets/sprites/mc_walk2.png differ diff --git a/assets/sprites/mc_walk3.png b/assets/sprites/mc_walk3.png new file mode 100644 index 0000000..80fde44 Binary files /dev/null and b/assets/sprites/mc_walk3.png differ diff --git a/assets/sprites/torch.png b/assets/sprites/torch.png new file mode 100644 index 0000000..a747637 Binary files /dev/null and b/assets/sprites/torch.png differ diff --git a/assets/tilemaps/level1.tmx b/assets/tilemaps/level1.tmx index ad5cac3..8ad4792 100644 --- a/assets/tilemaps/level1.tmx +++ b/assets/tilemaps/level1.tmx @@ -1,5 +1,5 @@ - + @@ -8,7 +8,12 @@ - eJztmksOgzAMBeECvf9xKxaoKKog8cvHxjNSNq1s06lRcNNtAwAAAIBM7CxpfdqVm2LUnCtq1sTjT4vHnxaf2V8P8KeR2V+m+3cE+FtbM5I/j9/Z2/1d54R/r+Fvfs4y/ljlTHdyN/PdzYTWa1Hen5WzjO/dS9Z8+PvlHBGHPy0Of1pcJn8te1Hts8TTnmXNqeCp/1aAPw1LT5f9Henz9sZj/0Vi1PxRs0Zd00w8zr/403NGwas/63520uNcuyZXpvs3y++n+NPq4k+riz+tbkZ/rXvfW57/VCL1n0ci+fN8//asiz+tLv60uvjT6uJPq4s/rS7+tLoZ/VnOnaz/LVLOurzlPOK/tYYNcQ== + eJztmtEOwjAIRbcf8P8/1+xh0TRaO25ZQc5J+qIB9IS1w7ltAAAAAFCJnSWtx3Xlphg154qaI/H40+Lxp8VX9jcD/GlU9rdPiM/iz4NK+58Hlfyp15ql5kh8Fn+Wmu9zwqfX8Hd/zjb+WO1Md9Kb+XozofWzKO/flbONn91L1nz4e+X0iMOfFoc/La6Svytn0ei9xK8zy5pTIVL/rQB/Gpaebvs70/edTcT+y4TX/DGyvuEx53sRcf7N1M8Rr1/86Tmt59nJjOfaI7lW+evtcV79F/E370z7H/408KeBP43I/q6eff9y/6eSqf8iksmfx1yo5szkL/L+N7Mu/rS6+NPq4k+riz+tLv60uhX9WZ47Wf9bpDzripbziH8C3pgNFg== + + + + + eJzt18EJACAIBdDm6dD+4zVB0KES8717IEj6bQ0AAACAlRH8HqrwV8isRxfANr0CIJpdBFThzgd+dmvGncyKcicAGdhXf7uRmdyaAADw1gRA8QI/ @@ -21,19 +26,4 @@ eJztzjERAAAIBKBPYy77pzCCk+cCCUgAAAAAAAAAAAAAAAAAAOBWJf19AHYDKYYAhw== - - - eJzt2DkSgCAQBEACj///2Mhwq7Y4FKU7RiWQgaEUAAAAIlvj83vFe1u/CazjSI6TK3xN9t+OnF1mAQDtenfK7B4XddE32Jfhn6xtZlbbKd2fjNXa9Xub6bwE9BHluPUOAOup7R/ODUBWlDPuTQHGuHNXzsLzLhUcAI8= - - - - - eJzt1ssJADAIREELSP/15mQBQj6wzFTgQZ5WAQAA8Nr6PQAQQUtIZbcBSOGmAan0DZjSDeA2nQEAmr8AAADgjA19dABh - - - - - eJztzgENAAAIA6AXsH9dY3w6SEACAAAAAAAAAAAAAAAAAHdNOwAAjyyd+AAO - - diff --git a/assets/tilemaps/level2.tmx b/assets/tilemaps/level2.tmx index 9a3fbfa..dde0ef2 100644 --- a/assets/tilemaps/level2.tmx +++ b/assets/tilemaps/level2.tmx @@ -1,24 +1,34 @@ - + - + - eJzt2FEOgjAQRdHuQJ39L9bwYSREWzpvSof03qSfDvUIEiiFiIiIiIh6enSurWfwas0cdcyXsPDDD795fib6GX74icdc5fo1/PCb6DfqmPjVP/PJyvf/fh9+/vMryu/Yv9/qbKv5KTN+zcQPP/zwW9VvX8+9qGXh6Y5+kfNGLvxivr9a5J7Ud0JX+/U+OxyfI/DT/TzV9jTbJfv5h5/mV7tG8dP9vKnvLTyzMl6/yp5qe802Ez/88MNvdb+t3nvf1X6WcGbLItP5h5++12wz8cMPP/zwww8//O7qR/7ePxWy/Q== + eJwTYGBgEBjFo5gMLATFA+2OUUxe3IzG38BjfiyYHvGCzV4YHrV31F5a2EvLND1Q9hLCAA30JV8= - + - eJztmksOgzAMBeECvf9xKxaoKKog8cvHxjNSNq1s06lRcNNtAwAAAIBM7CxpfdqVm2LUnCtq1sTjT4vHnxaf2V8P8KeR2V+m+3cE+FtbM5I/j9/Z2/1d54R/r+Fvfs4y/ljlTHdyN/PdzYTWa1Hen5WzjO/dS9Z8+PvlHBGHPy0Of1pcJn8te1Hts8TTnmXNqeCp/1aAPw1LT5f9Henz9sZj/0Vi1PxRs0Zd00w8zr/403NGwas/63520uNcuyZXpvs3y++n+NPq4k+riz+tbkZ/rXvfW57/VCL1n0ci+fN8//asiz+tLv60uvjT6uJPq4s/rS7+tLoZ/VnOnaz/LVLOurzlPOK/tYYNcQ== + eJxjYBgFvAPtgFEwCkbBKBgFo2AUDCsAAHYMAA4= - + - eJzt2TsKwCAQBUDvEBJIld/975heAoKoi2SmkRXUV/tSAgAAGGvLVpjZVZgBAAD4pyc6AFS6owMAMDV/5jF0bwDQzxkdACDIWXluaRkCqLZ+7O1B70JPR6d7876sNJe07I51eYz0AlJZAoI= + eJxjYBgFwx0Ik6BWnmauGAVDFSgOtANGwbABolQwQ4wKZoyCUUAPAACflgB/ - + - eJztzjERAAAIBKBPYy77pzCCk+cCCUgAAAAAAAAAAAAAAAAAAOBWJf19AHYDKYYAhw== + eJzjY2Bg4BsgjA8QkidH7ai9lNvLiIRhgBENDyf/DgV70cOfEU0NNnls8UdN/9ICDDd7CcULNntx6cGmHxcgJq2S6l9i1A82e0kpr7CZSSjMaeFfYsBgtZdYNbSyl5i8QwomxkwAYyAFTQ== + + + + + eJxjYBgFlACegXbAKMAAhOJkNM5GwWgaGAWjYBTQGgAAO28AMQ== + + + + + eJxjYBgFlAI2HOKsdHXFKEAG6HGCHhe44gyb2lEw+AC++CMGsFDFFaNgFAxtwE6h/tGyEj8AACxvADg= diff --git a/assets/tilemaps/sprites.tsx b/assets/tilemaps/sprites.tsx index 726fef3..4775fa7 100644 --- a/assets/tilemaps/sprites.tsx +++ b/assets/tilemaps/sprites.tsx @@ -1,9 +1,21 @@ - + + + + + + + + + + + + + @@ -67,31 +79,64 @@ + - + - + + - + - + - + + - + - + - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + diff --git a/assets/tilemaps/tutorial_key.tmx b/assets/tilemaps/tutorial_key.tmx new file mode 100644 index 0000000..0f120f1 --- /dev/null +++ b/assets/tilemaps/tutorial_key.tmx @@ -0,0 +1,29 @@ + + + + + + eJxjYCAe8BPAxKrjp7J5A6VOiER1xAAAEOED9A== + + + + + eJxjZGBgYCQC8zEQBnzDWB0jHrX4+CCgDxVHD09s4QwAylQBMQ== + + + + + eJxjYBg8QGmgHUAm0KOiWQAxwABR + + + + + eJxjYKAPsKSTPUMdAABDeAA6 + + + + + eJxjYKA+8KWBmSMFAABgnABO + + + diff --git a/assets/tilemaps/tutorial_movement.tmx b/assets/tilemaps/tutorial_movement.tmx new file mode 100644 index 0000000..b92de77 --- /dev/null +++ b/assets/tilemaps/tutorial_movement.tmx @@ -0,0 +1,29 @@ + + + + + + eJxjYKAMCJKBR/WO6h1seoWooJdcAADifQte + + + + + eJxjZGBgYCQT8zGQB/iooBebe8i1lxi30EIvMsAXxoT04pKntl5i45/U+OVDYw+EXmx8UvWSm48AeZUCCQ== + + + + + eJxjYBi8QJRK5ghTyZxRMApoAQBybAAp + + + + + eJxjYKAcCBHgjwLqAELhLIRHbigCQn6glh8HOqwAHRsAow== + + + + + eJxjYKAM8FKofxSMgpEOAC34AA4= + + + diff --git a/game/entities/player.py b/game/entities/player.py index 0850a67..fdf6faf 100644 --- a/game/entities/player.py +++ b/game/entities/player.py @@ -1,14 +1,17 @@ import math +import arcade from pyglet.math import Vec2 +import assets from game.entities import Entity from game.views.inventory import Inventory class Player(Entity): def __init__(self, game_view): - super().__init__("mc_idle.png") + super().__init__("mc_walk0.png") + self.scale = 0.5 self.center_x, self.center_y = Vec2(0, 0) self.angle = -90 self.normal_speed = 4.0 @@ -16,17 +19,35 @@ def __init__(self, game_view): self.game_view = game_view self.inventory = Inventory() self.enemy_touch_count = 0 + self.holding_item = None - def update_animation(self, delta_time: float = 1 / 60): - pass + self.walk_textures = [] + for i in range(4): + texture = arcade.load_texture(assets.sprites.resolve(f"mc_walk{i}.png")) + self.walk_textures.append(texture) + + def update_animation(self, delta_time: float = 1 / 60, delta_pos=Vec2(0, 0)): + if delta_pos.x == 0 and delta_pos.y == 0: + self.texture = self.idle_texture + return + + # Walking animation + self.cur_texture += 1 + if self.cur_texture >= 4 * 8: + self.cur_texture = 0 + frame = self.cur_texture // 8 + self.texture = self.walk_textures[frame] def move(self, delta_pos: Vec2, mouse_pos: Vec2): direction = mouse_pos - self.get_position() if direction.mag != 0: direction = direction.normalize() self.angle = math.degrees(direction.heading) + if delta_pos.mag > 1: + delta_pos = delta_pos * Vec2(0.707, 0.707) self.center_x += delta_pos.x * self.speed self.center_y += delta_pos.y * self.speed + self.update_animation(1 / 60, delta_pos) def update_player(self): nearest_item, nearest_dist = None, 99999 diff --git a/game/views/game_view.py b/game/views/game_view.py index 9757d6b..50aeac7 100644 --- a/game/views/game_view.py +++ b/game/views/game_view.py @@ -8,7 +8,7 @@ from game.entities.enemy import Enemy from game.sounds import change_music from game.views import change_views, return_to_view -from game.views.inventory import Item, get_inventory_ui +from game.views.inventory import Item, Door, get_inventory_ui arcade.enable_timings() @@ -25,6 +25,7 @@ def __init__(self, level): self.floor = None self.objects = None self.pickables = None + self.doors = None self.player = None self.physics_engine = None self.start_time = None @@ -74,13 +75,28 @@ def select_level(self, level: int = 1): self.floor = level_map.sprite_lists["floor"] self.walls = level_map.sprite_lists["walls"] self.objects = level_map.sprite_lists["objects"] + self.doors = arcade.SpriteList(use_spatial_hash=True) self.pickables = arcade.SpriteList(use_spatial_hash=True) - if level_map.sprite_lists.get("pickables") is not None: - for item in level_map.sprite_lists["pickables"]: - self.pickables.append( - Item(item.properties["file"], Vec2(*item.position), item.angle) + for item in level_map.sprite_lists["pickables"]: + self.pickables.append( + Item( + item.properties["file"], + Vec2(*item.position), + item.angle, + name_color=item.properties.get("name_color"), ) + ) + + for door in level_map.sprite_lists["doors"]: + self.doors.append( + Door( + door.properties["file"], + Vec2(*door.position), + door.angle, + name_color=door.properties["name_color"], + ) + ) # Set up the player self.player = Player(self) @@ -249,6 +265,7 @@ def on_draw(self): self.scene_camera.use() if self.floor is not None: self.floor.draw() + self.doors.draw() self.walls.draw() if self.objects is not None: self.objects.draw() @@ -257,9 +274,9 @@ def on_draw(self): self.enemies.draw() # TODO: remove from final, for debug - if self.enemies[0].arrows: - for i in self.enemies[0].arrows: - i.draw_hit_box() + # if self.enemies[0].arrows: + # for i in self.enemies[0].arrows: + # i.draw_hit_box() self.player.draw() diff --git a/game/views/inventory.py b/game/views/inventory.py index 2a0c34f..e7b18f9 100644 --- a/game/views/inventory.py +++ b/game/views/inventory.py @@ -1,3 +1,4 @@ +from time import sleep from typing import Union import arcade.gui @@ -5,13 +6,50 @@ import assets +item_functionality = { + "knife": "equip", + "torch": "equip", + "letter": "read", + "key": "use", +} + + +class Door(arcade.Sprite): + def __init__(self, sprite_file: str, pos: Vec2, angle: float, name_color: str): + super().__init__(assets.sprites.resolve(sprite_file)) + self.name, self.item_color = name_color.split("-") + self.center_x, self.center_y = pos + self.angle = angle + + def try_open(self, key: "Item", game): + if key is not None and key.name == "key" and key.item_color == self.item_color: + self.kill() + else: + game.player.game_view.set_display_text(f"You need a {self.item_color} key") + sleep(3) + game.player.game_view.set_display_text("") + class Item(arcade.Sprite): - def __init__(self, sprite_file: str, pos: Vec2, angle: float, name: str = None): + def __init__( + self, sprite_file: str, pos: Vec2, angle: float, name_color: str = None + ): super().__init__(assets.items.resolve(sprite_file)) - self.name = name or sprite_file.split(".")[0] + # self.name, self.item_color = name_color.split("_") self.center_x, self.center_y = pos self.angle = angle + # self.functionality = item_functionality[self.name] + + # pylint: disable=E1101 + def use(self, game: arcade.View): + # TODO : Replace with Match Case + if self.functionality == "equip": + game.player.holding_item = self + elif self.functionality == "read": + # TODO Display the letter on screen + pass + elif self.name == "key": + game.player.near_door.try_open(self, game) def get_position(self): return Vec2(self.center_x, self.center_y) @@ -82,7 +120,9 @@ def get_inventory_ui( v_box = arcade.gui.UIBoxLayout(vertical=True) h_box = arcade.gui.UIBoxLayout(vertical=False, space_between=100) - use_button = arcade.gui.UIFlatButton(text="USE", width=80) + use_button = arcade.gui.UIFlatButton( + text=inventory.items[item].functionality.upper(), width=80 + ) v_box.add(use_button.with_space_around(bottom=10)) drop_button = arcade.gui.UIFlatButton(text="DROP", width=80) @@ -109,6 +149,7 @@ def get_inventory_ui( @use_button.event("on_click") def on_click_use(event): assets.sounds.click.play() + inventory.items[item].use(window) # pylint: disable=W0640 # noinspection PyUnusedLocal