§
    T¿j,  ã                  ó²   — 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dl	m
Z
mZmZmZ ddlmZmZmZmZmZmZ ddlmZmZ ddlmc mZ  G d	„ d
¦  «        ZdS )z‡
Map Style Relational Service for FreeExile.
Provides query interfaces for biomes, tile mappings, props, and idempotent SQLite seeder.
é    )ÚannotationsN)Úcontextmanager)ÚPath)Ú	GeneratorÚListÚOptionalÚUnion)ÚMapStyleDefinitionÚMapStylePaletteÚMapStyleLightingÚMapStyleHazardÚMapStyleTileMappingÚMapStylePropDefinition)Úinit_dbÚSQL_PRAGMA_SETUPc                  ó–   — e Zd ZdZd$d%d„Zed&d„¦   «         Zd'd
„Zd(d)d„Ze	d*d„¦   «         Z
d+d„Zd,d„Zd-d„Zd.d„Zd/d „Zd0d"„Zd0d#„ZdS )1ÚMapStyleServiceuT   Service providing relational access to Dark Fantasy Cá»• VÃµ Hoang Vá»±c map styles.NÚdb_pathúOptional[Union[Path, str]]c                ób  — |€—t           j                             t           j                             t           j                             t
          ¦  «        ddd¦  «        ¦  «        }t          j        |d¬¦  «         t           j                             |d¦  «        }t          |¦  «        | _        d | _	        | j        dk    r,t          d¦  «        | _	        |                      d¬¦  «         d S |                      ¦   «         5 }	 d d d ¦  «         n# 1 swxY w Y   |                      d¬¦  «         d S )	Nz..ÚdataT)Úexist_okzmap_styles.dbz:memory:F)Úforce)ÚosÚpathÚabspathÚjoinÚdirnameÚ__file__ÚmakedirsÚstrr   Ú_memory_connr   Úseed_databaseÚ_get_connection)Úselfr   Úbase_dirÚconns       ú7C:\Projects\FreeExile\server\world\map_style_service.pyÚ__init__zMapStyleService.__init__   s;  € Øˆ?Ý”w—’¥r¤w§|¢|µB´G·O²OÅHÑ4MÔ4MÈtÐUYÐ[aÑ'bÔ'bÑcÔcˆHÝŒK˜¨4Ð0Ñ0Ô0Ð0Ý”g—l’l 8¨_Ñ=Ô=ˆGÝ˜7‘|”|ˆŒØ:>ˆÔàŒ<˜:Ò%Ð%Ý '¨
Ñ 3Ô 3ˆDÔØ×Ò UÐÑ+Ô+Ð+Ð+Ð+à×%Ò%Ñ'Ô'ð ¨4Øðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à×Ò UÐÑ+Ô+Ð+Ð+Ð+s   Ä DÄDÄDÚreturnú)Generator[sqlite3.Connection, None, None]c              #  ó^  K  — | j         �$| j         V — | j                              ¦   «          d S t          | j        ¦  «        }	 |V — |                     ¦   «          n## t          $ r |                     ¦   «          ‚ w xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w©N)r"   Úcommitr   r   Ú	ExceptionÚrollbackÚclose)r%   r'   s     r(   r$   zMapStyleService._get_connection,   sº   è è € àÔÐ(ØÔ#Ð#Ð#Ð#ØÔ×$Ò$Ñ&Ô&Ð&Ð&Ð&å˜4œ<Ñ(Ô(ˆDðØ�
�
�
Ø—’‘”��øÝð ð ð Ø—’‘”�Øðøøøð ð
 —
