Ë
    ðÆj¸  ã            	      ó†  — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ed«      Z
 ej                  dej                  «      Z ej                  dej                  «      Z ej                  d	ej                  «      Zd
 ej                  dej                  «      fd ej                  dej                  «      fd ej                  dej                  «      fd ej                  dej                  «      ffZd ej                  dej                  «      fd ej                  dej                  «      fd ej                  dej                  «      fd ej                  dej                  «      fd ej                  dej                  «      ffZd)d*d„Zd)d+d„Zd)d*d„Zd)d*d „Zd,d!„Zd-d"„Zd.d#„Zd$d%d&œZd/d'„Zde
fd0d(„Zy)1aÑ  The Town: settlements for a custom 3D game (villages, hamlets, towns and cities of the medieval and Breton styles).

A custom 3D game whose words name a settlement (a village, a hamlet, a castle town, a tavern, a smithy, a cathedral...)
gets the town kit (JavaScript ES modules, built by `tools/pack/pack_townkit.sh`) and its style's
models and textures as attachments, and the builder contract joins the brief. The builder places houses from the kit
with `settle` + `buildSettlement` (SETTLEMENT.md) instead of drawing them from boxes. The Engine stages attachments at
`.forge/attachments/att<N>/original.<ext>` in order, like games_garage and games_library. A missing bundle = no town kit,
the build goes on as before.
é    )ÚannotationsN)ÚPath)ÚAnyz/srv/forge-assets/distzk\b(breton|bretons|brittany|britanny|bretagne|finistere|morbihan|fishing (?:village|town|port|harbou?r)s?)\ba1  \b(medieval|mediaeval|middle ages?|fantasy (?:town|village|city|kingdom|realm)s?|castle towns?|kingdom(?! hearts)|kingdoms|knights?|knightly|taverns?|blacksmiths?|smithy|smithies|bakery|bakeries|market towns?|cathedrals?|abbeys?|monasteries|monastery|peasants?|feudal|hamlets?|villages?|serfs?|thatched)\baV  \b(space|spaceships?|starships?|sci-?fi|galax\w*|asteroids?|aliens?|cyber\w*|modern city|downtown|skyscrapers?|metropolis|new york|hong kong|racing (?:circuit|track)|race ?tracks?|grand prix|formula (?:1|one)|football|soccer|basketball|baseball|tennis|golf\w*|skate\w*|supermarkets?|airports?|office blocks?|shopping (?:mall|centre|center))\bÚcityz9\b(cities|city|capitals?|cathedrals?|walled|metropolis)\bÚtownz\b(towns?)\bÚvillagez\b(villages?)\bÚhamletz\b(hamlets?)\bÚcoastzD\b(coasts?|coastal|seaside|shore|shoreline|harbou?rs?|bay|cliffs?)\bÚriverz7\b(rivers?|riverside|streams?|fords?|lakes?|springs?)\bÚhillz4\b(hills?|hilltops?|hillsides?|mountains?|perched)\bÚspurz!\b(spurs?|ridges?|promontor\w*)\bÚ
crossroadsz6\b(crossroads?|crossings?|junctions?|intersections?)\bÚ c                óP  — t        | dd «      }t        | dd«      t        | dd«      t        | dd«      t        | dd«      t        | dd«      dj                  t        | d	d «      xs g «      t        |d
d «      xs dt        |dd «      xs d|xs dg	}dj                  d„ |D «       «      S )NÚworldÚtitler   ÚpitchÚgenreÚ	core_loopÚfirst_versionú ÚmoodÚsettingÚlookc              3  ó8   K  — | ]  }|sŒt        |«      –— Œ y ­w)N)Ústr)Ú.0Úps     úE/home/claude-agent/forge-build/forge-assets/omg/factory/games_town.pyú	<genexpr>z_card_text.<locals>.<genexpr>4   s   è ø€ Ò/˜qªQ”C˜—FÑ/ùs   ‚Š)ÚgetattrÚjoin)ÚcardÚpromptr   Úpartss       r   Ú
_card_textr&   /   s´   € Ü�D˜' 4Ó(€EÜ�T˜7 BÓ'¬°°wÀÓ)CÄWÈTÐSZÐ\^ÓE_ÔahÐimÐozÐ|~ÓaÜ�T˜?¨BÓ/°·±¼'À$ÈÐPTÓ:UÒ:[ÐY[Ó1\Ü�U˜I tÓ,Ò2°´G¸EÀ6È4Ó4PÒ4VÐTVÐX^ÒXdÐbdðf€Eð �8‰8Ñ/ EÔ/Ó/Ð/ó    c                ó    — t        | |«      }t        j                  |«      ryt        j                  |«      ryt        j                  |«      ryy)zt'breton', 'medieval' or None, deterministic from the words. Modern, space and sport words win over settlement words.NÚbretonÚmedieval)r&   Ú_NOT_TOWN_REÚsearchÚ_KIND_BRETON_REÚ_KIND_MEDIEVAL_RE)r#   r$   Útexts      r   Ú	town_kindr0   7   sD   € ä�d˜FÓ#€DÜ×Ñ˜4Ô ØÜ×Ñ˜dÔ#ØÜ×Ñ Ô%ØØr'   c                ób   — t        | |«      }t        D ]  \  }}|j                  |«      sŒ|c S  y)zj'hamlet', 'village', 'town' or 'city'. The largest word wins; a settlement with no size word is a village.r   )r&   Ú_TIER_WORDSr,   )r#   r$   r/   ÚtierÚpatterns        r   Ú	town_tierr5   C   s7   € ä�d˜FÓ#€DÜ$ò ‰ˆˆgØ�>‰>˜$ÕØŠKðð r'   c                ób   — t        | |«      }t        D ]  \  }}|j                  |«      sŒ|c S  y)zj'coast', 'river', 'hill', 'spur', 'crossroads' or 'plain': water first, then high ground, then a crossing.Úplain)r&   Ú_SITE_WORDSr,   )r#   r$   r/   Úsiter4   s        r   Ú	town_siter:   L   s7   € ä�d˜FÓ#€DÜ$ò ‰ˆˆgØ�>‰>˜$ÕØŠKðð r'   c                óŽ   — t        | dd «      }t        | dd «      dk(  xr' t        | dd «      dk(  xr |d uxr t        |dd «      dv S )Nr   ÚlaneÚcustomÚstageÚnoneÚview)ÚfirstÚthirdÚtop)r!   )r#   r   s     r   Ú	town_fitsrD   U   se   € Ü�D˜' 4Ó(€EÜ�D˜& $Ó'¨8Ñ3ò J¼ÀÀgÈtÓ8TÐX^Ñ8^ò JÐchÐptÐctò JÜ˜˜v tÓ,Ð0IÐIðKr'   c                óô   — 	 | dz  j                  «       j                  «       xs dS # t        $ r Y nw xY w	 t        j                  | dz  j                  «       «      j                  «       S # t        $ r Y yw xY w)zfsha256 of the code tarball (the one `townkit.sha` names), for meta; None when the kit is not vendored.ztownkit.shaNútownkit.tar.gz)Ú	read_textÚstripÚOSErrorÚhashlibÚsha256Ú
read_bytesÚ	hexdigest)Ú
assets_dirs    r   Útown_sharO   [   sy   € ðØ˜]Ñ*×5Ñ5Ó7×=Ñ=Ó?ÒGÀ4ÐGøÜò ÙðúðÜ�~‰~˜zÐ,<Ñ<×HÑHÓJÓK×UÑUÓWÐWøÜò Ùðús   ‚$' §	3²3·3A+ Á+	A7Á6A7c                óV   — d| › d�t        j                  |«      j                  «       z   S )Nzdata:z;base64,)Úbase64Ú	b64encodeÚdecode)ÚmimeÚdatas     r   Ú	_data_urlrV   g   s*   € Ø�4�&˜Ð!¤F×$4Ñ$4°TÓ$:×$AÑ$AÓ$CÑCÐCr'   zpMedieval style: timber-framed and stone houses with tile roofs, Romanesque and Gothic churches, walls and gates.zmBreton style: granite and slate houses with blue-grey slate roofs and painted timber, a fishing-village look.)r*   r)   c                ó˜   — d| z   dz   |z   dz   |z   dz   | z   dz   |z   dz   t         |   z   dz   |z   dz   |z   d	z   |z   d
z   |z   dz   |z   dz   S )zXThe builder contract for the town kit. code_id / models_id are attachment ids (att2...).z0 SETTLEMENTS COME FROM OUR TOWN KIT. Attachment zQ is the town kit (JavaScript ES modules, three.js, a gzipped tar) and attachment z holds its zm style models and textures (a gzipped tar). First run: `mkdir -p src/lib/town && tar -xzf .forge/attachments/z;/original.* -C src/lib/town && tar -xzf .forge/attachments/z[/original.* -C public`, then read `src/lib/town/TOWN.md` and `src/lib/town/SETTLEMENT.md`. z This world is a z on a zy: build the whole world with ONE call: `const town = await createTown(THREE, { renderer, GLTFLoader, KTX2Loader, style: 'z
', tier: 'z
', site: 'a“  ', seed })` from `@/lib/town/index.mjs` (three.js loaders from three/addons; kits load from /town/kits/, the KTX2 decoder from /town/basis/), then `scene.add(town.group)`. Never draw houses, walls, roads or churches from boxes: the kit places them. Spawn the player at `town.spawn` (the main square). Collide with `town.colliders`. Walk on `town.heightAt(x, z)`. Do not edit src/lib/town or public/town.)Ú_STYLE_NOTES)Úcode_idÚ	models_idÚkindr3   r9   s        r   Útown_contractr\   q   sý   € ð 	;¸WÑDð H'ñ 	'Ø)2ñ	3Ø5Bñ	CØEIñ	JðMRñ	RàT[ñ	\ð_'ñ	'ð *3ñ	3ð6)ñ	)ô ,8¸Ñ+=ñ		>ð ATñ		Tð W[ñ		[ð ^fñ		fð imñ		mðpBñ		Bð
 EIñ	Ið
Lñ	ð ñ	ð (ñ	(ð +/ñ	/ð2[ñ		[ðr'   c                ó”  — t        | «      syt        | |«      }|€y	 |dz  j                  «       }|d|› d�z  j                  «       }d|dz   › �d|dz   › �}}t	        d|«      dd	d
dœt	        d|«      d|› d�d|› d�ddœg}	t        | |«      t        | |«      }}
t        ||||
|«      }|	|||
|t        |«      dœfS # t        $ r Y yw xY w)a  (attachments, contract, meta) or None. first_index = attachments already in the brief (the Engine numbers att1,
    att2... in list order). None when the game has no settlement or a bundle is missing: the town kit is a bonus, never a
    reason to fail a build.NrF   ztownkit-z.tar.gzÚatté   é   zapplication/gzipzTown kit (JavaScript, three.js)z/code to extract into src/lib/town and use as is)ÚurlÚfilenameÚaltÚrolezTown kit models and textures (z style)z+models to extract into public (public/town))r[   r3   r9   Úsha)	rD   r0   rL   rI   rV   r5   r:   r\   rO   )r#   Úfirst_indexr$   rN   r[   ÚcodeÚmodelsrY   rZ   Úattsr3   r9   Úcontracts                r   Útown_attachmentsrk   �   s"  € ô �TŒ?ØÜ�T˜6Ó"€DØ€|ØðØÐ-Ñ-×9Ñ9Ó;ˆØ ¨$¨¨wÐ7Ñ7×CÑCÓEˆð ˜{¨Q™Ð/Ð0°C¸Àa¹Ð7HÐ2IˆY€GäÐ,¨dÓ3ÐAQÐZ{ØBñ	DäÐ,¨fÓ5ÀXÈdÈVÐSZÐC[Ø0°°°gÐ>ÐHuñ	wð€Dô ˜4 Ó(¬)°D¸&Ó*Aˆ$€DÜ˜W i°°t¸TÓB€HØ� D°$ÀÌXÐV`ÓMaÑbÐbÐbøô ò Ùðús   �*B; Â;	CÃC)r   )r#   r   r$   r   Úreturnr   )r#   r   r$   r   rl   ú
