2024.10.01

장재영·2024년 10월 1일
0

변경 사항

  • 기존 fetch로 데이터를 받아왔는데 그럴필요가 없다는걸 알게됨.
import unlockInfo from '../assets/item_unlock.json' with { type: 'json' };
  • 파싱도 자동으로 작동

구현하고 싶은 것

  1. 기본 점수검증
  • 완료
  //검증
  const serverTime = Date.now(); //현재 타임스탬프
  const elapsedTime = (serverTime - currentStage.timestamp) / 1000;

  //서버와 클라이언트간의 통신이 지연(여기선 5)되거나 강제로 점수를 늘릴경우
  if(elapsedTime < 5){
    return { status: 'fail', message: 'Invalid elapsed time' };
  }

  //점수검증
  const maxboundary =
  stages.data[payload.targetStage - 1000].score - stages.data[payload.currentStage - 1000].score;

  //totalScore와 runScore, itemScore비교
  //강제로 totalScore를 늘릴경우를 생각해서 처리
  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.' };
  }

  // targetStage 대한 검정 <- 게임에셋에 존재하는 스테이지인가
  if (!stages.data.some((stages) => stages.id === payload.targetStage)) {
    return { status: 'fail', message: 'Target stage not found' };
  }
  1. 아이템 획득 시 서버에서 검증 작업
  • 각 구간별로 최고점수 아이템을 획득 할 경우 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에 저장
    - 게임 컨텐츠의 내용이 바뀌지 않는다면 어떠한 형태(자료구조)로든 데이터를 저장
profile
개발 하고 싶은 비버

0개의 댓글