miniopolis/lib/engine/game_logic.py

124 lines
5.1 KiB
Python
Raw Permalink Normal View History

2025-01-22 12:34:51 -05:00
"""
game_logic.py
author: Caleb Scott
2025-02-04 14:43:54 -05:00
Internal logic for the game world. This doesn't work with setting
visual elements; this is handles in the scene/ python files
2025-01-22 12:34:51 -05:00
"""
# IMPORTS -----------------------------------------------------------
from global_config import *
2025-02-05 15:33:07 -05:00
from lib.engine.game_config import *
from lib.engine.game_board import LayeredFlatWorld
from lib.engine.game_objects import str_to_game_object
2025-02-05 15:33:07 -05:00
# FUNCTIONS ---------------------------------------------------------
def init_gb_from_scene_info(scene_info: dict):
"""
Takes a dictionary of 2D arrays (organized by layer name), and
converts them into their proper game board of game objects.
"""
board_layers = {}
for layer in scene_info.keys():
board_layers[layer] = [[None] * BOARD_HEIGHT for _ in range(BOARD_WIDTH)]
for i in range(BOARD_WIDTH):
for j in range(BOARD_HEIGHT):
board_layers[layer][i][j] = str_to_game_object(scene_info[layer][i][j])
return board_layers
2025-01-22 12:34:51 -05:00
# CLASSES -----------------------------------------------------------
class GameLogic:
2025-02-05 15:33:07 -05:00
def __init__(self, layers, starting_resources=STARTING_RESOURCES):
2025-01-22 12:34:51 -05:00
# Initializes the game board (from arcade Scene)
# and starting resources
2025-02-05 15:33:07 -05:00
self.game_board = LayeredFlatWorld(layers)
2025-01-22 12:34:51 -05:00
self.resources = starting_resources
2025-02-05 15:33:07 -05:00
# def place_structure(self, struct_type, x, y):
# """
# Game logic for placing a structure, if valid.
# """
# # First check and see if we already have a structure there.
# s_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_STRUCTURES])
# if len(s_tiles) == 1:
# return "Structure already in this space."
2025-01-22 14:51:13 -05:00
2025-02-05 15:33:07 -05:00
# # Get the centered location of the tile chosen
# # We use the environment layer instead to determine if placement
# # is legal.
# e_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_ENVIRONMENT])
# if len(e_tiles) == 1:
# print(e_tiles[0].properties)
# env_tile_type = e_tiles[0].properties['class']
# c_x, c_y = e_tiles[0].center_x, e_tiles[0].center_y
2025-01-22 14:51:13 -05:00
2025-02-05 15:33:07 -05:00
# # Determine what sprite object to place
# if struct_type == LOGGER:
# if env_tile_type == TREES:
# logger_sprite = LoggerTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, logger_sprite)
# return ""
# else:
# return "Logger must be placed on trees tile."
# elif struct_type == CROPS:
# if env_tile_type == GROUND:
# crops_sprite = CropsTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, crops_sprite)
# return ""
# else:
# return "Crops must be placed on a ground tile."
# elif struct_type == HYDROPOWER:
# if env_tile_type == WATER:
# hydro_sprite = HyroPowerTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, hydro_sprite)
# return ""
# else:
# return "Hydro Power must be placed on a water tile."
# elif struct_type == HOUSING:
# if env_tile_type == GROUND:
# housing_sprite = HousingTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, housing_sprite)
# return ""
# else:
# return "Housing must be placed on a ground tile."
# elif struct_type == MINER:
# if env_tile_type == IRON:
# miner_sprite = MinerTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, miner_sprite)
# return ""
# else:
# return "Miner must be placed on an iron tile."
# elif struct_type == FACTORY:
# if env_tile_type == GROUND:
# factory_sprite = FactoryTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, factory_sprite)
# return ""
# else:
# return "Factory must be placed on a ground tile."
# elif struct_type == JUNCTION:
# if env_tile_type == GROUND:
# junction_sprite = JunctionTile(c_x, c_y)
# self.scene.add_sprite(LAYER_STRUCTURES, junction_sprite)
# return ""
# else:
# return "Junctions must be placed on a ground tile."
# else:
# return ""
2025-01-22 12:34:51 -05:00
2025-02-05 15:33:07 -05:00
# def delete_structure(self, x, y):
# """
# Game logic for deleting a structure, if valid.
# """
# s_tiles = arcade.get_sprites_at_point((x,y), self.scene[LAYER_STRUCTURES])
# if len(s_tiles) == 1:
# struct_sprites = self.scene[LAYER_STRUCTURES]
# struct_sprites.remove(s_tiles[0])
# return ""
# else:
# return "No structure on that space."