’
‘”���ø�—
’
‘”��øøøs   ÁA ÁB Á A<Á<B ÂB,ÚNonec                óX   — | j         �"| j                              ¦   «          d| _         dS dS )z&Close connection if running in-memory.N)r"   r1   )r%   s    r(   r1   zMapStyleService.close<   s6   € àÔÐ(ØÔ×#Ò#Ñ%Ô%Ð%Ø $ˆDÔÐÐð )Ð(ó    Fr   ÚboolÚintc                ó  — |                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         |                     ¦   «         }|r/|d         dk    r#|s!t	          |d         ¦  «        cddd¦  «         S t          j        ¦   «         D �]¡}|                     d|j        |j        |j	        |j
        |j        |j        |j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        |j        j        |j        j        |j        |j        |j        f¦  «         t          j        |j        ¦  «        D ]Z}|                     d|j        |j        |j        |j         |j!        |j"        |j#        |j$        |j%        |j&        |j'        f¦  «         Œ[t          j(        |j        ¦  «        D ]`}|                     d|j)        |j        |j	        |j
        |j*        |j+        |j,        |j-        |j.        |j/        |j0        |j1        f¦  «         Œa�Œ£|                     d¦  «         t	          |                     ¦   «         d         ¦  «        cddd¦  «         S # 1 swxY w Y   dS )z:Seed all 30 styles, tile mappings, and props idempotently.z&SELECT count(*) AS cnt FROM map_stylesÚcnté   Na7  
                    INSERT OR REPLACE INTO map_styles (
                        style_id, biome_code, name_vi, name_en, theme_category,
                        theme_category_name, description, floor_color_hex, wall_color_hex,
                        path_color_hex, liquid_color_hex, ambient_light_hex, fog_density,
                        movement_modifier, hazard_damage, hazard_slow_factor, asset_dir,
                        monster_family, legacy_alias
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                    a•  
                        INSERT OR REPLACE INTO map_style_tiles (
                            style_id, tile_type_id, tile_type_name, texture_filename,
                            normal_filename, texture_width, texture_height, is_seamless,
                            elevation_px, roughness, base_color_fallback
                        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                        a‘  
                        INSERT OR REPLACE INTO map_style_props (
                            prop_id, style_id, prop_name_vi, prop_name_en, sprite_key,
                            sprite_path, spawn_weight, placement_rule, blocks_movement,
                            footprint_w, footprint_h, elevation_z
                        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                        )2r$   ÚcursorÚexecuteÚfetchoner6   ÚcatalogÚlist_stylesÚstyle_idÚ
biome_codeÚname_viÚname_enÚtheme_categoryÚtheme_category_nameÚdescriptionÚpaletteÚfloorÚwallr   ÚliquidÚlightingÚambient_hexÚfog_densityÚmovement_modifierÚhazardÚdpsÚslow_factorÚ	asset_dirÚmonster_familyÚlegacy_aliasÚget_tiles_for_styleÚ	tile_codeÚtile_type_nameÚtexture_pathÚnormal_pathÚtexture_widthÚtexture_heightÚis_seamlessÚelevation_pxÚ	roughnessÚprocedural_fallback_colorÚget_props_for_styleÚprop_idÚ
sprite_keyÚsprite_pathÚspawn_weightÚplacement_ruleÚblocks_movementÚfootprint_wÚfootprint_hÚelevation_z)r%   r   r'   r:   ÚrowÚsÚtÚps           r(   r#   zMapStyleService.seed_databaseB   sÃ  € à×!Ò!Ñ#Ô#ð 9	1 tØ—[’[‘]”]ˆFØ�NŠNÐCÑDÔDÐDØ—/’/Ñ#Ô#ˆCØð '�s˜5”z RÒ'Ð'°Ð'Ý˜3˜uœ:‘”ð9	1ð 9	1ð 9	1ð 9	1ñ 9	1ô 9	1ð 9	1ð 9	1õ Ô(Ñ*Ô*ð 0ñ 0�Ø—’ðð œ
 A¤L°!´)¸Q¼YÈÔHXØÔ-¨q¬}¸a¼i¼oÈqÌyÌ~Øœ	œ¨¬	Ô(8¸!¼*Ô:PÐRSÔR\ÔRhØÔ+¨Q¬X¬\¸1¼8Ô;OÐQRÔQ\ØÔ(¨!¬.ðñô ð õ$ !Ô4°Q´ZÑ@Ô@ð ð �AØ—N’Nðð œJ¨¬°QÔ5EÀqÄ~ØœM¨1¬?¸AÔ<LÈaÌmØœN¨A¬K¸Ô9Tðñô ð ð õ !Ô4°Q´ZÑ@Ô@ð ð �AØ—N’Nðð œI q¤z°1´9¸a¼iÈÌØœM¨1¬>¸1Ô;KÈQÔM^ØœM¨1¬=¸!¼-ðñô ð ð ñð �NŠNÐCÑDÔDÐDÝ�v—’Ñ(Ô(¨Ô/Ñ0Ô0ðs9	1ð 9	1ð 9	1ð 9	1ñ 9	1ô 9	1ð 9	1ð 9	1ð 9	1ð 9	1ð 9	1ð 9	1øøøð 9	1ð 9	1ð 9	1ð 9	1ð 9	1ð 9	1s   •A"JÂG1JÊJÊ	Jri   úsqlite3.Rowr
   c                óš  — t          | d         | d         | d         | d         | d         ¬¦  «        }t          | d         d| d         ¬	¦  «        }t          | d
         | d         ¬¦  «        }t          | d         | d         | d         | d         | d         | d         | d         |||| d         | d         | d         | d         ¬¦  «        S )NÚfloor_color_hexÚwall_color_hexÚpath_color_hexÚliquid_color_hexÚambient_light_hex)rG   rH   r   rI   Úambientg      ð?rL   )rK   Ú	intensityrL   Úhazard_slow_factorÚhazard_damage)rP   rO   r?   r@   rA   rB   rC   rD   rE   rM   rQ   rR   rS   )r?   r@   rA   rB   rC   rD   rE   rF   rJ   rN   rM   rQ   rR   rS   )r   r   r   r
   )ri   ÚpalÚlightÚhazs       r(   Ú_row_to_stylezMapStyleService._row_to_style   s  € åØÐ'Ô(¨sÐ3CÔ/DØÐ%Ô&¨sÐ3EÔ/FØÐ+Ô,ð
ñ 
ô 
ˆõ
 !ØÐ/Ô0¸CØ˜MÔ*ð
ñ 
ô 
ˆõ ØÐ0Ô1°s¸?Ô7Kð
ñ 
ô 
ˆõ "Ø˜”_°°\Ô1BØ˜	”N¨C°	¬NØÐ/Ô0Ø #Ð$9Ô :Ø˜MÔ*°CÀ%Ø¨#Ð.AÔ*BØ˜+Ô&°sÐ;KÔ7LØ˜^Ô,ð	
ñ 	
ô 	
ð 		
r4   r?   r!   úOptional[MapStyleDefinition]c                ó  — |                       ¦   «         5 }|                     ¦   «         }|                     d||f¦  «         |                     ¦   «         }|r|                      |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )z2Query style by canonical style_id or legacy alias.z?SELECT * FROM map_styles WHERE style_id = ? OR legacy_alias = ?N©r$   r:   r;   r<   r{   )r%   r?   r'   r:   ri   s        r(   Ú	get_stylezMapStyleService.get_style˜   sÏ   € à×!Ò!Ñ#Ô#ð 	< tØ—[’[‘]”]ˆFØ�NŠNØQØ˜8Ð$ñô ð ð —/’/Ñ#Ô#ˆCØ.1Ð;�4×%Ò% cÑ*Ô*Ð*°tð	<ð 	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s   •AA;Á;A?ÂA?r@   c                ó  — |                       ¦   «         5 }|                     ¦   «         }|                     d|f¦  «         |                     ¦   «         }|r|                      |¦  «        ndcddd¦  «         S # 1 swxY w Y   dS )z!Query style by biome_code (1-30).z-SELECT * FROM map_styles WHERE biome_code = ?Nr~   )r%   r@   r'   r:   ri   s        r(   Úget_style_by_codez!MapStyleService.get_style_by_code£   sÃ   € à×!Ò!Ñ#Ô#ð 	< tØ—[’[‘]”]ˆFØ�NŠNÐJÈZÈMÑZÔZÐZØ—/’/Ñ#Ô#ˆCØ.1Ð;�4×%Ò% cÑ*Ô*Ð*°tð		<ð 	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s   •AA:Á:A>ÂA>úList[MapStyleDefinition]c                óò   ‡ — ‰                       ¦   «         5 }|                     ¦   «         }|                     d¦  «         ˆ fd„|                     ¦   «         D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z+Return all 30 styles ordered by biome_code.z0SELECT * FROM map_styles ORDER BY biome_code ASCc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )r{   )Ú.0Úrr%   s     €r(   ú
<listcomp>z/MapStyleService.list_styles.<locals>.<listcomp>°   s'   ø€ ÐEÐEÐE¨a�D×&Ò& qÑ)Ô)ÐEÐEÐEr4   N)r$   r:   r;   Úfetchall)r%   r'   r:   s   `  r(   r>   zMapStyleService.list_styles«   sÊ   ø€ à×!Ò!Ñ#Ô#ð 	F tØ—[’[‘]”]ˆFØ�NŠNÐMÑNÔNÐNØEÐEÐEÐE°6·?²?Ñ3DÔ3DÐEÑEÔEð	Fð 	Fð 	Fð 	Fñ 	Fô 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Føøøð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fs   –A	A,Á,A0Á3A0úList[MapStyleTileMapping]c                ó0  — t           j                             ||¦  «        }|                      ¦   «         5 }|                     ¦   «         }|                     d|f¦  «         d„ |                     ¦   «         D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z.Retrieve the 20 TileType bindings for a style.zJSELECT * FROM map_style_tiles WHERE style_id = ? ORDER BY tile_type_id ASCc                óÆ   — g | ]^}t          |d          |d         |d         |d         |d         |d         |d         |d         |d         |d	         |d
         ¬¦  «        ‘Œ_S )r?   Útile_type_idrV   Útexture_filenameÚnormal_filenameÚbase_color_fallbackrY   rZ   r[   r\   r]   ©r?   rU   rV   rW   rX   r^   rY   rZ   r[   r\   r]   )r   ©r†   r‡   s     r(   rˆ   z7MapStyleService.get_tiles_for_style.<locals>.<listcomp>»   s�   € ð 
ð 
ð 
ð õ $Ø˜zœ]°a¸Ô6GØ#$Ð%5Ô#6ÀQÐGYÔEZØ !Ð"3Ô 4ÐPQÐRgÔPhØ"# OÔ"4ÀQÐGWÔEXØ ! -Ô 0¸qÀÔ?PØ œnðñ ô ð
ð 
ð 
r4   N©r=   ÚLEGACY_BIOME_TO_STYLE_IDÚgetr$   r:   r;   r‰   ©r%   r?   Úresolvedr'   r:   s        r(   rT   z#MapStyleService.get_tiles_for_style²   sà   € åÔ3×7Ò7¸À(ÑKÔKˆØ×!Ò!Ñ#Ô#ð 	 tØ—[’[‘]”]ˆFØ�NŠNØ\Ø�ñô ð ð
ð 
ð  ŸšÑ*Ô*ð
ñ 
ô 
ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ó   µA	BÂBÂBrU   úOptional[MapStyleTileMapping]c                óö  — t           j                             ||¦  «        }|                      ¦   «         5 }|                     ¦   «         }|                     d||f¦  «         |                     ¦   «         }|s	 ddd¦  «         dS t          |d         |d         |d         |d         |d         |d         |d	         |d
         |d         |d         |d         ¬¦  «        cddd¦  «         S # 1 swxY w Y   dS )z;Retrieve single TileType mapping for a style and tile_code.zESELECT * FROM map_style_tiles WHERE style_id = ? AND tile_type_id = ?Nr?   r�   rV   rŽ   r�   r�   rY   rZ   r[   r\   r]   r‘   )r=   r”   r•   r$   r:   r;   r<   r   )r%   r?   rU   r—   r'   r:   r‡   s          r(   Úget_tile_mappingz MapStyleService.get_tile_mappingÇ   si  € åÔ3×7Ò7¸À(ÑKÔKˆØ×!Ò!Ñ#Ô#ð 	 tØ—[’[‘]”]ˆFØ�NŠNØWØ˜9Ð%ñô ð ð —’Ñ!Ô!ˆAØð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ 'Ø˜:œ°!°NÔ2CØ Ð!1Ô2ÀÐCUÔAVØÐ/Ô0ÈAÐNcÔLdØ Ô0ÀÐCSÔATØ˜mÔ,¸1¸^Ô;LØ˜Kœ.ðñ ô ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   µAC.ÂAC.Ã.C2Ã5C2úList[MapStylePropDefinition]c                ó0  — t           j                             ||¦  «        }|                      ¦   «         5 }|                     ¦   «         }|                     d|f¦  «         d„ |                     ¦   «         D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z&Retrieve decorative props for a style.z0SELECT * FROM map_style_props WHERE style_id = ?c                óÔ   — g | ]e}t          |d          |d         |d         |d         |d         |d         |d         |d         |d         |d	         |d
         |d         ¬¦  «        ‘ŒfS )r?   r`   Úprop_name_viÚprop_name_enrd   rc   rf   rg   ra   rb   re   rh   )r?   r`   rA   rB   rd   rc   rf   rg   ra   rb   re   rh   )r   r’   s     r(   rˆ   z7MapStyleService.get_props_for_style.<locals>.<listcomp>â   s’   € ð 
ð 
ð 
ð õ 'Ø˜zœ]°A°i´LØ˜nÔ-°q¸Ô7HØ#$Ð%5Ô#6ÀQÀ~ÔEVØ ! -Ô 0¸aÀÔ>NØ  œ¸A¸mÔ<LØ$%Ð&7Ô$8ÀaÈÔFVðñ ô ð
ð 
ð 
r4   Nr“   r–   s        r(   r_   z#MapStyleService.get_props_for_styleÜ   sÚ   € åÔ3×7Ò7¸À(ÑKÔKˆØ×!Ò!Ñ#Ô#ð 	 tØ—[’[‘]”]ˆFØ�NŠNÐMÐPXÈ{Ñ[Ô[Ð[ð
ð 
ð  ŸšÑ*Ô*ð
ñ 
ô 
ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	r˜   c                ó,   — |                       |¦  «        S )zAlias for get_props_for_style.)r_   )r%   r?   s     r(   Ú
list_propszMapStyleService.list_propsî   s   € à×'Ò'¨Ñ1Ô1Ð1r4   r-   )r   r   )r*   r+   )r*   r2   )F)r   r5   r*   r6   )ri   rm   r*   r
   )r?   r!   r*   r|   )r@   r6   r*   r|   )r*   r‚   )r?   r!   r*   rŠ   )r?   r!   rU   r6   r*   r™   )r?   r!   r*   rœ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r   r$   r1   r#   Ústaticmethodr{   r   r�   r>   rT   r›   r_   r¢   r…   r4   r(   r   r      s1  € € € € € Ø^Ð^ð,ð ,ð ,ð ,ð ,ð  ðð ð ñ „^ðð%ð %ð %ð %ð;1ð ;1ð ;1ð ;1ð ;1ðz ð
ð 
ð 
ñ „\ð
ð0	<ð 	<ð 	<ð 	<ð<ð <ð <ð <ðFð Fð Fð Fðð ð ð ð*ð ð ð ð*ð ð ð ð$2ð 2ð 2ð 2ð 2ð 2r4   r   )r¦   Ú
__future__r   r   Úsqlite3Ú
contextlibr   Úpathlibr   Útypingr   r   r   r	   Úserver.world.map_style_typesr
   r   r   r   r   r   Úserver.world.map_style_schemar   r   Úserver.world.map_style_catalogÚworldÚmap_style_catalogr=   r   r…   r4   r(   ú<module>r²      s?  ððð ð
 #Ð "Ð "Ð "Ð "Ð "Ø 	€	€	€	Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð DÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0ðW2ð W2ð W2ð W2ð W2ñ W2ô W2ð W2ð W2ð W2r4   