Merge branch 'new-race-mode' into test

This commit is contained in:
2026-05-12 09:20:55 +08:00
2 changed files with 43 additions and 13 deletions

View File

@@ -20,25 +20,47 @@ onLoad(async (options) => {
const result = await getBattleAPI(battleId.value); const result = await getBattleAPI(battleId.value);
data.value = result; data.value = result;
if (result.mode > 3) { if (result.mode > 3) {
players.value = result.resultList.map((item, index) => {
const plist = result.teams[0] ? result.teams[0].players : []; const plist = result.teams[0] ? result.teams[0].players : [];
const p = plist.find((p) => p.id === item.userId); // 以 id 为 key 建立 teams 玩家快速查找表
const teamPlayerMap = {};
plist.forEach((p) => { teamPlayerMap[p.id] = p; });
// 处理有成绩的玩家resultList 顺序即排名顺序)
const rankedPlayers = (result.resultList || []).map((item, index) => {
const playerId = item.userId || item.id;
const p = teamPlayerMap[playerId] || item;
const arrows = new Array(12); const arrows = new Array(12);
result.rounds.forEach((r, index) => { result.rounds.forEach((r, rIndex) => {
if (r.shoots[item.userId]) { if (r.shoots[playerId]) {
r.shoots[item.userId].forEach((s, index2) => { r.shoots[playerId].forEach((s, sIndex) => {
arrows[index2 + index * 6] = s; arrows[sIndex + rIndex * 6] = s;
}); });
} }
}); });
return { return {
...item, ...item,
id: playerId,
rank: index + 1, rank: index + 1,
name: p.name, name: (p && p.name) || item.name,
avatar: p.avatar || "", avatar: (p && p.avatar) || item.avatar || "",
arrows, arrows,
}; };
}); });
// 追加未出现在 resultList 中的玩家未射箭rank=0 隐藏角标
const rankedIds = new Set(rankedPlayers.map((p) => p.id));
const unrankedPlayers = plist
.filter((p) => !rankedIds.has(p.id))
.map((p) => ({
id: p.id,
name: p.name,
avatar: p.avatar || "",
arrows: [],
totalScore: 0,
rank: 0,
}));
players.value = [...rankedPlayers, ...unrankedPlayers];
} }
}); });
@@ -59,13 +81,14 @@ const checkBowData = (selected) => {
<Container title="详情"> <Container title="详情">
<view class="container"> <view class="container">
<BattleHeader <BattleHeader
v-if="data.mode <= 3"
:winner="data.winTeam" :winner="data.winTeam"
:blueTeam="data.teams[1] ? data.teams[1].players : []" :blueTeam="data.teams[1] ? data.teams[1].players : []"
:redTeam="data.teams[2] ? data.teams[2].players : []" :redTeam="data.teams[2] ? data.teams[2].players : []"
:players="players" :players="players"
/> />
<view <view
v-if="data.mode >= 3" v-if="data.mode > 3"
class="score-header" class="score-header"
:style="{ border: 'none', padding: '5px 15px' }" :style="{ border: 'none', padding: '5px 15px' }"
> >
@@ -76,14 +99,14 @@ const checkBowData = (selected) => {
</view> </view>
</view> </view>
<PlayerScore2 <PlayerScore2
v-if="data.mode >= 3" v-if="data.mode > 3"
v-for="(player, index) in players" v-for="(player, index) in players"
:key="index" :key="index"
:name="player.name" :name="player.name"
:avatar="player.avatar" :avatar="player.avatar"
:arrows="player.arrows" :arrows="player.arrows"
:totalScore="player.totalScore" :totalScore="player.totalScore"
:rank="index + 1" :rank="player.rank"
/> />
<view <view
v-if="data.mode <= 3" v-if="data.mode <= 3"

View File

@@ -55,7 +55,14 @@ const onPractiseLoading = async (page) => {
}; };
const getName = (battle) => { const getName = (battle) => {
if (battle.mode <= 3) return `${battle.mode}V${battle.mode}`; if (battle.mode <= 3) return `${battle.mode}V${battle.mode}`;
return battle.mode + "人大乱斗"; // 排位赛大乱斗mode 数字与实际人数不一致,使用固定映射
if (battle.way === 2) {
if (battle.mode === 4) return "5人大乱斗";
if (battle.mode === 5) return "10人大乱斗";
}
// 好友约战大乱斗:从 teams[0].players 取实际参与人数动态展示
const count = battle.teams?.[0]?.players?.length;
return count ? `${count}人大乱斗` : "大乱斗";
}; };
/** /**