UNPKG

press-next

Version:

Vue3 组件库,支持 Composition API

567 lines (469 loc) 15 kB
import { timeStampFormat } from 't-comm/es/time/time'; import { NUMBER_CHI_MAP } from 't-comm/lib/base/number/number'; import { CORE_TIME_MAP_MINUTE } from './config'; import { CARD_STATUS_MAP, DEFAULT_CARD_CUSTOM, CARD_ICON_FONT_MAP, CARD_ICON_TEXT_MAP, CARD_BUTTON_CLASS, CARD_BUTTON_MAP, } from './utils'; import { getCurBattleSeqFromTime } from './utils-battle-seq'; import { getSatisfiedAndCannotInviteCardCustom, getSatisfiedAndCanInviteCardCustom, } from './utils-card-signup-any'; const TIME_MAP = { JUMP_TO_ROOM: CORE_TIME_MAP_MINUTE.JUMP_TO_ROOM * 60 * 1000, GROUPING_AND_CREATING_ROOM: CORE_TIME_MAP_MINUTE.GROUPING_AND_CREATING_ROOM * 60 * 1000, // 比赛已开启,但仍可进入虚拟房间准备 JUMP_TO_STARTED_ROOM: CORE_TIME_MAP_MINUTE.JUMP_TO_STARTED_ROOM * 60 * 1000, }; export function getCardCustom({ cardState, canBattle, isSolo, isVirtualRoom, isGroupingStage, canReadyInStartedGame, isVirtualReadyStage, curGoingBattleIndex, curShowingBattleIndex, battleList, primaryButtonDisabledToShowQRCode = false, isFromGpHor = false, }: Record<string, any>) { let iconCustom = { leftIconFont: '', leftIconText: '', rightIconFont: '', rightIconText: '', }; let buttonCustom: Record<string, any> = {}; const curShowingBattle = battleList[curShowingBattleIndex] || {}; if (cardState === CARD_STATUS_MAP.SATISFIED_AND_CAN_NOT_INVITE) { buttonCustom = getSatisfiedAndCannotInviteCardCustom({ rawBattleList: battleList, curShowingBattleIndex, }); } if (cardState === CARD_STATUS_MAP.SATISFIED_AND_CAN_INVITE) { buttonCustom = getSatisfiedAndCanInviteCardCustom({ rawBattleList: battleList, curShowingBattleIndex, }); } if (!isSolo) { if ([ CARD_STATUS_MAP.RESULT_WAITING, CARD_STATUS_MAP.RESULT_FAIL, CARD_STATUS_MAP.RESULT_WIN, CARD_STATUS_MAP.RESULT_SHOW_RANK, ].includes(cardState)) { iconCustom = { leftIconFont: '', leftIconText: '', rightIconFont: CARD_ICON_FONT_MAP.CHECK_OPPONENTS, rightIconText: CARD_ICON_TEXT_MAP.CHECK_OPPONENTS, }; // 竖版先不变 if (isFromGpHor) { buttonCustom = { mainButton: CARD_BUTTON_MAP.CHECK_DETAIL_DATA, mainButtonClass: CARD_BUTTON_CLASS.PRIMARY, buttonTips: '', }; } } else { iconCustom = { leftIconFont: CARD_ICON_FONT_MAP.CHECK_OPPONENTS, leftIconText: CARD_ICON_TEXT_MAP.CHECK_OPPONENTS, rightIconFont: CARD_ICON_FONT_MAP.CHECK_PLAYING_LIST, rightIconText: CARD_ICON_TEXT_MAP.CHECK_PLAYING_LIST, }; } } if (curShowingBattleIndex > curGoingBattleIndex) { buttonCustom = { mainButton: CARD_BUTTON_MAP.WAIT_START, mainButtonClass: CARD_BUTTON_CLASS.INVALID, buttonTips: '', }; if (isVirtualRoom) { buttonCustom.buttonTips = '开赛前15分钟进入备战房准备'; const { start_time: startTime } = curShowingBattle; if (startTime * 1000 - Date.now() < TIME_MAP.JUMP_TO_ROOM && startTime * 1000 - Date.now() > 0) { buttonCustom = { mainButton: CARD_BUTTON_MAP.GROUPING, mainButtonClass: primaryButtonDisabledToShowQRCode ? CARD_BUTTON_CLASS.INVALID : CARD_BUTTON_CLASS.PRIMARY, buttonTips: CARD_BUTTON_MAP.JUMP_TO_ROOM_TIP, }; } } } else if (curShowingBattleIndex < curGoingBattleIndex) { buttonCustom = { mainButton: CARD_BUTTON_MAP.BATTLED_ENDED, mainButtonClass: CARD_BUTTON_CLASS.INVALID, buttonTips: '', }; } else { if (cardState === CARD_STATUS_MAP.BATTLE_WILL_START || cardState === CARD_STATUS_MAP.GAME_WILL_START) { if (isVirtualRoom) { buttonCustom = { mainButton: CARD_BUTTON_MAP.WAIT_START, mainButtonClass: CARD_BUTTON_CLASS.INVALID, buttonTips: CARD_BUTTON_MAP.WAIT_VIRTUAL_START_TIP, }; if (isGroupingStage) { // 分组建房阶段 buttonCustom = { mainButton: CARD_BUTTON_MAP.GROUPING, mainButtonClass: primaryButtonDisabledToShowQRCode ? CARD_BUTTON_CLASS.INVALID : CARD_BUTTON_CLASS.PRIMARY, buttonTips: CARD_BUTTON_MAP.GROUPING_TIP, title: '比赛已开启', }; } else if (isVirtualReadyStage || canReadyInStartedGame) { // 可以提前进入备战房 buttonCustom = { mainButton: CARD_BUTTON_MAP.GROUPING, mainButtonClass: primaryButtonDisabledToShowQRCode ? CARD_BUTTON_CLASS.INVALID : CARD_BUTTON_CLASS.PRIMARY, buttonTips: CARD_BUTTON_MAP.JUMP_TO_ROOM_TIP, }; } } } if (cardState === CARD_STATUS_MAP.BATTLE_STARTED) { if (canBattle || isSolo) { const { enter_game_remain: enterGameRemain = 0, } = curShowingBattle; // 可以出战 buttonCustom = { mainButton: CARD_BUTTON_MAP.LAUNCH_GAME, mainButtonClass: primaryButtonDisabledToShowQRCode ? CARD_BUTTON_CLASS.INVALID : CARD_BUTTON_CLASS.PRIMARY, buttonTips: CARD_BUTTON_MAP.LAUNCH_GAME_TIP, mainButtonCountdown: enterGameRemain * 1000 + Date.now(), }; } else { // 不可以出战 buttonCustom = { mainButton: CARD_BUTTON_MAP.CAN_NOT_BATTLE, mainButtonClass: CARD_BUTTON_CLASS.INVALID, buttonTips: '', }; } } if ([ CARD_STATUS_MAP.BATTLE_PLAYING_JOINED, CARD_STATUS_MAP.BATTLE_PLAYING_NOT_JOINED, ].includes(cardState)) { if (isVirtualRoom) { buttonCustom = { mainButtonClass: CARD_BUTTON_CLASS.PRIMARY, mainButton: CARD_BUTTON_MAP.BATTLE_PLAYING, }; } } } const cardCustom = { ...JSON.parse(JSON.stringify(DEFAULT_CARD_CUSTOM)), [cardState]: { ...(DEFAULT_CARD_CUSTOM[cardState as keyof typeof DEFAULT_CARD_CUSTOM] || {}), ...iconCustom, ...buttonCustom, }, }; // console.log('cardCustom', cardCustom); return cardCustom; } function getCardState({ curJoinStatus, isAdvance, gameResult, gameStatus, battleList, curBattleStatus, isLastBattle, canEnterGame, mineInBattle, isGroupingStage, canReadyInStartedGame, isPlayingAndCanSignup, isPlayingAndNotSatisfied, isSatisfiedAndCanInvite, isSatisfiedAndCannotInvite, }: Record<string, any>) { if (isPlayingAndCanSignup) { return CARD_STATUS_MAP.PLAYING_AND_CAN_SIGN_UP; } if (isPlayingAndNotSatisfied) { return CARD_STATUS_MAP.PLAYING_AND_NOT_SATISFIED; } if (isSatisfiedAndCanInvite) { return CARD_STATUS_MAP.SATISFIED_AND_CAN_INVITE; } if (isSatisfiedAndCannotInvite) { return CARD_STATUS_MAP.SATISFIED_AND_CAN_NOT_INVITE; } const cardState = ''; if (curJoinStatus == 2) { return CARD_STATUS_MAP.NOT_SIGN_UP; } if (gameResult == 100) { return isAdvance ? CARD_STATUS_MAP.RESULT_WIN : CARD_STATUS_MAP.RESULT_SHOW_RANK; } if (gameResult == 200) { return isAdvance ? CARD_STATUS_MAP.RESULT_FAIL : CARD_STATUS_MAP.RESULT_SHOW_RANK; } if (gameStatus <= 10) { return CARD_STATUS_MAP.GAME_WILL_START; } if (battleList.length && curBattleStatus <= 10) { return CARD_STATUS_MAP.BATTLE_WILL_START; } if (curBattleStatus == 100) { return CARD_STATUS_MAP.BATTLE_WILL_START; } if (curBattleStatus == 200) { if (canEnterGame == 1) { return CARD_STATUS_MAP.BATTLE_STARTED; } // 虚拟房间类型,battleStatus 进入到200,Date.now() + 5分钟 < cutBattle.startTime // 为分组建房阶段,否则要么可进入游戏,要么本场未出战(仍可以跳到虚拟房间) if (isGroupingStage || canReadyInStartedGame) { return CARD_STATUS_MAP.BATTLE_WILL_START; } if (mineInBattle) { return CARD_STATUS_MAP.BATTLE_PLAYING_JOINED; } return CARD_STATUS_MAP.BATTLE_PLAYING_NOT_JOINED; } if (curBattleStatus == 300) { if (gameResult == 300 || (!gameResult && isLastBattle)) { return CARD_STATUS_MAP.RESULT_WAITING; } if (mineInBattle) { return CARD_STATUS_MAP.BATTLE_PLAYING_JOINED; } return CARD_STATUS_MAP.BATTLE_PLAYING_NOT_JOINED; } // 未开放报名 if (curJoinStatus == 7) { return CARD_STATUS_MAP.NOT_SIGN_UP; } return cardState; } function parseBattleList(battleList: Array<any>, curBattleSeq: number) { const newBattleList = battleList.map((item) => { const { start_time: startTime, battle_start_remain: remain = 0, battle_seq: seq, battle_id: battleId, } = item; let fixedTime = startTime * 1000; if (remain) { fixedTime = Date.now() + remain * 1000; } return { title: `第${NUMBER_CHI_MAP[seq as keyof typeof NUMBER_CHI_MAP]}场`, time: fixedTime, timeDesc: timeStampFormat(fixedTime, 'MM-dd hh:mm'), battleId, rawStartTime: startTime, }; }); const battleScoreList = battleList.map((item, index) => { const { battle_seq: seq = 1, battle_status: curBattleStatus = 0, score = 0, } = item; let realScore = score; if (!score) { if (curBattleSeq < index + 1) { realScore = '-'; } else if (curBattleSeq == index + 1) { if (curBattleStatus <= 100) { realScore = '-'; } else { realScore = '0'; } } } return { title: `第${NUMBER_CHI_MAP[seq as keyof typeof NUMBER_CHI_MAP]}场`, scoreOrRank: realScore, }; }); return { newBattleList, battleScoreList, }; } export function parseBattleInfo(...args: [ { info: Record<string, any>; curJoinStatus?: number; mineInBattle?: boolean; teamInfo?: Record<string, any>; isPlayingAndCanSignup?: boolean; isPlayingAndNotSatisfied?: boolean; isSatisfiedAndCanInvite?: boolean; isSatisfiedAndCannotInvite?: boolean; childInfo?: Record<string, any>; } ] | [ info: Record<string, any>, curJoinStatus?: number, mineInBattle?: boolean, teamInfo?: Record<string, any>, ]) { let info: Record<string, any>; let curJoinStatus = 0; let mineInBattle = true; let teamInfo: Record<string, any>; let isPlayingAndCanSignup = false; let isPlayingAndNotSatisfied = false; let isSatisfiedAndCanInvite = false; let isSatisfiedAndCannotInvite = false; let childInfo: Record<string, any> = []; if (args.length === 1 && args[0].info) { info = args[0].info; curJoinStatus = args[0].curJoinStatus ?? 0; mineInBattle = args[0].mineInBattle ?? true; teamInfo = args[0].teamInfo ?? {}; isPlayingAndCanSignup = args[0].isPlayingAndCanSignup; isPlayingAndNotSatisfied = args[0].isPlayingAndNotSatisfied; isSatisfiedAndCanInvite = args[0].isSatisfiedAndCanInvite; isSatisfiedAndCannotInvite = args[0].isSatisfiedAndCannotInvite; childInfo = args[0].childInfo ?? {}; } else { info = args[0]; curJoinStatus = args[1] ?? 0; mineInBattle = args[2] ?? true; teamInfo = args[3] ?? {}; } const defaultCurBattleSeq = getCurBattleSeqFromTime(childInfo?.match_rule_cfg?.pubg_rule_cfg?.round_time_cfg || []); const { battle_list: battleList = [], battle_user_list: battleUserList = [], cur_battle_seq: curBattleSeq = defaultCurBattleSeq, game_status: gameStatus, game_result: gameResult, game_rank: gameRank = '-', start_battle_type: startBattleType, game_start_remain: gameStartRemain = 0, join_type: joinType = 1, use_match: useMatch, is_advance: isAdvance = 0, } = info; const curBattleInfo = battleList[curBattleSeq - 1] || {}; // 对局状态 10未开始 100即将开始 200进行中 300已结束 const { battle_status: curBattleStatus = 0, can_enter_game: canEnterGame, can_battle: canBattle, start_time: curBattleStartTime, enter_game_remain: enterGameRemain = 0, } = curBattleInfo; const isLastBattle = curBattleSeq == battleList.length; const isSolo = joinType == 2; const isVirtualRoom = useMatch == 3; const isManualStart = startBattleType == 2; const matchStartedTime = Date.now() - curBattleStartTime * 1000; const isVirtualReadyStage = isVirtualRoom && curBattleStartTime * 1000 - Date.now() < TIME_MAP.JUMP_TO_ROOM && matchStartedTime < 0; const canReadyInStartedGame = isManualStart ? false : isVirtualRoom && matchStartedTime <= TIME_MAP.JUMP_TO_STARTED_ROOM && matchStartedTime > 0; const checkIsGroupingStage = () => { const baseCheck = isVirtualRoom && matchStartedTime > 0; if (isManualStart) { return baseCheck && matchStartedTime < TIME_MAP.GROUPING_AND_CREATING_ROOM; } return baseCheck && matchStartedTime > TIME_MAP.JUMP_TO_STARTED_ROOM && matchStartedTime < (TIME_MAP.GROUPING_AND_CREATING_ROOM + TIME_MAP.JUMP_TO_STARTED_ROOM); }; const isGroupingStage = checkIsGroupingStage(); const cardState = getCardState({ curJoinStatus, isAdvance, gameResult, gameStatus, battleList, curBattleStatus, isLastBattle, canEnterGame, mineInBattle, isGroupingStage, canReadyInStartedGame, isPlayingAndCanSignup, isPlayingAndNotSatisfied, isSatisfiedAndCanInvite, isSatisfiedAndCannotInvite, }); const { newBattleList, battleScoreList, } = parseBattleList(battleList, curBattleSeq); return { rawBattleList: battleList, battleList: newBattleList, curGoingBattleIndex: curBattleSeq - 1, curShowingBattleIndex: curBattleSeq - 1, isManualStart: startBattleType == 2, gameStartCountdown: gameStartRemain * 1000, cardState, battleScoreList, gameRank, joinRoomTime: enterGameRemain * 1000 + Date.now(), curBattleInfo, isVirtualRoom, isSolo, isGroupingStage, canReadyInStartedGame, isVirtualReadyStage, canBattle, memberList: (teamInfo?.members || battleUserList || []).map((item: Record<string, any>) => ({ avatar: item.head, name: item.nick, nick: item.nick, isLeader: item.teamrole == 1 || item.is_cap, })), minSignNum: childInfo?.match_rule_cfg?.sign_team_min_mem || info.sign_team_min_mem, }; } export function parseMemInfo(memInfo: Record<string, any> = {}) { const { game_info: gameInfo = {} } = memInfo; return { roleName: gameInfo.roleName || '', device: gameInfo.device == 2 ? '' : 'iOS', roleId: gameInfo.roleid, }; } export function parseChildInfo(info: Record<string, any> = {}) { if (!info.join_end) { return { signUpCountdown: 0, }; } const signUpCountdown = info.join_end - parseInt(`${Date.now() / 1000}`, 10); return { signUpCountdown: signUpCountdown * 1000, }; }