@@ -2,10 +2,29 @@ import allRegions from './hierarchy.json'
22import ignore from './ignore.json'
33import { setup } from './camera.js'
44
5- type RegionKey = keyof typeof allRegions
6- type Region = ( typeof allRegions ) [ RegionKey ]
5+ type RegionKey = string
6+ type Region = {
7+ rooms : Array < {
8+ screens : string [ ]
9+ data : {
10+ mapPos : [ number , number ]
11+ size : [ number , number ]
12+ layer : number
13+ warpPoints : {
14+ region : string | null
15+ room : string | null
16+ pos : [ number , number ] | null
17+ oneWay : boolean
18+ } [ ]
19+ echoSpots : unknown [ ]
20+ } | { mapPos ?: never }
21+ } >
22+ data : {
23+ name : string
24+ }
25+ }
726
8- const regions : Partial < Record < RegionKey , Region > > = { }
27+ const regions : Record < RegionKey , Region > = { }
928for ( const rk in allRegions ) {
1029 if ( ignore . region . includes ( rk ) ) continue
1130 regions [ rk ] = allRegions [ rk ]
@@ -14,8 +33,8 @@ for(const rk in allRegions) {
1433// half height of camera
1534// const size = 384
1635
17- const outer = window . map_container
18- const inner = window . map_content
36+ const outer = ( window as any ) . map_container
37+ const inner = ( window as any ) . map_content
1938
2039const context = {
2140 canvas : outer ,
@@ -40,7 +59,7 @@ const context = {
4059
4160setup ( context )
4261
43- const regionsEl = window . regions
62+ const regionsEl = ( window as any ) . regions
4463
4564// null if show all
4665function fillRegions ( filter : string | null ) {
@@ -65,6 +84,16 @@ function fillRegions(filter: string | null) {
6584 }
6685}
6786
87+ function lget ( list : Map < number , HTMLElement > , layer : number ) {
88+ let v = list . get ( layer )
89+ if ( ! v ) {
90+ v = document . createElement ( 'div' )
91+ v . style . position = 'absolute'
92+ list . set ( layer , v )
93+ }
94+ return v
95+ }
96+
6897function showRegion ( regionName : RegionKey , region : Region ) {
6998 inner . innerHTML = ''
7099 var minX = Infinity
@@ -78,18 +107,26 @@ function showRegion(regionName: RegionKey, region: Region) {
78107 const markerLayerEls : Map < number , HTMLElement > = new Map ( )
79108
80109 for ( const k in region . rooms ) {
81- const room = region . rooms [ k as RegionKey ]
110+ const room = region . rooms [ k ]
82111 if ( ! room . data . mapPos ) continue
83112 const layer = room . data . layer
84113 layers . add ( layer )
85114
115+ let totalX = 0
116+ let totalY = 0
117+ let count = 0
118+
86119 for ( const s of room . screens ) {
87120 const ps = s . split ( '$' )
88121 let x = room . data . mapPos [ 0 ] / 3 - room . data . size [ 0 ] * 0.5
89122 let y = room . data . mapPos [ 1 ] / 3 - room . data . size [ 1 ] * 0.5
90123 x += Number ( ps [ 0 ] ) / 20
91124 y += Number ( ps [ 1 ] ) / 20
92125
126+ totalX += x
127+ totalY += y
128+ count ++
129+
93130 const image = document . createElement ( 'img' )
94131 image . classList . add ( 'bg' )
95132 image . setAttribute ( 'src' , '/images/' + regionName + '/' + k + '/' + s )
@@ -101,23 +138,32 @@ function showRegion(regionName: RegionKey, region: Region) {
101138 minY = Math . min ( minY , y )
102139 maxY = Math . max ( maxY , y )
103140
104- let v = layerEls . get ( layer )
105- if ( ! v ) {
106- v = document . createElement ( 'div' )
107- v . classList . add ( 'room-layer' )
108- v . style . position = 'absolute'
109- layerEls . set ( layer , v )
110- }
141+ lget ( layerEls , layer ) . append ( image )
142+ }
111143
112- v . append ( image )
144+ for ( let i = 0 ; i < room . data . warpPoints . length ; i ++ ) {
145+ const it = room . data . warpPoints [ i ]
146+
147+ const v = lget ( markerLayerEls , layer )
148+ const m = document . createElement ( 'div' )
149+ m . classList . add ( 'marker-warp' )
150+ m . classList . add ( 'warp-oneway' , '' + it . oneWay )
151+ m . style . left = ( totalX / count ) + 'px'
152+ m . style . top = - ( totalY / count ) + 'px'
153+ v . append ( m )
113154 }
114155 }
115156
116157 const layersArr = [ ...layers ]
117158 layersArr . sort ( ( a , b ) => a - b )
118159
119160 for ( const l of layersArr ) {
120- inner . append ( layerEls . get ( l ) )
161+ const e = layerEls . get ( l )
162+ if ( e ) inner . append ( e )
163+ }
164+ for ( const l of layersArr ) {
165+ const e = markerLayerEls . get ( l )
166+ if ( e ) inner . append ( e )
121167 }
122168
123169 let curLayer = layersArr [ 0 ]
@@ -136,7 +182,8 @@ function showRegion(regionName: RegionKey, region: Region) {
136182 context . requestRender ( )
137183
138184 {
139- window . layers . innerHTML = ''
185+ const layerEl = ( window as any ) . layers
186+ layerEl . innerHTML = ''
140187
141188 const form = document . createElement ( 'form' )
142189 for ( const l of layersArr ) {
@@ -151,7 +198,7 @@ function showRegion(regionName: RegionKey, region: Region) {
151198 form . append ( cont )
152199 }
153200
154- window . layers . append (
201+ layerEl . append (
155202 document . createTextNode ( 'Layers:' ) ,
156203 form ,
157204 )
0 commit comments