Improve summit terrain, mobile HUD and multiplayer night equipment

Add the Blender flashlight asset with a 600 lm beam and reduced bloom, shared-mode self badge, and compact phone controls. Relocate the summit marker, blend terrain seams, widen walking routes, and align local server configuration on port 2027.
This commit is contained in:
2026-10-31 23:14:44 +09:00
parent 18dfb63350
commit eb49ea4b84
40 changed files with 402 additions and 64 deletions
+1 -1
View File
@@ -3,5 +3,5 @@ export const SERVER_LIMITS = {
movementBudgetSeconds: 0.5,
updateIntervalMs: 100,
weatherSampleMs: 60000,
defaultOrigins: ['http://localhost:3000', 'http://127.0.0.1:3000', 'http://localhost:5173', 'http://127.0.0.1:5173'],
defaultOrigins: ['http://localhost:2027', 'http://127.0.0.1:2027', 'http://localhost:5173', 'http://127.0.0.1:5173'],
} as const;
+4 -2
View File
@@ -43,7 +43,8 @@ function validUpdate(value: unknown): value is PlayerUpdate {
&& Math.abs(v.yaw) <= Math.PI * 2 && typeof v.moving === 'boolean'
&& ['idle', 'wave', 'pray'].includes(v.emote) && !!gear
&& typeof gear.umbrella === 'boolean' && typeof gear.raincoat === 'boolean'
&& typeof gear.hood === 'boolean' && (!gear.hood || gear.raincoat);
&& typeof gear.hood === 'boolean' && (!gear.hood || gear.raincoat)
&& (gear.flashlight === undefined || typeof gear.flashlight === 'boolean');
}
export class SummitRoom {
@@ -191,7 +192,8 @@ export class SummitRoom {
|| Object.keys(update.equipment).some(key => update.equipment[key as keyof typeof update.equipment] !== s.player!.equipment[key as keyof typeof update.equipment]);
if (!changed) return;
s.player = { ...s.player, x: update.x, z: update.z, yaw: update.yaw, moving: update.moving, emote,
equipment: { umbrella: update.equipment.umbrella, raincoat: update.equipment.raincoat, hood: update.equipment.hood },
equipment: { umbrella: update.equipment.umbrella, raincoat: update.equipment.raincoat, hood: update.equipment.hood,
...(update.equipment.flashlight === undefined ? {} : { flashlight: update.equipment.flashlight }) },
updatedAt: at, emoteStartedAt: emote === s.player.emote ? s.player.emoteStartedAt : at };
this.dirty = true;
}