From d2e217ae9fcf9867b4272fdbea30310616455acc Mon Sep 17 00:00:00 2001 From: duckduckdoof Date: Wed, 22 Jan 2025 12:34:51 -0500 Subject: [PATCH] Added basic game logic class --- lib/game_config.py | 22 ++++++++++++ lib/game_logic.py | 35 ++++++++++++++++++ miniopolis.py | 89 ++++++++++++++++++++++++++++++++++++---------- 3 files changed, 128 insertions(+), 18 deletions(-) create mode 100644 lib/game_logic.py diff --git a/lib/game_config.py b/lib/game_config.py index 7a4556d..a652acc 100644 --- a/lib/game_config.py +++ b/lib/game_config.py @@ -42,3 +42,25 @@ TEST_MAP = MAPS + "default-map.json" # Layers for Map LAYER_STRUCTURES = "Structures" LAYER_ENVIRONMENT = "Environment" + +# Tile Types +LOGGER = "LoggerTile" +CROPS = "CropsTile" +HYDROPOWER = "HydroPowerTile" +HOUSING = "HousingTile" +MINER = "MinerTile" +FACTORY = "FactoryTile" +JUNCTION = "JunctionTile" + +GROUND = "GroundTile" +WATER = "WaterTile" +IRON = "IronTile" +TREES = "TreesTile" + +# Game Starting Resources +STARTING_RESOURCES = { + "iron": 50, + "wood": 100, + "people": 10, + "food": 200 +} \ No newline at end of file diff --git a/lib/game_logic.py b/lib/game_logic.py new file mode 100644 index 0000000..eb35dd3 --- /dev/null +++ b/lib/game_logic.py @@ -0,0 +1,35 @@ +""" +game_logic.py + +author: Caleb Scott + +Internal logic for the game world. +""" + +# IMPORTS ----------------------------------------------------------- + +import arcade +from game_config import * + +# CLASSES ----------------------------------------------------------- + +class GameLogic: + + def __init__(self, scene, starting_resources): + + # Initializes the game board (from arcade Scene) + # and starting resources + self.scene = scene + self.resources = starting_resources + + def place_structure(self, x, y): + """ + Game logic for placing a structure, if valid. + """ + pass + + def delete_structure(self, x, y): + """ + Game logic for deleting a structure, if valid. + """ + pass \ No newline at end of file diff --git a/miniopolis.py b/miniopolis.py index e4b7213..f6af681 100644 --- a/miniopolis.py +++ b/miniopolis.py @@ -9,8 +9,9 @@ First attempt to make a tile-based colony-sim game. # IMPORTS ----------------------------------------------------------- import arcade -import arcade.key + from lib.game_config import * +from lib.game_logic import GameLogic # CLASSES ----------------------------------------------------------- @@ -45,7 +46,11 @@ class GameBoard(arcade.Window): # Tiles selection self.selected_struct_tile = "[Nothing]" - self.selected_env_tile = "GroundTile" + self.selected_env_tile = GROUND + + # Structure build state + self.pressed_key = None + self.build_mode = "" # Render text for the game self.structs_text = arcade.Text( @@ -64,26 +69,71 @@ class GameBoard(arcade.Window): f"SELECTED: {self.selected_struct_tile}", start_x=TEXT_X, start_y=TEXT_Y - 3*TEXT_Y_WIDTH ) + self.mode_text = arcade.Text( + f"MODE: {self.build_mode}", + start_x=TEXT_X, start_y=TEXT_Y - 4*TEXT_Y_WIDTH + ) + + # Initialize the Game Logic class + self.game_logic = GameLogic(self.scene, STARTING_RESOURCES) + + def on_key_release(self, symbol, modifiers): + if symbol == arcade.key.ESCAPE: + self.pressed_key = None + self.build_mode = "" + else: + self.pressed_key = symbol + if self.pressed_key == arcade.key.X: + self.build_mode = "Delete Structure" + elif self.pressed_key == arcade.key.L: + self.build_mode = "Place Logger (must be on trees tile)" + elif self.pressed_key == arcade.key.C: + self.build_mode = "Place Crops" + elif self.pressed_key == arcade.key.W: + self.build_mode = "Place Hydro Power (must be adjacent to water)" + elif self.pressed_key == arcade.key.H: + self.build_mode = "Place Housing" + elif self.pressed_key == arcade.key.M: + self.build_mode = "Place Miner (must be on iron tile)" + elif self.pressed_key == arcade.key.F: + self.build_mode = "Place Factory" + elif self.pressed_key == arcade.key.J: + self.build_mode = "Place Junction" + else: + self.pressed_key = None + self.build_mode = "" def on_mouse_release(self, x, y, button, modifiers): - - # Check if button was held -- this means we place structure tiles or delete them - if button == arcade.key.X: - print("Delete!") - - # Checking structure tile type - s_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_STRUCTURES]) - if len(s_tiles) == 1: - self.selected_struct_tile = s_tiles[0].properties['type'] + if self.pressed_key == arcade.key.X: + self.game_logic.delete_structure(x, y) + elif self.pressed_key == arcade.key.L: + self.game_logic.place_structure(LOGGER, x, y) + elif self.pressed_key == arcade.key.C: + self.game_logic.place_structure(CROPS, x, y) + elif self.pressed_key == arcade.key.W: + self.game_logic.place_structure(HYDROPOWER, x, y) + elif self.pressed_key == arcade.key.H: + self.game_logic.place_structure(HOUSING, x, y) + elif self.pressed_key == arcade.key.M: + self.game_logic.place_structure(MINER, x, y) + elif self.pressed_key == arcade.key.F: + self.game_logic.place_structure(FACTORY, x, y) + elif self.pressed_key == arcade.key.J: + self.game_logic.place_structure(JUNCTION, x, y) else: - self.selected_struct_tile = "[Nothing]" + # Checking structure tile type + s_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_STRUCTURES]) + if len(s_tiles) == 1: + self.selected_struct_tile = s_tiles[0].properties['type'] + else: + self.selected_struct_tile = "[Nothing]" - # Checking environment tile type - e_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_ENVIRONMENT]) - if len(e_tiles) == 1: - self.selected_env_tile = e_tiles[0].properties['type'] - else: - self.selected_env_tile = "GroundTile" + # Checking environment tile type + e_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_ENVIRONMENT]) + if len(e_tiles) == 1: + self.selected_env_tile = e_tiles[0].properties['type'] + else: + self.selected_env_tile = GROUND def on_draw(self): """ @@ -105,6 +155,9 @@ class GameBoard(arcade.Window): self.resources_text.text = f"RESOURCES: People: 0, Iron: 0, Wood: 0, Food: 0" self.resources_text.draw() + self.mode_text.text = f"MODE: {self.build_mode}" + self.mode_text.draw() + # MAIN -------------------------------------------------------------- def main():