DasTetris/tetris_config.py

188 lines
4.5 KiB
Python

import dataclasses
import json
import os.path
import sys
from enum import Enum
import pygame
from Serializer import EnumSerializer
CONFIG_JSON = 'configs/config.json'
CONFIG_BLOCKS_JSON = 'configs/blocks.json'
CONFIG_ADD_BLOCKS_JSON = 'configs/blocks_ADD.json'
@dataclasses.dataclass
class Block:
name: str
color: tuple[int, int, int]
min_score: int
shapes: list
class BlockType(Enum):
"""
Define block types with their shapes and colors
All shapes draws starting in top left corner from left to right
Every line mean the share rotated in clockwise direction
"""
O = {
'name': 'Square',
'color': (255, 255, 0), # Yellow
'min_score': 0,
'shapes': [
[
[1, 1],
[1, 1]
]
]
}
I = {
'name': 'Line',
'color': (0, 255, 255), # Cyan
'min_score': 0,
'shapes': [
[[1, 1, 1, 1]],
[[1], [1], [1], [1]]
]
}
L = {
'name': 'L-Shape',
'color': (255, 0, 255), # Magenta
'min_score': 0,
'shapes': [
[[1, 0], [1, 0], [1, 1]],
[[1, 1, 1], [1, 0, 0]],
[[1, 1], [0, 1], [0, 1]],
[[0, 0, 1], [1, 1, 1]]
]
}
J = {
'name': 'J-Shape',
'color': (0, 0, 255), # Blue
'min_score': 900,
'shapes': [
[[0, 1], [0, 1], [1, 1]],
[[1, 0, 0], [1, 1, 1]],
[[1, 1], [1, 0], [1, 0]],
[[1, 1, 1], [0, 0, 1]]
]
}
S = {
'name': 'S-Shape',
'color': (0, 255, 0), # Green
'min_score': 1000,
'shapes': [
[[0, 1, 1], [1, 1, 0]],
[[1, 0], [1, 1], [0, 1]]
]
}
Z = {
'name': 'Z-Shape',
'color': (255, 0, 0), # Red
'min_score': 2500,
'shapes': [
[[1, 1, 0], [0, 1, 1]],
[[0, 1], [1, 1], [1, 0]]
]
}
T = {
'name': 'T-Shape',
'color': (255, 255, 255), # White
'min_score': 2500,
'shapes': [
[[1, 1, 1], [0, 1, 0]],
[[1, 0], [1, 1], [1, 0]],
[[0, 1, 0], [1, 1, 1]],
[[0, 1], [1, 1], [0, 1]]
]
}
BLOCK_TYPE = BlockType
# Key configuration
KEY_CONFIG = {
'left': pygame.K_LEFT,
'right': pygame.K_RIGHT,
'rotate': pygame.K_UP,
'drop': pygame.K_DOWN,
'pause': pygame.K_p,
'restart': pygame.K_r,
'exit': pygame.K_ESCAPE
}
CONTROLS_TEXT = [
"Controls:",
"Left/Right Move",
"Up - Rotate",
"Dn - Drop",
"P - Pause",
"R - Restart",
"ESC - Exit"
]
# Store width configuration
STORE_WIDTH = 10 # number of blocks wide
BLOCK_SIZE = 30 # pixels per block
# Colors
COLORS = {
'background': (20, 20, 40),
'field': (30, 30, 60),
'border': (100, 100, 150),
'text': (255, 255, 255),
'game_over': (255, 0, 0)
}
HIGH_SCORE_INC_SPEED = False
def store_config():
blocks_to_save = {'ALL_BLOCKS': BlockType}
es = EnumSerializer()
es.save_to_file(blocks_to_save, CONFIG_BLOCKS_JSON)
config_to_save = {
'CONFIG': {
'keys': KEY_CONFIG,
'controls_text': CONTROLS_TEXT,
'colors': COLORS,
'store_width': STORE_WIDTH,
'block_size': BLOCK_SIZE
}
}
es.save_to_file(config_to_save, CONFIG_JSON)
def load_config():
global KEY_CONFIG, COLORS, CONTROLS_TEXT, STORE_WIDTH, BLOCK_SIZE, BLOCK_TYPE, HIGH_SCORE_INC_SPEED
es = EnumSerializer
if not os.path.isfile(CONFIG_JSON) or not os.path.isfile(CONFIG_JSON) :
print('No config files was found')
sys.exit(10)
config_data = es.load_from_file(CONFIG_JSON)
KEY_CONFIG = config_data['CONFIG']['keys']
CONTROLS_TEXT = config_data['CONFIG']['controls_text']
COLORS = config_data['CONFIG']['colors']
STORE_WIDTH = config_data['CONFIG']['store_width']
BLOCK_SIZE = config_data['CONFIG']['block_size']
HIGH_SCORE_INC_SPEED = True if str(config_data['CONFIG']['high_score_inc_speed']).lower() == 'true' else False
with open(CONFIG_BLOCKS_JSON) as block_fd:
blocks_data = json.load(block_fd)
blocks0 = blocks_data['ALL_BLOCKS']['members']
blocks1 = {}
if os.path.isfile(CONFIG_ADD_BLOCKS_JSON):
with open(CONFIG_ADD_BLOCKS_JSON) as block_fd:
blocks_data1 = json.load(block_fd)
blocks1 = blocks_data1['ADDITIONAL_BLOCKS']['members']
blocks = blocks0 | blocks1
BLOCK_TYPE = Enum('BlockType', blocks)
if __name__ == '__main__':
pass