Files
mini-zmc/pages/create/create.js
2026-07-29 10:50:33 +08:00

117 lines
3.3 KiB
JavaScript

const service = require("../../services/game-service");
const { GAME_MODES, DEFAULT_SETTINGS } = require("../../utils/constants");
Page({
data: {
name: "周末藏猫猫",
mode: DEFAULT_SETTINGS.mode,
modes: Object.values(GAME_MODES),
durationOptions: [15, 20, 30, 45, 60],
durationIndex: 2,
prepareOptions: [1, 3, 5, 8],
prepareIndex: 1,
maxPlayerOptions: [4, 6, 8, 10, 12, 20],
maxPlayerIndex: 2,
seekerOptions: [1, 2, 3, 4],
seekerIndex: 1,
clueOptions: [3, 5, 8, 10],
clueIndex: 1,
radiusOptions: [200, 300, 500, 800, 1000],
radiusIndex: 2,
skillsEnabled: true,
safetyAccepted: false,
submitting: false
},
updateName(event) {
this.setData({ name: event.detail.value });
},
chooseMode(event) {
this.setData({ mode: event.currentTarget.dataset.mode });
},
onDurationChange(event) {
this.setData({ durationIndex: Number(event.detail.value) });
},
onPrepareChange(event) {
this.setData({ prepareIndex: Number(event.detail.value) });
},
onMaxPlayerChange(event) {
const maxPlayerIndex = Number(event.detail.value);
const maxPlayers = this.data.maxPlayerOptions[maxPlayerIndex];
let seekerIndex = this.data.seekerIndex;
while (
seekerIndex > 0 &&
this.data.seekerOptions[seekerIndex] >= maxPlayers
) {
seekerIndex -= 1;
}
this.setData({ maxPlayerIndex, seekerIndex });
},
onSeekerChange(event) {
const seekerIndex = Number(event.detail.value);
const seekers = this.data.seekerOptions[seekerIndex];
const maxPlayers = this.data.maxPlayerOptions[this.data.maxPlayerIndex];
if (seekers >= maxPlayers) {
wx.showToast({ title: "寻找者必须少于人数上限", icon: "none" });
return;
}
this.setData({ seekerIndex });
},
onClueChange(event) {
this.setData({ clueIndex: Number(event.detail.value) });
},
onRadiusChange(event) {
this.setData({ radiusIndex: Number(event.detail.value) });
},
onSkillsChange(event) {
this.setData({ skillsEnabled: event.detail.value });
},
onSafetyChange(event) {
this.setData({ safetyAccepted: event.detail.value.length > 0 });
},
openRules() {
wx.navigateTo({ url: "/pages/rules/rules" });
},
submit() {
if (!this.data.name.trim()) {
wx.showToast({ title: "请填写房间名称", icon: "none" });
return;
}
if (!this.data.safetyAccepted) {
wx.showToast({ title: "请先确认安全规则", icon: "none" });
return;
}
this.setData({ submitting: true });
const data = this.data;
try {
const room = service.createRoom({
name: data.name.trim(),
mode: data.mode,
durationMinutes: data.durationOptions[data.durationIndex],
prepareMinutes: data.prepareOptions[data.prepareIndex],
maxPlayers: data.maxPlayerOptions[data.maxPlayerIndex],
seekerCount: data.seekerOptions[data.seekerIndex],
clueIntervalMinutes: data.clueOptions[data.clueIndex],
radiusMeters: data.radiusOptions[data.radiusIndex],
skillsEnabled: data.skillsEnabled
});
wx.redirectTo({ url: `/pages/lobby/lobby?code=${room.code}` });
} catch (error) {
this.setData({ submitting: false });
wx.showToast({ title: error.message, icon: "none" });
}
}
});