138 lines
6.0 KiB
Plaintext
138 lines
6.0 KiB
Plaintext
<view class="game-page" wx:if="{{readyToRender}}">
|
|
<view class="game-head {{me.role === 'seeker' ? 'seeker-head' : 'hider-head'}}">
|
|
<view class="row between">
|
|
<view class="live-pill"><view class="live-dot"></view>{{stageLabel}}</view>
|
|
<view class="safe-state">● 边界内</view>
|
|
</view>
|
|
<view class="role-label">你的身份</view>
|
|
<view class="role-name">{{me.role === 'seeker' ? '寻找者' : '躲藏者'}}</view>
|
|
<view class="role-task">
|
|
{{me.role === 'seeker' ? '根据线索找到目标,用动态口令完成抓捕。' : '保持隐蔽,在倒计时结束前不要被发现。'}}
|
|
</view>
|
|
<view class="countdown">{{countdown}}</view>
|
|
</view>
|
|
|
|
<view class="page game-content">
|
|
<view class="stat-grid">
|
|
<view class="stat-card">
|
|
<view class="stat-value">{{survivors}}</view>
|
|
<view class="stat-label">仍在躲藏</view>
|
|
</view>
|
|
<view class="stat-card">
|
|
<view class="stat-value">{{seekers}}</view>
|
|
<view class="stat-label">正在寻找</view>
|
|
</view>
|
|
<view class="stat-card">
|
|
<view class="stat-value">{{room.settings.radiusMeters}}m</view>
|
|
<view class="stat-label">安全半径</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view wx:if="{{room.status === 'preparing'}}" class="preparing-card">
|
|
<view class="preparing-icon">◌</view>
|
|
<view class="card-title">准备阶段</view>
|
|
<view class="preparing-copy">
|
|
{{me.role === 'seeker' ? '请留在起点,不要观察躲藏者的方向。倒计时结束后会震动提醒。' : '现在出发寻找安全藏身处,不要进入封闭、危险或私人区域。'}}
|
|
</view>
|
|
</view>
|
|
|
|
<view wx:elif="{{room.status === 'paused'}}" class="preparing-card">
|
|
<view class="preparing-icon">Ⅱ</view>
|
|
<view class="card-title">游戏暂停中</view>
|
|
<view class="preparing-copy">请留在安全位置并等待房主继续游戏,暂停期间倒计时和线索计时均不会推进。</view>
|
|
</view>
|
|
|
|
<block wx:else>
|
|
<view wx:if="{{room.settings.skillsEnabled && (me.status === 'seeking' || me.status === 'hiding')}}">
|
|
<view class="section-label">角色能力</view>
|
|
<view class="skill-card">
|
|
<view class="skill-icon">{{me.role === 'seeker' ? '⌁' : '◐'}}</view>
|
|
<view class="skill-main">
|
|
<view class="card-title">{{me.role === 'seeker' ? '区域雷达' : '静默信号'}}</view>
|
|
<view class="skill-copy">
|
|
{{me.role === 'seeker' ? '检测附近是否可能存在躲藏者,不显示精确方向。' : '跳过下一次周期性位置广播。'}}
|
|
</view>
|
|
</view>
|
|
<button
|
|
class="skill-button {{skillUsed ? 'used' : ''}}"
|
|
disabled="{{skillUsed}}"
|
|
bindtap="useSkill"
|
|
>{{skillUsed ? '已使用' : '使用'}}</button>
|
|
</view>
|
|
</view>
|
|
|
|
<view wx:if="{{me.role === 'seeker' && me.status === 'seeking'}}">
|
|
<view class="section-label">抓捕确认</view>
|
|
<view class="capture-card">
|
|
<view class="capture-title">选择你在线下找到的目标</view>
|
|
<view class="target-list">
|
|
<view
|
|
wx:for="{{captureTargets}}"
|
|
wx:key="id"
|
|
class="target-chip {{selectedTargetId === item.id ? 'selected' : ''}}"
|
|
data-id="{{item.id}}"
|
|
bindtap="chooseCaptureTarget"
|
|
>{{item.name}}</view>
|
|
</view>
|
|
<view class="capture-copy">请在安全距离内完成确认,禁止追逐中发生身体接触。</view>
|
|
<input
|
|
type="number"
|
|
maxlength="4"
|
|
value="{{submittedCode}}"
|
|
placeholder="0000"
|
|
bindinput="inputCaptureCode"
|
|
/>
|
|
<view wx:if="{{showDemoCode}}" class="demo-code" bindtap="fillDemoCode">
|
|
原型演示:点击填入口令 {{captureCode}}
|
|
</view>
|
|
<button
|
|
class="secondary-button capture-button"
|
|
loading="{{captureSubmitting}}"
|
|
disabled="{{captureSubmitting || !selectedTargetId || submittedCode.length !== 4}}"
|
|
bindtap="submitCapture"
|
|
>确认抓捕</button>
|
|
</view>
|
|
</view>
|
|
|
|
<view wx:elif="{{me.role === 'hider' && me.status === 'hiding'}}">
|
|
<view class="section-label">你的动态口令</view>
|
|
<view class="token-card">
|
|
<view class="token-label">被找到后,将口令展示给寻找者</view>
|
|
<view class="token-code">{{captureCode}}</view>
|
|
<view class="token-note">每 30 秒刷新 · 不要远程发送口令</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view wx:else class="preparing-card player-finished-card">
|
|
<view class="card-title">你已结束躲藏</view>
|
|
<view class="preparing-copy">经典模式下可以留在安全区域观战,请勿向其他玩家透露信息。</view>
|
|
</view>
|
|
|
|
<view class="section-label">实时事件</view>
|
|
<view class="event-list">
|
|
<view wx:if="{{eventViews.length === 0}}" class="empty-inline">还没有游戏事件</view>
|
|
<view wx:for="{{eventViews}}" wx:key="id" class="event-row">
|
|
<view class="event-mark {{item.type}}"></view>
|
|
<view class="event-message">{{item.message}}</view>
|
|
<view class="event-time">{{item.time}}</view>
|
|
</view>
|
|
</view>
|
|
</block>
|
|
|
|
<view class="safety-actions">
|
|
<button class="danger-button" bindtap="showSafety">安全与退出</button>
|
|
<button wx:if="{{canManage}}" class="ghost-button" bindtap="togglePause">
|
|
{{room.status === 'paused' ? '继续游戏' : '暂停游戏'}}
|
|
</button>
|
|
<button wx:if="{{canManage}}" class="ghost-button" bindtap="finishEarly">提前结束</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="state-page" wx:elif="{{errorMessage}}">
|
|
<view class="state-icon">!</view>
|
|
<view class="state-title">无法恢复游戏</view>
|
|
<view class="state-copy">{{errorMessage}}</view>
|
|
<button class="primary-button state-action" bindtap="backHome">返回首页</button>
|
|
</view>
|