From 2f02c7bbf350b81ff20f1f4c1e6cf04b701fca4f Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Sun, 18 Mar 2018 13:57:01 +0000 Subject: [PATCH] Some more map progress --- cmd/loader/main.go | 6 + cmd/view-map/main.go | 260 ++++++++++++++------- doc/formats/img/chapter01_cell_index_9.png | Bin 0 -> 76647 bytes doc/formats/maps.md | 64 ++++- internal/maps/maps.go | 86 +++++-- 5 files changed, 314 insertions(+), 102 deletions(-) create mode 100644 doc/formats/img/chapter01_cell_index_9.png diff --git a/cmd/loader/main.go b/cmd/loader/main.go index 80ccc80..41e7a49 100644 --- a/cmd/loader/main.go +++ b/cmd/loader/main.go @@ -123,5 +123,11 @@ func loadSets() { for key, mapSet := range mapSets { fmt.Printf(" * `%s`: Defs=%#v len(palette)=%d\n", key, mapSet.Defs, len(mapSet.Palette)) + if key == "map01.set" { + for i, objName := range mapSet.Palette { + fmt.Printf(" %d. %s\n", i, objName) + } + } + } } diff --git a/cmd/view-map/main.go b/cmd/view-map/main.go index f8e7cf4..7da9ae6 100644 --- a/cmd/view-map/main.go +++ b/cmd/view-map/main.go @@ -5,6 +5,7 @@ import ( "log" "math" "os" + "path/filepath" "time" "github.com/faiface/pixel" @@ -13,6 +14,7 @@ import ( "golang.org/x/image/colornames" "ur.gs/chaos-gate/internal/maps" + "ur.gs/chaos-gate/internal/sets" ) var ( @@ -24,6 +26,26 @@ var ( winY = flag.Int("win-y", 1024, "height of the view-map window") ) +type env struct { + gameMap *maps.GameMap + set sets.MapSet +} + +type runState struct { + env *env + + autoUpdate bool + started time.Time + + cam pixel.Matrix + camPos pixel.Vec + + zoom float64 + + zIdx int + cellIdx int +} + func main() { flag.Parse() @@ -37,23 +59,21 @@ func main() { log.Fatalf("Couldn't load map file: %v", err) } + setFile := filepath.Join(*gamePath, "Sets", gameMap.MapSetFilename()) + log.Println(setFile) + mapSet, err := sets.LoadSet(setFile) + if err != nil { + log.Fatalf("Couldn't load set file %s: %v", setFile, err) + } + + env := &env{gameMap: gameMap, set: mapSet} + // The main thread now belongs to pixelgl - pixelgl.Run(func() { run(gameMap) }) + pixelgl.Run(func() { run(env) }) } -type runState struct { - redraw bool - started time.Time - autoUpdate bool - gameMap *maps.GameMap - - zoom float64 - - zIdx int - cellIdx int -} - -func run(gameMap *maps.GameMap) { +func run(env *env) { + // WARE! 0,0 is the *bottom left* of the window cfg := pixelgl.WindowConfig{ Title: "View Map " + *mapFile, Bounds: pixel.R(0, 0, float64(*winX), float64(*winY)), @@ -66,74 +86,141 @@ func run(gameMap *maps.GameMap) { } state := &runState{ - redraw: true, - started: time.Now(), + env: env, autoUpdate: true, - gameMap: gameMap, - zoom: 1.0, + + camPos: pixel.V(0, float64(-*winY)), + + zoom: 8.0, } for !win.Closed() { - if state.redraw { - log.Printf("z=%d cellIdx=%d", state.zIdx, state.cellIdx) - presentFull(win, state) - } - + oldState := *state state = runStep(win, state) + if oldState != *state { + log.Printf("z=%d cellIdx=%d", state.zIdx, state.cellIdx) + present(win, state) + } + win.Update() } } +// Converts pixel coordinates to cell coordinates +func vecToCell(vec pixel.Vec) (int, int) { + x := int(vec.X) + y := int(vec.Y) + + if x < 0 { + x = 0 + } + + if x > maps.MaxWidth-1 { + x = maps.MaxWidth - 1 + } + + if y < 0 { + y = 0 + } + + if y > maps.MaxLength-1 { + y = maps.MaxLength - 1 + } + + return x, y +} + +func cellToVec(x, y int) pixel.Rect { + min := pixel.Vec{X: float64(x), Y: float64(y)} + max := pixel.Vec{X: min.X + 1, Y: min.Y + 1} + return pixel.Rect{Min: min, Max: max} +} + // TODO: cut this down to showing just the viewport? // The naive approach using gameMap.Width() / Height() cuts half the map off :/ -func presentFull(win *pixelgl.Window, state *runState) { - gameMap := state.gameMap - center := win.Bounds().Center() - sz := win.Bounds().Size() +func present(win *pixelgl.Window, state *runState) { + gameMap := state.env.gameMap imd := imdraw.New(nil) - // Rotate everything 45' anticlockwise to get an isometric view with the - // lowest coordinates at the (now) top corner - imd.SetMatrix(pixel.IM.Rotated(center, -math.Pi/4)) - - xPerCell := sz.X / float64(maps.MaxWidth) - yPerCell := sz.Y / float64(maps.MaxLength) - - for y := 0; y < maps.MaxLength; y++ { - for x := 0; x < maps.MaxWidth; x++ { - min := pixel.Vec{X: float64(x) * xPerCell, Y: float64(y) * yPerCell} - max := pixel.Vec{X: min.X + xPerCell, Y: min.Y + yPerCell} - + for y := gameMap.MinLength; y < gameMap.MaxLength; y++ { + for x := gameMap.MinWidth; x < gameMap.MaxWidth; x++ { + rect := cellToVec(int(x), int(y)) cell := gameMap.Cells.At(int(x), int(y), int(state.zIdx)) + // TODO: represent the state of the cell *sensibly*, using colour. // Need to understand the contents better first, so for now optimize // for exploration - // - // CellIndex=3 shows walls & elevation changes - imd.Color = makeColour(cell, state.cellIdx) - imd.Push(min, max) + imd.Color = makeColour(&cell, state.cellIdx) + imd.Push(rect.Min, rect.Max) imd.Rectangle(0.0) } } - cam := pixel.IM.Scaled(center, state.zoom) - win.SetMatrix(cam) + // Draw the boundary + rect := pixel.R( + float64(gameMap.MinWidth)-1, float64(gameMap.MinLength)-1, + float64(gameMap.MaxWidth)+1, float64(gameMap.MaxLength)+1, + ) + + imd.Color = pixel.RGB(255, 0, 0) + imd.EndShape = imdraw.SharpEndShape + imd.Push(rect.Min, rect.Max) + imd.Rectangle(1.0) + + center := win.Bounds().Center() + + cam := pixel.IM + cam = cam.ScaledXY(pixel.ZV, pixel.Vec{1.0, -1.0}) // invert the Y axis + cam = cam.Scaled(pixel.ZV, state.zoom) // apply current zoom factor + cam = cam.Moved(center.Sub(state.camPos)) // Make it central + cam = cam.Rotated(center.Sub(state.camPos), -0.785) // Apply isometric angle + state.cam = cam + + win.SetMatrix(state.cam) win.Clear(colornames.Black) imd.Draw(win) } -func makeColour(cell maps.Cell, colIdx int) pixel.RGBA { - return pixel.RGB( - float64(cell[colIdx]), - float64(cell[colIdx]), - float64(cell[colIdx]), - ) +func makeColour(cell *maps.Cell, colIdx int) pixel.RGBA { + var scale func(float64) float64 + + mult := func(factor float64) func(float64) float64 { + return func(in float64) float64 { return in * factor } + } + + // Different columns do better with different levels of greyscale. + + switch colIdx { + case 0: + scale = mult(0.004) + case 1: + scale = mult(0.1) + case 2: + scale = mult(1.0) + case 3: + scale = mult(0.1) + case 4: + scale = func(in float64) float64 { return mult(0.01)(in - 100) } + case 10: + scale = func(in float64) float64 { return mult(0.01)(in - 100) } + case 12: + scale = mult(0.004) + case 13: + scale = mult(0.004) + case 14: + scale = mult(0.004) + default: + scale = mult(0.01) // close to maximum resolution, low-value fields will be lost + + } + + col := scale(float64(cell.At(colIdx))) + return pixel.RGB(col, col, col) } func runStep(win *pixelgl.Window, state *runState) *runState { nextState := *state - nextState.redraw = false // Enable / disable auto-update with the enter key if win.JustPressed(pixelgl.KeyEnter) { @@ -146,8 +233,7 @@ func runStep(win *pixelgl.Window, state *runState) *runState { } // Automatically cycle every second when auto-update is on - if nextState.autoUpdate && time.Now().Sub(nextState.started) > time.Second { - nextState.redraw = true + if nextState.autoUpdate && time.Now().Sub(state.started) > 500*time.Millisecond { nextState.cellIdx = nextState.cellIdx + 1 if nextState.cellIdx >= maps.CellSize { nextState.cellIdx = 0 @@ -161,47 +247,61 @@ func runStep(win *pixelgl.Window, state *runState) *runState { nextState.started = time.Now() } - if win.JustPressed(pixelgl.KeyDown) { - if nextState.zIdx <= 0 { - log.Printf("z index is already at minimum") - } else { - nextState.redraw = true - nextState.zIdx = nextState.zIdx - 1 + if win.Pressed(pixelgl.KeyLeft) { + nextState.camPos.X -= 4 + } + + if win.Pressed(pixelgl.KeyRight) { + nextState.camPos.X += 4 + } + + if win.Pressed(pixelgl.KeyDown) { + nextState.camPos.Y -= 4 + } + + if win.Pressed(pixelgl.KeyUp) { + nextState.camPos.Y += 4 + } + + for i := 0; i <= 6; i++ { + if win.JustPressed(pixelgl.Key1 + pixelgl.Button(i)) { + nextState.zIdx = i } } - if win.JustPressed(pixelgl.KeyUp) { - if nextState.zIdx >= maps.MaxHeight-1 { - log.Printf("z index is already at maximum") - } else { - nextState.redraw = true - nextState.zIdx = nextState.zIdx + 1 + // Decrease the cell index + if win.JustPressed(pixelgl.KeyMinus) { + if nextState.cellIdx > 0 { + nextState.cellIdx -= 1 } } - if win.JustPressed(pixelgl.KeyLeft) { - if nextState.cellIdx <= 0 { - log.Printf("cell index is already at minimum") - } else { - nextState.redraw = true - nextState.cellIdx = nextState.cellIdx - 1 + // Increase the cell index + if win.JustPressed(pixelgl.KeyEqual) { + if nextState.cellIdx < maps.CellSize-1 { + nextState.cellIdx += 1 } } - if win.JustPressed(pixelgl.KeyRight) { - if nextState.cellIdx >= maps.CellSize-1 { - log.Printf("cell index is already at maximum") - } else { - nextState.redraw = true - nextState.cellIdx = nextState.cellIdx + 1 - } + // Show details of clicked-on cell in termal + if win.JustPressed(pixelgl.MouseButtonLeft) { + vec := state.cam.Unproject(win.MousePosition()) + x, y := vecToCell(vec) + log.Printf("%#v -> %d,%d", vec, x, y) + cell := state.env.gameMap.Cells.At(x, y, state.zIdx) + log.Printf( + "x=%d y=%d z=%d Object0SurfaceArea=%d Object3CenterArea=%d (%s) SquadRelated=%d", + x, y, state.zIdx, + cell.Object0SurfaceArea, cell.Object3CenterArea, state.env.set.Palette[int(cell.Object3CenterArea)], + cell.SquadRelated, + ) + log.Printf("CellIdx%d=%d. Full cell data: %#v", state.cellIdx, cell.At(state.cellIdx), cell) } // Zoom in and out with the mouse wheel nextState.zoom *= math.Pow(1.2, win.MouseScroll().Y) if nextState.zoom != state.zoom { log.Printf("zoom=%.2f", nextState.zoom) - nextState.redraw = true } return &nextState diff --git a/doc/formats/img/chapter01_cell_index_9.png b/doc/formats/img/chapter01_cell_index_9.png new file mode 100644 index 0000000000000000000000000000000000000000..7130773b1b4b48b392ce664c2985a77ce7c93a7b GIT binary patch literal 76647 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

c8Q)7@~dU%seRA-0W;t| zW+=lFOeuy#k9!)9&tgbDu#V7#IKjoueemk(U{di9>6i=fgdYY9WDj4&SYz_9We8CJ z71Vn}X_*!$>nURbwgX6R%G9;t|Lw}B#BkoEH_#t8;zELK1n#>%jx=;an!KHz5-lg~PA;I5AnQ&zzy&~PKT#4O z6k~OB+KY*1955NkU}Uz!;})O$A|LDP>kAZ|DK!or0#qfU_Udy>+FWV7<@+)(6pf#> z6L?aP1b>H>D|r=TXn&9Cq}KH`Jssn-@RC zCX}Gqd1_3Y%-*^GGI4$&C>_Un7S=zlt*!gcqAu-@jezGy>Bq(<=2%+&vKQne9QvR~ zpzmDj@4jlWmndBgJ&bTH?H0)le-bdD?K1fBUXUzTVBb zBK~FIal1wt!XfWaS~R)*7+f}#e`15+I_@049Nq?WBr>6va*KEA>=MNiry1{d^rRhp zxsH$rDG#&l9r+JHSMk;7n}e=?!OG!gwg!7FqgkkW%jDngkqi_Qtw=6RBYF~96=Vvh zR=Fe(v&T(@nc@UMa-fWDl9w9!u57|Lt^KUwOB(981NcC1a2CDu$b!8Y8z_xmQzpLP zo@Ezexov5ns5rrKPHxX}jhE3DZ={`WWR!xY)cH>|1Ns@7boanry~~Hwxyo4l^zPb4 z%xN?Jr3)<-Uy`dvo!D|ZZm|~NNLY{5!3Xi?3I(ZRuyJ266YQ&|%WNd(1U|S^t#?Dq z|9oxWCYAPS-u;konLS+IKfDsDqF`LFXRd%gv!rN0D~9nT z_0>-<%!Nl#lMr=#ISZ98u=Nk^wsIS6GT#%D4GQm>eNEX&4p5tuQV1p3X_9M-Z<4%3 z>R(p)Nkl)xZdny@v28TP?hdc|EuTo^49m056ia88j4q{!HP=9mWE_$*ASw>@vq4#x z=6JL^D{Un4{N5bw+F;Bv{4w+HJ$8y#uh%v#{QQgpfrDg<_7oR?>fEsNzNkV({SrH) zC`=@YY|b!H!u1#jj6Bi_o^N)KvHC_Uwj^sSfTlbfnAfeW)1c$z8OmsS(JgvT`;k*~9{=(d zWyq__#7bs4M1jJlD8m9O&lud_3njy@Rm z+pW7Q!}9))7Ky}(^HC1Q_Pv~vK^3e1Cztl`%rj{EYhR$S1AdagcZ0d|1cUaydbxiN zh4+ydk$aokV5=X?$40ety(#2dl+pYyO=epgfmvRPVMKH=52#*asR_}XTc3ho5n612 z9gl#`SRpw1e8DfVR?(9AHYbka^nEDHs$NghL5V}~p8r=hncDiZpI3OBb!1q^?~p*X zV4LO*uQQ-IkcGloxHNJW=_+VEoevR%cQkB#c~UnFf$&4GCKD2NKn_lBQ7zrb*wq-- z-h9E>e1BI=J@~C8y5B>-1Jd~<{|JqO@ZiNi-FhexXKXsU%ubqp&k2z?O2NhdGuR%Q zHyq@@cQYna?-No%9^wX&>`}W;;$us8=2Y-CI6bq-8niBkRXw(bx}2v>^L_NVwkP$~ zWV{E5Z`NRE@E7n7Oi}6y>#}dv< zuLEwcmEW{@Y2~-~d<#zzNV4zCk6Lv&7Xn_)-!V2P?l)teMnTW%Mb|#Py2jgkl~r?2 zU-myQ1g*6!r$yvAG$uJlRGk^Eyh-;P3A~CzO9!R1_Oz zzSj=6HP``e`jKDsNhE?(=X91siF<6fl}_C3J{*LwFn+1C*=!1Mp|TAt!K*MA|HR&3 zXH%Bsf?E{pGGgJxG7@_{eS&^;El)sNw7D2SL6NPnrslcU>TS|HZk9&Nr8vQTt4z95 zZaVeV&d#OE#9)i^hO`Z7R)f-vt!K;i(J3XoT#2X*+b^}L+_ozpQ9|y^$J_F$XRW{L zEvo1yvlnMC)WZ>`OTnA^&2P?m=2Iak*%I=at@|w$Hw|AuB{{{ndv102?6ggaZu@$& z&ifv4wCpMwnxA?W%~lrA zb>Yg{Rka@ML}uj#_;5~n_8N6cW8~P5|1$P?T+1bpcC>>6PR4BCYE%c`?^)GR)ik5c zG-Rp^4ps@YDHka!|70Pz!b|ggEow=|F9RGTiUs`wghr5RqP-ks`2cHex#Bkqo>WU(m{yM=A58n857kksvD&14 zS!yEG75^=?%}I$)I_#kR<6`oPWBEbqr48X4E9oJ}q?D8r{&VX~?4-*I;N*CnH2H4B z(r8N=mRi80RKvYa^+ElJtD_K?pEXaPnOIogMH8yW`Vl$%Hh@GVJq{AlqP5?GGDa7( zD3dI523=lVG0WKZ?keMr@GZDGKY64L!TK5ctI={L@k5Sw#8w zN6E1W%%)&$clfp^4Jb|vc7h%w8% zv7->KodKu{KTN3q{%H=$nua{BBJy$qFXC=BX2ip9!w|mo(pD|xGqI?3^i}qagseY@ zis|9CW{3O2)^mrZECYbDAXZGNa@2`$y+oim5&SYQW@@*jH?Q%$;q$OrN&e2f8}i;( zt20-0B4YDC-}GKCUSlV9(fdrE#J%Nl08mO3^Bo2FY4ggL@Lx&<>p#&ZnAPOvO@x#O z*VtJMJ?25=EV;ATG23HN#<`C7j}<~_Xv7Kk57gA&(Za97!4?wUJ|5#Sh||UBl#TUU zZ6{%;p^YcyKEG`X2*h3DkB#dS8~24Hr)>p@jO@q$#`jon9D+m@^e|<2HMgvB`OwmY#kc?}1D$8xP1UAHEH29~B#?|Ggw^z z>#wXTr}yG7&CBzNe6hS7V34ecGOfhJSBr$izE84zpCo}w@skb&-~&Ypz(-ti;IsCeh|u!{_s4jbWg4KvFf@( zuI|EE(~Rn`6XFM|q`7x8BL{@)dK;cWuaom;g9zK|kq_rN$>1Gkl+zdJ02fnpr?+#~ znc=yhIgc~rbDn)7bg<+uuPe4pPkt+M`}`Yq94|;Y-PMo_fFZDb!QsJ!<&?Y5>m$?* zin?akxetfFsnK_-*QUt>R6ZL1cd94SsWE7Gu8TkEUTyWyBxJ{4&{&wGs-W)FFE>Yi z%ect0|IwyKguY@bCzoyWC0%7%Qd^FZb|!#0m*3ppW5IpRGx97nBKdz*5T`T@{1EB! zB8V%;;|tkixt&mncWaM8;aT=2)wU=n!Gqq(}vvd!CFcn^%=& z0DF2|d&tDZClj;k1NiXQ6Aj)2(ue?zg&EV*(Di8^AYx>KF+l@iJ+X&gwPNH>gND#O z3e_sS4hRP_5K_D`LReM%qT1qOz>x8p_Ax&H!yvaOOYJI_>RdJzxwy>kt=+|@^!*(x z_`hOkEERF0*9a3i*m{l@hjnX6J1Hlx`%)_EylMLwvfU=;vV_Y2zj^==%+HR1dSf77 zb9cemgNc=C89aHg@Wy?tX2gAr1C=COiSJBKTiee%-*kdd%VI3;hY&?on@Kt)3kc%_ zW2)R*q!m3&gQ=(m~Q|3VI-GzG^!Y1Kx8AGAtV8VmOb;=nL~lV8b}1 zfHpV{OM*WPn$&J7K`fA9Ms2H%LTTg!pZFjC#g1#u9Xt=>xq%I>01T?05QR1UDsJX6|nD7|$oCU#bRJl1W0tPtF@w=`#Z7>^HW6-$Akj?yV`ROGZ45b+> z$9-dJp6=&tgTmu_sV0 zr(nrUfV!h#;X&}2-0=AwHcn(&&_e-P_$UdK!K^yEsmIKEm5k%FG{GS8Uc$`DiKp)T zH^iMUe)9*_f%%YQS=T;TFa7BQMdh@-ixh!Y>{s-)@GmPo+EV;Z4g#HH%0psPqPe#I zceanD^vxa~_`q>u^Oi5FpT1tYz{iI_9G?5?l?kh(we|BN|LN#^sxFmyN_z?MidO7e zEOK3dqm=+`6@c^5kp}e}Ww7$bJhC}-gr__;pe;_cSq2>i%e_HJP!gziS?D?fVRdgK zs`69ShMsk$(-x3)KXxXy9y~mOp<(uU_Uf2DaX}Q%SGf_=KgV(pt6FQD@v)q?+*n?j zVgt*boRIm47M%K1I*sIk@^!o^_Ub5;fms0sqEgtTd1Y4}L?*d-M5ysrc2zi+I=qRp zO%aKYtP*r50N4VAl^Eh*_}$^#l8Yv<)l$XhV>5#X1|i<7zVwZQnROlJru&RUE3*ql zb+%QOTn70GXvW4O780tucf)t&XRt3F+v5@aBUUi}C;L4b2~Gk#Tw4dlGEpE0_w;HK zpYcNVh|suyPrdvE;QgCd+BYv6liBts7j-cz)sN#>=d~h0ML$5`(nKC zEpvKvm1XtH7tv>S2+KT_BBD7?B=U$OkA_f0vx!R7hp?8%BMg|Td(xCsv_?sA5H&t6 z#M=ldP2G+Rltn@fM|i_4M!Z$MwWyarmf*=f2nGJT9m+Hj`Zt;C)vbk;P#P*kq&WiN z;pX2{8E|hezH?DjU&O>1eDx1PIS7n5lYRCA3KdXimb4Aah@V3xbS4GHTpj<=`n7A8 zW4ahXcAe&(w9D_mJ?pZ6D5iPKEUTgS^$#t;BGWyFd#a{bw$kRP2}xNF@uJ@1D&Q^J zzl2didm=mfgdQS4T+mf8rdw5g^NM9w7ZME_VcvG}vw_IN9bvUN)nqdGGQ@tdriGHn zUDTKj;ZVln7N6#i<%8M$MaGJQ@2kG_y6{%eTbyypq}f=`G!Zun{7|4kKK&3pfX{K5 zPR4Pk7QoxXi>qcTv0{V<5DpUgg(6a!@N4m89=ODlK0nJm6Ht|r65nB8uxpIFcXF%9 zxQww}xXk1|z_Olt{aRAl07sv)vfk|-l8V`>SbI$KNibxH083=WvisdU4$v42jJx`6 zS`E!c0nhvqd`+|1Z-&SL;i!)dgIs~E=KkViuHvvVSYX+5HGI(esLOgx*&ya$?%mGM z!V8U`Om$uyDfVp_nzG|_sJ$)qSw|1-blW`88T&m@_hr6dJSJxp$Xft8W5VPDm<()` zPN3T`mZMlU^n2QF&N(VqkG;o$6Lhe4{HVTOC#VxF1VkjFpjN?ExJ;7vbB$Xd;%g0z z|It>yLo~nplaskeGaHDLjF%VckY8+~onkHmLw&f-$D%wesz13tDpg@4ZAWA2=MN@_ z@EGo*U6{9`mi2e#^6mmJ*>AKAB)UJDuVK*mklXsk+lvuH{6OpViZx#zlHREPa?2Gk zdQ!9O3De^Jo)Mb=L<9fYoIWM@zURLE@F&|f$Th3I1qGVo~E$Nh@OD)l`9YRXCQoYYwUjJmYZ&u4gS%pvo}ODtZo# zB^365E|ysRwB=QotN!8XH&Z|15s=S7MKKiI($+LL< zf$2|PdpaAM_0hO#!ftfv8%Kl8xgANc0-+)Ue*xA99K#xp-^CENFP#X;DVhZY1qJ8G zA1THiV$%?I0+mUiEZS9nhqlKna%SuMUr>7fz^>qCcL48!T|2PR z8B?Tz5B>)o(095&fPIM-BaODP2U2(I$4M^nViPg9^^`y-kP(;^SH`y5Apv-UIDUj) zOkSiwG|pCc!}S{jHXpIf+mOpz1H=zT@OJWP^{5K~!Sl0oFk))sH`4We7 z-%)u^FD#FC<+A$1wu$GwTw=^uAMvX0V{PEe`q~vBB}lYLE<8{{+G4``Ho!~V1wnXz zilc=a$?0)2(XuKkzI?0f$o;U=p0JPU<>3Yv%?AuU2 zIy~B*s*Jm2OF{*-CpU#KN*F3kCHB=Zm^L7c>3qs&s0jEZ0_JCmlf_u|gV||`?pl*5 z;4fgoc)iUsNUrMFgB-F*-gmfK3$AS;_B`ByJ_&Nz5HXYw1ROT{By$aG1X~a<#`2U3 z`3&rhGhfv6O_Cpdw?M+oB6K2Nr1@Ou_IYh}34PFy6?A4UI@VS!iA@N4`3AWc&NH;J z!dnf3Q$ENiUt0v)iUXd{S}*mE15T^}2sp~0))KewkbVZ|@AcvcD^P09B~0yVfJ%0i z%Qp7P(^Y*``H|d0)HUv_T~L~&uSDe4pNb1n+0enqzmUVq*UJWS-2y?5*R7Q2;&6yU zq8cEglv@`8?#(a?P~rZ5$wy%Q5N%_t8#gG&1Tl=5m#WhYrGuJp7v|}ZHWt3~A58(e z#sW&dwt9b4C}ZPyM0vX|e|bcD02zt?9;l`^2aW=j_WG_@%DJJtr?{|EnT#S@cvtLm zll-jN%d{$ykRvQV2Y19xha8Z_ea!niPaJ|<;sP3r{y3&xV_QAul&iUDm1H(wevTkM z?#1hT?w*2oZE?1l)cKJv7)Q*ZQVRf<(+>}jBH=#p(9m+k&Tiso0_M?^z1z1H|3PB0 z@LgiD`HRHjHD%w}b=?!4OrY|mvFdENDhgBWeqj^dWX9XXuYI{{MK%it@MEX^PIEoq0Z^@Dy_>*!x@$b6cDT;QbGjpOsPV-KTKLmN zrC8!ssY*a**G46r@_jUWup6nQSZ9;T^{H6NQUI`=tC#8`A)WlgO0}U`2@Ic-wmCQm zy#wq0_gNS1jGnz%n0;|``OHJgG7+_EbJ5%g)i`i_s_UAq{47GWFYR$4tC_>&q^3Pd z{=NR8ZJw1;ii1|{%9m0tnX8bFdm9A zzQ<&lKzP8rQ<3A&B1b^EEA-CgDG7YvgjIjMb?%+}h}8{>`y5w6No)(&-%T!j&1vD| ze=6?tOl(JxGfK z3xXg<9Ib=CXgEQENkZ2oHz0|C2`wK=W=Wq3k7(=}a@suU#7ywd;LM-bb80E zx)wg_h{kO*H%i(Ozm9-0aS*jhnGE%&&_dY?Y{yXP8GNh=SwlrURv^B^QnThGb%2>& z#BnT}ZMcykM=%JRW3M^;II@E0K>6*?d2yH;(qdy@8ts5)4C8F`29=br&dZ#nwkw-s zR!==?UhS~RHSw=qI&FE4ib3pSbhTpL0v@4l=?`@VYAE}Kp3d@%i#GzYXR3i7PS)Kp zX3+@$I2D% zKKzbKSF+9B*bt>kH^Skw4VriThZ}y*E!nUCW zeN4_Bt##zd#)vwtu0k~$GUy~E#NH?boO=!tbX zWnRXZiv%Hf$J7I+s{VhW9)tzW1w865Db1u?xqn;7N3SL$r~;#G$&o&@qFSHUy;4y8 z`&RM~OQQp#VoEbg?%`nrO}UAR&U~G!g6Zd8eX7Eysa0NmFz(ORa{Q4{?~DX_eUi&#SqBr=$NZ-2Yid}{K<5jLExeleweOhha>#?U`3ZneOt1Ug#384MiTQmf?GVs? zm&53`S*-CvhJV-YMIhXs5xV|hbnToOtp9wYi;+>++o49{yKWdxe9tHl{o5%7OAu%A z=cGa0v!c<{%R(&gGVLy-0ENs`cDCw22|Qfk-;7=Vv8#AQ=+4Oq$_;mXJIT_;48e!5elqLV#WE7_7e%=8u#0uH_BFylpF?%O#YERBu5U-Q~W;_qtnK3(Rom2zmW`cJ%X-924MAWm0a zoiLIR!-US+_k5ej51;@jIjC#m*-&uIvk`ZxD?05NRBKEv@80z z#@mqs zx9$AqFW^2o9j_SuUMxxt8EDb4pa;l};v75=IB?}aI^g2Mo0C_MYX5qozg@XrNkRmO zrvDy`&5Z4RLvFdkaj+Dzy!8lEJ=^EN%pJsDSWivpP;wRz&P)#V`^r_D53H9_5n!+S zb>4h^i<9YADRRfa~gm>uTL#%qXLd zI};7vgy<<>~R8|TF=7+pz6vk zr*id_v`7fpL}BP`&&^;(`O4u;b%w5VvVr{N<>e7M!{pn)m)-S>XclHY<#SP>v1%T@)uzN^6)3$?bQdbE_O&Q78w*j6|T{ z_IBu+-J3_A`Cr&SJoISpdXp=D!Gv}AxJbx+BapwqxBIYEEfJKFgmW(EAD*3UuW2>j zHy_;Y00hL<{@S%n1(XDKoR&&8$%t=eealm%H-$-dtM4~_9orsj?NC86{cwzQaWchu zQBXL~9&ibr@RRPCyxM`2-CjUjoOeKB7ebzh9ZVVMDDtB zP%HJJR2+O{l(58rcQLMfyRCPXLtt*TaWf-YmFDv%0r?{8!$L;FRMrRf$Bp=5s#MrQ z7j@LK-#M*ydSo=EBh_sfXU5Ue?n{RXTQ~^$MlqH(_v7$L6|~=7TAO^DPRY_ACI%~) zd0CPnd0Fx0gLpP#VaYQdGWv+CB@tUzeUlox^a!h&3G5S{02UT5X5Q>S4T?HTysX^f zrwPgB^}-+3Np)mucCx(*`DGpuVXU?T1zTX*r;{cK$X((S{MbG`VPG#lN9_sPh2R>ng|3uEC3PL4sdIYXEDmadu^TJHX?e=+RSG$T#%jCa|$V=KDyEmJkZHbk8bkBRFq#$;0Yv%`yRaiC)H8hTy zZV`(@wi?S;y#N6CI1q3?p+Z6{v5l^HJ8F9p|!R*z_Zz?$L|qy9mhR zqc`KHvm)}SDctaNE_E|_#q9jYTEmy%k7GZNb-CTKpQnq!YVy>%-HK|IqAR_sd@L>8 z@6oqx?n)ED2I=UK;ZnGq{L!X-%a+yKhiy|*L!-?b$~kT02Ih&tlXEG>L-n+7Bbg(zMK(giG)0!RoVlgxLS(I|1SuIcNVk; zSTGj5J8u7Lav}uwW z;XA`RGH7D$K5`%dp&$6AfWUfv&W+GP05Pe6aY~k+#1}-Y zr^;=lJjd!2BfTsCc--!T$ON^!Un+wPS9|qVi=Q&iAf=xvEwrnB^<@hfrgG~ywKcH; zXnONuZelK20y9wiBiTm{*>Sj~)A`~Tn5TW{>o=Q=+&x_+mrU%9jn`vaGDY!DX+VlL z;u0>G2k@Ej*`0Rl?FdEPmm8C`eW(@NzFMs~@;XA5;dk};3}{!&+y}=EnW*28!5f4d zQE}D0OB_J-)%e4g?CtXzT4cGHXMU>3z37D(YH#wnM_=;2i53GVZv9O=zWB}mYsaP0 z@OalDt z1yqQvjej1p3hef1)&`yPAlWD@CB=JfoBUeKPs9-lE=Db(#Fx4l+RQnAH4DfA{ET|+ zG46Xx5^IN`@7oPA4>>F3B)U%PMgubWp^$wi>V3$sx^~MxELTrc0K`0;kI7>KMD}TO zZbm_3F1F0H(`)HIKT>`O2@7}k3IY{KJ{w~U@>qvY90&5vM=;9vUD}-co@cG{jvD~M zPcwp>mVVzwpDuz5=J~YejOCi>GQGpGsOEpp{wH#Q8*W*ee!casCHDoxRaY(9d4n}| z4RTMXX*NFeLRGY+iwDz=K3%=e)(0R0rF(HGV%h$a?@1yZnaAa z8P>x`0hk#4rE>-EY6BVKN`?ss9eX3+%lVU++4S6BMR01UD^*+)Lku0P-TupkWHqBv2iG;)u`J6*qocq#gUa^?(tG&*_+&#(2^ zk16pQSS7!AFOQ|=D89qIFrX}tZ3G1dMg9-~{RxZR<9vYzDHrQmpLK++a`E0?4;D>8x>R7COAVpyfgm)=%EEzp0U*V?*9<0%OX?S?JKR z37nm64Q_>zW0aVYyCmM0wi=v_^3h=0RlkbmaPas-t3eYNJiJi;YXe?D6tUWd0!A8S^M9-k zmMygXLF0!t=^+BK?S-0*Z%dRe@U38Cd>d|Q~n_nS3Tc!8P#HK`4g<4?7yV@Pu)8Bf3 z508^EKMcKq?O@3OR;tl5&>I2QyXmGG{+FU87T9dCN*q4au@dLB1M%gzY#OnjU$Gk~ zE4E1U)`7-mliAd=7EAEw+4Xn<1glkAnN*h2j-EddeNa%~1G*}^9R$7^eO6W#1tUc~ z6|DRX<#F`?kF{8ecpRx)uP82{q<~C%bgC<}Rk#eu2_6D5i_KyBkf;({7cc-qyYem? zyRxu6(;$Jce7>rHRE2sIhEP(**za%Ps8%-I8-j?>jfDesDOiH+j=?9;SIB*IBcR2q z3cK`Rb+~dkaK4tjf7f`z5ah<21kJ0I{6 zR>0SPvViCeJOFNlOaEP$5pGKiR3bn0&1f(CAuOGumGQ-Fv+Bea=aN;GqpY)yV@((~ z?&Pi1PU`COFKe!~n=MJHUViFH{0tGkz}DjTpoc(UY9Zab*FYQohe^ehDC5Y2Pnyks z0Ct1XlmHs^r_b@?Z$8JQwR^~a3U%kw1tx!ly3raG-@9e^8Qt?5J)roG+cp=2SsL5f z_NLEHjz$J3ZN#|yfnj1U5{2OXtuI=2>hrG@dHSdE5gjaQU6BwX2NI)zme}{>;dPaw zYTZ`u+xgEZ(4x&zrgnS?uN1qUbzv-FNfBdC==)t|_bYsbc4Wr?XZVW8h<8BQZ(>t} zx~1diqSwX$>|C}Dnwb`ARJD?oz>`DQt^CTad!~sSL7PkZ|w3v+mohrz2m7 z8?aRQ*H0BtBUzk1ap!YIj(Bm`v2@43YB}nO=^n&9!TCd3r$o@~vMe-AMwEHcpp};P z$o$e85uspBkc<0|4)Sbi#%6nXMB`5{fs(hDg zgE>$wP7|AhV8I&rpyXyK1a1IS$>c$x3BDTAUC$-GOOhKqvXGH09XRJa4vhPi3|zSTHz5> zIexmX0K85MUH$x1K*O2JK+*(m{T=DWd+L)fu&dIv1i%Zhb^rfWquG*>fWAV)#rqLk zn%}SN33NzX4vTi(101Z0*;$_agR(aj+%HlGWVw0 zAE16{%Q(?j=o)=6*_6920FdZMK}`z|4`_rp4v+kPYG8qsdyb5r#@5zd4RV#8^)E)@ zpv8(+mVDQh3HSJ)mf-n%RkrOT(5y@fjxENy{SBV|^ht_uk!vi zfgKB<99%ByCkgR20xb`Ags(tt_q+O6P$-)6K9fuCQ6e`hEf=SkLfrI@LG~bKU{o2due^d zN9^qi;Ga!k&jn6WrbGV&XnPv1#&3`hl@+~^n+XP4O^W59VaJYuy~lrXMOaV{{rPtA zNA#gJ3869gN2~OO->lM97$L{H5g|mzu|J^h+z+|QZ&rv3=t^GySaQ|crsUkKks~et z_j50fL>XdtTg&%fw&2XdkMihp$oJcAG5j8S;^i_U2cq-xU#eFRGW+0wW|PVE0SqX- zeKvAJ;eeMtuzhW?=F@+Y6ewt(f80JVyafLBu@n&|FDp*65Vgg0_M&w zP9E<|YN9m-7H83@JY9!Fnc+gaTehE;%3G-^e;Ti_KrlT3CZ(KaKlt4Ug6Z1y$ z2n+(9o07;C;5pF9TGhu2I|N2==WSm>SRBrBvx4~!?!EaM=!BZUjcCh~kR;=e68dQ0 zFtNe*XlO{;HH0pK{Sq%;1`dAx59j}ou^S&bAp-u@388}qDrk9QzjNJ|M-WBm#aO87 zxy4k~nV4(6g|8-7q#M|uOO5s{a?6*qDFS^27Z{h=q>mLN1ddrD?8A+K)sa^xz4Hog?gDQ458AmkrQPlD2LIQ}D|L$}ll&-#MecXf!dCbhZ zt7kP~S3t*OAmlG=IXTHX_`m>Rd4Ov(7x8Leaz9xL)wx_RW6v4Nv$?&WaR1$FKi!m)5z)@d z%C+P!8KGe6nz)xJM5^Xwag*840$HGWTJ)$uRzh1Oo4^o16m$VF`qwTw`03n*`7%ng z>EmaXaCa9of zc|%}qz8;o&9xi)cTTg2=9eF@b35C9vf2{QE@@WFX$Wu=#eOLvVm7knS(l#RbxI#{S znh=&t^g+CUtf^=(l$`p7auW;7&{8YD2toe@5zc+8vrx+MkiDB4RElc0Ckayf<>g!} zR?`;uBy1MiYFrona7 zVY*7_(`NW)!XN!!tVAvO4w4th7RVRi@YJW%5OqKHvV#;P;u#|M3$oT18}T@Do-WpE z4HwhXZSM&=3yZxN)%#Ni$4$tzOVoY3)iB8|G`=}gvXYI*N6WdtQ9oDo%TR5JBGFJI zgR3R=)f?9cnXR(lfiR_NKm`S^Y$Qoc=GC{`h|(KcwOTkm!lf)`$)jKfG||edBc}pJ z2*7#pn%lV6Bh|at!)uJ6WXEmC<~8}y>Rr<=w&`V>V2KSRp{i-{(I{K}G(W#tSxHqn zo5(nA>^^ItUA7i_?THRW0iML|&bwcqA@OhBIMdko21ZxXOZ%8>dQpwacsOig=)DN$ zeP6ZaxY|zG&PI62DO-{Uo+Q(>b{PhC*RmY%E>vc!_~;F_XM%rG+_}B@CM1tS*6lI~ z+Mw;Elj6CsC_In%sa+kAM7Vgv4F=LIk3qci@9@|j5zN8;7|LIN@QN${Cd7Dk-P0%uHoGoF5V+~4BkB7*O3l;&ym z8Spqx?$Sx%-x%)K+^}@?uu~w_lGF8(!|m(c>(7xn`bGI@io?|Zb>D_76 z?e&!FNx@Y?y#;@4_+WAdWwxDK*%$c|&8e8>-x)y9djG%HzC0evw(Wlw`;smDnu_cak+p@gE5cx8kR)WvzK^8b z6p6BP-`27Y30Ws=WeZu#HW9KfgR#%=9J-(PewO!nKkxf{&VQOdW3KZ$x8wL8-(xw= zz6G|tZM$ZsjO?+#JlbOk|Ctsioxcn&5&TpE`y!>*lRj(qv&hO%Gw*EBmx}5Jv5wI1 zaSmJ+B|zuB?HDxKCh(2l@wR%F?j65r_Rxf5EMTS(`u6$8akZt#9v(q4g0<3n@tL+s zZR2w@)D;YQrL8otR==(4M7k*>8>Yi_ss<{1)Wk+UfBu}%;GsxA;;9$C7JspCm*8YU*Dp9=;f>?tR$aR4_x8a{u%T1ZFk?u!k$wfNx6KO)F{ zM@&+_)%&cwGckTT;wbOx{Kz)d&+nu{Gk1%i!u(i|k9KDZNI?~`$KePq2Gh#QF=7{cPW5DDPvoZc&olF@EcICF-uieRZ*&N&j z!2$P&c0s1?mfpE3AKip4pGNJ-wi~0)J@ed?$C}f1MztrykuW~Z)wxX(m<^R7#RepZ zZkPheP?MNma&5Joa?95{rkp8bNb-yg?OK-MEE&*imy###pu5@PyViQ--KgwjO2G$_ zY@~bTjIqEemNe|N$hM!vy#-Or5{N&xbn$Q;CASrKi#RN!lWD>twX}26wuXS=#1J15 zq~V<(I^xI5k*ka1ON=KRrX=2HXhnXD&Vpa(;zRl+NeVwNx*PT!jP7sURRKAZas)|N zKvzHZnEh%O#E^cvBciaDMTr|><5w< zW#uw@wzOL4=wveS7SC$hes1AhY_UJR3!J?i@a~_=$D{nYxVdfDXUjw$rS=uiTnp25 zjPtB98@^{W9xzsPaxY0BwaeIiVsyVubU9#i>lpq5{vA5#IW11!B>cO16}Oi9p>R zrdKr5En8te(mHDur?+DFi8_zO`gtHA&ZQdH8{?Z_a$)_`RIInQ8!cL;zZriTp9<># zry>SIRT^dMwvr+}dCB|}%j-X?Jf&WP!#w+{PZ&jyy|n2ovhfI`gPVHz_7OJs>lw^| zj&#%6Q={O~5wZq5VKak*KJ;_dHfPgo9M5qeBHz;Za946G{novc8@okLAh7(%`@W_( zPQa=4^JiwV_^*gvDOb+9l2vpl`t9^`9};3+n$rT(X#zxSx6n%Lp0H(3Tr^NLyd@Xc zX=tl6onep&pUDmQea!_&FfyB3U&T%brsT>x4eMq8|b+gn6#H_a-9V@7~2L z6g;aHkT}2dY3QZisI_FH_=TWHZ(#@;Nk|C&Zl#mDAu{&9XL z#_P+1kC>WpA8$MmxuF}aRL^=g<)_pA@a+}3UJYPS3=awf_nq4E0v^Bn+hpb`sB46; zC1)+dq$g-9AI>~v_Z~LUsiEhT{-WZjMXsRZq~m8i*zuS7&&!O!Kx55(jCijIDUY4h z&jpuS#qo>*;YWb~_F)LvE&xbSd!9OaO06fVieCmC0-ih?E}^0q5S`i07EE8hc|1pa z+Qo=XV7>G_?{lf-4TEK0`F5>hB6}@7u6Xw}EbC=y+AuK21`;5^TG{{m2?Ec8jNGY{ z0fcZdGHBVm^y=?x+A6bNHF2OS#M4C{StbO-Jf$i;C9-z9ZssbU9@mOlXq43pnLOYB zZVY!rOi4w~?FgC{&HS-=BAF(DTZv^5zA1)gL!Vy071VP1;}FM>=@G4O>fv|av&@cYgGdSFB_>9QAa!0XI-hvwCPMIpLp`Qp@y_! zVY56aj%9;_<+{@h?zCtr^pRycv)iD!6a;;t#q3c@1m+c?(Wj@VyRFe@8Y%->Vw|?7 zN{LC9sds(%W5je+LbI(sKC|rBo(|<+mV>(Oc8qh_W25G9y}{B6wi!=pqFjujo;aV! zo4<~~OdMuNElp__Hns!=z9S?zjBu;Df0QPLp+K}&`1cSsv3d>LpqCRNGq{}P9TVJZ zoboPxyYJBbkNy^)+T-Erf*)#?Z=>pa>NvP1W~#1gC3sksp|3vv>-u-|97l052P>@U z;$tj#%yR|9n|FfZ*x&enH!5T(r?1BGHA;FRyCc_A3(Af(dWuQ zWx{4E87gzmBYgu1X%1}5Mav{XyFilQQ^}>9by@kys%tmHbn=kPGfAhzN0e@&Pd>GW zORjoN4wtF+HL^HVy5Xr3e25UMs9d04G#Xt^ zqs+3jgDKd4=Cj*-40zAy^d*cD6;u#sCoJWljDG7r&I&QMSGx5>t*r!S>9R(O2O-w6 zT(!Z)HA%wTa-`>YZT8)1Bk-^BTeC=V z?hIK3i+$fcVO1hJCTbT-nZ|9UuD{X`frz3qw-l-ShQitN1ao&UtOpPl?WH!n!g7E{ z)14&HH5;;5Stlt+hHEe7TOG>=&}!7Uf{=T6hGpg{ASB%PfhRg z`GzwlC(F4s;@-KxLiehiAtUDMT9A5q?~J^BoXSsxD7_dNO1-Q~)gVKz)Uqln( zIfKctjJxocws2MeiJ)~yhQHma(Lt^Xyx8c+yg-CCbm9zcRR`da$ARgUT|xClx9lr+ zn-RP@cPX7PkbZn6HGg^i*OB1$foumU81+y+%zp%`o8;XtT4KwsqSw|iX--+I%7W=A z{{1ldpYX0PNV_ao{f4_<@Qi0&Xju%!iMmqo6@-=*AGamTec3o!E!UQ`o_ay&z~vx( zaY@KVz@#hvDk1Ht%`hGQ(%=vX6}@FkxqoUbprb?kv4>VaFGWUM<~OOV%_fWH4XxRB z&(HNfO4bs_iro)%`04&`o-3YqF^#{z=J!NcP4outR3_>>nf zR+(iDl_s6`&U^+8G;O!nLt7@mQ1dX^VuuRDaoN~s=2yFt)6H(*dul|v6=h#ej*s zo^f}?`R^w5&i^O$wousdEFrC3s!F8*$goIhG2u8cXs#Xf;gG7~@D>d!vJ^%DGs3ha zTO!0wrAh9X{a0CgD|jUh#ZJt8s3l$xa{qx6{jujOrHG$C^HT2q)?CXK~O2 zUA`_WFW(e9*YBmm4fMAyc$QkobYmBjZCLN|#w{HY$PUaL6*wIGC)nO*HUBYnMua#k<E~YW#{iHj5Z?3(dty&}`Ypi6TELGNH+U$TLt3#h8yd0LfJ1@> zvJcy2+4vD~-0YS5A5WEfH>XBgE$0{L3{u+WFzc=Alir-#)cBPG{1-JsI#zg2u7o27Q#X0&qr&Kvbm1ZMJ&*X;o> zZvTnqts7tA$S6@w=LOW_1w`00&h#}q<8k5Ur-JJXMQB|DO38t{rBLDg=-X;;C7G0O zllRj8-j;18X@G-ze{<JTVQq;7qHNp<2u?LE`fK8nI>pBHoH2Kv207zY@j7@$us#zdpC7}?JLC+avBF z9-J1$C9-4avKL`LBY-ffe`&OrROT7D>gg8Z`a@eHrTXZ%HoD%qZ>}?+Bc)Cvd-;|w z8<&~t$}Ap#ZDz@tt(+p7s$}D75UyQs0#>6Fpw)R=Rl%Sj8i^DE?oJ~)=pbh$tWxZx z{=Y}bFiv>%<(J-aHpW(|+o#879$f0#h{*XP!Xsa(Z|BqO;t3#=!KM;U?cP_lyd-(rlNg~oiRfp_9Y&I zuwlAkT0VZ-iR9vUMTyT0oj8=`G2^$L!cH$pyiV#oO_rbHO&p$*qD_sER*j^=KC?^y7-MzmB1t~2G@s2E_DP_uWew)n%j zDOQoWZOM$@fi$pm+RqQ9?NQXFn=^5M-YLY{4{Gnsaa*y->X(#2lgNy=+mXBq7A0Dr zlvVonI$vT5hkx}&6H&s+?8yC}h7vwajVA-U=me#Fnx-e42U60@)0~m1K7lt?c1}qJ zSSA$g9ox%Kbr+G)ujn=Lssg+4<}!e_|4KN2*{zFs4~zT@xm_i)KcQMYbAQyCtId!1 zlJWav0^XJhrCalvUOj~(6QQr$-E$&zFsUVe%2&xoHRq7fh=ZnG4$txoFeu-~8>yrXU8u>uYSp*+> z?dSll(0p@Gd#QzKHG^{ah7=d4K?RU7b9r|_ss!*G=9{uCQ=sWKcxr1wM&uz{9>ihV z8WqyvMXhu_28_d&a0=S=Ov<@GrFG6)1%z{|$?B$+w6AvwLq0`f6eC6DpVC^VwJ)1F zwNF9FsF*{@PhmvZA+JqM8;s0vX!F|GB3-UL(<76Yw&1BJ6r!WQF{E%BE_^yL&`;K} ze~)Wcv~dsdjIzy^tJ@pU0wo((q`_~q7$#OjeeQhTAA|_^Tw73gXrGI;G5w?Yhq<3w+G|wB37BZlvnl{bKD|1v_--*-s znSAq2&wApXGg78CQ6Q`~!iT+19$CCNO!I!_J}zp1uq#q@;Z2un{K96Fjfek2(}I&P3I$MYb@5u7A$p*&Emqe4CMZo0J{87@W_Q3WHrtBDvW+YGG z6!sqV!rx%> z?exrHV_xA77h6g}>Nypf1u|quD32MT{NvPEjbiUJ;+lr5b$Yd|pTX+C0jLp#Y*9}TGxTB2`|9>@osKN8b>|A9u^7dMt|42a>H`LX4pWGT z$BZ1X!;P=QBQdEVxs4ubjPnoK3)%oX+%TzA2)#=k)!Y+EgO)&xqCLp|si~@47s0*) z?S##L3Y>xkZ(``4PpxCwl*b+`^$Y$1V|V*9&l=%*cEqAWB_K zgKf?dt=R7o#MXbE)R5v6>GG$OuD2uvxb*0;s`4)q$#vz(&8YA+?33Jsp+U&FzWqTN zd!WO+xu7Fw0M(j%dFFHkm|W1bby_B=4}ZcE6Ljdg0{@MHW*j)N4n7+1b3uDdcZ@W$ zhIF2tZBJ862G-v+HN%V#@htz+`-}-SL_kzUl&2e^7I-;k&$B}VZ#Ql)d8^PG<04cR z#mds6yxn?M1SFM5L$g1u^p`9eXcfD%#N6c_Q9ubSpID|^rdVD<{Ja$61}%mZL!$u# zk7vH+1j)B2OhGh+_9nyFLbPyia4(lhTHga~d_no7nra&3oL6!La&!=AJeH3$F;B5cdSCmZT1iqpy5mM11S9!Q9 z;U@q}{Dri9n0=(le55QRBI+%;r%C9Y0w!{gIY9ezw5fePKQ zgv*~)s4up|;xc@_Pc!B3gJmN%F;Azx!Y=Qp64KHnJ) zI)}EG?6*bPCW}>*fl3(TFi{<^TQC;*70`Npl4Y&*YZ4(RagDYKmoUY!17c4B$etnvWKU_?ma)vr1j9_LWtGGX;=)dAKDXP8R%>GD{mRk!x$?pwwS80T*xD?c z=)!RATrm1W2Yr9s9ydz8-=o%v<*Y1z72Pq7nJanVVM2E3TxgiS{eD}&K<@ipl(&og zz7^QZ<5Hzk@io?h2*xWVfDz3l%eu?cSRhGC1#N^v$FwYqEPQ_4Y04#eirF0*|3`l+(SF zQr@(g?o9^WJNIJ(M?Si)S8vwccM6%jznA^?3tElJmpGRfm91B^BD-yHOgQxS-3Um` zkzT?1(ea(*5&~zpLFhn{$CYmTDLI)X|8CDLuCc%|i6I_MCw92{fXj`@V!3g#B++!& zNZ^zrGla8x8oPcb1nOG>5qipXceX7BK`Figdowen&fHO*=*^iQ>v{f{wla3kylyz_ zM0$CTAy4_G^h!<`07DdaScKFJ3^x7Z=gymN+uAVcw7$Swpt3{#HZc%z-OOEF$zh8s0+{so?4ayg}oH;EGST>y(jX{FM$bp5a%fZi^MpV zn9r&42BjywDLnC4nb~(`bsJu_i!~>G9=+Ofy64`a+N|_vf8=7D=UBgx8O>{9eN9ay z*quipFQGORUQiC8UUsxD+Q5bx`DkjWHzm<9v~8!^qeijW0DQ_5Pig8SEp$JtVd)Tc z8sy7^-tK>_&i~_~SYCU;dSaR219go%*SW6-TeN;~K#T8vD6Ei+PSitIjpk3f+uS7% zdf&I&`{Zcz;%#ls!u0D|L{*d3WF7EwRRgDOZ-`!q>38A|_Tn5j&gpxNMaf%5m?(TM zgxj zx@l_87MX%Oiz>y-Jx(sW9=e>UIJQOT^Hm2qk}IChPwi=KP1Pnos*z@Kn%n*{Hwqj2 zdC!4CwXaxX7X-?jzQ1=*tPef&vUgE=0okS1-?ug1>ZtK@-yY1>2D1p3)ORV zQgc4>EJlf;*Ei;Tfw;}?Q$QKvx0VT)aG^MN;5K2yIN|Q&bK+zfp999TQaWX$WxH#M zKdAn{98pY_|PW6T*4(&Sv!qN*?kz4Se&`hw_LVln_H-ED?@oZ>d(Czy*T4+JMLqBUJ+uHoQEPB;C{BQ!<)pJ3iC(m%jF zR4C;rSEOgcxIJ8cgh~>=!PxtTY1#9adSHKsMBDskdTRd3`c66=$s`%|5IE%^e}j2> zy|X<3oyFQnSJe%3|0U^v#;%?zDWdd-SKAxR{5`)2mE-57LBp|-wo4|7e=4*U`F{we zdY;sJh3v3NpJq0%K7dJ06~ZZ{n^Vrx*v``hhv-5(YGvz!s)BCxwO@Kv*EmQE<1qrT z+Kd-#R;Wh}bz~F~)x9FXr`!*yOC3Pgoq6NfwfL{Tbh`Aj+4F5Kap(Y0YS$+Mg$S-I zL_KX|I^268dix?UZx0*%ria$QBUUq48&}C5K!ViOsx8Ud)E7#0{`)>A9V%* zjRkwA|0e0_GAR`kN#7FR45CJdiGp}9JVJ8hF{A?K4ZCus0qmI~XOUk!WEF(FltWY= zraRiX(Iil~7$Tf${FBt+KB+%0x{z5jND)nMnN32}UPuMkNOU~_l3n*Du^i4U%OLO* z&6-Ix`in3EB;WC6Co=hU9nVpKO`0NNUqY86It1TS(YEK)X!D|$OkLzjo4@--$EwTP zrj@y}cT`96m(9&cqFeLyw>(pD*E}f|C}xN?+^LkT)T*R(mC8ZZd{w|AV~3W zV;g6zxCQ&clqf6d2LBV5+}4!D>vb|!4Vw0a|IU~*0q1rt9o*(J>m|JXVF25IoJ8X? zci&PoubiTie$G;)XQ>4$NChf}ew!@w2rcqviAe)C-bbQ4zM?ucTzxecWDPB4?1>Ba z7zJ?{a@yI$095%B2e_fbM)jd`m(015TaOGtFoz%I&j01(K_KD31SMNbRc?P8ae)sX z{02%%SfKPaNg3$6;u_ZrL8I0bVkXxuwzg@&evrZCgV2Jw@y!w?J|C{ZS?*x=@*I6> z+x=Sij~=>4!=e~Zgt8z!YW_ORBrYbctfo3e&osrYdx1pfb5w~w;i_zuGLp?Apx0Xo zt>P8Df6~inQ~$lIAYApx?v>5p-NIvaPWg>>UbT*kG?G+lf4m@R%pv6@JcYd^4S#xF z3pwEbMGg0Wb$p8f+=IsX-Gg_zn{`~Ow|~%a zZ{(v{#h8ZhcymNPHS@ANY>F8RhYHfyFL8?XsB7bXqnN*d+xT9(#EQOlhh;E_1-7qb zdm|JhqwhNduxXn1;Al zOg~>ynw#OYDM+!q#FM)Pf$fK38XN7EMRynd_u~{^yh!uvOcd{|xSbM9tHf1Z9y!eR zN#EXd;H6tleM=GX5^aJeu5NH|E1=8g7V|O;Dky>yh6*0TYr%3V63fLmV!FJLi-~MB zKH(TGid|`_3d^z4*Oj`$!sA;AM$m46xYKBV_9;f?e!uhdQZof? zKM}*!|0Cg@ORkC27OK)sq>QC?3{?-dV)d1UOE^aU_DeB)MfECQO-6!9w|lZadednj zui(CxgiW)e4Gby#nU^DI|7E64q*_Q9~CK?Qpd7Ks-&$^7(@fUFp zL%QMhBd@i2yy%D>abOxOVH{0Ush5c2GM{vfRHpUWr>%@r>Wy&u)`o{;k7t#Q!v+UU zad*kV_T|nl5uQk^_J0pDZc&dMJ42E%Lqt7Jw#k&QIHRVAqoq(a3AKNrC?$ly+~xUg z&wqs$*55C*q&|IFv@3my4Sk(=u3jIPMoS>&QSB(Zrq3=JZd?cJpCs?Jnq+AW;vfv_ zGt6L*V`TDw`+`>5qC0R#H*7f&I{e*;&#~#}GAf6!qAO?j<^fkC z)lBhWF*ICuU{~_B^3>kn|Uw-M9`Qou_$x_`+qS3y3ySudg z61&y1a|4}M=hLRC!j{F@YofMJBN5qZVjUJc*&iK9e4(CN{%{|t(m4l}qM;`dqi0AA zDxLQfeR6zxz4+BJ3Qob4m6V%>Fefjy^a|(_^lnR%Y&|UCbm=a!Bxj=nQvGl&vT5RZ zT8(pS^F7?#w7H{u{@rV0_$9fQJ84!nsZ{+7VSYIDyZln70w?$Yn)?SYC4)1mZ$c zU{`uxFVf5p*_r4|v74a7Y?T3l&^^`Byl@?p`2DQ&f=RMZT#^*NCJ_Bor;R3@lk~8(Ns2{5r|)_oWB%5ktQ!C zjL$#PdRlq!O2YKdnva9N>;_#Xww7ZoIeV>xY^Le%V2J`)=aOXOG5jTWO>Kz7h5@?O zj{6Z9@2P@0zoPwT{paebH#~N3b;<9fb$Qzw?RuZYdvgWOYebIJ3*pUR`+6) zYQ6(eZCks=6uY$0Xf`aRN`0p=3aMK)wB_HOBG8;vI2{I#_UpF&m9K`0#F7F6b%Dih zrt1%Xu|hM-Sd#|6k3V<5Kh~)eteTIksi_|IPflO=&aE2b1xI1F|7g%AW1$AtnHIqo zL^5d5?GBE%;|w(ZaU9qgLLlj6YsmfuO?NN}_p>2)DXv@!!~`2u*edq@MzPDWLA{<% zqg2%p@J=AoE4UKK&uFY*xrUt!@lol9k;k^`*4~BQ9Ddr(ll@(s1s~Tm?Dulo4BaiJ zjVzp`CDf!TyA%c!c)Hi4o`k(i$3(X_v>Sv^KS3lIp)@MTXSO_l5Y{Q45TE4!R46$E zE%t4hcrFkhh`6bogqf!CiJ$hXw{_tR-P~ehMr$^lwvJ_Ww7h}b=pt&@Upaa%$AZ{y z!-lo)+%B4)eP1G5Z*ZRz>(!NhTUFGdX`K;f$fS`T;tACm(r{YY%o0`3wpQ_-{%$$H zufjbSxvS>V{wQmCVYl|SVSU4bpA+$$$B2f*b&5?FiMd^S&*YugRAEG?f*_D**?0_7F&1S!lPK2>+g)9=_TZ=?5xQAL5roa!-8}&rsUR6ZEB!6T<&5k}jR;0=?8gLxzeMlL~4ZI@3;M)_oR3U>J43y z-pP%Kz)T&jcPx6JB5Vufsot1a}hqBvpTFI$zZZwytK3F3-&yy#K~0LN18itEghp#<_peY%2E z&-JY@0G%`1Q;Vz6@y?%WQ))SKxsN8ZUc+%jbp_>4iT5=a7fc|0Hufs=kCJMXqVB) zc4O)K35sVn_E_*0+{x*i82x+Za6u|B8Rjky)Z;iG-ofgO;D?Om6f;Xz`wFt^4vBhx z$c;bd-fhR@2CyL+0y;V-X-lWQe$S1zgCiWWS5T5N>fo>{4^tI}&D+PE25Cu{+)2TBLtehd*#eKUx zP$EhpldXii4ZXsNa zF@-ybbagZEN|z6Eg9%|%9_(_wwtMDi0qy(*<$$-&o24xi&!jfp=(cn2M>jO_s2*xB z<>%d@lmdKHQarbgco_;lQKK9V!`O4}#mUUwSUDN(lhoUYs2>M6fD`TE3k$4VC(umr&&{+M6!XG3Ws0<4lHIGnbf8-?4`}7Gvz3|fD zyZLkw_!WG9JKy?ER9KsuyT6O<8`}aSk|8L(0W0^*0qMb}DH_rPbBq)z9LYq=`I$_k z!&6?GqtQTxROND}{mge9UxTQWBi%r@4x0b5mC_|0+qM6(>dLzm4RsJG-utzT#5=## zV1JIq|9*f>X7zNy^Zq@w+(z}pm6EkR{YBzaH2 zh=9b$3e&!^7*Xz>%)1=@9y2y2K^LO!JDM^BXL%~48J~S=e|6441RrcinW5M~lCgCe zGmRG`vj#>HGU_Cyd69ZJB7~LYG?3 zdF9xgkBH#9da=qn=cK^SLnyJDL~%AZ7AweXRU#;ru17;SH~+ZJtiTxWbD6V92%kAv zJKsTz3 zRoP(YieH5zveh=Qq{2?4fpo&wDxJQ!NE6F%KfWG@B?zH?0KUA5}limiyY!Ht$Pr&h?Ey^Hy^Hmf=I*n7sKxX!l(wkY$& zV40`}@drqdMLV?oRl|aKDxT2l2$*rT7!7@P) zYQGC7)s4LuhX=8I9I!2sE%NQECa=u?^{K;^@!+A;h;yVsXzz@`G(Tbams!zD8#l&p ze2#S5P@wc5SXLh~48ML?c;m+ENAO8IiWbpJ%+y)3Jo9Rr@E+V^gs@9|WElS>LsOqD-yHEC)o!_5~!~7A~L@ zd}rTbOB8?R_VTG2SLO6-J@6Y%T@VZhd`>Z5mAlW4F92%)j^=;SU|Ar)1Y{h7F|R=_ 0 yet +* `Cell[3]` Object 0 (Surface) Area (Sets/*.set lookup) +* `Cell[4]` Unsure at present, but it varies between a narrow range of values. + I've seen 128 - 147. Broadly matches the terrain layout. +* `Cell[5]` Object 1 (Left) Area (Sets/*.set lookup) **ASSUMED**. + * It's in the right place, and there seems to be correspondence, but not as + neatly as the other 3 columns. Often off-by-1 +* `Cell[6]` Wide range of values, 0 - 161 observed. Seems to have identity with + some blood splatters, etc +* `Cell[7]` Object 2 (Right) Area (Sets/*.set lookup) +* `Cell[8]` Wide range of values, 0 - 159 observed. +* `Cell[9]` Object 3 (Center) Area (Sets/*.set lookup) +* `Cell[10]` Varies from 0 - 248. Unclear what for, broadly follows terrain +* `Cell[11]` all 255? +* `Cell[12]` all 0? +* `Cell[13]` all 0? +* `Cell[14]` all 0? +* `Cell[15]` shows squad positions, MP start positions, etc, as 0x04 + +Mapping the altar in Chapter01 to the map01 set suggests it's a palette entry +lookup, 0-indexed. `U` debug in WH40K_TD.exe says the cell's `Object 3-Center` +has `Area 67` and `Sprite 1`. In `Sets/map01.set`, entry 67, zero-indexed and +ignoring non-palette data, is an altar. + +The data of that cell is: + +``` +maps.Cell{ + 0x18, 0x0, 0x0, 0x2, 0x99, 0x1, 0x0, 0x0, + 0x0, 0x43, 0x81, 0xff, 0x0, 0x0, 0x0, 0x0 +} +``` + +So `CellIdx == 9` points to the center object's Area, looked up in the set file! + +![Pinning down cell index 9](img/chapter01_cell_index_9.png + +I still see weird artifacts on middle Z-layers making me think I'm off the +stride or perhaps there's a data block partway through or something. Or maybe +the data's just born that way. ## Trailer @@ -459,4 +507,4 @@ Around 001841A0: mission objectives! ``` Since all the files are exactly the same length uncompressed, I'm going to -assume these are all a fixed number of fixed-size records when looking into it. \ No newline at end of file +assume these are all a fixed number of fixed-size records when looking into it. diff --git a/internal/maps/maps.go b/internal/maps/maps.go index a471dd4..ff9f5d7 100644 --- a/internal/maps/maps.go +++ b/internal/maps/maps.go @@ -26,8 +26,8 @@ const ( CellSize = 16 // seems to be - cellDataOffset = 0x100 // tentatively - cellDataSize = MaxHeight * MaxLength * MaxWidth * CellSize + cellDataOffset = 0x120 // tentatively + cellCount = MaxHeight * MaxLength * MaxWidth ) type Header struct { @@ -59,21 +59,79 @@ func (h Header) Height() int { return MaxHeight } -type Cell []byte // FIXME: need to deconstruct this into the various fields +func (h Header) MapSetFilename() string { + idx := bytes.IndexByte(h.SetName[:], 0) + if idx < 0 { + idx = 8 // all 8 bytes are used + } + + return string(h.SetName[0:idx:idx]) + ".set" +} + +type Cell struct { + DoorAndCanisterRelated byte + DoorLockAndReactorRelated byte + Unknown2 byte + Object0SurfaceArea byte + Unknown4 byte + Object1LeftArea byte + Unknown6 byte + Object2RightArea byte + Unknown8 byte + Object3CenterArea byte + Unknown10 byte + Unknown11 byte + Unknown12 byte + Unknown13 byte + Unknown14 byte + SquadRelated byte +} + +func (c *Cell) At(n int) byte { + switch n { + case 0: + return c.DoorAndCanisterRelated + case 1: + return c.DoorLockAndReactorRelated + case 2: + return c.Unknown2 + case 3: + return c.Object0SurfaceArea + case 4: + return c.Unknown4 + case 5: + return c.Object1LeftArea + case 6: + return c.Unknown6 + case 7: + return c.Object2RightArea + case 8: + return c.Unknown8 + case 9: + return c.Object3CenterArea + case 10: + return c.Unknown10 + case 11: + return c.Unknown11 + case 12: + return c.Unknown12 + case 13: + return c.Unknown13 + case 14: + return c.Unknown14 + case 15: + return c.SquadRelated + } + + return 0 +} // Cells is always a fixed size; use At to get a cell according to x,y,z -type Cells []byte +type Cells []Cell // FIXME: Ordering may be incorrect? I assume z,y,x for now... func (c Cells) At(x, y, z int) Cell { - start := - (z * MaxLength * MaxWidth * CellSize) + - (y * MaxWidth * CellSize) + - (x * CellSize) - - end := start + CellSize - - return Cell(c[start:end:end]) + return c[(z*MaxLength*MaxWidth)+(y*MaxWidth)+x] } func (h Header) Check() []error { @@ -194,9 +252,9 @@ func loadMapFile(filename string) (*GameMap, error) { return nil, err } - out.Cells = make(Cells, cellDataSize) + out.Cells = make(Cells, cellCount) if err := binary.Read(zr, binary.LittleEndian, &out.Cells); err != nil { - return nil, fmt.Errorf("Error parsing %s: %v", filename, err) + return nil, fmt.Errorf("Error parsing cells for %s: %v", filename, err) } return &out, nil