diff --git a/.gitignore b/.gitignore index 15201ac..5b88fa5 100644 --- a/.gitignore +++ b/.gitignore @@ -169,3 +169,14 @@ cython_debug/ # PyPI configuration file .pypirc + +# Custom Omissions +maps/*.tiled-project +maps/*.tiled-session +maps/*.tsx +maps/*.tmx + +res/*.aseprite + +template.py +test-demo.py diff --git a/maps/default-map.json b/maps/default-map.json new file mode 100644 index 0000000..1d0f16c --- /dev/null +++ b/maps/default-map.json @@ -0,0 +1,86 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":false, + "layers":[ + { + "data":[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 2, 2, 2, 4, 4, 4, 4, 4, 4, 2, 2, 4, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 4, 4, 3, + 3, 4, 1, 1, 4, 4, 2, 4, 4, 4, 4, 4, 2, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 4, 4, 3, + 3, 4, 1, 1, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 2, 4, 4, 4, 4, 2, 2, 2, 4, 4, 3, + 3, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, + 3, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 3, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, + 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 3, + 3, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 3, + 3, 4, 1, 1, 1, 4, 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 3, + 3, 4, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 3, + 3, 4, 4, 1, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + "height":20, + "id":1, + "name":"Environment", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 12, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":20, + "id":5, + "name":"Structures", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }], + "nextlayerid":12, + "nextobjectid":3, + "orientation":"orthogonal", + "renderorder":"right-up", + "tiledversion":"1.11.1", + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "source":"world-tiles.tsx" + }, + { + "firstgid":5, + "source":"bulidings.tsx" + }], + "tilewidth":32, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/res/connector.png b/res/connector.png new file mode 100644 index 0000000..4a83d7b Binary files /dev/null and b/res/connector.png differ diff --git a/res/crops.png b/res/crops.png new file mode 100644 index 0000000..cd9eee9 Binary files /dev/null and b/res/crops.png differ diff --git a/res/factory.png b/res/factory.png new file mode 100644 index 0000000..0cb277a Binary files /dev/null and b/res/factory.png differ diff --git a/res/ground.png b/res/ground.png new file mode 100644 index 0000000..56c4f54 Binary files /dev/null and b/res/ground.png differ diff --git a/res/housing.png b/res/housing.png new file mode 100644 index 0000000..5309aa7 Binary files /dev/null and b/res/housing.png differ diff --git a/res/hydropower.png b/res/hydropower.png new file mode 100644 index 0000000..8ff7ef0 Binary files /dev/null and b/res/hydropower.png differ diff --git a/res/iron.png b/res/iron.png new file mode 100644 index 0000000..e27c67f Binary files /dev/null and b/res/iron.png differ diff --git a/res/logger.png b/res/logger.png new file mode 100644 index 0000000..b86d532 Binary files /dev/null and b/res/logger.png differ diff --git a/res/miner.png b/res/miner.png new file mode 100644 index 0000000..b78ac6f Binary files /dev/null and b/res/miner.png differ diff --git a/res/powerpole.png b/res/powerpole.png new file mode 100644 index 0000000..c34e6be Binary files /dev/null and b/res/powerpole.png differ diff --git a/res/trees.png b/res/trees.png new file mode 100644 index 0000000..76d0b1f Binary files /dev/null and b/res/trees.png differ diff --git a/res/water.png b/res/water.png new file mode 100644 index 0000000..6aad42f Binary files /dev/null and b/res/water.png differ diff --git a/tile-demo.py b/tile-demo.py new file mode 100644 index 0000000..70c426e --- /dev/null +++ b/tile-demo.py @@ -0,0 +1,151 @@ + +""" +tile-demo.py + +author: Caleb Scott + +Attempting to make a tile-based layout for a colony-sim game. +""" + +# IMPORTS ----------------------------------------------------------- + +import arcade + +# CONSTANTS --------------------------------------------------------- + +# Sizing +TILE_SCALE = 1.0 + +# Screen constants +SCREEN_WIDTH = 960 +SCREEN_HEIGHT = 960 +SCREEN_TITLE = "ColonySim Tiles Demo" + +# World size +WORLD_WIDTH = 960 +WORLD_HEIGHT = 640 + +# Text placement +TEXT_X = 10 +TEXT_Y = SCREEN_HEIGHT - 30 +TEXT_Y_WIDTH = 30 + +# Resources dir +RES = "res/" + +# Maps dir + map presets +MAPS = "maps/" +TEST_MAP = MAPS + "default-map.json" + +# Layers for Map +LAYER_STRUCTURES = "Structures" +LAYER_ENVIRONMENT = "Environment" + +# CLASSES ----------------------------------------------------------- + +class HousingTile(arcade.Sprite): + + def __init__(self): + # Basic type attributes + self.type = "Housing" + + self.image_file_name = RES + "housing.png" + super().__init__(self.image_file_name, TILE_SCALE) + +class GameBoard(arcade.Window): + + def __init__(self, width, height, title): + + # Basic setup for size of window + default background + super().__init__(width, height, title) + arcade.set_background_color(arcade.color.BLACK) + + def setup(self): + """ + Used for starting up the game board + """ + # Obtain world tilemap + # Layer options come from https://api.arcade.academy/en/platformer_tutorial_revamp/tutorials/platform_tutorial/step_12.html + layer_options = { + LAYER_ENVIRONMENT: { + "use_spatial_hash": True + }, + LAYER_STRUCTURES: { + "use_spatial_hash": True + } + } + self.tile_map = arcade.load_tilemap( + TEST_MAP, + scaling=TILE_SCALE, + layer_options=layer_options + ) + self.scene = arcade.Scene.from_tilemap(self.tile_map) + + # Tiles selection + self.selected_struct_tile = "[Nothing]" + self.selected_env_tile = "GroundTile" + + # Render text for the game + self.structs_text = arcade.Text( + "STRUCTURES: [L]ogger [C]rops [W]ater Power [H]ousing [M]iner [F]actory [J]unction", + start_x=TEXT_X, start_y=TEXT_Y + ) + self.commands_text = arcade.Text( + "COMMANDS: [X] - Delete", + start_x=TEXT_X, start_y=TEXT_Y - TEXT_Y_WIDTH + ) + self.resources_text = arcade.Text( + "RESOURCES: People: 0, Iron: 0, Wood: 0, Crops: 0", + start_x=TEXT_X, start_y=TEXT_Y - 2*TEXT_Y_WIDTH + ) + self.tile_text = arcade.Text( + f"SELECTED: {self.selected_struct_tile}", + start_x=TEXT_X, start_y=TEXT_Y - 3*TEXT_Y_WIDTH + ) + + def on_mouse_release(self, x, y, button, modifiers): + """ + On mouse click, get the tiles over the mouse. + """ + + # 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" + + def on_draw(self): + """ + Screen rendering + """ + # Refresh + self.clear() + + # Draw the world tiles + self.scene.draw() + + # Draw updated text + self.structs_text.draw() + self.commands_text.draw() + self.resources_text.draw() + + self.tile_text.text = f"SELECTED: {self.selected_struct_tile} on {self.selected_env_tile}" + self.tile_text.draw() + +# MAIN -------------------------------------------------------------- + +def main(): + window = GameBoard(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + window.setup() + arcade.run() + +if __name__ == "__main__": + main() \ No newline at end of file