변경 사항
- 기존 fetch로 데이터를 받아왔는데 그럴필요가 없다는걸 알게됨.
import unlockInfo from '../assets/item_unlock.json' with { type: 'json' };
구현하고 싶은 것
- 기본 점수검증
const serverTime = Date.now();
const elapsedTime = (serverTime - currentStage.timestamp) / 1000;
if(elapsedTime < 5){
return { status: 'fail', message: 'Invalid elapsed time' };
}
const maxboundary =
stages.data[payload.targetStage - 1000].score - stages.data[payload.currentStage - 1000].score;
if (payload.totalScore - (payload.runScore + payload.itemScore) > Math.abs(5)) {
return { status: 'fail', message: 'The totalScore is the problem.' };
}
const nowRunScore = payload.runScore - currentStage.runScore;
if (nowRunScore > maxboundary + 5) {
return { status: 'fail', message: 'RunScore is too large.' };
}
if (!stages.data.some((stages) => stages.id === payload.targetStage)) {
return { status: 'fail', message: 'Target stage not found' };
}
- 아이템 획득 시 서버에서 검증 작업
- 각 구간별로 최고점수 아이템을 획득 할 경우 5초면 스테이지를 넘기게 점수를 조정
- 이후 아이템 검증 완료
export const getitem = (userId, payload) => {
const { items, itemUnlocks } = getGameAssets();
let currentStages = getStage(userId);
console.log(userId);
if (!currentStages.length) {
return { status: 'fail', message: 'no stages found for user(item)' };
}
currentStages.sort((a, b) => a.id - b.id);
const currentStage = currentStages[currentStages.length - 1];
const maxItemScore = items.data[stageIndex].score * 5;
if (payload.itemScore - currentStage.itemScore > maxItemScore) {
return { status: 'fail', message: 'The itemScore is too high. ' };
}
const stageIndex = payload.currentStage - 1000;
const itemIdIndex = payload.itemId;
if (itemIdIndex > itemUnlocks.data[stageIndex].item_id) {
return { status: 'fail', message: 'It is an item that should not exist.' };
}
console.log(`stage: ${stageIndex + 1}`);
console.log(`itemId: ${itemIdIndex}`);
return { status: 'success' };
};
발생한 문제 및 해결
- 정말 가끔 스테이지를 불러오지 못하는 오류가 발생
- 그런데 너무 가끔 발생해서 어디서 오류가 일어나는지 왜 일어나는지 찾기가 너무나 힘들고 튜터님께 찾아가기도 애매한 상황
- 일단
- 그 외 til로 적을 수는 없는 자잘한 오류가 다양하게 발생하여 해결
내일 목표
- 아이템 획득 정보를 서버가 저장하고 있기 위한 추가적인 작업필요(지금까지 한 작업을 약간 뒤엎을 필요가 있어 큰 시간소모 예상)
- Broadcast 기능 추가
이후 목표
- 가장 높은 점수 Record 관리
- 현재 가장 높은 점수는 localStorage에 저장하고 있는데 이것을 서버가 관리하는 것으로 수정
- 유저 정보 연결
- 만약 유저 ID를 클라이언트에서 알고 있다면 최초 접속 이후 uuid를 생성, 발급받고 그 다음 접속부터는 이전에 했던 게임 기록에 대해 연동
- Redis 연동, 게임 정보 저장
- 유저, 스테이지에 대한 정보를 redis에 저장
- 게임 컨텐츠의 내용이 바뀌지 않는다면 어떠한 형태(자료구조)로든 데이터를 저장