str | None)r#   r   rl   Úbool)rN   r   rl   rm   )rT   r   rU   Úbytesrl   r   )rY   r   rZ   r   r[   r   r3   r   r9   r   rl   r   )
r#   r   rf   Úintr$   r   rN   r   rl   z-tuple[list[dict[str, Any]], str, dict] | None)Ú__doc__Ú
__future__r   rQ   rJ   ÚreÚpathlibr   Útypingr   ÚDISTÚcompileÚIr-   r.   r+   r2   r8   r&   r0   r5   r:   rD   rO   rV   rX   r\   rk   © r'   r   ú<module>rz      sÛ  ðñõ #ã Û Û 	Ý Ý áÐ$Ó%€à�"—*‘*ØrÐtv×txÑtxóz€à�B—J‘JðHàIKÏÉóOÐ ð ˆr�z‰zðràsu×swÑswóy€ð ˆZˆR�Z‰ZÐTÐVX×VZÑVZÓ[Ð\ØˆZˆR�Z‰Z˜¨¯©Ó.Ð/Ø�
�—
‘
Ð-¨r¯t©tÓ4Ð5Øˆzˆr�z‰zÐ+¨R¯T©TÓ2Ð3ð	€ð ˆjˆb�j‰jÐ`Ðbd×bfÑbfÓgÐhØˆjˆb�j‰jÐSÐUW×UYÑUYÓZÐ[ØˆZˆR�Z‰ZÐOÐQS×QUÑQUÓVÐWØˆZˆR�Z‰ZÐ<¸b¿d¹dÓCÐDØ�:�2—:‘:ÐWÐY[×Y]ÑY]Ó^Ð_ð€ô0ô	ôôóKó	óDð
 CØ}ñ€óð  ACÐW[õ cr'   