§
    ¿jƒ  ã                  óN   — d Z ddlmZ ddlZddlZddlmZ ddlmZ dZ	dZ
dd„ZdS )zŽ
Map Style Relational Schema and DDL for FreeExile.
Defines SQLite tables with strict foreign keys, CHECK constraints, WAL mode, and indices.
é    )ÚannotationsN)ÚPath)ÚUnionzS
PRAGMA foreign_keys = ON;
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
aã  
CREATE TABLE IF NOT EXISTS map_styles (
    style_id TEXT PRIMARY KEY,
    biome_code INTEGER NOT NULL UNIQUE CHECK (biome_code BETWEEN 1 AND 255),
    name_vi TEXT NOT NULL,
    name_en TEXT NOT NULL,
    theme_category TEXT NOT NULL CHECK (theme_category IN (
        'HOANG_DA_DA_NGOAI', 'DAM_LAY_DOC_CHUONG', 'HEM_NUI_COT_MAC',
        'HAM_MO_TA_QUAI', 'THAN_DIEN_PHE_TICH', 'HU_KHONG_DI_BIEN'
    )),
    theme_category_name TEXT NOT NULL,
    description TEXT NOT NULL,
    floor_color_hex TEXT NOT NULL,
    wall_color_hex TEXT NOT NULL,
    path_color_hex TEXT NOT NULL,
    liquid_color_hex TEXT NOT NULL,
    ambient_light_hex TEXT NOT NULL,
    fog_density REAL NOT NULL DEFAULT 0.30 CHECK (fog_density BETWEEN 0.0 AND 1.0),
    movement_modifier REAL NOT NULL DEFAULT 1.0 CHECK (movement_modifier > 0.0),
    hazard_damage INTEGER NOT NULL DEFAULT 0 CHECK (hazard_damage >= 0),
    hazard_slow_factor REAL NOT NULL DEFAULT 1.0 CHECK (hazard_slow_factor >= 1.0),
    asset_dir TEXT NOT NULL,
    monster_family TEXT NOT NULL,
    legacy_alias TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS map_style_tiles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    style_id TEXT NOT NULL REFERENCES map_styles(style_id) ON DELETE CASCADE,
    tile_type_id INTEGER NOT NULL CHECK (tile_type_id BETWEEN 0 AND 19),
    tile_type_name TEXT NOT NULL,
    texture_filename TEXT NOT NULL,
    normal_filename TEXT NOT NULL,
    texture_width INTEGER NOT NULL DEFAULT 128 CHECK (texture_width IN (64, 128, 256, 512)),
    texture_height INTEGER NOT NULL DEFAULT 64 CHECK (texture_height IN (32, 64, 128, 256, 512)),
    is_seamless INTEGER NOT NULL DEFAULT 1 CHECK (is_seamless IN (0, 1)),
    elevation_px INTEGER NOT NULL DEFAULT 0,
    roughness REAL NOT NULL DEFAULT 0.8 CHECK (roughness BETWEEN 0.0 AND 1.0),
    base_color_fallback TEXT NOT NULL,
    UNIQUE(style_id, tile_type_id)
);

CREATE TABLE IF NOT EXISTS map_style_props (
    prop_id TEXT PRIMARY KEY,
    style_id TEXT NOT NULL REFERENCES map_styles(style_id) ON DELETE CASCADE,
    prop_name_vi TEXT NOT NULL,
    prop_name_en TEXT NOT NULL,
    sprite_key TEXT NOT NULL,
    sprite_path TEXT NOT NULL,
    spawn_weight REAL NOT NULL CHECK (spawn_weight > 0.0 AND spawn_weight <= 1.0),
    placement_rule TEXT NOT NULL CHECK (placement_rule IN (
        'FLOOR_EDGE', 'WALL_ADJACENT', 'DEAD_END', 'PATH_SIDE', 'ANY_FLOOR', 'ARENA_PERIMETER'
    )),
    blocks_movement INTEGER NOT NULL DEFAULT 0 CHECK (blocks_movement IN (0, 1)),
    footprint_w INTEGER NOT NULL DEFAULT 1 CHECK (footprint_w >= 1),
    footprint_h INTEGER NOT NULL DEFAULT 1 CHECK (footprint_h >= 1),
    elevation_z INTEGER NOT NULL DEFAULT 0
);

CREATE INDEX IF NOT EXISTS idx_map_styles_biome_code ON map_styles(biome_code);
CREATE INDEX IF NOT EXISTS idx_map_styles_theme ON map_styles(theme_category);
CREATE INDEX IF NOT EXISTS idx_map_style_tiles_style ON map_style_tiles(style_id);
CREATE INDEX IF NOT EXISTS idx_map_style_props_style ON map_style_props(style_id);
Údb_pathúUnion[Path, str]Úreturnúsqlite3.Connectionc                ó²  — t          | ¦  «        }|dk    rTt          j                             t          j                             |¦  «        ¦  «        }|rt          j        |d¬¦  «         t          j        |¦  «        }t          j        |_	        | 
                    t          ¦  «         | 
                    t          ¦  «         |                     ¦   «          |S )zQInitialize SQLite database with strict pragmas, tables, and indices idempotently.z:memory:T)Úexist_ok)ÚstrÚosÚpathÚdirnameÚabspathÚmakedirsÚsqlite3ÚconnectÚRowÚrow_factoryÚexecutescriptÚSQL_PRAGMA_SETUPÚSQL_CREATE_TABLESÚcommit)r   Úpath_strÚparentÚconns       ú6C:\Projects\FreeExile\server\world\map_style_schema.pyÚinit_dbr   U   s«   € å�7‰|Œ|€HØ�:ÒÐÝ”—’¥¤§¢°Ñ!:Ô!:Ñ;Ô;ˆØð 	/ÝŒK˜¨Ð.Ñ.Ô.Ð.ÝŒ?˜8Ñ$Ô$€DÝ”{€DÔØ×ÒÕ'Ñ(Ô(Ð(Ø×ÒÕ(Ñ)Ô)Ð)Ø‡K‚K�M„M€MØ€Kó    )r   r   r   r	   )Ú__doc__Ú
__future__r   r   r   Úpathlibr   Útypingr   r   r   r   © r   r   ú<module>r%      s‰   ððð ð
 #Ð "Ð "Ð "Ð "Ð "Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðÐ ð@Ð ðFð ð ð ð ð r   