Skip to content

Commit 0f78276

Browse files
committed
feat: warp marker display
1 parent d237d8e commit 0f78276

File tree

3 files changed

+78
-18
lines changed

3 files changed

+78
-18
lines changed

src/index.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
height: 39px;
44
user-drag: none;
55
pointer-events: none;
6+
transform: translate(-50%, -50%);
67
}
78
:root {
89
width: 100%;
@@ -43,6 +44,7 @@ body {
4344
transition: color 0.2s;
4445
}
4546
#layers {
47+
min-height: 5rem;
4648
padding: 0.5rem;
4749
display: flex;
4850
flex-direction: column;
@@ -55,3 +57,11 @@ body {
5557
.region-selected {
5658
color: #2060ae;
5759
}
60+
.marker-warp {
61+
transform: translate(-50%, -50%);
62+
position: absolute;
63+
width: 10px;
64+
height: 10px;
65+
border-radius: 999999px;
66+
background: red;
67+
}

src/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
</div>
1616
</div>
1717
<div id="menu">
18+
<div id="element">
19+
</div>
20+
1821
<div id="layers">
1922
</div>
2023
<div id="regions">

src/index.ts

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,29 @@ import allRegions from './hierarchy.json'
22
import ignore from './ignore.json'
33
import { 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> = {}
928
for(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

2039
const context = {
2140
canvas: outer,
@@ -40,7 +59,7 @@ const context = {
4059

4160
setup(context)
4261

43-
const regionsEl = window.regions
62+
const regionsEl = (window as any).regions
4463

4564
// null if show all
4665
function 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+
6897
function 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

Comments
 (0)