乐高王国提示词分享

乐高王国实际页面:完整岛屿、中央宫殿与河道

把约 100 座各具特色的城堡,放进一座可以拖拽、缩放、切换昼夜的积木王国。岛形、分区、河道和城堡组合交给模型设计,逐砖搭建、水面涟漪与游船由提示词内置的固定引擎完成。

本次 Naive-N0.5-Flash 实测:186 秒生成包含 100 座城堡的王国页面。这是本次生成耗时,不是页面内搭建动画的时长;其他模型和运行环境的表现可能不同。

下载完整提示词(约 99 KB) · 查看与复制全文

实际效果

以下均为实际王国页面截图,展示积木建筑、河流海面和昼夜光影。

乐高王国实际页面的宫殿与周边建筑细节
宫殿、高塔和周边建筑的积木细节。
乐高王国实际页面的夜景与水面
切换夜晚,查看窗灯与水面的光影。

使用方法

  1. 下载或复制下方完整提示词,将全部内容发送给支持长文本与代码生成的模型。
  2. 让模型只填写岛屿和城堡数据,原样保留模板中的固定引擎,不删减、不改写。
  3. 将生成的完整代码保存为“乐高城堡王国.html”,用浏览器打开。首次打开需要联网加载三维渲染库。

生成后的页面支持播放、暂停、进度调整、日夜切换、拖拽和缩放;海面与河流中有游船,鼠标可触发水面涟漪。下方正文与下载文件均包含完整模板。

完整提示词

乐高城堡王国 · 完整原文
# 任务:约100座乐高城堡的自由岛屿王国

只输出一个可直接打开的完整 HTML 代码块,不输出分析、清单或校验代码。如需文件名,使用“乐高城堡王国.html”。

## 做法:复制模板,只填两处
1. 原样复制文末“完整模板”的全部内容。
2. 把 `/*KINGDOM*/` 替换为 `const KINGDOM={...};`,把 `/*CASTLES*/` 替换为 `const CASTLES=...;`。两处都必须是完整可执行的代码,不能留空或只返回模板。
3. 除这两处外,模板其余每个字符都不改。无需另写渲染、动画,也不调用 `KINGDOM_SHOW`。

### 固定引擎:整段照抄,不要“改进”
`<script type="text/plain" id="E">` 内有55个引擎块,每块带校验码,加载器逐字符核对,任何改动都可能让整页无法运行。把这些块当作不可读的数据整段照抄:
- 即使看到缺花括号、多余括号、风格不统一、疑似 bug 或可简化的写法,也不修改。
- 不格式化,不增删空格、换行和注释,不改名,不补分号,不重算校验码,不删减或合并块。
- 下列写法容易被误改,它们都是正确的:`for(...)a(),b()` 不带花括号;字符串 `va="...w;}"` 结尾的 `}`;`Array.from({length:32},()=>new e.Vector4(0,0,1,0))` 不加外层括号;`n.add(t+.5+","+(a+.5)+","+c)`;`document.activeElement`。
- 加载器报错为英文、界面文字为中文,都属于固定内容,不翻译、不统一。

篇幅紧张时,用函数压缩城堡数据代码;不缩短引擎,也不减少城堡数量。

## 画面
平缓岛屿,不要山、雪山、火山、浮岛、人工瀑布。中央主堡最高,有分层和金饰。

以下效果由引擎自动完成,数据里不用写:3:4高处俯视镜头、约42秒逐砖搭建动画、日夜切换、海水河流与涟漪、游船、夜窗灯光、播放/暂停/进度/缩放/拖拽。

## 岛屿数据 KINGDOM
写 `const KINGDOM={...};`。所有字段可选,缺项用默认值,越界值会被收回范围。岛形、河道、分区、地面色自由设计;不填 camera、timeline、mountains(会被忽略)。

坐标:u 横向、v 纵向(北小南大),常用 u 约 −16~16、v 约 −2~36,岛心通常在 (0, 6~16)。

岛形三选一:
- `ellipse:{A,B,vc,taper}`:半宽 A 为 3~12,半长 B 为 6~24,vc 为中心 v,taper 为 0~0.8;不写岛形则用默认椭圆。
- `shape:{lobes:[[u,v,r],...],minus:[[u,v,r],...]}`:多个圆斑合并,再减去海湾或湖泊。
- `shape:{poly:[[u,v],...]}`:多边形。

其他字段:
- `districts:{分区键:{at:[u,v],elev,ground}}`:1~12 区;位置、题材、名称、城堡分配自由,无固定名额,重叠地块自动让位。elev 为 0~12 砖;ground 为 `'#RRGGBB'`、`'water'` 水面或 `'harbor'` 港口。
- `rivers:[{path:[[u,v],...],width}]`:0~4 条,宽 3~12,至少 2 点,可用小数;可短、斜、横、分叉、有支流,不必贯穿全岛。引擎会修复越界、断开和入海部分,城堡自动让出河道并架桥。
- `coast:{beach,sea}`:beach 为 3~10,sea 为 8~24。`wall:{courses}`:城墙 1~4 层。`heroPlotLift`:主堡地块抬高 0~8 砖。
- `keep:{tiers:[{inset,n}],tierTowers:[{r,extra,cone}],spire:{r,n,cone},wall,trim,roof}`:主堡分层、层塔、尖塔和配色,可省略。tiers 为 2~4 层(inset 0~6,n 1~8);tierTowers 数量不少于层数−1(r 0.8~2.2,extra 0~5,cone 3~16);spire 的 r 为 1~2.4,n 为 3~14,cone 为 5~18。任一项不合法时整组改用默认主堡。

有效语法示例;正式设计另创岛形、分区、河道:
```js
const KINGDOM={shape:{lobes:[[0,7,6],[3,16,7]],minus:[[-4,12,2]]},districts:{royal:{at:[0,8],elev:3,ground:'#E4D7BE'},port:{at:[2,18],elev:0,ground:'harbor'}},rivers:[{path:[[1,5],[3,10],[1,16]],width:4}]};
```

## 城堡数据 CASTLES
写 `const CASTLES=[...];`,普通 JavaScript 数组,每项 `{id,dist,name,hero,parts}`:
- 数量 80~120,目标 100;id 从 1 连续编号;dist 为 KINGDOM 的分区键;name 为各不相同的中文名。
- #1 是主堡:`hero:1`,`parts:[Object.assign({t:'keep'},KINGDOM.keep)]`,可再加装饰。
- 其余每座 6~10 个零件,包含主体(box/house)、高点(tower 等)和细节(arch、paving、tree、figs 等)。
- 不要只用少数整堡模板:任意两座的主体布局、塔的数量和位置、高度轮廓、屋顶组合不能全部相同;只换颜色或名字不算不同。
- 推荐在脚本里写配色、塔组、带顶楼体等小函数,按编号组合生成;也可直接写零件对象。每次返回新对象;共享嵌套配置时先用 `structuredClone` 复制。

可执行组合示例;正式生成须满足全部数量与差异要求:
```js
const kit=(wall,roof)=>({
 towers:rows=>rows.map(([x,y,r,n])=>({t:'tower',x,y,r,n,cone:6,base:'stone',flag:1,col:wall,coneCol:roof})),
 hall:(x,y,w,d,n)=>[{t:'box',x,y,w,d,n,col:wall,base:'stone'},{t:'roof',x,y,w,d,z:3*n,h:3,col:roof},{t:'arch',x:x+w/2-1,y:y+d,face:'y',w:2,h:6}]
});
const colors=[kit('#EFE2C8','#456494'),kit('#DED4BE','#AF5844')];
const recipes=[
 ['royal','钟庭小堡',0,p=>[...p.hall(4,4,6,6,4),...p.towers([[1.6,1.6,1,7],[12.4,12.4,1,6]]),{t:'paving',x:6,y:11,w:2,d:2}]],
 ['port','三塔长厅',1,p=>[...p.hall(5,4,4,6,6),...p.towers([[2,2,1,5],[2,12,1,6],[12,12,1,8]]),{t:'paving',x:6,y:11,w:2,d:2}]]
];
const CASTLES=[{id:1,dist:'royal',name:'王宫主堡',hero:1,parts:[Object.assign({t:'keep'},KINGDOM.keep)]},...recipes.map(([dist,name,k,build],i)=>({id:i+2,dist,name,parts:build(colors[k])}))];
```

### 零件接口
x,y 为凸点格,z 为薄板高,n 为砖层数;1 砖 = 3 薄板,z=0 贴地。组合函数沿用这些参数,不是新格式。

| t | 参数与用途 |
|---|---|
| box | x,y,w,d,n,z,col,base,cren,capCol,crenCol,band,win,winRows,winStep,corner,beams,floor,slab;cren为城垛,win:false关窗,slab:1实心平台 |
| roof | x,y,w,d,z,col,h,spike,tier;坡屋顶 |
| tower | x,y,r,n,z,cone,coneCol,col,stripe,crown,crownCol,flag,flagCol,base,caps,nowin,open;x,y是圆心,可带.5 |
| cone | x,y,r,z,h,col,flag,flagCol;独立尖顶 |
| tree | x,y,z,s,col,trunk,snow;层叠松树,s为1~3,snow:1雪顶 |
| bigtree | x,y,z,r,n,R,col;巨树 |
| house | x,y,w,d,n,z,col,roof,beam,rh,chimney,base;自带屋顶的半木结构房屋 |
| water / paving | x,y,w,d,z,col;水池/铺地,自动让位建筑 |
| bridge | x,y,z,len,dir,wid,piers,col,rail;dir为'x'或'y',piers为数组 |
| arch | x,y,z,face,w,h;墙面门洞,face为'x'或'y' |
| figs | x,y,z,w,d,n,seed;小人群;单人可用fig |
| sail / boat / ship | x,y,z及船形参数;水边小船、帆船 |
| keep | 使用KINGDOM.keep,仅用于#1 |

颜色用 `#RRGGBB` 或调色板:stone、stoneL、white、tan、sand、dtan、brown、dbrown、red、orange、blue、dblue、teal、ice、iceD、green、dgreen、gold、dark、yellow、lime、purple、grass、water、rock、copper、pink。无效颜色变白。

### 配色
- 城堡以奶油、浅石墙为主,少量彩色塔身;每堡一主色、一辅色、少量金饰。
- 屋顶和尖顶用协调色,例如蓝 #526D98、砖红 #B5634C、绿 #5C8064、青 #538786、灰紫 #8E739C;同一零件内不逐砖换色。
- 全岛屋顶主色至少 4 个色系,任一色系不超过城堡总数一半;每区墙/顶主色至少 3 种,各区题材和配色有区别。
- 塔:每区至少 1/3 城堡有 2 座以上塔;全岛至少 15 座 n≥8 的高塔,至少 15 座用 col/stripe/coneCol 做出彩色塔身或尖顶。
- 引擎只收敛过艳、过暗、过亮的屋顶色,保留色相;这些配色限制仅用于城堡。

### 摆放
每座城堡占一块 14×14 的地块,坐标范围 0~14,砖格索引 0~13。
- box/house:x,y,w,d 为整数,x,y≥0,x+w≤14,y+d≤14。带屋顶(roof 或 house)时四边各留 0.7 给坡面和屋檐,即 x,y≥1、x+w≤13、y+d≤13。
- tower:圆心离地块四边至少——有尖顶 r+0.6,`crown:false` 的尖顶塔 r+0.35,无尖顶城垛塔 r+0.75;带旗时圆心右侧(+x)至少留 1.1。
- 两座带尖顶的塔圆心距 ≥ r1+r2+1.2;塔圆心离屋顶边 ≥ r+1。
- roof 与承托它的 box 同 x,y,w,d,z = box.z + 3×box.n;这个 box 不设 cren。
- 不悬空:z>0 的零件下面要有实际平台。普通 box 顶面在 z+3n;cren 的 box 内院地面在 z+3n+1。独立 cone 放在同心塔顶 z+3n+4(`crown:false` 时 z+3n),或放在完整覆盖其底面的平台上。
- 树、小人、小物件与 box/house/tower 外缘(含屋檐和塔顶外扩)至少隔 1 格。占地半径:tree 中心 (x+0.5,y+0.5),s=1/2/3 时约 1.40/1.90/2.40;bigtree 中心 (x,y),半径 max(r,1.18R);fig 四周 0.25;figs 的 w,d 为正整数且整片留空。引擎只按参考点挪开冲突物件,不能代替这一步。
- 没有 ring/arena 零件;圆形场地用 n=1~2 的宽 tower 或 paving,不压在 box 上。

## 完整模板
模板含 55 个固定引擎块(§001~§055)。加载器会尝试修复少量抄写错误,但不要依赖它。

