Keep elevator proportions correct in portrait layout

This commit is contained in:
Admin 2026-09-21 23:47:11 +00:00
parent 56e638900d
commit 8af0769704

View File

@ -71,7 +71,10 @@ const FLOOR_H = Math.floor(
) / FLOOR_COUNT ) / FLOOR_COUNT
) )
const STATUS_Y = HEIGHT - 36 const STATUS_Y = HEIGHT - 36
const ELEVATOR_CAR_H = Math.min(140, Math.max(76, Math.round(FLOOR_H * 0.58))) const ELEVATOR_CAR_W = 82
const ELEVATOR_CAR_H = Math.min(104, Math.max(74, Math.round(FLOOR_H * 0.36)))
const ELEVATOR_OPENING_W = 72
const ELEVATOR_OPENING_H = Math.min(96, Math.max(68, Math.round(FLOOR_H * 0.34)))
const PLAYER_DRAG_FOLLOW = 0.18 const PLAYER_DRAG_FOLLOW = 0.18
const PLAYER_DRAG_OFFSET_Y = 42 const PLAYER_DRAG_OFFSET_Y = 42
@ -179,26 +182,66 @@ function cropTexture(scene, sourceKey, key, rect) {
scene.textures.addCanvas(key, canvas) scene.textures.addCanvas(key, canvas)
} }
const ELEVATOR_SVG = ` function buildElevatorSvg() {
<svg xmlns="http://www.w3.org/2000/svg" width="120" height="542" viewBox="0 0 120 542"> const shaftHeight = FLOOR_COUNT * FLOOR_H + (FLOOR_COUNT - 1) * FLOOR_GAP
<rect x="5" y="2" width="110" height="538" rx="16" fill="#dfe8f1" stroke="#9aaabd" stroke-width="5"/> const openings = Array.from({ length: FLOOR_COUNT }, (_, floor) => {
<rect x="16" y="10" width="88" height="522" rx="12" fill="#f7fbff" stroke="#c6d1de" stroke-width="3"/> const centerY = floor * (FLOOR_H + FLOOR_GAP) + FLOOR_H / 2
<g fill="#fff3f8" stroke="#c896ad" stroke-width="3"> const y = centerY - ELEVATOR_OPENING_H / 2
<rect x="24" y="12" width="72" height="82" rx="9"/>
<rect x="24" y="122" width="72" height="82" rx="9"/> return `
<rect x="24" y="232" width="72" height="82" rx="9"/> <rect
<rect x="24" y="342" width="72" height="82" rx="9"/> x="${(ELEVATOR_W - ELEVATOR_OPENING_W) / 2}"
<rect x="24" y="452" width="72" height="78" rx="9"/> y="${y}"
</g> width="${ELEVATOR_OPENING_W}"
<g fill="#f28fb3"> height="${ELEVATOR_OPENING_H}"
<path d="M60 40c-11-15-33-4-23 14 10 17 23 23 23 23s13-6 23-23c10-18-12-29-23-14z"/> rx="10"
<path d="M60 150c-11-15-33-4-23 14 10 17 23 23 23 23s13-6 23-23c10-18-12-29-23-14z"/> fill="#fff3f8"
<path d="M60 260c-11-15-33-4-23 14 10 17 23 23 23 23s13-6 23-23c10-18-12-29-23-14z"/> stroke="#c896ad"
<path d="M60 370c-11-15-33-4-23 14 10 17 23 23 23 23s13-6 23-23c10-18-12-29-23-14z"/> stroke-width="3"
<path d="M60 480c-11-15-33-4-23 14 10 17 23 23 23 23s13-6 23-23c10-18-12-29-23-14z"/> />
</g> <text
x="${ELEVATOR_W / 2}"
y="${centerY + 2}"
text-anchor="middle"
dominant-baseline="middle"
font-family="Arial, sans-serif"
font-size="28"
fill="#f28fb3"
>♥</text>
`
}).join('')
return `
<svg
xmlns="http://www.w3.org/2000/svg"
width="${ELEVATOR_W}"
height="${shaftHeight}"
viewBox="0 0 ${ELEVATOR_W} ${shaftHeight}"
>
<rect
x="5"
y="2"
width="${ELEVATOR_W - 10}"
height="${shaftHeight - 4}"
rx="16"
fill="#dfe8f1"
stroke="#9aaabd"
stroke-width="5"
/>
<rect
x="16"
y="10"
width="${ELEVATOR_W - 32}"
height="${shaftHeight - 20}"
rx="12"
fill="#f7fbff"
stroke="#c6d1de"
stroke-width="3"
/>
${openings}
</svg> </svg>
` `
}
class HouseScene extends Phaser.Scene { class HouseScene extends Phaser.Scene {
constructor() { constructor() {
@ -226,7 +269,7 @@ class HouseScene extends Phaser.Scene {
this.load.image('character-sheet', '/assets/character-sheet.png') this.load.image('character-sheet', '/assets/character-sheet.png')
this.load.image( this.load.image(
'elevator-shaft', 'elevator-shaft',
'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(ELEVATOR_SVG) 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(buildElevatorSvg())
) )
} }
@ -319,15 +362,16 @@ class HouseScene extends Phaser.Scene {
const stopY = elevatorStopY(currentRoom) const stopY = elevatorStopY(currentRoom)
const cx = ELEVATOR_X + ELEVATOR_W / 2 const cx = ELEVATOR_X + ELEVATOR_W / 2
this.elevatorCarBack = this.add.rectangle(cx, stopY, 94, ELEVATOR_CAR_H, 0xfff8fb, 1) this.elevatorCarBack = this.add.rectangle(cx, stopY, ELEVATOR_CAR_W, ELEVATOR_CAR_H, 0xfff8fb, 1)
.setStrokeStyle(3, 0xb98ba2) .setStrokeStyle(3, 0xb98ba2)
.setDepth(190) .setDepth(190)
this.elevatorDoorLeft = this.add.rectangle(cx - 23, stopY, 44, ELEVATOR_CAR_H - 8, 0xf4bfd2, 1) const doorW = Math.floor((ELEVATOR_CAR_W - 6) / 2)
this.elevatorDoorLeft = this.add.rectangle(cx - doorW / 2, stopY, doorW, ELEVATOR_CAR_H - 8, 0xf4bfd2, 1)
.setStrokeStyle(2, 0xc17d9d) .setStrokeStyle(2, 0xc17d9d)
.setDepth(210) .setDepth(210)
this.elevatorDoorRight = this.add.rectangle(cx + 23, stopY, 44, ELEVATOR_CAR_H - 8, 0xf4bfd2, 1) this.elevatorDoorRight = this.add.rectangle(cx + doorW / 2, stopY, doorW, ELEVATOR_CAR_H - 8, 0xf4bfd2, 1)
.setStrokeStyle(2, 0xc17d9d) .setStrokeStyle(2, 0xc17d9d)
.setDepth(210) .setDepth(210)
@ -630,8 +674,11 @@ class HouseScene extends Phaser.Scene {
async setElevatorDoors(open) { async setElevatorDoors(open) {
const cx = ELEVATOR_X + ELEVATOR_W / 2 const cx = ELEVATOR_X + ELEVATOR_W / 2
const leftX = open ? cx - 58 : cx - 23 const doorW = Math.floor((ELEVATOR_CAR_W - 6) / 2)
const rightX = open ? cx + 58 : cx + 23 const closedOffset = doorW / 2
const openOffset = ELEVATOR_CAR_W / 2 + doorW / 2 + 4
const leftX = open ? cx - openOffset : cx - closedOffset
const rightX = open ? cx + openOffset : cx + closedOffset
await Promise.all([ await Promise.all([
this.tweenAsync({ this.tweenAsync({
@ -934,7 +981,7 @@ const game = new Phaser.Game({
}) })
window.__DOLLHOUSE__ = { window.__DOLLHOUSE__ = {
version: '0.4.2', version: '0.4.3',
game, game,
async resetAll() { async resetAll() {
await clearGameState() await clearGameState()