```html
<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>乐高城堡王国</title>
<style>html,body{margin:0;height:100%;overflow:hidden;background:var(--page-bg,#E8DED0);font-family:"PingFang SC","Noto Sans CJK SC",sans-serif}#ui{box-sizing:border-box;position:fixed;z-index:2;left:50%;bottom:max(16px,env(safe-area-inset-bottom));transform:translateX(-50%);width:min(760px,calc(100% - 28px));display:flex;align-items:center;gap:10px;padding:10px 14px;border:1px solid #ffffff26;border-radius:14px;background:#15202bc9;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);color:#fff5e5;font:13px/1.4 system-ui,sans-serif;transition:opacity .18s}
#ui.hidden{opacity:0;pointer-events:none}#ui:focus-within{opacity:1;pointer-events:auto}
#ui button{flex:0 0 54px;padding:7px 0;border:0;border-radius:7px;background:#ffffff18;color:inherit;font:inherit;cursor:pointer}#ui button:hover{background:#ffffff2b}#ui button:disabled{opacity:.5;cursor:default}
#ui input{--progress:0%;flex:1;min-width:0;margin:0;height:26px;appearance:none;-webkit-appearance:none;background:transparent;cursor:pointer}
#ui input::-webkit-slider-runnable-track{height:4px;border-radius:4px;background:linear-gradient(to right,#f3c680 var(--progress),#ffffff38 var(--progress))}
#ui input::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;width:14px;height:14px;margin-top:-5px;border-radius:50%;background:#fff2d9}
#ui input::-moz-range-track{height:4px;border-radius:4px;background:#ffffff38}#ui input::-moz-range-progress{height:4px;background:#f3c680}#ui input::-moz-range-thumb{width:14px;height:14px;border:0;border-radius:50%;background:#fff2d9}
#ui :focus-visible{outline:2px solid #f3c680;outline-offset:3px}#tt{white-space:nowrap;font-variant-numeric:tabular-nums;font-size:12px}
#bn[aria-pressed="true"]{background:#f3c68030;color:#ffdfaa}
@media(prefers-reduced-motion:reduce){#ui{transition:none}}
@media(max-width:720px){#ui{gap:7px;padding:8px 10px}#ui button{flex-basis:44px}#tt{font-size:11px}}
@media(max-width:420px){#ui{gap:6px}#ui button{flex-basis:38px}#tt{font-size:10px}}</style>
<script type="importmap">{"imports":{"three":"https://unpkg.com/three@0.160.0/build/three.module.js","three/addons/":"https://unpkg.com/three@0.160.0/examples/jsm/"}}</script>
<script>// Legacy no-op; the engine starts automatically.
window.KINGDOM_SHOW=window.KINGDOM_SHOW||function(){};</script>
<script type="application/json" id="labels">{"fallbackCastle":"备用城堡","castle":"城堡","palace":"王宫主堡","total":",共 ","pause":"暂停","play":"播放","animation":"动画","night":"夜晚","day":"白天","toDay":"切换为白天","toNight":"切换为夜晚"}</script>
<script>
const UI_TEXT=JSON.parse(document.getElementById("labels").textContent);
// Fixed loader: verify, repair small copy errors, warn about the rest; stop only on structure or syntax errors.
(function(){
var NB=55,q=location.search;window.__NOCAUS=/nocaus/.test(q);
var CE=console.error;console.error=function(m){try{if(/Shader Error/.test(String(m))&&!window.__NOCAUS){location.replace(location.href+(q?'&':'?')+'nocaus')}}catch(e){}return CE.apply(console,arguments)};
function H(s){var a=-559038737,b=1103547991,i,c,p=Math.imul;for(i=0;i<s.length;i++){c=s.charCodeAt(i);a=p(a^c,2654435761);b=p(b^c,1597334677)}
a=p(a^a>>>16,2246822507)^p(b^b>>>13,3266489909);b=p(b^b>>>16,2246822507)^p(a^a>>>13,3266489909);return(a>>>0).toString(36)+(b>>>0).toString(36)}
function fix(t,h){var A='\n)(;,{}[]:.=!>"\' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$&|?+-*/<%#@~^`\\',i,j,u;
function at(i,n,s){u=t.slice(0,i)+s+t.slice(i+n);return H(u)==h}
for(i=0;i<t.length;i++)if(at(i,1,''))return u
for(i=0;i<t.length-1;i++)if(at(i,2,t[i+1]+t[i]))return u
for(j=0;j<A.length;j++)for(i=0;i<=t.length;i++)if(at(i,0,A[j]))return u
for(j=0;j<A.length;j++)for(i=0;i<t.length;i++)if(t[i]!=A[j]&&at(i,1,A[j]))return u
var W=[')=>{','=>{','))',')))','()',');','),','){','})','}}','};','=>','(()=>{','=>(','),(','")'],n;
for(n=0;n<W.length;n++)for(i=0;i<=t.length;i++)if(at(i,0,W[n]))return u
for(n=2;n<=8;n++)for(i=0;i+n<=t.length;i++)if(at(i,n,''))return u
return null}
function say(m){var d=document.createElement('div');d.style.cssText='position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#F4E6D0;color:#5A4632;font:18px/1.6 sans-serif;text-align:center;padding:40px;z-index:9;white-space:pre-wrap';d.textContent=m;document.body.appendChild(d)}
function go(){var E=document.getElementById('E');if(!E){say('Engine not found. The page cannot start.');return}
var T=E.textContent.replace(/\r/g,''),re=/\/\*§(\d+) (\w+)\*\/\n/g,M=[],m,k,out=[],fx=[],bad=[];
while(m=re.exec(T))M.push({n:+m[1],h:m[2],a:m.index+m[0].length,s:m.index});
if(M.length!==NB||M.some(function(b,i){return b.n!==i+1})){say('Engine blocks are missing, duplicated or out of order: expected exactly 55 blocks numbered 001-055.');return}
for(k=0;k<M.length;k++){var t=T.slice(M[k].a,k+1<M.length?M[k+1].s:T.length).replace(/\s+$/,'');
if(H(t)!=M[k].h){var f=fix(t,M[k].h);if(f===null||H(f)!==M[k].h)bad.push(M[k].n);else{t=f;fx.push(M[k].n)}}out.push(t)}
if(fx.length)console.info('[Kingdom] Repaired blocks: '+fx.join(','));
if(bad.length)console.warn('[Kingdom] Blocks changed and not repairable: '+bad.join(',')+'. Trying to run anyway.');
var src=out.join('\n');
try{new Function(src)}catch(e){say('Engine syntax error. Stopped.\n'+e.message+(bad.length?'\nChanged blocks: '+bad.join(','):''));return}
var s=document.createElement('script');s.textContent=src;document.body.appendChild(s)}
document.addEventListener('DOMContentLoaded',go)})();
</script>
</head><body><div id="ui" role="group" aria-label="动画播放控制"><button id="bp" type="button" disabled>播放</button><input id="sl" type="range" min="0" max="1" step="0.05" value="0" aria-label="动画进度" disabled><button id="bn" type="button" aria-pressed="false" aria-label="切换为夜晚" title="切换为夜晚" disabled>白天</button><output id="tt" for="sl">00:00 / 00:00</output></div>
<script>
/*KINGDOM*/
</script>
<script>
/*CASTLES*/
</script>
<script type="text/plain" id="E">
/*§001 u0gu2j1mqia7r*/
const __D={K:(()=>{try{return KINGDOM}catch(t){return null}})(),C:(()=>{try{return CASTLES}catch(t){return null}})()};(async()=>{try{const P=await import("three"),k=t=>import("three/addons/"+t+".js"),[{OrbitControls:T},{RoomEnvironment:_},{EffectComposer:R},{RenderPass:I},{GTAOPass:L},{ShaderPass:W},{OutputPass:G},{HorizontalTiltShiftShader:O},{VerticalTiltShiftShader:V},{UnrealBloomPass:Y}]=await Promise.all(["controls/OrbitControls","environments/RoomEnvironment","postprocessing/EffectComposer","postprocessing/RenderPass","postprocessing/GTAOPass","postprocessing/ShaderPass","postprocessing/OutputPass","shaders/HorizontalTiltShiftShader","shaders/VerticalTiltShiftShader","postprocessing/UnrealBloomPass"].map(k));const{max:$a,min:$b,floor:$c,round:$d,cos:$e,sin:$f,ceil:$g,hypot:$h,abs:$i,PI:$j}=Math;const sd=(x,y,h,u)=>{const d=$a(0,$b(1,(x*h+y*u)/(h*h+u*u||1)));return $h(x-h*d,y-u*d)};const{Float32BufferAttribute:$2,Color:$3,Vector3:$4,ConeGeometry:$5,CylinderGeometry:$6,BufferGeometry:$7,MeshStandardMaterial:$8,Mesh:$9,InstancedMesh:$10,InstancedBufferAttribute:$11,PlaneGeometry:$12,ShaderMaterial:$13,DirectionalLight:$14,PerspectiveCamera:$15}=P;const sg=(s,k,c)=>(k="#include <"+k+">",s.replace(k,k+"\n"+c));const _blankModel=()=>({cells:[],cyls:[],cones:[],decals:[],roofs:[],fx:[],bricks:0});const _attrs=(g,a)=>{for(const[n,v,s]of a)g.setAttribute(n,new $2(v,s))};window.THREE=P,window.PP={EffectComposer:R,RenderPass:I,GTAOPass:L,ShaderPass:W,OutputPass:G,HorizontalTiltShiftShader:O,VerticalTiltShiftShader:V,UnrealBloomPass:Y};
/*§002 1picj5hn181zn*/
const byId=t=>document.getElementById(t),$u=UI_TEXT;const U=[],j=t=>"number"==typeof t&&isFinite(t),N=(t,e,o)=>j(t)&&t>=e&&t<=o,q=(t,e,o,n)=>j(t)?$a(e,$b(o,t)):n,X=/^#[0-9a-fA-F]{6}$/,H=["#58A845","#D9B979","#9EA4A9","#4C9A3C","#F4F6F7","#C7CACD"],K={tiers:[{inset:1,n:5},{inset:3,n:5},{inset:5,n:4}],tierTowers:[{r:1.4,extra:2,cone:9},{r:1.2,extra:3,cone:10}],spire:{r:1.7,n:10,cone:14},wall:"white",trim:"gold",roof:"dblue"},$=()=>({ellipse:{A:6,B:16,vc:14,taper:.5},districts:{core:{at:[0,14],elev:3,ground:"#C7CACD"},north:{at:[0,3],elev:5,ground:"#F4F6F7"},west:{at:[-5,12],elev:2,ground:"#4C9A3C"},east:{at:[6,14],elev:2,ground:"#D9B979"},south:{at:[0,24],elev:1,ground:"#58A845"}},rivers:[{path:[[0,2],[1,6],[-1,10],[1,15],[0,20]],width:5}],coast:{beach:7,sea:16},wall:{courses:3},heroPlotLift:4,keep:K}),Q=t=>Array.isArray(t)&&t.length>=2&&j(t[0])&&j(t[1]);function t(t){const e=$();if(!t||"object"!=typeof t)return U.push("Missing KINGDOM; using defaults"),e;try{const o=t.ellipse;o&&j(o.A)&&j(o.B)&&(e.ellipse={A:q(o.A,3,12,6),B:q(o.B,6,24,12),vc:q(o.vc,0,30,o.B||12),taper:q(o.taper,0,.8,0)})}catch(t){}try{const o=t.shape;if(o&&"object"==typeof o){const t=Array.isArray(o)?o:o.poly,n=t=>Array.isArray(t)&&t.length&&t.every((t=>Array.isArray(t)&&t.length>=2&&t.every(j))),r=t=>n(t)?t.filter((t=>t.length>=3)):[];(r(o.lobes).length||n(t)&&t.length>2)&&(e.shape={poly:n(t)&&t.length>2?t:void 0,lobes:r(o.lobes),minus:r(o.minus)})}}catch(t){}try{const o=t.districts;if(o&&"object"==typeof o){const t={};
/*§003 o34b4cho3a0z*/
let n=0;for(const e in o){const r=o[e];if(n>=12)break;if(!r||"object"!=typeof r)continue;const s=Q(r.at)?r.at:Q(r.anchor)?r.anchor:[5*(n%3-1),4+8*$c(n/3)];t[e]={at:[q(s[0],-16,16,0),q(s[1],-2,36,12)],elev:q(r.elev,0,12,2),ground:"string"!=typeof r.ground||"water"!=r.ground&&"harbor"!=r.ground&&!X.test(r.ground)?H[n%6]:r.ground},n++}n?e.districts=t:U.push("Empty districts; using defaults")}}catch(t){}try{e.rivers=[];const o=Array.isArray(t.rivers)?t.rivers:t.river?[t.river]:[];for(const t of o.slice(0,4)){const o=t&&Array.isArray(t.path)?t.path.filter(Q):[];o.length<2?U.push("River needs at least 2 points; skipped"):e.rivers.push({path:o.slice(0,80).map((t=>[t[0],t[1]])),width:q(t.width,3,12,5)})}}catch(t){}try{const o=t.coast;o&&(e.coast={beach:q(o.beach,3,10,7),sea:q(o.sea,8,24,16)})}catch(t){}try{const o=t.wall;o&&(e.wall={courses:$d(q(o.courses,1,4,3))})}catch(t){}e.heroPlotLift=q(t.heroPlotLift,0,8,4);try{const o=t.keep;if(o&&Array.isArray(o.tiers)&&o.tiers.length>=2&&o.tiers.length<=4&&o.tiers.every((t=>t&&N(t.inset,0,6)&&N(t.n,1,8)))&&Array.isArray(o.tierTowers)&&o.tierTowers.length>=o.tiers.length-1&&o.tierTowers.every((t=>t&&N(t.r,.8,2.2)&&N(t.extra,0,5)&&N(t.cone,3,16)))&&o.spire&&N(o.spire.r,1,2.4)&&N(o.spire.n,3,14)&&N(o.spire.cone,5,18)){const t=t=>"string"==typeof t?t:void 0;
/*§004 1oh47zj1ivk8n*/
e.keep={tiers:o.tiers.map((t=>({inset:t.inset,n:t.n}))),tierTowers:o.tierTowers.map((t=>({r:t.r,extra:t.extra,cone:t.cone}))),spire:{r:o.spire.r,n:o.spire.n,cone:o.spire.cone},wall:t(o.wall)||"white",trim:t(o.trim)||"gold",roof:t(o.roof)||"dblue"}}else o&&U.push("Invalid keep; using defaults")}catch(t){}return e}const Z=new Set(["keep","box","roof","tower","cone","tree","bigtree","water","paving","bridge","fx","figs","arch","house","sail","fig","boat","ship"]),J=["x","y","z","w","d","n","r","h","len","s","R","cone","wid"];function e(t){if(!t||"object"!=typeof t||"string"!=typeof t.t||!Z.has(t.t))return!1;for(const e of J)if(e in t&&void 0!==t[e]&&!j(t[e]))return!1;return!(t.w>14||t.d>14||t.n>30||t.r>7||t.h>60||t.len>16||t.R>8)}const tt=["white","tan","stoneL","white","tan"],et=["red","orange","dblue","teal","red","blue"];function o(t,e){const o=tt[e%5],n=et[(3*e+1)%6],r=e%3,s=5+e%4,a=4+e%3,c=1+e%3,i=2+(e>>1)%3,l=3+e%3;let f;return f=0==r?[{t:"box",x:c,y:i,w:s+2,d:a+1,n:l,col:o,base:"stone"},{t:"roof",x:c,y:i,w:s+2,d:a+1,z:3*l,col:n,h:3},{t:"tower",x:c+s+3.5,y:i+a+2,r:1.4,n:l+3,cone:8,base:"stone",flag:1,col:o},{t:"tower",x:c-.5,y:i+a+2,r:1.2,n:l+2,cone:7,base:"stone",flag:1,col:o},{t:"arch",x:c+2,y:i+a+1,face:"y",w:2,h:6}]:1==r?[{t:"house",x:1,y:1,w:5,d:4,n:2,col:o,roof:n},{t:"house",x:7,y:1,w:5,d:4,n:2,col:"tan",roof:et[(e+2)%6]},{t:"house",x:2,y:7,w:5,d:4,n:2,col:"white",roof:et[(e+4)%6]},{t:"tree",x:10,y:8,s:2,col:"dgreen"},{t:"tree",x:11,y:11,s:1,col:"dgreen"}]:[{t:"box",x:4,y:4,w:6,d:6,n:l+1,col:o,base:"stone",cren:1,capCol:"blue"},{t:"tower",x:4.5,y:4.5,r:1.2,n:l+4,cone:8,base:"stone",flag:1,col:o},{t:"tower",x:9.5,y:9.5,r:1.2,n:l+3,cone:7,base:"stone",flag:1,col:o},{t:"tree",x:1,y:1,s:2,col:"dgreen"},{t:"tree",x:12,y:2,s:1,col:"dgreen"}],{id:0,dist:t,name:$u.fallbackCastle+(e+1),parts:f}}function n(t){const e=[];
/*§005 2uk8ec129df2n*/
for(const o of t)if(("box"==o.t||"house"==o.t)&&j(o.x)&&j(o.y))e.push([o.x-1,o.y-1,o.x+(o.w||4)+1,o.y+(o.d||4)+1]);else if("tower"==o.t&&j(o.x)&&j(o.y)){const t=(o.r||1.5)+1;e.push([o.x-t,o.y-t,o.x+t,o.y+t])}const o=(t,o)=>e.some((e=>t>=e[0]&&t<=e[2]&&o>=e[1]&&o<=e[3]));let n=0;const r=t.filter((t=>{if("tree"!=t.t&&"bigtree"!=t.t&&"figs"!=t.t||(t.z||0)>0||!j(t.x)||!j(t.y)||!o(t.x,t.y))return!0;for(let e=1;e<=9;e++)for(let r=0;r<12;r++){const s=t.x+e*$e(.5236*r),a=t.y+e*$f(.5236*r);if(s>=1&&a>=1&&s<=12&&a<=12&&!o(s,a))return t.x=$d(2*s)/2,t.y=$d(2*a)/2,n++,!0}return n++,!1}));return n&&U.push("Moved trees/props: "+n+""),r}function r(t,r){const s=Object.keys(r.districts);let a=[],c=null,i=0;Array.isArray(t)||(U.push("Missing CASTLES; using fallback castles"),t=[]);for(const o of t){if(!o||"object"!=typeof o||!Array.isArray(o.parts)){i++;continue}const t=n(o.parts.filter(e));if(t.length<(o.hero?1:2)){i++;continue}const l={id:0,dist:r.districts[o.dist]?o.dist:s[a.length%s.length],name:"string"==typeof o.name?o.name.slice(0,16):$u.castle,parts:t};o.hero&&!c&&(l.hero=1,c=l),a.push(l)}for(i&&U.push("Dropped invalid castles: "+i+""),a=a.slice(0,130);a.length<24;)a.push(o(s[a.length%s.length],a.length)),U.push("Added fallback castle");
/*§006 1xfme8r180mh3o*/
return c?c.parts.some((t=>"keep"==t.t))||(c.parts=[Object.assign({t:"keep"},r.keep),...c.parts.filter((t=>"box"!=t.t&&"roof"!=t.t))]):(c={id:0,dist:s[0],name:$u.palace,hero:1,parts:[Object.assign({t:"keep"},r.keep)]},a.unshift(c),U.push("Added main keep")),a.sort(((t,e)=>(e.hero?1:0)-(t.hero?1:0))),a.forEach(((t,e)=>t.id=e+1)),a}let ot=t(__D.K),nt=r(__D.C,ot);var s=[];const rt=(t,e)=>["#D8C49A","#CDB88C","#E0CDA4","#C4AE86","#B9B1A0"][$c(5*B(3*t+1,7*e+2))],st={w:"#ECE7DC",g:"#8C9196",b:"#2552B4",gold:"#E0A83A",grn:"#3F8F3C",tree:"#2F7D35",brn:"#7B4A2C"};let at=1;function a(t,e,o,n,r,s,a,c,i){const l=at++;t.bricks++;for(let f=0;f<r;f++)for(let r=0;r<s;r++)t.cells.push({x:e+f,y:o+r,z:n,h:a,col:c,id:l,fl:i||{}});return l}function c(t,e,o,n,r,s={}){const a=s.z||0,c={cx:e,cy:o,r:n,z0:a,n:r,hasCone:!!s.cone,base:!s.z&&!s.nobase,col:s.col,stripe:s.stripe,crownCol:s.crownCol,nowin:s.nowin,baseCol:s.baseCol,crown:!1!==s.crown,open:s.open,caps:s.caps};t.cyls.push(c),t.bricks+=r*$g(2*n);const i=a+3*r+(!1!==s.crown?4:0);s.cone&&t.cones.push({cx:e,cy:o,r:n+(!1!==s.crown?.55:.3),z:i,h:.72*s.cone,flag:s.flag,col:s.coneCol,flagCol:s.flagCol,own:c})}function i(t){return t=t.replace("#",""),[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function l(t,e){return void 0!==ct&&ct[t]&&(t=ct[t]),"#"+i(t).map((t=>$a(0,$b(255,$d(t*e))).toString(16).padStart(2,"0"))).join("")}const ct={stone:"#9EA4A9",stoneL:"#C7CACD",white:"#ECE7DC",tan:"#E4CD9E",sand:"#D9B979",dtan:"#B98F55",brown:"#7B4A2C",dbrown:"#5A3620",red:"#C4402F",orange:"#E2692A",blue:"#2552B4",dblue:"#1E3F86",teal:"#2E8C8C",ice:"#BFE3F2",iceD:"#7FBCDA",green:"#3F8F3C",dgreen:"#2F7D35",gold:"#E0A83A",dark:"#5A5E66",lava:"#F06A1A",yellow:"#F2C43A",lime:"#8DBF3F",purple:"#6A4C9C",grass:"#58A845",water:"#3B86C9",snow:"#F4F6F7",rock:"#8A8F94",copper:"#B8733A",pink:"#E58FA6"},it=t=>{const e=ct[t]||t;
/*§007 1i24nwt178m1nk*/
return"string"==typeof e&&/^#[0-9a-fA-F]{6}$/.test(e)?e:ct.white};function fillCells(t,e,p){for(const c of e)if(!p||!c.fl.pave)for(let z=0;z<c.h;z++)t.add(c.x+","+c.y+","+(c.z+z))}function cellGroups(t){const e=new Map;for(const o of t)e.has(o.id)||e.set(o.id,[]),e.get(o.id).push(o);return e}function f(t,e,o){t.fl=Object.assign({},t.fl,{[e]:o})}function h(t,e,o,n,r,s,c,i,l){const f=t._occ||(t._occ=new Set);let u=!0;for(let t=0;t<r;t++)for(let r=0;r<s;r++)for(let s=0;s<c;s++)f.has(e+t+","+(o+r)+","+(n+s))&&(u=!1);if(u){for(let t=0;t<r;t++)for(let r=0;r<s;r++)for(let s=0;s<c;s++)f.add(e+t+","+(o+r)+","+(n+s));return a(t,e,o,n,r,s,c,i,l)}if(r*s>1)for(let a=0;a<r;a++)for(let r=0;r<s;r++)h(t,e+a,o+r,n,1,1,c,i,l)}function u(t,e){const{x:o,y:n,z:r=0,w:s,d:a,n:c=1}=e,i=it(e.col),l=t.cells.length;if(e.slab)return h(t,o,n,r,s,a,3*c,i,{}),r+3*c;for(let l=0;l<c;l++){const c=r+3*l,f=0==l&&e.base?it(e.base):e.band&&l%2==1?it(e.band):i;for(let e=0;e<a;e++){let r=-(l+e)%2;for(;r<s;){const a=$a(r,0),i=$b(r+2,s)-a;i>0&&h(t,o+a,n+e,c,i,1,3,f),r+=2}}}const u=t.cells.slice(l);if(e.corner){const t=it(e.corner);for(const r of u){const c=r.x==o||r.x==o+s-1,i=r.y==n||r.y==n+a-1;(c&&i||e.beams&&((r.x-o)%3==0&&i||(r.y-n)%3==0&&c))&&(r.col=t)}}if(!1!==e.win&&c>=2){const t=e.winStep||2;for(const i of u){const l=(i.z-r)/3;
/*§008 kpoyu41b52b36*/
l<1||l>=c||e.winRows&&!e.winRows.includes(l)||(i.x==o+s-1&&(i.y-n)%t==1&&i.y<n+a-1?f(i,"win","x"):i.y==n+a-1&&(i.x-o)%t==1&&i.x<o+s-1&&f(i,"win","y"))}}const d=r+3*c;if(e.cren){const r=e.capCol?it(e.capCol):null;for(let c=0;c<s;c++)for(let l=0;l<a;l++)0==c||0==l||c==s-1||l==a-1?(c+l)%2==0?(h(t,o+c,n+l,d,1,1,3,e.crenCol?it(e.crenCol):i),r&&(c+l)%4==0&&h(t,o+c,n+l,d+3,1,1,2,r,{round:1})):h(t,o+c,n+l,d,1,1,1,i,{tile:1}):h(t,o+c,n+l,d,1,1,1,e.floor?it(e.floor):i,{tile:1})}return d}function d(t,e){t.roofs.push({x:e.x-.4,y:e.y-.4,w:e.w+.8,d:e.d+.8,z:e.z,h:e.h||.55*$b(e.w,e.d),col:it(e.col||"orange"),tier:e.tier}),e.spike&&t.cones.push({cx:e.x+e.w/2,cy:e.y+e.d/2,r:.2,z:e.z+3*(e.h||.55*$b(e.w,e.d)),h:1,spike:1})}function p(t,e){const s={...e,baseCol:e.base?it(e.base):void 0,nobase:!e.base};for(const k of["coneCol","col","stripe","crownCol","flagCol"])s[k]=e[k]?it(e[k]):void 0;c(t,e.x,e.y,e.r||1.5,e.n||4,s)}function y(t,e){const o=e.z||0,n=e.s||2;a(t,e.x,e.y,o,1,1,3,it(e.trunk||"brown"));const r=n+1;for(let s=0;s<r;s++){const a=n+1-s;t.cones.push({tree:1,tier:s,top:s==r-1,snow:e.snow,cx:e.x+.5,cy:e.y+.5,r:.35+.42*a,z:o+3+3*s,h:2.6,col:e.col?it(e.col):void 0})}}function x(t,e){t.fx.push(Object.assign({z:0,k:(e.x||0)+(e.y||0)+(e.kk||1.5)},e))}const lt=new Set(["sail","fig","boat","ship"]),ft={keep:function(t,e){const o=e;let n=0;const r=o.tiers,s=o.wall||"white",a=o.trim||"gold",c=o.roof||"dblue";r.forEach(((e,i)=>{const l=14-2*e.inset,f=u(t,{x:e.inset,y:e.inset,z:n,w:l,d:l,n:e.n,col:s,band:a,cren:1,capCol:a,base:0==i?"stone":void 0,win:i>0}),h=o.tierTowers[i-1];
/*§009 88f3lpsa670f*/
if(h&&i>0){const s=e.inset+h.r-.2,l=14-e.inset-h.r+.2,f=i==r.length-1&&o.spire,u=f?$a(7-s,o.spire.r+h.r+.7):0,d=f?[[7,7-u],[7+u,7],[7,7+u],[7-u,7]]:[[s,s],[l,s],[s,l],[l,l]];for(const[o,r]of d)p(t,{x:o,y:r,z:n,r:h.r,n:e.n+h.extra,cone:h.cone,coneCol:c,crownCol:a,flagCol:"yellow",base:1==i?"stone":null})}i>0&&l>=6&&t.decals.push({x:6,y:14-e.inset,z:n,face:"y",w:2,h:$b(6,3*e.n-1)}),n=f+1})),p(t,{x:7,y:7,z:n,r:o.spire.r,n:o.spire.n,cone:o.spire.cone,coneCol:c,crownCol:a,flagCol:"yellow",base:null}),t.cones.push({cx:7,cy:7,r:.25,z:n+3*o.spire.n+4+.72*o.spire.cone*3,h:1,spike:1})},box:u,roof:d,tower:p,cone:function(t,e){t.cones.push({cx:e.x,cy:e.y,r:e.r,z:e.z||0,h:e.h,col:it(e.col||"blue"),flag:e.flag,flagCol:e.flagCol?it(e.flagCol):void 0})},tree:y,bigtree:function(t,e){const o=e.z||0;c(t,e.x,e.y,e.r||1.2,e.n||5,{z:o,col:it("brown"),crown:!1,nowin:1,nobase:1});const n=o+3*(e.n||5),r=e.R||3;for(let o=0;o<3;o++)t.cones.push({tree:1,cx:e.x,cy:e.y,r:r-.6*o,z:n-2+3*o,h:2.6,col:e.col?it(e.col):void 0});return n},water:function(t,e){for(let o=0;o<e.w;o++)for(let n=0;n<e.d;n++)h(t,e.x+o,e.y+n,e.z||0,1,1,1,(5*o+3*n)%7==0?"#6FB3E3":it("water"),{tile:1,pave:1})},paving:function(t,e){for(let o=0;o<e.w;o++)for(let n=0;n<e.d;n++)a(t,e.x+o,e.y+n,e.z||0,1,1,1,it((3*o+5*n)%4==0?"rock":e.col||"stoneL"),{tile:1,pave:1})},bridge:function(t,e){const{x:o,y:n,z:r,len:s,dir:c}=e,i=e.wid||2;for(let a=0;a<i;a++)"x"==c?h(t,o,n+a,r,s,1,2,it(e.col||"stoneL"),{tile:1}):h(t,o+a,n,r,1,s,2,it(e.col||"stoneL"),{tile:1});
/*§010 r43rlc1pjpsa0*/
const l=e.piers&&e.piers.length?e.piers:e.hang?[]:[0,s-1];for(const s of l)for(let a=0;a<i;a++){const i="x"==c?o+s:o+a,l="x"==c?n+a:n+s;for(let o=e.from||0;o<r;o+=3)h(t,i,l,o,1,1,$b(3,r-o),it(e.pier||"stone"))}if(e.rail)for(let l=0;l<s;l+=2)a(t,"x"==c?o+l:o+i-1,"x"==c?n+i-1:n+l,r+2,1,1,2,it(e.rail),{round:1})},fx:x,figs:function(t,e){const o=["red","blue","yellow","dgreen","purple","white","orange"];for(let n=0;n<(e.n||3);n++){const r=e.x+37*n%(e.w||3)+.5,s=e.y+53*n%(e.d||3)+.5;t.fx.push({t:"fig",x:r,y:s,z:e.z||0,col:it(o[(n+(e.seed||0))%o.length]),k:r+s+.6})}},arch:function(t,e){t.decals.push({x:e.x,y:e.y,z:e.z||0,face:e.face||"y",w:e.w||2,h:e.h||5})},house:function(t,e){const o=u(t,{x:e.x,y:e.y,z:e.z||0,w:e.w,d:e.d,n:e.n||2,col:e.col||"tan",corner:e.beam||"brown",beams:!0,base:e.base||"stone"});return d(t,{x:e.x,y:e.y,z:o,w:e.w,d:e.d,col:e.roof||"orange",h:e.rh}),e.chimney&&a(t,e.x,e.y,o,1,1,6,it("red")),o}};function m(t){at=1e5*t.id;const e=_blankModel();for(const o of t.parts){if(!ft[o.t]&&lt.has(o.t)){x(e,o);continue}const n=ft[o.t];if(n)try{n(e,o)}catch(e){console.warn("part failed",o.t,t.id,e.message)}else console.warn("skip unknown part",o.t,"in",t.id)}const o=new Set;fillCells(o,e.cells,1);e.cells=e.cells.filter((t=>{return!t.fl.pave||!(o.has(t.x+","+t.y+","+t.z)||(n=t.x,r=t.y,s=t.z,e.cyls.some((t=>(n+.5-t.cx)**2+(r+.5-t.cy)**2<t.r*t.r&&s>=t.z0&&s<t.z0+3*t.n+4))));var n,r,s}));for(const t of e.cones)t.col||t.tree||t.spike||(t.col="#2552B4");let n=7*t.id;
/*§011 1cbhl7018m66qt*/
for(const o of e.cones)if(!(o.tree||o.spike||o.flag&&o.r<=.25||(o.col=A(o.col,n++),t.hero))){const e=B(31*t.id+n,17*n+3);o.h*=[.85,1,1.12,1.22][$c(4*e)],o.seg=e<.3?8:0,o.band=e>.72?1:0}for(const t of e.roofs)t.col=A(t.col,n++);return function(t,e){const o=t.cells.length;t.cells=t.cells.filter((t=>t.x>=0&&t.y>=0&&t.x<=13&&t.y<=13));const n=new Map,r=[];for(const e of t.cells){let t=!1;for(let o=0;o<e.h;o++){const r=n.get(e.x+","+e.y+","+(e.z+o));if(void 0!==r&&r!==e.id){t=!0;break}}if(!t){for(let t=0;t<e.h;t++)n.set(e.x+","+e.y+","+(e.z+t),e.id);r.push(e)}}t.cells=r;for(let e=0;e<6;e++){const e=new Set;fillCells(e,t.cells);for(const o of t.cyls)for(let t=$c(o.cx-o.r);t<=o.cx+o.r;t++)for(let n=$c(o.cy-o.r);n<=o.cy+o.r;n++)if((t+.5-o.cx)**2+(n+.5-o.cy)**2<=o.r*o.r+.6)for(let r=o.z0;r<o.z0+3*o.n+4;r++)e.add(t+","+n+","+r);const o=cellGroups(t.cells),n=new Set;for(const[t,r]of o)r[0].z<=0||r.some((t=>e.has(t.x+","+t.y+","+(t.z-1))||e.has(t.x+","+t.y+","+(t.z+t.h))))||n.add(t);if(!n.size)break;t.cells=t.cells.filter((t=>!n.has(t.id)))}t.cells.length<o&&U.push("Castle "+(e&&e.id)+" repaired; dropped "+(o-t.cells.length)+" out-of-bounds, overlapping or unsupported cells")}(e,t),b(e),e}function w(t){return t.spike||t.tree||t.flag&&t.r<=.25}function M(t){return $a(.3,3*t.h)}function v(t){return t.z0+3*t.n+(t.crown?t.hasCone?4:7.5:.45)}function g(t){return t.r+(t.crown?t.hasCone?.5:.75:0)}function b(t){!function(t){for(const e of t.cones)if(!w(e)&&!e.own)for(const o of t.cyls)if($h(o.cx-e.cx,o.cy-e.cy)<.35&&e.z>=o.z0+3*o.n-.5&&e.z<=o.z0+3*o.n+(o.crown?7.6:1)){e.own=o,o.hasCone=!0,e.z<o.z0+3*o.n+(o.crown?4:0)&&(e.z=o.z0+3*o.n+(o.crown?4:0));
/*§012 if25rt414qef*/
break}}(t);const e=t.cones.filter((t=>!w(t)));for(let o=0;o<8;o++)for(const o of e){const n=o.own?$a(.45,.7*o.own.r):.35,r=M(o);for(const t of e)if(t!==o&&o.z<t.z+M(t)&&t.z<o.z+r){const e=$h(o.cx-t.cx,o.cy-t.cy)-o.r-t.r-.05;e<0&&(o.r=$a(n,o.r+e/2))}for(const e of t.cyls)if(e!==o.own&&o.z<v(e)&&e.z0<o.z+r){const t=$h(o.cx-e.cx,o.cy-e.cy)-o.r-g(e)-.02;t<0&&(o.r=$a(n,o.r+t),e.crown&&!e.hasCone&&(e.noMerlon=1))}}return t}function C(t){const[e,o,n]=i(t).map((t=>t/255)),r=$a(e,o,n),s=$b(e,o,n),a=(r+s)/2;if(r==s)return{h:0,s:0,l:a};const c=r-s;return{h:60*(r==e?(o-n)/c+(o<n?6:0):r==o?(n-e)/c+2:(e-o)/c+4),s:a>.5?c/(2-r-s):c/(r+s),l:a}}const _c=new $3;function A(t,e){const o=C(t=it(t));return o.s<.12||o.s*(1-$i(2*o.l-1))<.12?t:"#"+_c.setHSL(o.h/360,$b(o.s,.58),$a(.28,$b(.68,o.l)),P.SRGBColorSpace).getHexString(P.SRGBColorSpace)}function B(t,e){let o=374761393*t+668265263*e^1540483477;return o=1274126177*(o^o>>>13),((o^o>>>16)>>>0)/4294967296}function F(t,e,o){const n=$c(t/o),r=$c(e/o),s=t/o-n,a=e/o-r,c=s*s*(3-2*s),i=a*a*(3-2*a),l=B(n,r),f=B(n+1,r),h=B(n,r+1);return l+(f-l)*c+(h-l)*i+(l-f-h+B(n+1,r+1))*c*i};const dt={};for(const Mt in ot.districts)dt[Mt]=ot.districts[Mt].ground;const pt=t=>/^#/.test(t)&&i(t).every((t=>t>225)),yt=t=>"water"==t||"harbor"==t;function E(t,e,o){const n=dt[t];return"harbor"==n?e+o<9?"#D9B979":(5*e+3*o)%11==0?"#6FB3E3":"#3B86C9":"water"==n?(5*e+3*o)%11==0?"#6FB3E3":"#3B86C9":(7*e+3*o)%13==0?l(n,.92):n}function S(t,e){let o=ot.districts[t].elev;
/*§013 1i5geic5b4vkg*/
return e&&e.hero&&(o+=ot.heroPlotLift),3*o}let xt=null,mt=null;function D(t){const e=_blankModel();t.rivers.forEach(((t,o)=>{const n=t.tiles,r=n.length;n.forEach(((s,a)=>{if(a%5==2&&a>0&&a<r-1){const r=n[a+1],c=n[a-1],i=$i(r.cx-c.cx)>$i(r.cy-c.cy),l=$d(s.cx),f=$d(s.cy),u=$b(15,$d($a(t.w,6)+6)),d=s.z+6,p=$c(u/2),y=a+9*o,x=$c(u/2),m=(t,o,n,r,s,a)=>i?h(e,l+o-1,f-p+t,n,1,1,r,s,a):h(e,l-p+t,f+o-1,n,1,1,r,s,a);for(let t=0;t<u;t++){for(let e=0;e<3;e++)m(t,e,d,1,1==e?it("stoneL"):"#B9BEC3",{tile:1});m(t,0,d+1,2,t%2?it("stoneL"):"#D5D9DD"),m(t,2,d+1,2,t%2?it("stoneL"):"#D5D9DD")}for(const t of[0,1,u-2,u-1,x])for(let e=0;e<3;e++)for(let o=s.z;o<d;o+=3)m(t,e,o,$b(3,d-o),B(t+y,e+o)<.3?"#8E9398":it("stone"));for(const t of[2,u-3,x-1,x+1])if(t>1&&t<u-2)for(let e=0;e<3;e++)m(t,e,d-3,3,it("stone"));e.fx.push({t:"fig",x:l+.5,y:f+.5,z:d+1,col:"#C4402F",k:l+f+2})}else a%3==1&&t.w>=5&&e.fx.push({t:"boat",x:s.cx-1.5,y:s.cy+.5,z:s.z,len:3,k:s.cx+s.cy+3})}))}));for(const o of t.cols)o.bank&&!o.water&&B(o.x+11,o.y+5)>.9&&(o.snow?y(e,{x:o.x,y:o.y,z:o.h,s:1,col:"#2E6B4A"}):y(e,{x:o.x,y:o.y,z:o.h,s:1}));for(const o of t.cols)o.sea&&!o.foam&&o.dCoast>ot.coast.beach+4&&B(o.x+5,o.y+9)>.9993&&e.fx.push({t:"boat",x:o.x,y:o.y,z:0,len:3,k:o.x+o.y+3});for(const o of t.plots)yt(dt[o.dist])&&(7*o.u+o.v+50)%3!=0&&e.fx.push({t:"boat",x:o.X+11,y:o.Y+13.5,z:0,len:3,k:o.X+o.Y+25});return function(t,e){const o=t.cols.filter((t=>t.sea&&!t.foam&&t.dCoast>ot.coast.beach+2.5&&t.dCoast<ot.coast.beach+5));
/*§014 1htnjag18xekw1*/
if(!o.length)return;let n=t.plots.filter((t=>"harbor"==dt[t.dist]));n.length||(n=t.plots.filter((t=>!t.rc.hero)));const r=n.map((t=>{const[e,n]=(t=>{let e=null,n=1e9;for(let r=0;r<o.length;r+=3){const s=o[r],a=$h(s.x-t.cx,s.y-t.cy);a<n&&(n=a,e=s)}return[e,n]})(t);return{p:t,c:e,d:n}})).sort(((t,e)=>t.d-e.d)),s=[];for(const t of r){if(s.length>=2)break;s.every((e=>$h(e.p.cx-t.p.cx,e.p.cy-t.p.cy)>45))&&s.push(t)}for(const{p:o,c:n}of s){let r=n.x-o.cx,s=n.y-o.cy;const c=$i(r)>=$i(s),i=c?Math.sign(r):0,l=c?0:Math.sign(s);let f=$d(o.cx),h=$d(o.cy);for(let e=0;e<80;e++){const e=t.colMap.get(f+","+h);if(e&&e.sea)break;f+=i,h+=l}f-=2*i,h-=2*l;let u=0;for(let e=2;e<26;e++){const o=t.colMap.get(f+i*e+","+(h+l*e)),n=t.colMap.get(f+i*(e+2)+","+(h+l*(e+2)));if(!(o&&o.sea&&n&&n.sea))break;u=e}if(u<5)continue;u=$b(u,14);const d=-l,p=i,y=2;for(let o=0;o<u;o++)for(let n=-1;n<=1;n++){const r=f+i*o+d*n,s=h+l*o+p*n;if(a(e,r,s,y,1,1,1,(o+n)%3==0?"#6B4226":"#8B5A30",{tile:1}),o%3==0&&0!=n){const o=t.colMap.get(r+","+s);for(let t=o?o.h:-6;t<y;t+=3)a(e,r,s,t,1,1,$b(3,y-t),"#9A7650",{round:1})}}for(let o=-4;o<=4;o++){const n=f+i*u+d*o,r=h+l*u+p*o;for(let t=0;t<3;t++)a(e,n+i*t,r+l*t,y,1,1,1,(t+o)%3==0?"#6B4226":"#8B5A30",{tile:1});if($i(o)%2==0){const o=t.colMap.get(n+i+","+(r+l));for(let t=o?o.h:-6;t<y;t+=3)a(e,n+i,r+l,t,1,1,$b(3,y-t),"#9A7650",{round:1})}}for(let t=2;t<u;t+=4)a(e,f+i*t+1*d,h+l*t+1*p,y+1,1,1,2,"#E0A83A",{round:1});const x=Math.atan2(i,l)+$j/2,m=[[.45*u,4.8],[.8*u,-4.8],[u-2,8.5]];for(const[o,n]of m){const r=f+.5+i*o+d*n,s=h+.5+l*o+p*n;
/*§015 1ehexyi1yea1xi*/
let a=!0;for(let e=-3;e<=3;e++)for(let o=-1;o<=1;o++){const n=t.colMap.get($c(r+e)+","+$c(s+o));n&&n.sea||(a=!1)}a&&e.fx.push({t:"ship",x:r,y:s,z:0,ry:x+(o>u?.5:0),k:r+s+3})}}}(t,e),e}!function(){const t=.4,e=P,o={"#3B86C9":"#1C9AAE","#6FB3E3":"#55C8CB","#2F6FA8":"#167C8C","#E8F4FA":"#F4FBFF","#58A845":"#5DB247","#4C9A3C":"#4AA042","#E3CB93":"#EBD49E","#D9BE85":"#E0C68D","#E8D3A0":"#F0DDAE","#C9A97A":"#CDB083","#3F8F3C":"#3E9440","#ECE7DC":"#F0E5CE","#9EA4A9":"#A99D88","#C7CACD":"#D3C8B2","#8C9196":"#9C917F","#2552B4":"#3F5E93","#1E3F86":"#2F4876","#C4402F":"#B4513A","#E2692A":"#C9733F","#E0A83A":"#CFA24A","#F2C43A":"#E2BD55","#5A5E66":"#5E5A55","#8A8F94":"#918878"},n=t=>(t=void 0!==ct&&ct[t]||t,o[t]||t),r=new e.Matrix4,a=new e.Matrix3,c=new $4,i=new $3,f={cone8:new $5(1,1,8,1),pine:new $5(1,1,10,1),box:new e.BoxGeometry(1,1,1),cyl:new $6(1,1,1,28,1),cyl12:new $6(1,1,1,14,1),cone:new $5(1,1,24,1),sph:new e.SphereGeometry(1,16,12),stud:(()=>{const t=new $6(.3,.3,.18,14,1);return t.translate(0,.09,0),t})()};const pos=new $4,_j=new $4,axis=new $4(0,1,0),rot=new e.Quaternion,h=(t,o,n,s,a,c,i)=>r.compose(pos.set(t,o,n),rot.setFromAxisAngle(axis,i||0),_j.set(s,a,c));
/*§016 nv8d1rktlefe*/
function u(t,e,s=!1){return t.onBeforeCompile=t=>{Object.assign(t.uniforms,e),t.vertexShader="attribute float cid;\nattribute float t0;\nuniform vec3 uOff[141];\nuniform float uT;uniform vec4 uBoatMove[32];uniform vec2 uBoatPivot[32];\n"+sg(sg(t.vertexShader,"begin_vertex","if(t0>=0.0){float dt=uT-t0;if(dt<0.0){transformed=vec3(0.0,-10000.0,0.0);}else{float f=clamp(dt/0.38,0.0,1.0);float g=1.0-f;float sy=1.0;\n#ifdef USE_INSTANCING\nsy=max(length(instanceMatrix[1].xyz),1e-3);\n#endif\ntransformed.y+=g*g*3.2/sy;}}if(cid>=0.0){transformed+=uOff[int(cid+0.5)];}if(cid<-5.0){float ph=-cid*1.73;transformed.y+=sin(uT*1.3+ph)*.09+sin(uT*.71+ph*2.1)*.05;}if(cid<=-10.0&&cid>=-41.0){int bi=int(-cid-10.0);vec4 bm=uBoatMove[bi];vec2 bp=uBoatPivot[bi];transformed.xz=mat2(bm.z,-bm.w,bm.w,bm.z)*(transformed.xz-bp)+bp+bm.xy;}"),"beginnormal_vertex","if(cid<=-10.0&&cid>=-41.0){vec4 bm=uBoatMove[int(-cid-10.0)];objectNormal.xz=mat2(bm.z,-bm.w,bm.w,bm.z)*objectNormal.xz;}");if(s){t.uniforms.uNight=window.__R.night;t.uniforms.uLampTime=window.__R.lampTime;t.vertexShader="uniform float uLampTime;float lampGlow(float k){if(k<1.)return 0.;float s=fract(k);if(k>=3.)return 1.+s*.25;float d=8.+12.*fract(s*31.7),t=uLampTime+s*d,n=floor(t/d);vec2 a=step(fract(sin(vec2(n-1.,n)*17.13+s*91.7)*43758.5453),vec2(k>=2.?.85:.75));return mix(a.x,a.y,smoothstep(0.,.8,mod(t,d)))*(k>=2.?1.+s*.25:.65+s*.25);}\nvarying float vLamp;\n#ifndef USE_INSTANCING\nattribute float lamp;\n#endif\n"+sg(t.vertexShader,"begin_vertex","vLamp=0.;\n#ifndef USE_INSTANCING\nvLamp=lampGlow(lamp);\n#endif\n");t.fragmentShader="uniform float uNight;varying float vLamp;\n"+sg(t.fragmentShader,"emissivemap_fragment","totalEmissiveRadiance+=vec3(1.95,.88,.24)*vLamp*uNight;")}},t.customProgramCacheKey=()=>s?"cidboat5lamp2":"cidboat5",t}window.__R={night:{value:0},lampTime:{value:0},cidPatch:u,Acc:class{constructor(){this.p=[],this.n=[],this.c=[],this.i=[],this.cid=[],this.t0=[],this.lamp=[],this.vc=0,this.cur=-1}add(t,e,o,r,g=0){const s=t.attributes.position,l=t.attributes.normal,f=t.index;
/*§017 pkwgl5fc0gd7*/
a.getNormalMatrix(e),i.set(n(o));const h=this.vc;for(let t=0;t<s.count;t++)c.fromBufferAttribute(s,t).applyMatrix4(e),this.p.push(c.x,c.y,c.z),c.fromBufferAttribute(l,t).applyMatrix3(a).normalize(),this.n.push(c.x,c.y,c.z),this.c.push(i.r,i.g,i.b),this.cid.push(r),this.t0.push(this.cur),this.lamp.push(g);if(f)for(let t=0;t<f.count;t++)this.i.push(h+f.getX(t));else for(let t=0;t<s.count;t++)this.i.push(h+t);this.vc+=s.count}addTri(t,o,r){i.set(n(o));for(let o=0;o<t.length;o+=3){const n=new $4(...t[o]),s=new $4(...t[o+1]),a=new $4(...t[o+2]),c=s.clone().sub(n).cross(a.clone().sub(n)).normalize();for(const t of[n,s,a])this.p.push(t.x,t.y,t.z),this.n.push(c.x,c.y,c.z),this.c.push(i.r,i.g,i.b),this.cid.push(r),this.t0.push(this.cur),this.lamp.push(0),this.i.push(this.vc++)}}geom(){const t=new $7;return _attrs(t,[["position",this.p,3],["normal",this.n,3],["color",this.c,3],["cid",this.cid,1],["t0",this.t0,1],["lamp",this.lamp,1]]),t.setIndex(this.vc>65e3?new e.Uint32BufferAttribute(this.i,1):new e.Uint16BufferAttribute(this.i,1)),t.computeBoundingSphere(),t}},emitModel:function(o,r,a,c,i,u,d,p,y){const _part=g=>(X,Y,Z,W,H,D,C,R,K=0)=>i.add(g,h(X,Y,Z,W,H,D,R),C,p,K),$0=_part(f.box),$1=_part(f.cyl12),_d=_part(f.cyl),_k=_part(f.sph),_h=_part(f.pine),lamp=(X,Y,Z)=>(p===1?3-_l++%2:1)+$b(.9999,B($c(X*13+Z*7),$c(Y*17+p*19)));
/*§018 924o4dw1pqr1*/
let _l=0;y=y||(()=>-1);const x=(t,e,o)=>{i.cur=u.cur=y(t,e,o)},m=new Set;fillCells(m,o.cells);for(const t of o.cyls)for(let e=$c(t.cx-t.r);e<=t.cx+t.r;e++)for(let o=$c(t.cy-t.r);o<=t.cy+t.r;o++)if((e+.5-t.cx)**2+(o+.5-t.cy)**2<t.r*t.r)for(let n=t.z0;n<t.z0+3*t.n;n++)m.add(e+","+o+","+n);const w=(e,o,n)=>[r+e,(c+n)*t,a+o],M=o.cones.filter((t=>!(t.spike||t.flag&&t.r<=.25))),v=(t,e,o)=>M.some((n=>o>=n.z-.6&&o<=n.z+(n.tree?2.6:3*n.h)&&$h(t-n.cx,e-n.cy)<(n.tree?1.2*n.r:n.r)+.35));let g=1e9;for(const t of o.cells)g=$b(g,t.z);const b=t=>{const e=n(t);return"#F0E5CE"==e||"#D3C8B2"==e},C=cellGroups(o.cells);for(const[e,o]of C){let e=1e9,c=-1e9,y=1e9,M=-1e9;for(const t of o)e=$b(e,t.x),c=$a(c,t.x+1),y=$b(y,t.y),M=$a(M,t.y+1);const C=o[0],A=C.z,z=C.h;x(A,e,y);const F=w((e+c)/2,(y+M)/2,A+z/2),E="#D6EEF7"==C.col,S=E?u:i;if(!C.fl.tile||"#3B86C9"!=C.col&&"#6FB3E3"!=C.col){C.fl.round?S.add(f.cyl12,h(...F,.46,z*t-.01,.46),C.col,p):S.add(f.box,h(...F,c-e-.04,z*t-.012,M-y-.04),E?C.col:l(n(A==g&&b(C.col)?"#BFA987":C.col),.95+.09*B($c(7*e+A),$c(3*y+5*A))),p);for(const e of o){if(e.fl.win){const o="x"==e.fl.win,n=z*t,r=w(e.x+.5+(o?.5:0),e.y+.5+(o?0:.5),e.z+.45*z);$0(...r,o?.12:.5,.7*n,o?.5:.12,"#2B3742",0,lamp(...r)),$0(r[0],r[1]-.42*n,r[2],o?.2:.66,.08,o?.66:.2,"#D6C9AE")}if(!e.fl.tile&&!m.has(e.x+","+e.y+","+(e.z+e.h))&&!v(e.x+.5,e.y+.5,e.z+e.h)){const t=w(e.x+.5,e.y+.5,e.z+e.h);d.push([...t,e.col,p,i.cur])}}}else{const t=w(0,0,A)[1],o=w(0,0,A+z)[1];
/*§019 1apkjdiqwvbge*/
$0(F[0],t+.2*(o-t),F[2],c-e-.04,.4*(o-t),M-y-.04,rt(r+e,a+y)),s.push({x:r+e,y:a+y,w:c-e,d:M-y,sy:o,t0:i.cur+.45,tile:1})}}for(const e of o.cyls){const o=e.n,n=e.z0,r=n+3*o,s=e.col||st.w;for(let r=0;r<o;r++){x(n+3*r,e.cx,e.cy);const o=e.stripe?r%2?e.stripe:s:0==r&&e.base?e.baseCol||st.g:0==r&&b(s)?"#BFA987":s,a=w(e.cx,e.cy,n+3*r+1.5);_d(...a,e.r-r%2*.02,3*t-.015,e.r-r%2*.02,o)}if(!e.nowin&&o>=4)for(const[t,r]of[[$c(.45*o),.9],[$c(.75*o),.6]]){if(!t)continue;x(n+3*t,e.cx,e.cy);const o=w(e.cx+$e(r)*e.r,e.cy+$f(r)*e.r,n+3*t+1.5);$0(...o,.32,1,.32,"#3A4250",-r,lamp(...o))}if(e.crown){x(r,e.cx,e.cy);const o=e.r+.35,n=e.crownCol||s;let a=w(e.cx,e.cy,r+.5);_d(...a,e.r+.15,t,e.r+.15,n),a=w(e.cx,e.cy,r+2.5),_d(...a,o,3*t,o,n);const l=e.hasCone||e.noMerlon?0:$a(6,$d(4*o));for(let s=0;s<l;s+=2){const a=s/l*$j*2,u=e.cx+$e(a)*(o-.4),y=e.cy+$f(a)*(o-.4),x=w(u,y,r+5.5);if($0(...x,.8,3*t,.8,n,-a),d.push([x[0],(c+r+7)*t,x[2],n,p,i.cur]),e.caps&&s%4==0){const t=w(u,y,r+8);$1(...t,.4,.8,.4,"#2552B4")}}}else if(!e.hasCone){x(r-1,e.cx,e.cy);d.push([...w(e.cx,e.cy,r),s,p,i.cur])}}for(const e of o.cones){x(e.z,e.cx,e.cy);const o=w(e.cx,e.cy,e.z);if(e.tree){const n=B($c(7*e.cx),$c(5*e.cy)),r=e.col||["#3F6B3A","#4E7A3C","#5C7F40","#355E36","#2F5233","#6B7A45"][$c(6*n)],s=1.18*e.r,a=(e.top?4.6:3.9)*t,c=3*n;if(_h(o[0],o[1]+a/2-.05,o[2],s,a,s,r,c),$1(o[0],o[1]+.05,o[2],.96*s,.1,.96*s,l(r,.7)),e.fl9&&n>.35)for(let t=0;t<3;t++){const e=11*n+2.1*t,r=$b(s+.3,1.4);$1(o[0]+$e(e)*r,o[1]+.065,o[2]+$f(e)*r,.3,.13,.3,["#E58FA6","#F2C43A","#F4F1E8","#C9566E"][$c(4*B(t+3,$c(97*n)))])}(e.snow||"#2E6B4A"==e.col)&&_h(o[0],o[1]+.78*a,o[2],.42*s,.44*a,.42*s,"#F4F7F9",c);
/*§020 w4x8cv151o9d3*/
continue}if(e.spike){$1(o[0],o[1]+.5,o[2],.07,1,.07,st.gold),_k(o[0],o[1]+1.05,o[2],.17,.17,.17,st.gold);continue}const n=3*e.h*t;i.add(8==e.seg?f.cone8:f.cone,h(o[0],o[1]+n/2,o[2],e.r,n,e.r,8==e.seg?$j/8:0),e.col||st.b,p),e.band&&_d(o[0],o[1]+.3*n,o[2],.7*e.r+.04,.14,.7*e.r+.04,st.gold),_d(o[0],o[1]+.06,o[2],e.r+.05,.12,e.r+.05,l(e.col||st.b,.75)),$1(o[0],o[1]+n+.35,o[2],.06,.8,.06,st.gold),_k(o[0],o[1]+n+.78,o[2],.16,.16,.16,st.gold),e.flag&&($1(o[0],o[1]+n+1.6,o[2],.04,1.6,.04,"#55585E"),$0(o[0]+.55,o[1]+n+2.1,o[2],1.1,.6,.04,e.flagCol||"#D8402F"))}for(const s of o.roofs){x(s.z,s.x,s.y);const o=3*s.h*t,u=r+s.x,d=u+s.w,y=a+s.y,m=y+s.d,w=(c+s.z)*t,M=s.col||st.b,v=$b(s.w,s.d)/2,g=s.w>=s.d,b=[u+v,w+o,y+v],C=g?[d-v,w+o,y+v]:[u+v,w+o,m-v],A=[u,w,y],z=[d,w,y],B=[d,w,m],F=[u,w,m],E=g?[A,b,C,A,C,z,z,C,B,B,C,b,B,b,F,F,b,A]:[A,b,z,z,b,C,z,C,B,B,C,F,F,C,b,F,b,A],S=[];for(let t=0;t<18;t+=3){const o=new $4(...E[t+1]).sub(new $4(...E[t])).cross(new $4(...E[t+2]).sub(new $4(...E[t])));S.push(E[t],...o.y<0?[E[t+2],E[t+1]]:[E[t+1],E[t+2]])}i.addTri(S,l(n(M),.95),p),$0((u+d)/2,w+.05,(y+m)/2,s.w+.6,.14,s.d+.6,l(n(M),.42));const D=$a(3,$d(3*s.h));for(let t=1;t<D;t++){const e=t/D,r=v*e;$0((u+d)/2,w+o*e-.02,(y+m)/2,s.w-2*r+.04,.05,s.d-2*r+.04,l(n(M),t%2?.66:.86))}s.w!=s.d&&$0((b[0]+C[0])/2,w+o,(b[2]+C[2])/2,$i(C[0]-b[0])+.15,.12,$i(C[2]-b[2])+.15,l(M,.8))}for(const e of o.decals){x(e.z+e.h,e.x,e.y);const o="y"==e.face,n=e.x+(o?e.w/2:0),r=e.y+(o?0:e.w/2),s=w(n,r,e.z+e.h/2),a=w(n,r,e.z+e.h);
/*§021 1bx5vjt1r7eisf*/
$0(...s,o?.8*e.w:.1,e.h*t,o?.1:.8*e.w,"#4A3A30"),$0(...a,o?e.w:.14,.25,o?.14:e.w,st.gold)}for(const e of o.fx){x(e.z,e.x,e.y);const o=w(e.x,e.y,e.z),n=e.col||"#ECE7DC";if("fig"==e.t)$0(o[0],o[1]+.3,o[2],.42,.6,.26,l(n,.8)),$0(o[0],o[1]+.85,o[2],.46,.5,.28,n),$1(o[0],o[1]+1.3,o[2],.17,.36,.17,"#F2C43A");else if("sail"==e.t){const o=w(e.x+.5,e.y+.5+e.w/2,e.z+e.h/2);$0(o[0]+.15,o[1],o[2],.08,e.h*t,e.w,n),e.stripe&&$0(o[0]+.2,o[1],o[2],.06,e.h*t*.25,e.w+.02,e.stripe)}else if("ship"==e.t){const t=e.ry||0,n=$e(t),r=$f(t),s=(t,e,s)=>[o[0]+t*n+s*r,o[1]+e,o[2]-t*r+s*n],a=(e,o,n,r,a,c,l,u)=>{const d=s(e,o,n);$0(...d,r,a,c,l,t+(u||0))};a(0,.45,0,7,.9,2.2,"#F3F1EA"),a(3.5,.45,0,1.2,.9,1.2,"#F3F1EA",$j/4),a(0,.98,0,7.1,.16,2.34,"#2E5E9E"),a(0,.92,0,6.6,.06,1.9,"#C49565");for(const[t,e]of[[-.6,5],[1.6,4]]){const o=s(t,0,0);$1(o[0],o[1]+1+e/2,o[2],.09,e,.09,"#5A3620"),a(t+.08,1.6+.5*e,0,.07,.72*e,2.3,"#F7F3EA"),a(t+.1,1.6+.62*e,0,.08,.32,2.32,"#C4402F")}}else if("boat"==e.t){const t=1.25*(e.len||3),n=o[0]+t/2,r=o[2]+.5;$0(n,o[1]+.25,r,t,.5,1.1,"#7B4A2C"),$0(n+t/2,o[1]+.25,r,.6,.5,.6,"#7B4A2C",$j/4),$0(n,o[1]+.52,r,t-.3,.06,.8,"#C49565"),$1(n,o[1]+1.9,r,.07,2.8,.07,"#5A3620"),$0(n-.05,o[1]+2.05,r,.55*t,2,.06,"#F7F3EA"),$0(n-.05,o[1]+2.35,r,.56*t,.3,.08,"#C4402F"),$0(n+.3,o[1]+3.45,r,.6,.3,.04,"#C4402F")}}},makeMeshes:function(t,o,r,s,a,c){const l=u(new $8({vertexColors:!0,roughness:.42,metalness:0,envMapIntensity:.8}),a,!0),d=u(new e.MeshDepthMaterial({depthPacking:e.RGBADepthPacking}),a),p=o.geom(),y=new $9(p,l);
/*§022 3ocnuf1ipip2y*/
if(y.frustumCulled=!1,y.castShadow=y.receiveShadow=!0,y.customDepthMaterial=d,t.add(y),r.vc){const o=u(new $8({vertexColors:!0,roughness:.12,metalness:0,transparent:!0,opacity:.62,envMapIntensity:1}),a),n=new $9(r.geom(),o);n.frustumCulled=!1,t.add(n)}const x=f.stud.clone(),m=new $10(x,l,s.length),w=new Float32Array(s.length),M=new Float32Array(s.length);return s.forEach(((t,e)=>{m.setMatrixAt(e,h(t[0],t[1],t[2],t[6]??1,1,t[6]??1)),m.setColorAt(e,i.set(n(t[3]))),w[e]=t[4],M[e]=t[5]??-1})),x.setAttribute("cid",new $11(w,1)),m.frustumCulled=!1,x.setAttribute("t0",new $11(M,1)),m.castShadow=!0,m.receiveShadow=!0,m.customDepthMaterial=d,m.instanceColor.needsUpdate=!0,x.setAttribute("color",new $2(new Float32Array(3*x.attributes.position.count).fill(1),3)),t.add(m),{mesh:y,im:m}},M:h,UG:f,PH:t,RC:n,LOG:(...t)=>console.log("[k3d]",(performance.now()/1e3).toFixed(1),...t),tmpC:i}}(),window.__W9=function(){const va="vec4 w=modelMatrix*vec4(position,1.);vW=w.xyz;gl_Position=projectionMatrix*viewMatrix*w;}",vb="vec3 V=normalize(cameraPosition-vW);float F=clamp((.02+.98*pow(1.-max(dot(n,V),0.),5.))*1.1,0.,",vc="mix(vec3(1.,.96,.84),vec3(.68,.76,.73),uNight)*pow(max(dot(reflect(-uSun,n),V),0.),mix(",vd="mix(col,mix(vec3(.985,.99,.975),vec3(.18,.28,.36),uNight),",ve="normalize(vec3(clamp(g.x,-.4,.4),1.,clamp(g.y,-.4,.4)))",vf="varying vec3 vW,vNo;varying float vT0,vSh;varying vec2 vFl;";
/*§023 n3pp5qhn91h4*/
const t=window.THREE,e="float wh(vec2 p){return fract(sin(dot(p,vec2(41.3,289.1)))*15731.743);}\nfloat wn(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.-2.*f);return mix(mix(wh(i),wh(i+vec2(1,0)),f.x),mix(wh(i+vec2(0,1)),wh(i+vec2(1,1)),f.x),f.y);}\nvec2 wbase(vec2 p,float t){return vec2(.7,.35)*cos(dot(p,vec2(.17,.085))-t*.24)*.055+vec2(-.3,.8)*cos(dot(p,vec2(-.09,.24))+t*.19)*.035+vec2(wn(p*1.7+t*.18)-.5,wn(p*2.1+7.-t*.15)-.5)*.05;}\nfloat sdRR(vec2 p,vec2 b,float r){vec2 q=abs(p)-b+r;return length(max(q,0.))+min(max(q.x,q.y),0.)-r;}\nfloat wcell(vec2 p,float t){vec2 i=floor(p),f=fract(p);float a=9.,b=9.;\n for(int y=-1;y<=1;y++)for(int x=-1;x<=1;x++){vec2 g=vec2(x,y);vec2 h=vec2(wh(i+g),wh(i+g+7.7));vec2 o=g+.5+.38*sin(t*.6+6.2831*h)-f;float d=dot(o,o);if(d<a){b=a;a=d;}else if(d<b)b=d;}\n return 1.-smoothstep(0.,.11,sqrt(b)-sqrt(a));}",o="\n#include <tonemapping_fragment>\n#include <colorspace_fragment>",rp="uniform float uRippleTime,uRippleY[8];uniform vec4 uRipples[8];vec3 wripple(vec3 p){vec3 g=vec3(0.);for(int j=0;j<8;j++){float age=uRippleTime-uRipples[j].z;if(age<0.||age>=3.||uRipples[j].w<=0.||abs(p.y-uRippleY[j])>.05)continue;vec2 v=p.xz-uRipples[j].xy;float d=sqrt(dot(v,v)+.04),q=d-9.*age;if(abs(q)>4.)continue;float sn=sin(2.5*q),amp=.34*uRipples[j].w*pow(1.-age/3.,2.)*smoothstep(0.,.12,age)*exp(-.32*q*q)/sqrt(1.+d);g.xy-=v/d*amp*(2.5*cos(2.5*q)-.64*q*sn-.5*sn/(1.+d));g.z+=amp*sn;}return g;}vec3 wcrest(vec3 c,float h){float a=clamp(h*2.8,-.16,.20);return c*(1.+a)+max(a,0.)*.06;}";return{createResinWater:function(n){const r=n.size[0],s=n.size[1],a=n.yTop-n.yBottom,c=e=>new $3(e),i=new t.Group;
/*§024 tm5ukh69p51i*/
i.position.set(n.center[0],0,n.center[1]),i.rotation.y=n.rotY;const l={uNight:window.__R.night,uDepth:{value:n.depthTex},uSize:{value:new t.Vector2(r,s)},uRad:{value:n.radius},uYT:{value:n.yTop},uYB:{value:n.yBottom},uTime:{value:0},uLevel:{value:1},uSun:{value:new $4(-.45,.8,-.35).normalize()},uCStr:{value:1},uCLevel:{value:n.yTop},uSh:{value:c("#59B9AC")},uDp:{value:c("#16576A")},uIn:{value:c("#348E8A")},uRSh:{value:c("#428FBA")},uRDp:{value:c("#153E6A")},uSky:{value:c("#fbf3e4")},uSkyLo:{value:c("#6fc9b9")},uRipples:{value:Array.from({length:8},()=>new t.Vector4(0,0,-1e6,0))},uRippleTime:{value:0},uRippleY:{value:new Float32Array(8)}},f=new $9(new $12(r,s,1,1).rotateX(-$j/2),new $13({uniforms:l,transparent:!0,depthWrite:!1,vertexShader:`varying vec2 vUv;varying vec3 vW;uniform vec2 uSize;void main(){vUv=position.xz/uSize+.5;${va}`,fragmentShader:`uniform sampler2D uDepth;uniform vec2 uSize;uniform float uRad,uTime,uNight;uniform vec3 uSh,uDp,uSky,uSkyLo,uSun;varying vec2 vUv;varying vec3 vW;\n${e}\n${rp}\nvoid main(){float sd=sdRR((vUv-.5)*uSize,uSize*.5,uRad);if(sd>0.)discard;vec4 Dt=texture2D(uDepth,vUv);if(Dt.a<.5)discard;\n float dn=Dt.r;vec3 rip=wripple(vW);vec2 p=vW.xz,g=wbase(p,uTime)+rip.xy;vec3 n=${ve};\n ${vb}.38);float k=1.-exp(-dn*3.4);\n vec3 col=mix(uSh,uDp,k);float a=mix(.62,.95,k);vec3 R=reflect(-V,n);col=mix(col,mix(uSkyLo,uSky,smoothstep(-.05,.55,R.y)),F);a=max(a,F);\n col+=${vc}220.,140.,uNight))*mix(1.25,.42,uNight);\n float L=0.;for(int r=0;r<4;r++){float rr=1.3*(.3+float(r)*.6),lf=0.;for(int k=0;k<6;k++){float q=float(k)*1.0472+float(r)*.5;lf+=1.-texture2D(uDepth,vUv+vec2(cos(q),sin(q))*rr/uSize).a;}L+=lf/6.*(1.-float(r)*.2);}\n float Lw=clamp(L/2.,0.,1.)+wn(p*.35+uTime*.05)*.07+wn(p*1.3-uTime*.1)*.035;\n float rimf=(1.-smoothstep(0.,min(.45,uSize.x*.0015),-sd))*.35;float foam=clamp(max(max(smoothstep(.5,.75,Lw),(1.-smoothstep(0.,.025,dn))*step(.68,wn(p*2.+uTime*.2))),rimf),0.,.7);\n foam*=mix(1.,.58,uNight);col=${vd}foam);a=max(a,foam);col=wcrest(col,rip.z*(1.-foam));gl_FragColor=vec4(col,a);${o}}`}));
/*§025 crtxp3m9a3dd*/
f.renderOrder=3,f.frustumCulled=!1,i.add(f);const h=[],u=r/2-n.radius,d=s/2-n.radius;for(const[t,e,o]of[[u,d,0],[-u,d,$j/2],[-u,-d,$j],[u,-d,1.5*$j]])for(let r=0;r<=14;r++){const s=o+r/14*$j/2;h.push([t+$e(s)*n.radius,e+$f(s)*n.radius])}h.push(h[0]);const p=[],y=[];for(let t=0;t+1<h.length;t++){const[e,o]=h[t],[n,r]=h[t+1],s=(e+n)/2,a=(o+r)/2;let c=r-o,i=-(n-e);const l=$h(c,i)||1;c/=l,i/=l,c*s+i*a<0&&(c=-c,i=-i);for(const[t,s,a]of[[e,0,o],[n,0,r],[n,1,r],[e,0,o],[n,1,r],[e,1,o]])p.push(t,s,a),y.push(c,0,i)}const x=new $7;x.setAttribute("position",new $2(p,3)),x.setAttribute("normal",new $2(y,3));
/*§026 ijodq812saw3*/
const m=new $9(x,new $13({uniforms:l,side:t.DoubleSide,transparent:!0,depthWrite:!1,vertexShader:"uniform float uYT,uYB,uLevel;varying vec3 vW,vN;varying float vY;void main(){vec3 p=position;p.y=mix(uYB,uYB+(uYT-uYB)*uLevel,p.y);vY=(p.y-uYB)/(uYT-uYB);vec4 w=modelMatrix*vec4(p,1.);vW=w.xyz;vN=normalize(mat3(modelMatrix)*normal);gl_Position=projectionMatrix*viewMatrix*w;}",fragmentShader:`uniform float uLevel,uNight;uniform vec3 uDp,uIn;varying vec3 vW,vN;varying float vY;\nvoid main(){vec3 V=normalize(cameraPosition-vW),n=normalize(vN);if(dot(n,V)<.14)discard;float F=.03+.97*pow(1.-max(dot(n,V),0.),5.);\n vec3 col=mix(uDp,uIn,smoothstep(0.,1.,vY))*.8;col=mix(col,mix(vec3(.96,.98,.95),vec3(.18,.27,.38),uNight),F*.5);float lip=smoothstep(.035,0.,abs(vY-uLevel));col+=lip*mix(.55,.14,uNight);\n col+=pow(.5+.5*sin(dot(vW.xz,vec2(.21,.13))*2.+vY*1.5),60.)*mix(.05,.015,uNight);col*=mix(.82,1.,smoothstep(0.,.12,vY));gl_FragColor=vec4(col,clamp(.66+F*.3+lip,0.,1.));${o}}`}));m.renderOrder=4,m.frustumCulled=!1,i.add(m),n.scene.add(i);const w={uCTime:l.uTime,uCStr:l.uCStr,uCSun:l.uSun,uCLevel:l.uCLevel};return{makeInlandMaterial:function(n){return new $13({uniforms:Object.assign({},l,{uSh:l.uRSh,uDp:l.uRDp,uT:n}),transparent:!0,depthWrite:!1,vertexShader:`attribute float t0,shore;attribute vec2 flow;${vf}void main(){vT0=t0;vSh=shore;vFl=flow;vNo=normalize(mat3(modelMatrix)*normal);${va}`,fragmentShader:`uniform float uTime,uT,uNight;uniform vec3 uSun,uSky,uSkyLo,uSh,uDp;${vf}${e}\n${rp}\nvoid main(){if(uT<vT0)discard;vec2 fl=vFl,p=vW.xz,q=p-fl*uTime*.55;float top=step(.5,vNo.y),blue=top*(1.-uNight);vec3 rip=top>.5?wripple(vW):vec3(0.);vec2 g=wbase(q,uTime)+rip.xy;\n vec3 n=top>.5?${ve}:normalize(vNo);\n ${vb}mix(.55,.38,top));\n vec3 R=reflect(-V,n);float dk=clamp(mix(.64-.34*vSh,.5-.28*vSh,uNight)+(wn(p*.18)-.5)*.05,.18,mix(.68,.58,uNight));float sky=smoothstep(-.05,.55,R.y);vec3 base=mix(mix(uSh,uDp,dk),mix(vec3(.054,.147,.474),vec3(.009,.044,.227),dk),blue),ref=mix(mix(uSkyLo,uSky,sky),mix(vec3(.153,.283,.624),vec3(.337,.485,.855),sky),blue);vec3 col=mix(base,ref,F*mix(1.,.55,blue));\n col+=(${vc}mix(300.,220.,top),140.,uNight))*mix(2.5,1.25,top)*mix(1.,.336,uNight)+mix(vec3(.9),vec3(.15,.25,.32),uNight)*smoothstep(.74,.86,wn(vec2(dot(p,fl)*.9-uTime*.9,dot(p,vec2(-fl.y,fl.x))*3.5)))*mix(.18,.1,top*(1.-uNight))*length(fl))*mix(1.,.28,blue);\n float fo=smoothstep(.82,.98,vSh+(wn(p*2.2+uTime*.25)-.5)*.18)*mix(.92,mix(.1,.18,uNight),top);fo*=mix(1.,.6,uNight)*mix(1.,.35,blue);col=${vd}fo);col=wcrest(col,rip.z*(1.-fo));gl_FragColor=vec4(col,max(mix(.82,.94,blue),fo));${o}}`})},group:i,surface:f,sides:m,uniforms:l,patchCaustics:function(t){if(window.__NOCAUS)return;
/*§027 leezxwv18ld0*/
const o=t.onBeforeCompile,n=t.customProgramCacheKey?t.customProgramCacheKey.bind(t):()=>"";t.onBeforeCompile=(n,r)=>{o&&o.call(t,n,r),n.fragmentShader.includes("#include <emissivemap_fragment>")&&(Object.assign(n.uniforms,w),n.vertexShader="varying vec3 vCW9;\n"+n.vertexShader.replace("#include <project_vertex>","{vec4 q=vec4(transformed,1.);\n#ifdef USE_INSTANCING\nq=instanceMatrix*q;\n#endif\nvCW9=(modelMatrix*q).xyz;}\n#include <project_vertex>"),n.fragmentShader="varying vec3 vCW9;uniform float uCTime,uCStr,uCLevel;uniform vec3 uCSun;\n"+e+"\n"+sg(n.fragmentShader,"emissivemap_fragment","{float dz=uCLevel-vCW9.y;if(dz>0.){vec2 pp=vCW9.xz+uCSun.xz/max(uCSun.y,.2)*dz;float c=wcell(pp*.2,uCTime)*.8;float on=smoothstep(0.,.6,dz);\n float upw=max(dot(normal,normalize((viewMatrix*vec4(0.,1.,0.,0.)).xyz)),0.);c*=mix(.08,1.,smoothstep(.35,.9,upw));\n diffuseColor.rgb*=mix(vec3(1.),vec3(.93,.99,.98),on);totalEmissiveRadiance+=vec3(.85,1.,.92)*c*uCStr*exp(-dz*.08)*on*.5;}}"))},t.customProgramCacheKey=()=>n()+"|caus9",t.needsUpdate=!0},setLevel:function(t){l.uLevel.value=t;
/*§028 11n8ikgkagwej*/
const e=n.yBottom+a*t;f.position.y=e-n.yTop,f.visible=t>.001,l.uCLevel.value=t>.001?e:-1e9},update(t){l.uTime.value+=$b(t,.05)}}}}}();const wt=function(t={}){function viewHeight(){const p=byId("ui");return Math.max(1,innerHeight-(p&&!new URLSearchParams(location.search).has("noui")?p.offsetHeight+(parseFloat(getComputedStyle(p).bottom)||16)+14:0))}const e=P,{Acc:o,emitModel:n,makeMeshes:r,M:a,UG:c,PH:i,RC:f,tmpC:d}=window.__R,x=innerWidth,w=viewHeight(),M=new e.WebGLRenderer({antialias:!0});M.setPixelRatio($b(devicePixelRatio,2)),M.setSize(x,w),M.shadowMap.enabled=!0,M.shadowMap.type=e.PCFShadowMap,M.toneMapping=e.ACESFilmicToneMapping,M.toneMappingExposure=1.02,document.body.appendChild(M.domElement);const v=new $3("#E8DED0"),g=new e.Scene;g.background=v,g.fog=new e.Fog(v.clone(),700,1600);const C=new e.PMREMGenerator(M),_b=new _;g.environment=C.fromScene(_b,.04).texture,g.environmentIntensity=1,_b.dispose(),C.dispose();function makeInstance(o,p,v,r=0){const t=new $10(o,window.__R.cidPatch(new $8(p),I),v.length),n=new Float32Array(v.length),c=new Float32Array(v.length).fill(-1);v.forEach((b,j)=>{t.setMatrixAt(j,a(b[0],b[1],b[2],b[3],b[4],b[5],r?b[6]:0)),t.setColorAt(j,d.set(r?b[7]:f(b[6]))),n[j]=b[7+r]});
/*§029 1m451mubrwtr7*/
t.geometry=o.clone(),t.geometry.setAttribute("t0",new $11(n,1)),t.geometry.setAttribute("cid",new $11(c,1)),t.customDepthMaterial=window.__R.cidPatch(new e.MeshDepthMaterial({depthPacking:e.RGBADepthPacking}),I),t.castShadow=t.receiveShadow=!0,t.frustumCulled=!1,g.add(t);return t}const A=function(){if(xt)return xt;const{A:t,B:e,vc:o,taper:n=0}=ot.ellipse,r=ot.shape?function(t){if(!t)return null;const e=Array.isArray(t)?t:t.poly,o=t.lobes,n=t.minus;return e&&e.length>2||o&&o.length?(t,r)=>{let s=1e9;if(e&&e.length>2){let o=!1,n=1e9;for(let s=0,a=e.length-1;s<e.length;a=s++){const[c,i]=e[a],[l,f]=e[s];i>r!=f>r&&t<(l-c)*(r-i)/(f-i)+c&&(o=!o);n=$b(n,sd(t-c,r-i,l-c,f-i))}s=o?-n:n}if(o)for(const[e,n,a]of o)s=$b(s,$h(t-e,r-n)-a);if(n)for(const[e,o,a]of n)s=$a(s,a-$h(t-e,r-o));return s}:null}(ot.shape):null,s=nt.length,a=ot.districts,c=(s,a)=>r?r(s,a):(s/(t*$a(.3,1+n*(o-a)/e)))**2+((a-o)/e)**2,i=[];for(let t=-6;t<=42;t++)for(let e=-18;e<=18;e++)(e+t)%2||i.push({u:e,v:t,e:c(e,t)});i.sort(((t,e)=>t.e-e.e));const l=i[$b(s,i.length)-1].e+(r?3:.3),f=[],h=new Map;for(const t of ot.rivers){const e=t.path.map((([t,e])=>[(t+e)/2,(e-t)/2])),o=[];let n=null,r=null;const s=(t,e)=>{const n=t+","+e;if(h.has(n)||c(t-e,t+e)>l)return;const r={u:t-e,v:t+e,dist:"river"};h.set(n,r),o.push(r)};for(let t=0;t+1<e.length;t++){const[o,a]=e[t],[c,i]=e[t+1],l=$g(5*$h(c-o,i-a))+1;for(let t=0;t<=l;t++){const e=$d(o+(c-o)*t/l),f=$d(a+(i-a)*t/l);null!==n&&e!=n&&f!=r&&s(e,r),s(e,f),n=e,r=f}}if(o.length){const n={w:t.width,tiles:o,P:e};
/*§030 103l6lt124v526*/
o.forEach(((t,e)=>{t.rv=n,t.ri=e})),f.push(n)}}const u=i.filter((t=>!h.has((t.u+t.v)/2+","+(t.v-t.u)/2))).slice(0,s),d={};for(const t of nt)d[t.dist]=(d[t.dist]||0)+1;const p=[];for(const t of u)for(const e in d){const o=a[e].at;p.push({s:t,k:e,d:$h(1.15*(t.u-o[0]),t.v-o[1])})}p.sort(((t,e)=>t.d-e.d));for(const t of p)!t.s.dist&&d[t.k]&&(t.s.dist=t.k,d[t.k]--);const y={};for(const t of nt)(y[t.dist]=y[t.dist]||[]).push(t);for(const t in y){const e=u.filter((e=>e.dist==t)),o=[...y[t]].sort(((t,e)=>(e.hero?1:0)-(t.hero?1:0))),n=a[t].at;o[0].hero?e.sort(((t,e)=>$h(t.u-n[0],t.v-n[1])-$h(e.u-n[0],e.v-n[1]))):e.sort(((t,e)=>t.v-e.v||t.u-e.u)),e.forEach(((t,e)=>t.rc=o[e]))}const x=f.flatMap((t=>t.tiles)),m=[...u,...x],w=$b(...m.map((t=>(t.u+t.v)/2))),M=$b(...m.map((t=>(t.v-t.u)/2))),v=ot.coast.sea+ot.coast.beach+10;for(const t of m)t.sx=(t.u+t.v)/2-w,t.sy=(t.v-t.u)/2-M,t.X=15*t.sx+v,t.Y=15*t.sy+v,t.cx=t.X+7,t.cy=t.Y+7;for(const t of u)t.z=S(t.dist,t.rc);const g=(t,e)=>$i(t.sx-e.sx)<1.1&&$i(t.sy-e.sy)<1.1;for(const t of f){let e=99;const o=t.tiles;o.forEach(((t,n)=>{let r=0;for(const e of u)g(e,t)&&(r=$a(r,e.z));r=$b(e,$a(0,r-3)),t.z=r,e=r;const s=o[$a(0,n-1)],a=o[$b(o.length-1,n+1)],c=a.cx-s.cx,i=a.cy-s.cy,l=$h(c,i)||1;t.fl=[c/l,i/l]})),t.pts=t.P.map((([t,e])=>[15*(t-w)+v+7,15*(e-M)+v+7]))}const b=(t,e)=>{let o=1e9,n=null;for(const r of f){const s=r.pts;for(let a=0;a+1<s.length;a++){const[c,i]=s[a],[l,f]=s[a+1],p=sd(t-c,e-i,l-c,f-i);p<o&&(o=p,n=r)}}return[o,n]},C=[],A=new Map,z=t=>{C.push(t),A.set(t.x+","+t.y,t)};
/*§031 kpoqyklmvxxc*/
for(const t of u)for(let e=0;e<15;e++)for(let o=0;o<15;o++){const n=t.X+e,r=t.Y+o,s=E(t.dist,e,o),a="#3B86C9"==s||"#6FB3E3"==s,c=(14==e||14==o)&&!a;z({x:n,y:r,h:t.z,water:a,pl:e<14&&o<14?t:null,dist:t.dist,top:c?"#C7CACD":s,path:c,body:t.z>8?"#8E9398":"#A3A7AA"})}for(const t of x){const e=u.filter((e=>g(e,t)));for(let o=0;o<15;o++)for(let n=0;n<15;n++){const r=t.X+o,s=t.Y+n,[a,c]=b(r+.5,s+.5),i=$a(c.w,3)/2+1.2*(F(r,s,4)-.5);if(a<i){z({x:r,y:s,h:t.z,water:!0,river:t,top:B(r,s)<.15?"#6FB3E3":"#3B86C9",body:"#8E9398"});continue}let l=null,f=1e9;for(const t of e){const e=$h(r-t.cx,s-t.cy);e<f&&(f=e,l=t)}const h=l?l.z:t.z+3,u=$b(1,(a-i)/5.5);let d=$d(t.z+1+($a(h,t.z+2)-t.z-1)*u*u+2.4*(F(r+31,s+17,3)-.5));d=$a(t.z+1,d);const p=h>=18,y=F(r+3,s+7,2.5)>.72&&a<i+3;z({x:r,y:s,h:d,water:!1,dist:"river",top:a<i+1.4?"#E3CB93":y?"#9EA4A9":p?B(r,s)<.2?"#E6ECEF":"#F4F6F7":B(r,s)<.18?"#4C9A3C":"#58A845",body:d>8?"#8E9398":"#A3A7AA",bank:1,snow:p})}}let D=1e9,P=1e9,k=-1e9,T=-1e9;for(const t of C)D=$b(D,t.x),P=$b(P,t.y),k=$a(k,t.x),T=$a(T,t.y);const _=Math.SQRT1_2;let R=1e9,I=-1e9,L=1e9,W=-1e9;const G=(t,e)=>{const o=(t+e)*_,n=(t-e)*_;R=$b(R,o),I=$a(I,o),L=$b(L,n),W=$a(W,n)};for(const t of C)G(t.x+.5,t.y+.5);const O=$b(7,ot.coast.beach+2);R-=O,I+=O,L-=O,W+=O;const V=$b(26,.2*(W-L)),Y=(t,e)=>{const o=(t+.5+e+.5)*_,n=(t+.5-e-.5)*_;if(o<R||o>I||n<L||n>W)return!1;const r=$a(R+V-o,0,o-(I-V)),s=$a(L+V-n,0,n-(W-V));return $h(r,s)<=V};mt={pa0:R,pa1:I,pb0:L,pb1:W,inSlab:Y,RR:V};let U=ot.coast.sea+40;
/*§032 10l16kq1y5uosa*/
for(const t of[R,I])for(const e of[L,W]){const o=(t+e)*_,n=(t-e)*_;U=$a(U,$g(D-o)+4,$g(o-k)+4,$g(P-n)+4,$g(n-T)+4)}const j=k-D+1+2*U,N=T-P+1+2*U,q=new Float32Array(j*N);for(const t of C)q[t.x-D+U+(t.y-P+U)*j]=1;const X=new Float32Array(j*N).fill(1e9);for(let t=0;t<q.length;t++)q[t]&&(X[t]=0);for(let t=0;t<2;t++){const e=t?-1:1;for(let o=t?N-1:0;t?o>=0:o<N;o+=e)for(let n=t?j-1:0;t?n>=0:n<j;n+=e){const t=n+o*j;for(const[r,s,a]of[[-1,0,1],[0,-1,1],[-1,-1,1.414],[1,-1,1.414]]){const c=n+r*e,i=o+s*e;if(c<0||i<0||c>=j||i>=N)continue;const l=X[c+i*j]+a;l<X[t]&&(X[t]=l)}}}const H=new Float32Array(j*N),K=new Float32Array(j*N);for(let t=0;t<N;t++){let e=0;for(let o=-7;o<j;o++)o+7<j&&(e+=q[o+7+t*j]),o-7-1>=0&&(e-=q[o-7-1+t*j]),o>=0&&(H[o+t*j]=e)}for(let t=0;t<j;t++){let e=0;for(let o=-7;o<N;o++)o+7<N&&(e+=H[t+(o+7)*j]),o-7-1>=0&&(e-=H[t+(o-7-1)*j]),o>=0&&(K[t+o*j]=e/225)}for(let t=0;t<N;t++)for(let e=0;e<j;e++){const o=e+t*j;if(q[o])continue;const n=e+D-U,r=t+P-U;if(!Y(n,r))continue;const s=X[o],a=F(n,r,7),c=K[o]>.3+.12*a,i=ot.coast.beach+2.5*a;if(c||s<=i){const t=c?$b(s,i):s;z({x:n,y:r,h:t<.45*i?2:1,water:!1,top:B(n,r)<.18?"#D9BE85":t<1.5?"#E8D3A0":"#E3CB93",body:"#C9A97A",beach:1,dCoast:s})}else{const t=s-i,e=F(n+7,r+3,5),o=t<8&&F(1.3*n+11,1.3*r+5,3)>.64;let a=-$d(2+30*Math.pow($b(1,t/16),.8)+5*e);o&&(a=$b(-1,a+4+$d(5*B(n,r))));const c=B(n,r);z({x:n,y:r,h:a,water:!1,sea:1,foam:t<1.2,reef:o,top:o?c<.35?"#9A9384":c<.6?"#B0A898":"#857E70":c<.1?"#D3BE8E":c<.16?"#B9C3A0":a>-8?"#EAD8AB":a>-20?"#DCC799":"#CDBA8E",body:"#CDB68A",dCoast:s})}}let $=0,Q=0;
/*§033 1puswt11r3n6mz*/
for(const t of C)$=$a($,t.x),Q=$a(Q,t.y);return xt={plots:u,river:x,rivers:f,cols:C,colMap:A,W:$+1,H:Q+1,slab:mt},xt}(),z=A.plots.find((t=>t.rc.hero));let k=0,R=0;for(const t of A.plots)k+=t.cx,R+=t.cy;k/=A.plots.length,R/=A.plots.length;const I={uOff:{value:Array.from({length:141},(()=>new $4))},uT:{value:0},uBoatMove:{value:Array.from({length:32},()=>new e.Vector4(0,0,1,0))},uBoatPivot:{value:Array.from({length:32},()=>new e.Vector2)}},L=new o,W=new o,G=[],O=.3,V=10.6,Y={land:[0,.55],river:[.08,.52],beach:[.4,.7],sea:[.45,.9],bridges:[.55],wall:[.45,.95]};let U=0;for(const t of A.cols)t.water||t.beach||(U=$a(U,$h(t.x-z.cx,t.y-z.cy)));function j(t){const e=B(3*t.x+1,5*t.y+2)*(t.sea||t.beach?.35:.08);if(t.sea)return O+V*(Y.sea[0]+(Y.sea[1]-Y.sea[0])*$b(1,t.dCoast/(ot.coast.sea+4)))+e;if(t.beach)return O+V*(Y.beach[0]+(Y.beach[1]-Y.beach[0])*$b(1,t.dCoast/(ot.coast.beach+3)))+e;if(t.river)return O+V*(Y.river[0]+(Y.river[1]-Y.river[0])*(t.river.ri/t.river.rv.tiles.length+(t.x+t.y)%15/15/t.river.rv.tiles.length))+e;const o=$h(t.x-z.cx,t.y-z.cy)/U,n=(Math.atan2(t.y-z.cy,t.x-z.cx)/6.283+1)%1;return t.water?O+V*(Y.land[0]+(Y.land[1]-Y.land[0])*o)+.6+e:O+V*(Y.land[0]+(Y.land[1]-Y.land[0])*$b(1,.92*o+.08*n))+e}const N=new Map;for(const t of A.cols)N.set(t.x+","+t.y,j(t));const q=(t,e)=>N.get($c(t)+","+$c(e))??10.9,X=[],H=[],K=-48,$=["#D6C095","#C8AF82","#B8A27C","#A99C88","#CDB68A"],Q=t=>!(A.colMap.has(t.x+1+","+t.y)&&A.colMap.has(t.x-1+","+t.y)&&A.colMap.has(t.x+","+(t.y+1))&&A.colMap.has(t.x+","+(t.y-1))),Z=new Map;
/*§034 1573l7bqnnh0e*/
{const t=new Map;for(const e of A.cols)e.sea&&t.set(e.x+","+e.y,e.h+(e.reef?-3:0));for(const e of A.cols){if(!e.sea)continue;let o=0,n=0;for(let r=-2;r<=2;r++)for(let s=-2;s<=2;s++){const a=t.get(e.x+r+","+(e.y+s));if(void 0!==a){const t=1/(1+r*r+s*s);o+=a*t,n+=t}}Z.set(e.x+","+e.y,o/n+1.6*(F(e.x+3,e.y+8,4)-.5))}}const J=(t,e)=>{let o=0,n=0;for(const[r,s]of[[-1,-1],[0,-1],[-1,0],[0,0]]){const a=Z.get(t+r+","+(e+s));void 0!==a&&(o+=a,n++)}return n?o/n:null},tt=t=>{let e=1e9;for(let o=0;o<=1;o++)for(let n=0;n<=1;n++){const r=J(t.x+o,t.y+n);null!==r&&(e=$b(e,r))}return e};for(const t of A.cols){const e=!t.sea&&(t.water||"#3B86C9"==t.top||"#6FB3E3"==t.top);e&&(t.iw9=1);const o=e?t.h-.6:t.h,n=t.sea?$c(tt(t))-1:t.h-1,r=N.get(t.x+","+t.y);let a=0;const c=Q(t),f=c?K:$b(-4,3*$c((n-K)/3)+K);!c&&f>K&&X.push([t.x+.5,(K+f)/2*i,t.y+.5,1,(f-K)*i-.012,1,"#C8AF82",r]);for(let o=f;o<n-.01;o+=3,a++){const s=$b(n,o+3),c=o<0&&!t.water?$[($c((o-K)/3)+(B(t.x,t.y)<.15?1:0))%5]:e?"#B9A47C":o>6?l(t.body,.86+.22*B(5*t.x+$c(o/3),3*t.y+7)):t.body;X.push([t.x+.5,(o+s)/2*i,t.y+.5,1,(s-o)*i-.012,1,c,r+.09*a])}const h=r+.09*a;t.sea?N.set(t.x+","+t.y,h):(X.push([t.x+.5,(o-(e?.4:1)/2)*i,t.y+.5,e?.985:.965,(e?.4:1)*i-.01,e?.985:.965,e?rt(t.x,t.y):t.top,h]),N.set(t.x+","+t.y,h),e&&s.push({x:t.x,y:t.y,sy:(t.water?t.h+.6:t.h)*i,t0:h+.3,c:t}),e||t.path||t.pl||H.push([t.x+.5,o*i,t.y+.5,t.top,-1,h+.12,.53/.60]))}{const t=[],o=[],n=[],r=[],s=[],c=[],l=new $3;for(const e of A.cols){if(!e.sea)continue;
/*§035 179lp2t4xnnfb*/
const a=N.get(e.x+","+e.y)+.1,f=[[e.x,e.y],[e.x+1,e.y],[e.x+1,e.y+1],[e.x,e.y+1]].map((([t,e])=>[t,J(t,e)*i,e]));for(const e of[0,2,1,0,3,2]){const[h,u,d]=f[e],p=(t,e)=>{const o=J(t,e);return null===o?u/i:o};t.push(h,u,d),o.push((p(h-1,d)-p(h+1,d))*i/2,1,(p(h,d-1)-p(h,d+1))*i/2),r.push(h/14,d/14*1.3);const y=F(h+31,d+17,6),x=$b(1,-u/14);l.set(y>.7?"#CBB797":"#F2E3C4").multiplyScalar(1-.12*x),n.push(l.r,l.g,l.b),s.push(a),c.push(-1)}}const f=new $7;_attrs(f,[["position",t,3],["uv",r,2],["color",n,3],["t0",s,1],["cid",c,1],["normal",o,3]]),f.normalizeNormals();const h=window.__R.cidPatch(new $8({roughness:.95,vertexColors:!0,envMapIntensity:.6}),I),u=new $9(f,h);u.receiveShadow=!0,u.frustumCulled=!1,g.add(u);const p=new e.IcosahedronGeometry(1,1);{const t=p.attributes.position;for(let e=0;e<t.count;e++){const o=t.getX(e),n=t.getY(e),r=t.getZ(e),s=1+.55*(F(9*o+50,9*n+7*r,3)-.5);t.setXYZ(e,o*s,n*s*.8,r*s)}}const y=p.toNonIndexed();y.computeVertexNormals();const x=["#6E6458","#7C7064","#5E564C","#8A7D6C","#736A60","#93887A"],m=["#B9AD98","#A89C86","#C9BEA8","#8F8576"],w=[],M=t=>[[1,0],[-1,0],[0,1],[0,-1]].some((([e,o])=>{const n=A.colMap.get(t.x+e+","+(t.y+o));return n&&!n.sea}));for(const t of A.cols){if(!t.sea)continue;const e=Z.get(t.x+","+t.y),o=N.get(t.x+","+t.y)+.2,n=B(5*t.x+3,7*t.y+1),r=M(t);if(A.slab.inSlab(t.x+4,t.y)&&A.slab.inSlab(t.x-4,t.y)&&A.slab.inSlab(t.x,t.y+4)&&A.slab.inSlab(t.x,t.y-4)){if(t.reef?n<.32:r?n<.55:n<.004){const n=r?1+$c(3*B(t.x,t.y+9)):2+$c(4*B(t.x+4,t.y));for(let s=0;s<n;
/*§036 141cfga13morta*/
s++){const n=B(t.x+13*s,3*t.y+s),a=B(3*t.x+s,t.y+17*s),c=$b((0==s?1.1+1.6*n:.45+.8*n)*(r?1.15:1),$a(.35,-e*i*.75)),l=e;w.push([t.x+n,l*i+.25*c,t.y+a,c,c*(.6+.35*a),c*(.8+.3*n),6.28*n,x[$c(B(t.x+s,5*t.y)*x.length)],o])}}if(F(t.x+77,t.y+21,7)>.66&&n>.6)for(let n=0;n<3;n++){const r=B(t.x+7*n,t.y+3*n),s=B(7*t.x+n,t.y+11*n),a=.12+.2*r;w.push([t.x+r,e*i+.03,t.y+s,a,.6*a,.8*a,6*s,m[n%4],o])}}}makeInstance(y,{roughness:.88,flatShading:!0,envMapIntensity:.6},w,1)}const et=makeInstance(c.box,{roughness:.38,envMapIntensity:.75},X);for(const t of A.plots)for(let e=0;e<14;e++)for(let o=0;o<14;o++){const n=A.colMap.get(t.X+e+","+(t.Y+o));!n||n.sea||n.water||n.iw9||n.path||H.push([n.x+.5,n.h*i,n.y+.5,n.top,-1,N.get(n.x+","+n.y)+.12,.53/.60])}const ct={};for(const t of A.plots)(ct[t.dist]=ct[t.dist]||[]).push(t);const it=ot.districts[z.dist].at,lt=Object.keys(ct).sort(((t,e)=>$h(ot.districts[t].at[0]-it[0],ot.districts[t].at[1]-it[1])-$h(ot.districts[e].at[0]-it[0],ot.districts[e].at[1]-it[1])));for(const t in ct)ct[t].sort(((t,e)=>(e.rc.hero?1:0)-(t.rc.hero?1:0)||t.v-e.v||t.u-e.u));const ft=_blankModel();function ht(t,e){const o=t.dist,n=dt[o];if(yt(n))return;const r=new Set,s=(t,e,o)=>{for(let n=$c(t-o-1);n<=t+o+1;n++)for(let t=$c(e-o-1);t<=e+o+1;t++)r.add(n+","+t)};for(const t of e.cells)for(let e=-1;e<=1;e++)for(let o=-1;o<=1;o++)r.add(t.x+e+","+(t.y+o));for(const t of e.cyls)s(t.cx,t.cy,t.r+.6);for(const t of e.cones)s(t.cx,t.cy,t.r);for(const t of e.roofs)for(let e=$c(t.x)-1;e<=t.x+t.w+1;e++)for(let o=$c(t.y)-1;o<=t.y+t.d+1;o++)r.add(e+","+o);
/*§037 k0rdhz1kn53im*/
for(const t of e.fx)s(t.x||0,t.y||0,1.2);const a=.25+.55*B(o.charCodeAt(0),o.length),c=pt(n);for(let e=0;e<14;e++)for(let o=0;o<14;o++){if(e>1&&o>1&&e<12&&o<12)continue;if(r.has(e+","+o))continue;const n=B(t.X+e+7,t.Y+o+3);if(n>a)continue;const s=A.colMap.get(t.X+e+","+(t.Y+o));if(s&&!s.water){for(let t=-1;t<=1;t++)for(let n=-1;n<=1;n++)r.add(e+t+","+(o+n));y(ft,{x:t.X+e,y:t.Y+o,z:t.z,s:n<.45*a?2:1,col:c?"#2E6B4A":void 0,snow:c})}}}for(const t of A.plots){const e=m(t.rc);ht(t,e);let o=1e9,r=-1e9;for(const t of e.cells)o=$b(o,t.z),r=$a(r,t.z);for(const t of e.cyls)o=$b(o,t.z0),r=$a(r,t.z0+3*t.n);for(const t of e.cones)r=$a(r,t.z);for(const t of e.roofs)r=$a(r,t.z);o>r&&(o=r=0);const s=12.2+1.8*$a(0,lt.indexOf(t.dist))+.15*ct[t.dist].indexOf(t),a=t.rc.hero?6:2.4;t.tStart=s;const c=(e,n,c)=>s+a*$a(0,$b(1,(e-o+2.4*B(13*($c(2*n)+50*t.rc.id)+7,31*($c(2*c)+$c(e))+3))/(r-o+3)));n(e,t.X,t.Y,t.z,L,W,G,t.rc.id,c)}const ut=$a(...A.plots.map((t=>t.tStart+(t.rc.hero?6:2.4)))),wt=$b(20,...A.plots.filter((t=>yt(dt[t.dist]))).map((t=>t.tStart))),Mt=(t,e,o)=>{const n=((t,e)=>{let o=null,n=1e9;for(const r of A.plots){const s=$h(t-r.cx,e-r.cy);s<n&&(n=s,o=r)}return o})(e,o);return $a(q(e,o)+.6,n.tStart+.6*(n.rc.hero?6:2.4)+.8*B($c(e),$c(o)))+.05*t},vt=(t,e,o)=>wt+2+4*B($c(e)+3,$c(o)+9)+.03*t,gt=b(D(A)),bt=_blankModel();bt.fx=gt.fx.filter((t=>"boat"==t.t||"ship"==t.t||"buoy"==t.t)),gt.fx=gt.fx.filter((t=>"boat"!=t.t&&"ship"!=t.t&&"buoy"!=t.t));const Ct=b(function(t){const e=_blankModel();let o=0;for(const n of t){const t=dt[n.dist];
/*§038 49x6geqhbxs5*/
if(yt(t))continue;const r=n.X+14,s=n.Y+(5*n.u+3*n.v+40)%11+1;if(pt(t)?y(e,{x:r,y:s,z:n.z,s:2,col:"#2E6B4A"}):y(e,{x:r,y:s,z:n.z,s:1+o++%2}),(3*n.u+n.v)%4==0)for(let t=0;t<3;t++){const o=n.Y+(5*t+3*n.u+50)%13+.5;e.fx.push({t:"fig",x:n.X+14.5,y:o,z:n.z,col:["#C4402F","#2552B4","#F2C43A","#2F7D35"][(t+n.v)%4],k:n.X+14.5+o+1})}}return e}(A.plots)),At=b(function(t){return function(t){const e=_blankModel(),o=(e,o)=>t.plots.some((t=>t.sx==e&&t.sy==o))||t.river.some((t=>t.sx==e&&t.sy==o)),n=new Set,r=ot.wall.courses;for(const s of[...t.plots,...t.river]){const t=s.X,a=s.Y,c=s.z+("river"==s.dist?3:0),_wall=(x,y,w,d)=>u(e,{x,y,z:c,w,d,n:r,col:"#D8CAAE",cren:1,capCol:"blue",base:"#BBA987",win:!1});o(s.sx+1,s.sy)||(_wall(t+14,a,1,15),n.add(t+14.5+","+(a+.5)+","+c),n.add(t+14.5+","+(a+14.5)+","+c)),o(s.sx,s.sy+1)||(_wall(t,a+14,15,1),n.add(t+.5+","+(a+14.5)+","+c),n.add(t+14.5+","+(a+14.5)+","+c)),o(s.sx-1,s.sy)||(_wall(t,a,1,15),n.add(t+.5+","+(a+.5)+","+c)),o(s.sx,s.sy-1)||(_wall(t,a+14,15,1),n.add(t+.5+","+(a+.5)+","+c))}let s=0;const a=[];for(const t of n){const[o,n,c]=t.split(",").map(Number);a.some((t=>$h(t[0]-o,t[1]-n)<9))||(a.push([o,n]),p(e,{x:o,y:n,z:c,r:1.6,n:r+2,cone:s++%3?7:0,coneCol:s%5==0?"red":"dblue",crown:!0,caps:1,flag:1,base:"#BBA987",col:"#E6DCC4"}))}return e}(t)}(A));b(ft),n(gt,0,0,0,L,W,G,-1,((t,e,o)=>{const n=q(e,o);return $a(n+.6,O+V*Y.bridges[0])+.05*t})),n(Ct,0,0,0,L,W,G,-1,Mt),ft.cones.forEach((t=>{t.tree&&(t.fl9=1)})),n(ft,0,0,0,L,W,G,-1,Mt),bt.fx.forEach(((t,e)=>{const o=_blankModel();
/*§039 2v4u3pf2yahd*/
o.fx=[t],n(o,0,0,0,L,W,G,-(10+e),vt)})),n(At,0,0,0,L,W,G,-1,((t,e,o)=>{const n=(Math.atan2(o-R,e-k)/6.283+1)%1;return O+V*(Y.wall[0]+(Y.wall[1]-Y.wall[0])*n)+.04*t}));{const _m=new Set;for(const t of H){const key=t[0]+","+t[1]+","+t[2];if(!_m.has(key)){_m.add(key);G.push(t)}}}r(g,L,W,G,I);let zt=[1e9,-1e9,1e9,-1e9,-1e9];for(let t=0;t<L.cid.length;t++)if(L.cid[t]==z.rc.id){const e=L.p[3*t],o=L.p[3*t+1],n=L.p[3*t+2];zt[0]=$b(zt[0],e),zt[1]=$a(zt[1],e),zt[2]=$b(zt[2],n),zt[3]=$a(zt[3],n),zt[4]=$a(zt[4],o)}const Bt=[(zt[0]+zt[1])/2,z.z*i+.45*(zt[4]-z.z*i),(zt[2]+zt[3])/2];const $z=new e.HemisphereLight("#E5EBE7","#B8A38A",.6);g.add($z);const Ft=new $14("#FFE2BB",3.7);g.add(Ft.target),Ft.castShadow=!0,Ft.shadow.mapSize.set(t.shadow||4096,t.shadow||4096);const Et=Ft.shadow.camera;Et.left=-360,Et.right=360,Et.top=360,Et.bottom=-360,Et.near=20,Et.far=1400,Ft.shadow.bias=-4e-4,Ft.shadow.normalBias=.04,Ft.shadow.radius=3,g.add(Ft);const St=new $14("#F3D0A6",.24),Dt=new $14("#D9E6E8",.34);Dt.position.set(-300,200,300),g.add(Dt),g.add(St);const Pt=new $9(new $12(4e3,4e3),new e.ShadowMaterial({opacity:.22}));Pt.rotation.x=-$j/2,Pt.position.y=-48*i-.05,Pt.receiveShadow=!0,g.add(Pt);const kt=A.slab,Tt=Math.SQRT1_2,_t=kt.pa1-kt.pa0,Rt=kt.pb1-kt.pb0,It=(kt.pa0+kt.pa1)/2,Lt=(kt.pb0+kt.pb1)/2,Wt=(It+Lt)*Tt,Gt=(It-Lt)*Tt,Ot=.4*i,Vt=-48*i,Yt=_t+.7,Ut=Rt+.7,jt=Ot-Vt,Nt=$b(1024,$g(1.5*Yt)),qt=$b(1024,$g(1.5*Ut)),Xt=new Uint8Array(Nt*qt*4);for(let t=0;t<qt;t++)for(let e=0;e<Nt;
/*§040 mmfnozt6ykr0*/
e++){const o=It+((e+.5)/Nt*Yt-Yt/2),n=Lt-((t+.5)/qt*Ut-Ut/2),r=A.colMap.get($c((o+n)*Tt)+","+$c((o-n)*Tt)),s=4*(t*Nt+e);if(r&&!r.sea)continue;const a=r?r.h*i:Vt;Xt[s]=$a(0,$b(255,$d((Ot-a)/jt*255))),Xt[s+1]=r&&r.reef?110:0,Xt[s+3]=255}for(let t=0;t<2;t++){const t=Xt.slice();for(let e=1;e<qt-1;e++)for(let o=1;o<Nt-1;o++){const n=4*(e*Nt+o);if(!t[n+3])continue;let r=0,s=0;for(let n=-1;n<=1;n++)for(let a=-1;a<=1;a++){const c=4*((e+n)*Nt+o+a);t[c+3]&&(r+=t[c],s++)}Xt[n]=r/s}}const Ht=new e.DataTexture(Xt,Nt,qt,e.RGBAFormat);Ht.magFilter=Ht.minFilter=e.LinearFilter,Ht.needsUpdate=!0;const Kt=window.__W9.createResinWater({scene:g,center:[Wt,Gt],size:[Yt,Ut],radius:kt.RR+.35,rotY:-$j/4,yTop:Ot,yBottom:Vt,depthTex:Ht});Kt.group.traverse((t=>{t.frustumCulled=!1}));{const t=new Map;for(const e of s)e.tile||t.set(e.x+","+e.y,e);const o=[],n=[],r=[],a=[],c=[],l=(t,e,s,i,l)=>{for(let f=0;f<t.length;f++)o.push(...t[f]),n.push(e),r.push(s[f]),a.push(...i),c.push(...l)},f=(t,e,o,n,r,s,a,c)=>l([t,e,o,t,o,n],r,[s[0],s[1],s[2],s[0],s[2],s[3]],a,c),h=t=>t&&t.river?t.river.fl:[.05,.03],u=(e,o,n)=>{const r=t.get(e+","+o);return r&&$i(r.sy-n)<.05};for(const e of s){const o=e.sy;if(e.tile){f([e.x,o,e.y],[e.x,o,e.y+e.d],[e.x+e.w,o,e.y+e.d],[e.x+e.w,o,e.y],e.t0,[0,0,0,0],[.05,.03],[0,1,0]);continue}const n=e.x,r=e.y,s=h(e.c),a=(t,e)=>u(t-1,e-1,o)&&u(t,e-1,o)&&u(t-1,e,o)&&u(t,e,o)?0:1;f([n,o,r],[n,o,r+1],[n+1,o,r+1],[n+1,o,r],e.t0,[a(n,r),a(n,r+1),a(n+1,r+1),a(n+1,r)],s,[0,1,0]);
/*§041 13jr1mna345jn*/
for(const[s,a,c,l,h]of[[1,0,[n+1,r],[n+1,r+1],[1,0,0]],[-1,0,[n,r+1],[n,r],[-1,0,0]],[0,1,[n+1,r+1],[n,r+1],[0,0,1]],[0,-1,[n,r],[n+1,r],[0,0,-1]]]){const u=A.colMap.get(n+s+","+(r+a)),d=t.get(n+s+","+(r+a)),p=d?d.sy:u?u.sea?Ot:u.h*i:o-2;p>=o-.02||f([c[0],p,c[1]],[c[0],o,c[1]],[l[0],o,l[1]],[l[0],p,l[1]],e.t0,[1,1,1,1],[0,-1],h)}}const d=new $7;_attrs(d,[["position",o,3],["t0",n,1],["shore",r,1],["flow",a,2],["normal",c,3]]);const p=new $9(d,Kt.makeInlandMaterial(I.uT));p.frustumCulled=!1,p.matrixAutoUpdate=!1,Kt.group.updateMatrixWorld(!0),p.matrix.copy(Kt.group.matrixWorld).invert(),p.renderOrder=3,Kt.group.add(p)}const $t=new e.Group;g.add($t);const Qt=[];{const t=kt.RR,e=kt.pa0,o=kt.pa1,n=kt.pb0,r=kt.pb1,s=[],a=(e,o,n)=>{for(let r=0;r<=12;r++){const a=n+r/12*$j/2;s.push([e+$e(a)*t,o+$f(a)*t])}};a(o-t,r-t,0),a(e+t,r-t,$j/2),a(e+t,n+t,$j),a(o-t,n+t,1.5*$j),s.push(s[0]);for(let t=0;t+1<s.length;t++){const[e,o]=s[t],[n,r]=s[t+1],a=$h(n-e,r-o),c=$a(1,$g(a/1));for(let t=0;t<c;t++)Qt.push([e+(n-e)*t/c,o+(r-o)*t/c])}Qt.push(Qt[0])}const Zt=(t,e)=>[(t+e)*Tt,(t-e)*Tt],Jt=new o;{const t=["#E2CC9C","#D6BE8D","#CBB083","#DCC596","#C8A97C","#E6D3A6"],e=["#8E8B80","#A19B8C","#7B7A72"],o=(t,e)=>{for(let o=0;o<4;o++){const n=t+(It-t)/$h(It-t,Lt-e||1)*o,r=e+(Lt-e)/$h(It-t,Lt-e||1)*o,[s,a]=Zt(n,r),c=A.colMap.get($c(s)+","+$c(a));if(c)return c}return null};for(let n=0;n+1<Qt.length;n++){const[r,s]=Qt[n],[a,c]=Qt[n+1],l=o((r+a)/2,(s+c)/2),h=l?l.h:-20,[u,d]=Zt(r,s),[p,y]=Zt(a,c);for(let o=-48;o<h;o+=1.5){const r=$b(h,o+1.5),s=r>=h-.01,a=$c((o+48)/3+2.2*F(.7*n,.3*o+3,4)),c=F(.9*n+5,.6*o+9,3);let x=t[(a%6+6)%6];
/*§042 10wxa4728vtgz*/
c>.74&&(x=e[$c(31*c)%3]),s&&l&&(x=l.sea?l.reef?"#8E8B80":"#EAD8AB":l.top);const m=o*i,w=r*i;Jt.addTri([[u,m,d],[p,m,y],[p,w,y],[u,m,d],[p,w,y],[u,w,d]],f(x),-1)}}}const te=new $9(Jt.geom(),window.__R.cidPatch(new $8({vertexColors:!0,roughness:.75,side:e.DoubleSide}),I));te.receiveShadow=!0,g.add(te);{const t=new Set;g.traverse((e=>{if(!e.isMesh||!e.material||Kt.group===e.parent)return;const o=e.material;o.isMeshStandardMaterial&&!t.has(o)&&(t.add(o),Kt.patchCaustics(o))}))}const ee=document.createElement("canvas");ee.width=ee.height=256;{const t=ee.getContext("2d"),e=t.createRadialGradient(128,128,30,128,128,128);e.addColorStop(0,"rgba(70,45,20,.5)"),e.addColorStop(.55,"rgba(70,45,20,.28)"),e.addColorStop(1,"rgba(70,45,20,0)"),t.fillStyle=e,t.fillRect(0,0,256,256)}const oe=new $9(new $12(1.18*_t,1.3*Rt),new e.MeshBasicMaterial({map:new e.CanvasTexture(ee),transparent:!0,depthWrite:!1}));oe.rotation.order="YXZ",oe.rotation.y=-$j/4,oe.rotation.x=-$j/2,oe.position.set(Wt,Vt-.08,Gt),g.add(oe);const ne=Y.sea,re=O+V*ne[0],se=O+V*ne[1]+1.5;let ae=null;function ce(t){lampClock();nightFrame();boatFrame(t);Kt.uniforms.uRippleTime.value=performance.now()/1e3;let e=null==ae?1/60:t-ae;ae=t,e>0&&!(e>.25)||(e=1/30),Kt.uniforms.uSun.value.copy(Ft.position).sub(Ft.target.position).normalize(),Kt.update(e)}const ie=new $15(10,x/w,5,9e3),le=new T(ie,M.domElement),fe=(t,e,o)=>{const n=$a(0,$b(1,(o-t)/(e-t)));return n*n*(3-2*n)},he=Math.tan(14*$j/180)/Math.tan(5*$j/180);let ue=1e9,de=-1e9,pe=1e9,ye=-1e9;
/*§043 n954tl1v3bicl*/
for(const t of A.cols)t.sea||(ue=$b(ue,t.x),de=$a(de,t.x+1),pe=$b(pe,t.y),ye=$a(ye,t.y+1));const xe=[];A.cols.forEach(((t,o)=>{t.sea&&!t.foam||o%7||(xe.push(new $4(t.x+.5,-1,t.y+.5)),xe.push(new $4(t.x+.5,t.h*i+6,t.y+.5)))}));for(const t of A.plots)xe.push(new $4(t.cx,t.z*i+(t.rc.hero?zt[4]-t.z*i:16),t.cy));Qt.forEach((([t,o],n)=>{if(!(n%6))for(const n of[Vt,Ot])xe.push(new $4((t+o)*Tt,n,(t-o)*Tt))}));const me=(t,o,n,r=.93)=>{const s=new $15(10,x/w,5,9e3);let a=40,c=5e3;for(let e=0;e<30;e++){const e=(a+c)/2;s.position.set(t[0]+$f(o)*$e(n)*e,t[1]+$f(n)*e,t[2]+$e(o)*$e(n)*e),s.lookAt(t[0],t[1],t[2]),s.updateMatrixWorld(),s.updateProjectionMatrix(),xe.every((t=>{const e=t.clone().project(s);return $i(e.x)<=r&&$i(e.y)<=r&&e.z<1}))?c=e:a=e}return c};let we=$j/4;const Me=((t,o,n)=>{let r=[...t],s=400;const a=new $15(10,x/w,5,9e3);for(let t=0;t<5;t++){s=me(r,o,n),a.position.set(r[0]+$f(o)*$e(n)*s,r[1]+$f(n)*s,r[2]+$e(o)*$e(n)*s),a.lookAt(r[0],r[1],r[2]),a.updateMatrixWorld(),a.updateProjectionMatrix();let t=9,c=-9,i=9,l=-9;for(const e of xe){const o=e.clone().project(a);t=$b(t,o.x),c=$a(c,o.x),i=$b(i,o.y),l=$a(l,o.y)}const f=new $4((t+c)/2,(i+l)/2,.5).unproject(a).sub(a.position).normalize(),h=(r[1]-a.position.y)/f.y;r=[a.position.x+f.x*h,r[1],a.position.z+f.z*h]}return{p:r,d:me(r,o,n)}})([(ue+de)/2,0,(pe+ye)/2],we,.6),ve=[{az:we,el:.6,p:Me.p,d:Me.d}];let ge=!1;let $o=0,$A=0;const $T=new e.Raycaster,$m=new $4,$n=new $4,$H=new $4,$k=new $4,$B=new e.Vector2,$I=new $4,$J=new $4,$K=new $4,$p=new Map,$L=[];let $P=0,_a=0,$w=-1e6,$M=1e9,$N=1e9,$O=1e9;
/*§044 pgd55qu1v80z*/
for(const c of A.cols)if(!c.sea)$P=$a($P,c.h*i);for(const c of s){let m=$p.get(c.sy);if(!m)$p.set(c.sy,m=new Map);for(let x=$c(c.x);x<c.x+(c.w||1);x++)for(let z=$c(c.y);z<c.y+(c.d||1);z++){const k=x+","+z;let a=m.get(k);if(!a)m.set(k,a=[]);a.push(c)}}for(const m of[L,W])for(let a=0;a<m.i.length;a+=768){const z=$b(a+768,m.i.length),box=new e.Box3;for(let k=a;k<z;k++)box.expandByPoint($k.fromArray(m.p,m.i[k]*3));box.min.y-=.15;box.max.y+=.15;$L.push({m,a,z,box})}const $l=bt.fx.map((f,id)=>{const _f=f.t==="ship",len=1.25*(f.len||3),x=f.x+(_f?0:len/2),z=f.y+(_f?0:.5),yaw=_f?f.ry||0:0;return{id,x,z,ox:x,oz:z,yaw,baseYaw:yaw,hx:_f?4.4:len/2+.45,hz:_f?1.4:.7,baseY:f.z*i,seed:(id+1)*17393,turn:0,target:yaw,start:Infinity,end:0,minY:Infinity,maxY:-Infinity,box:new e.Box3,canMove:false}}),$D=new Map,$q=matchMedia('(prefers-reduced-motion:reduce)');let $W=performance.now();for(const b of $l){if(b.id>=32)continue;I.uBoatPivot.value[b.id].set(b.ox,b.oz);let h=null,d=.85;for(const[y,m]of $p){const a=m.get($c(b.x)+","+$c(b.z));if(a&&a.some(c=>b.x>=c.x&&b.x<c.x+(c.w||1)&&b.z>=c.y&&b.z<c.y+(c.d||1))&&$i(y-b.baseY)<d){h=y;d=$i(y-b.baseY)}}if(h===null&&A.colMap.get($c(b.x)+","+$c(b.z))?.sea&&$i(Ot-b.baseY)<.85)h=Ot;if(h===null)continue;let nav=$D.get(h);if(!nav){nav={h,wet:new Set,blocked:new Set};const m=$p.get(h);if(m)for(const[k,a]of m){const[x,z]=k.split(',').map(Number);if(a.some(c=>c.x<=x&&c.y<=z&&c.x+(c.w||1)>=x+1&&c.y+(c.d||1)>=z+1))nav.wet.add(k)}if($i(h-Ot)<.01)for(const c of A.cols)if(c.sea&&!c.foam)nav.wet.add(c.x+","+c.y);
/*§045 1u4uf30d2e6hb*/
$D.set(h,nav)}b.nav=nav}for(let j=0;j<L.cid.length;j++){const id=-L.cid[j]-10,b=$l[id];if(b&&id<32){b.minY=$b(b.minY,L.p[j*3+1]);b.maxY=$a(b.maxY,L.p[j*3+1])}}for(const m of[L,W])for(let j=0;j<m.i.length;j+=3){const a=m.i[j],b=m.i[j+1],c=m.i[j+2],id=-m.cid[a]-10;if(id>=0){if(m===L&&$l[id]&&id<32){$l[id].start=$b($l[id].start,j);$l[id].end=j+3}continue}const lo=$b(m.p[a*3+1],m.p[b*3+1],m.p[c*3+1]),hi=$a(m.p[a*3+1],m.p[b*3+1],m.p[c*3+1]),x0=$c($b(m.p[a*3],m.p[b*3],m.p[c*3])),x1=$c($a(m.p[a*3],m.p[b*3],m.p[c*3])),z0=$c($b(m.p[a*3+2],m.p[b*3+2],m.p[c*3+2])),z1=$c($a(m.p[a*3+2],m.p[b*3+2],m.p[c*3+2]));for(const nav of $D.values())if(hi>nav.h+.12&&lo<nav.h+6.4)for(let x=x0;x<=x1;x++)for(let z=z0;z<=z1;z++){const k=x+","+z;if(nav.wet.has(k))nav.blocked.add(k)}}function boatSafe(b,x,z,yaw,traffic=true){if(!b.nav)return false;const c=$e(yaw),s=$f(yaw),ac=$i(c),as=$i(s),hx=b.hx+.15,hz=b.hz+.15,rx=ac*hx+as*hz,rz=as*hx+ac*hz;if($i(b.nav.h-Ot)<.01)for(const dx of[-hx,hx])for(const dz of[-hz,hz]){const X=x+dx*c+dz*s,Z=z-dx*s+dz*c,r=kt.RR+.35,qx=$i((X+Z)*Tt-It)-Yt/2+r,qz=$i((X-Z)*Tt-Lt)-Ut/2+r;if($h($a(qx,0),$a(qz,0))+$b($a(qx,qz),0)>r)return false}for(let X=$c(x-rx);X<=x+rx;X++)for(let Z=$c(z-rz);Z<=z+rz;Z++){const dx=X+.5-x,dz=Z+.5-z;if($i(dx*c-dz*s)>hx+.5*(ac+as)||$i(dx*s+dz*c)>hz+.5*(ac+as))continue;const k=X+","+Z;if(!b.nav.wet.has(k)||b.nav.blocked.has(k))return false}if(traffic)for(const o of $l)if(o!==b&&$i(o.baseY-b.baseY)<.8&&$h(o.x-x,o.z-z)<$h(b.hx,b.hz)+$h(o.hx,o.hz)+.25)return false;
/*§046 56qz7zw6yt3*/
return true}function boatWrite(b,x=0,z=0){I.uBoatMove.value[b.id].set(x,z,$e(b.yaw-b.baseYaw),$f(b.yaw-b.baseYaw))}function boatBounds(b){const c=$i($e(b.yaw)),s=$i($f(b.yaw)),rx=c*b.hx+s*b.hz,rz=s*b.hx+c*b.hz;b.box.min.set(b.x-rx,b.minY-.16,b.z-rz);b.box.max.set(b.x+rx,b.maxY+.16,b.z+rz)}for(const b of $l)if(b.id<32&&b.end){for(const a of[b.baseYaw,b.baseYaw+Math.PI/2,b.baseYaw-Math.PI/2])if(boatSafe(b,b.x,b.z,a)){b.yaw=a;b.canMove=true;break}b.homeYaw=b.yaw;boatWrite(b);boatBounds(b)}function boatRoutePoint(b,t){const r=b.route,c=$e(b.homeYaw),s=$f(b.homeYaw),x=r[0]*$f(t),z=r[1]*(1-$e(t));return[b.ox+c*x+s*z,b.oz-s*x+c*z,b.homeYaw-Math.atan2(r[1]*$f(t),r[0]*$e(t))]}function boatRouteSafe(b,p){if(!boatSafe(b,...p))return false;for(const o of $l)if(o!==b&&o.path&&$i(o.baseY-b.baseY)<.8){const r=$h(b.hx,b.hz)+$h(o.hx,o.hz)+.45;if(o.path.some(q=>$h(p[0]-q[0],p[1]-q[1])<r))return false}return true}for(const b of $l)if(b.canMove){let $X;const sign=boatRandom(b)<.5?-1:1;for(const a of[8,6,4]){for(const z of[4,-4,3,-3,2,-2]){b.route=[a,z*sign];$X=Array.from({length:1024},(_,k)=>boatRoutePoint(b,k*Math.PI/512));if($X.every(p=>boatRouteSafe(b,p)))break;$X=null}if($X)break}if(!$X){b.route=null;const c=$e(b.homeYaw),s=$f(b.homeYaw),at=d=>[b.ox+c*d,b.oz-s*d,b.homeYaw];let lo=0,hi=0;while(lo>-24&&boatRouteSafe(b,at(lo-.125)))lo-=.125;while(hi<24&&boatRouteSafe(b,at(hi+.125)))hi+=.125;b.lo=lo;b.hi=hi;$X=[];for(let d=lo;d<=hi;d+=.125)$X.push(at(d));if(hi-lo<.5)b.canMove=false}b.path=$X;b.travel=0;
/*§047 1qa3sx41anltbl*/
b.dir=1}function boatsActive(){return!document.hidden&&!$q.matches&&(window.__t||0)>=_e&&$l.some(b=>b.canMove)}function boatRandom(b){b.seed=(Math.imul(b.seed,1664525)+1013904223)>>>0;return b.seed/4294967296}function boatFrame(t){const now=performance.now(),dt=$b(.05,$a(0,(now-$W)/1e3));$W=now;if(t<_e){for(const b of $l)if(b.id<32){b.x=b.ox;b.z=b.oz;b.yaw=b.homeYaw??b.baseYaw;b.seed=(b.id+1)*17393;b.turn=0;b.target=b.yaw;b.travel=0;b.dir=1;boatWrite(b);if(b.end)boatBounds(b)}return}if(document.hidden||$q.matches||!dt)return;for(const b of $l){if(!b.canMove)continue;const v=(.7+(b.id%5)*.09)*(1+.08*$f(b.travel*.3+b.id))*dt;if(b.route){b.travel+=v/$h(b.route[0]*$e(b.travel),b.route[1]*$f(b.travel));[b.x,b.z,b.yaw]=boatRoutePoint(b,b.travel)}else{b.travel+=b.dir*v;if(b.travel>b.hi){b.travel=2*b.hi-b.travel;b.dir=-1}else if(b.travel<b.lo){b.travel=2*b.lo-b.travel;b.dir=1}b.x=b.ox+$e(b.homeYaw)*b.travel;b.z=b.oz-$f(b.homeYaw)*b.travel;b.yaw=b.homeYaw}boatWrite(b,b.x-b.ox,b.z-b.oz);boatBounds(b)}}function boatPoint(v,j,b){const m=I.uBoatMove.value[b.id],x=L.p[j*3]-b.ox,z=L.p[j*3+2]-b.oz,ph=(b.id+10)*1.73;return v.set(b.ox+x*m.z+z*m.w+m.x,L.p[j*3+1]+$f(I.uT.value*1.3+ph)*.09+$f(I.uT.value*.71+ph*2.1)*.05,b.oz-x*m.w+z*m.z+m.y)}let $Y=performance.now(),$S=document.hidden||$q.matches;function lampClock(){const n=performance.now();if(!$S)window.__R.lampTime.value+=(n-$Y)/1e3;$Y=n;$S=document.hidden||$q.matches}function lampWake(){lampClock();rippleWake()}document.addEventListener('visibilitychange',lampWake);$q.addEventListener('change',lampWake);
/*§048 4ziqka1u27b6d*/
function clearRipples(){for(const p of Kt.uniforms.uRipples.value)p.w=0;$M=$N=$O=1e9;$w=-1e6}function rippleAlive(){const n=performance.now()/1e3;return Kt.uniforms.uRipples.value.some(p=>p.w>0&&n-p.z<3)}function rippleWake(){if((t.still||!Ie&&!ge&&!boatsActive())&&!$A&&(rippleAlive()||nightActive()||boatsActive()))$A=requestAnimationFrame(zoomStill)}function rippleSea(r){if(!Kt.surface.visible)return Infinity;Kt.surface.getWorldPosition($H);const d=($H.y-r.origin.y)/r.direction.y;if(d<=0)return Infinity;r.at(d,$n);Kt.group.worldToLocal($n);const rad=kt.RR+.35,qx=$i($n.x)-Yt/2+rad,qz=$i($n.z)-Ut/2+rad;if($h($a(qx,0),$a(qz,0))+$b($a(qx,qz),0)-rad>0)return Infinity;const u=($n.x/Yt+.5)*Nt-.5,v=($n.z/Ut+.5)*qt-.5,x=$c(u),z=$c(v),fx=u-x,fz=v-z,alpha=(x,z)=>Xt[4*($a(0,$b(qt-1,z))*Nt+$a(0,$b(Nt-1,x)))+3];return(alpha(x,z)*(1-fx)+alpha(x+1,z)*fx)*(1-fz)+(alpha(x,z+1)*(1-fx)+alpha(x+1,z+1)*fx)*fz<191.25?Infinity:d}function ripplePick(ev){const b=M.domElement.getBoundingClientRect();if(!b.width||!b.height)return false;$B.set((ev.clientX-b.left)/b.width*2-1,1-(ev.clientY-b.top)/b.height*2);if($i($B.x)>1||$i($B.y)>1)return false;ie.updateMatrixWorld();$T.setFromCamera($B,ie);const r=$T.ray;if(r.direction.y>=-1e-5)return false;let d=rippleSea(r);for(const[h,m]of $p){const at=(h-r.origin.y)/r.direction.y;if(at<=0||at>=d)continue;r.at(at,$k);const x=$k.x,z=$k.z,a=m.get($c(x)+","+$c(z));if(a&&a.some(c=>window.__t>=c.t0&&x>=c.x&&x<c.x+(c.w||1)&&z>=c.y&&z<c.y+(c.d||1)))d=at}if(!Number.isFinite(d))return false;r.at(d,$m);
/*§049 go2gz61i4fm7y*/
const dd=(d-.03)**2;for(const{m,a,z,box}of $L){if(!box.containsPoint(r.origin)&&(!r.intersectBox(box,$k)||$k.distanceToSquared(r.origin)>=dd))continue;for(let k=a;k<z;k+=3){const j=m.i[k];if(m.cid[j]<=-10&&m.cid[j]>-42)continue;$I.fromArray(m.p,j*3);$J.fromArray(m.p,m.i[k+1]*3);$K.fromArray(m.p,m.i[k+2]*3);if(m.cid[j]<-5){const ph=-m.cid[j]*1.73,dy=$f(I.uT.value*1.3+ph)*.09+$f(I.uT.value*.71+ph*2.1)*.05;$I.y+=dy;$J.y+=dy;$K.y+=dy}if(r.intersectTriangle($I,$J,$K,false,$k)&&$k.distanceToSquared(r.origin)<dd)return false}}for(const b of $l)if(b.id<32&&b.end&&(b.box.containsPoint(r.origin)||r.intersectBox(b.box,$k)&&$k.distanceToSquared(r.origin)<dd))for(let k=b.start;k<b.end;k+=3){const j=L.i[k];if(I.uT.value<L.t0[j])continue;boatPoint($I,j,b);boatPoint($J,L.i[k+1],b);boatPoint($K,L.i[k+2],b);if(r.intersectTriangle($I,$J,$K,false,$k)&&$k.distanceToSquared(r.origin)<dd)return false}const _n=.5/$a(.001,$h(r.direction.x,r.direction.z));for(let n=_n;n<d;n+=_n){const y=$m.y-r.direction.y*n;if(y>$P+.1)break;const c=A.colMap.get($c($m.x-r.direction.x*n)+","+$c($m.z-r.direction.z*n));if(c&&!c.sea&&c.h*i>y+.05)return false}return true}M.domElement.addEventListener("pointermove",ev=>{if(!le.enabled||ev.buttons||ev.pointerType&&ev.pointerType!=="mouse"||window.__t<_e||!Number.isFinite(ev.clientX+ev.clientY))return;const n=performance.now()/1e3;if(n-$w<.09)return;$w=n;if(!ripplePick(ev)){$M=$N=$O=1e9;return}if($i($m.y-$O)<.05&&$h($m.x-$M,$m.z-$N)<1.1)return;const j=_a++%8;Kt.uniforms.uRipples.value[j].set($m.x,$m.z,n,.65);
/*§050 1vc6jcs1c6nfod*/
Kt.uniforms.uRippleY.value[j]=$m.y;$M=$m.x;$N=$m.z;$O=$m.y;rippleWake()},{passive:true});M.domElement.addEventListener("pointerleave",()=>{$M=$N=$O=1e9},{passive:true});const $E=new $4;le.minDistance=Me.d*.25,le.maxDistance=Me.d*2;function zoomTick(){if(!$o)return;const _o=$i($o)<.0001?$o:$a(-.018,$b(.018,$o*.25));$o-=_o;$E.copy(ie.position).sub(le.target);const d=$E.length();if(d>0){const _i=$a(le.minDistance,$b(le.maxDistance,d*Math.exp(_o)));ie.position.copy(le.target).addScaledVector($E,_i/d);if(_i===le.minDistance||_i===le.maxDistance)$o=0}}function zoomStill(){$A=0;if(Ie||!t.still&&(ge||boatsActive()))return;Re(window.__t||0);if((t.still||!Ie&&!ge)&&($o||rippleAlive()||nightActive()||boatsActive()))$A=requestAnimationFrame(zoomStill)}M.domElement.addEventListener("wheel",ev=>{if(!le.enabled||!le.enableZoom)return;ev.preventDefault();ev.stopImmediatePropagation();if(!Number.isFinite(ev.deltaY)||!ev.deltaY)return;ge=!0;const unit=ev.deltaMode===1?16:ev.deltaMode===2?M.domElement.clientHeight:1,_p=$a(-120,$b(120,ev.deltaY*unit)),_q=$a(1,Number.isFinite(devicePixelRatio)?devicePixelRatio:1);$o=$a(-.18,$b(.18,$o+_p*.0005/_q));if(t.still&&!$A)$A=requestAnimationFrame(zoomStill)},{capture:!0,passive:!1});le.addEventListener("start",(()=>{ge=!0})),window.setCam=(t,e)=>{window.__camOv=t?{pos:t,tgt:e}:null};const{EffectComposer:be,RenderPass:Ce,GTAOPass:Ae,ShaderPass:ze,OutputPass:Be,HorizontalTiltShiftShader:Fe,VerticalTiltShiftShader:Ee}=window.PP,Se=new be(M);Se.setPixelRatio(M.getPixelRatio()),Se.setSize(x,w),Se.addPass(new Ce(g,ie));
/*§051 9y4hwz15l4fif*/
const De=new Ae(g,ie,x,w);window.__R.cidPatch(De.normalMaterial,I),De.updateGtaoMaterial({radius:4.5,distanceExponent:1.5,thickness:2,scale:1.2,samples:16}),De.updatePdMaterial({lumaPhi:10,depthPhi:2,normalPhi:3,radius:6,rings:2,samples:16});{const t=De.render.bind(De);De.render=(...e)=>{const o=Kt.sides.visible;Kt.sides.visible=!1,t(...e),Kt.sides.visible=o}}t.noao||Se.addPass(De);const Pe=new ze(Fe),ke=new ze(Ee);let $v=null;if(Se.addPass(Pe),Se.addPass(ke),window.PP.UnrealBloomPass){$v=new window.PP.UnrealBloomPass(new e.Vector2(x,w),.12,.4,1.8);Se.addPass($v)}Se.addPass(new Be);const Te=new ze({uniforms:{tDiffuse:{value:null},s:{value:1.08}},vertexShader:"varying vec2 vUv;void main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.);}",fragmentShader:"uniform sampler2D tDiffuse;uniform float s;varying vec2 vUv;void main(){vec4 c=texture2D(tDiffuse,vUv);float l=dot(c.rgb,vec3(.299,.587,.114));vec3 o=mix(vec3(l),c.rgb,s);vec2 q=vUv-.5;o*=1.-dot(q,q)*.18;gl_FragColor=vec4(clamp(o,0.,1.),c.a);}"});Se.addPass(Te);const $x=window.__R.night,$U=g.background.clone(),$Z=[[g.background,"#090A0B"],[g.fog.color,"#090A0B"],[$U,"#090A0B"],[$z.color,"#C4CEC8"],[$z.groundColor,"#8B7866"],[Ft.color,"#E9E1CB"],[St.color,"#FFD3A0"],[Dt.color,"#CAD4D2"],[Kt.uniforms.uSh.value,"#46796F"],[Kt.uniforms.uDp.value,"#1D4144"],[Kt.uniforms.uRSh.value,"#46796F"],[Kt.uniforms.uRDp.value,"#1D4144"],[Kt.uniforms.uIn.value,"#375E55"],[Kt.uniforms.uSky.value,"#AEB5B2"],[Kt.uniforms.uSkyLo.value,"#667D78"]].map(([c,v])=>[c,c.clone(),new $3(v)]),$s=[[M,"toneMappingExposure",.98],[$z,"intensity",.48],[Ft,"intensity",1.05],[St,"intensity",.65],[Dt,"intensity",.5],[Pt.material,"opacity",.14],[Kt.uniforms.uCStr,"value",.12],[Te.uniforms.s,"value",1.04]];
/*§052 19szndd17ysb9e*/
if($v)$s.push([$v,"strength",.18],[$v,"threshold",.95]);const $y=new Set;g.traverse(o=>{for(const m of[].concat(o.material||[]))if(m.isMeshStandardMaterial&&!$y.has(m)){$y.add(m);$s.push([m,"envMapIntensity",m.envMapIntensity*.30])}});for(const p of $s)p.push(p[0][p[1]]);let $r=0,$Q=0,$F=0,$V=-1;function nightActive(){return $x.value!==$r||$x.value>0&&!document.hidden&&!$q.matches}function nightFrame(){const t=$b(1,$a(0,(performance.now()-$F)/1000)),v=t*t*(3-2*t),n=t===1?$r:$Q+($r-$Q)*v;$x.value=n;if(n===$V)return;$V=n;for(const[c,a,b]of $Z)c.lerpColors(a,b,n);for(const[o,k,b,a]of $s)o[k]=a+(b-a)*n;document.documentElement.style.setProperty('--page-bg',$U.getStyle())}window.isNight=()=>!!$r;window.setNight=v=>{nightFrame();$Q=$x.value;$r=+!!v;$F=performance.now();if(matchMedia('(prefers-reduced-motion:reduce)').matches)$F-=1000;Re(window.__t||0);rippleWake()};const _e=$g(ut+8);function Re(t){ge&&(zoomTick(),le.update());I.uT.value=t,function(t){const e=fe(re,se,t);Kt.setLevel(e)}(t),function(){if(ge)return;const t=window.__camOv;if(t){ie.position.set(...t.pos),ie.lookAt(...t.tgt),le.target.set(...t.tgt),Ft.position.set(t.tgt[0]-160,300,t.tgt[2]-40),Ft.target.position.set(t.tgt[0],0,t.tgt[2]);const o=ie.position.distanceTo(new $4(...t.tgt));
/*§053 na0arj1ym9sbk*/
return g.fog.near=o+250,void(g.fog.far=o+2500)}const[o,n,r]=ve[0].p,s=ve[0].az,a=ve[0].el,c=ve[0].d;ie.position.set(o+$f(s)*$e(a)*c,n+$f(a)*c,r+$e(s)*$e(a)*c),le.target.set(o,n,r),ie.lookAt(o,n,r),g.fog.near=c+600,g.fog.far=c+4e3,Ft.position.set(o+260*$f(s+1.2),320,r+260*$e(s+1.2)),Ft.target.position.set(o,0,r),St.position.set(o+200,60,r+200);const i=fe(500,950,c/he);Pe.uniforms.h.value=(.6+.9*i)/x,ke.uniforms.v.value=(.6+.9*i)/w,Pe.uniforms.r.value=ke.uniforms.r.value=.5}(),ce(t),Se.render(),window.__t=t}window.renderAt=t=>{clearRipples();Re(t);rippleWake()},window.SHOW={END:_e,reports:[],lastCastle:ut,KF:ve,hero:{c:Bt},heroAz:we,HERO_EL:.6,DSC:he};let Ie=!t.still,Le=performance.now(),$R=0;function kickPlay(){if(t.still&&!$R)$R=requestAnimationFrame(playTick)}window.isPlaying=()=>Ie;window.resume=()=>{if((window.__t||0)>=_e)return;Le=performance.now()-1e3*(window.__t||0);Ie=!0;kickPlay()},window.pause=()=>{Ie=!1;rippleWake()},addEventListener("resize",(()=>{const h=viewHeight();ie.aspect=innerWidth/h;ie.updateProjectionMatrix();M.setSize(innerWidth,h);Se.setSize(innerWidth,h);De.setSize(innerWidth,h);Re(window.__t||0)})),Re(0),t.still||playTick();function playTick(){$R=0;if(Ie){const n=$b(_e+30,(performance.now()-Le)/1e3);Re(n);window.onTime&&window.onTime(n)}else(ge||boatsActive())&&(zoomTick(),le.update(),ce((window.__t||0)+(performance.now()-(window.__wt||performance.now()))/1e3),window.__wt=performance.now(),Se.render());if(!t.still||Ie)$R=requestAnimationFrame(playTick)}window.__ready=!0};
/*§054 13qprvmn9dflj*/
!function(){const e=new URLSearchParams(location.search),o={still:e.has("still"),shadow:+(e.get("shadow")||4096),noao:e.has("noao")},n=()=>{try{return wt(o),!0}catch(t){return console.warn("[Kingdom] Render failed:",t&&t.message),U.push("Render failed: "+(t&&t.message)),!1}};let s=n();if(!s){document.querySelectorAll("canvas").forEach((t=>t.remove())),xt=null,mt=null,ot=t(null),nt=r([],ot);for(const t in dt)delete dt[t];for(const t in ot.districts)dt[t]=ot.districts[t].ground;s=n()}if(!s)return;const a=byId("ui");if(a)if(e.has("noui"))a.remove();else{const ui=a,sl=byId('sl'),bp=byId('bp'),bn=byId('bn'),tt=byId('tt'),end=SHOW.END;let $C=false,$G=false,_g=-1;const fmt=v=>String(Math.floor(v/60)).padStart(2,'0')+':'+String(Math.floor(v%60)).padStart(2,'0');function draw(force=false){const t=Math.min(end,Math.max(0,window.__t||0));if(!force&&Math.floor(t*10)===_g)return;_g=Math.floor(t*10);sl.value=t;sl.style.setProperty('--progress',t/end*100+'%');sl.setAttribute('aria-valuetext',fmt(t)+$u.total+fmt(end));tt.textContent=fmt(t)+' / '+fmt(end);bp.textContent=isPlaying()?$u.pause:$u.play;bp.setAttribute('aria-label',bp.textContent+$u.animation);bn.textContent=isNight()?$u.night:$u.day;bn.setAttribute('aria-pressed',String(isNight()));bn.setAttribute('aria-label',isNight()?$u.toDay:$u.toNight);bn.title=bn.getAttribute('aria-label')}function toggle(){if(isPlaying())pause();else if((window.__t||0)<end)resume();draw(true)}function begin(){if($C)return;$C=true;$G=isPlaying();pause();draw(true)}function finish(){if(!$C)return;
/*§055 lztqyfdd94pu*/
$C=false;if($G&&!document.hidden&&(window.__t||0)<end)resume();draw(true)}window.syncPlayer=()=>draw(true);sl.max=end;for(const c of[sl,bp,bn])c.disabled=false;bn.onclick=()=>{setNight(!isNight());draw(true)};bp.onclick=toggle;sl.addEventListener('pointerdown',begin);sl.oninput=()=>{const n=+sl.value;begin();renderAt(n);draw(true)};for(const type of['pointerup','pointercancel','keyup','blur'])window.addEventListener(type,finish);window.onTime=t=>{if(t>=end){pause();renderAt(end);draw(true)}else draw()};addEventListener('keydown',e=>{if(e.code==='Space'&&!e.repeat&&!document.activeElement.matches('input,button,a,select,textarea,[contenteditable]')){e.preventDefault();toggle()}});const stop=()=>{$C=$G=false;pause();draw(true)};document.addEventListener('visibilitychange',()=>{if(document.hidden)stop()});addEventListener('pagehide',stop);const reveal=()=>ui.classList.remove('hidden');ui.addEventListener('focusin',reveal);addEventListener('pointerdown',reveal,{passive:true});addEventListener('pointermove',e=>{if(e.pointerType!=='mouse')return;const b=ui.getBoundingClientRect();ui.classList.toggle('hidden',!($C||ui.contains(document.activeElement)||e.clientX>=b.left-16&&e.clientX<=b.right+16&&e.clientY>=b.top-16&&e.clientY<=b.bottom+16))},{passive:true});if(matchMedia('(prefers-reduced-motion:reduce)').matches||document.hidden)pause();draw(true)}SHOW.fix=U,U.length&&console.info("[Kingdom] Repairs: "+U.length+":\n"+U.slice(0,40).join("\n"))}()}catch(vt){console.warn("[Kingdom] Engine startup failed",vt)}})();
</script>
<script>// Report a startup timeout after 40 seconds.
(function(){var t0=Date.now(),d=null;var iv=setInterval(function(){if(window.__ready){if(d)d.remove();clearInterval(iv);return}if(!d&&Date.now()-t0>40000){d=document.createElement('div');d.style.cssText='position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#F4E6D0;color:#5A4632;font:18px sans-serif;text-align:center;padding:40px;z-index:9';d.textContent='The kingdom engine did not start. Check that the fixed engine is complete and unpkg.com is reachable.';document.body.appendChild(d)}},1000)})();</script></body></html>
```