오늘의 목표
더보기
최종 프로젝트 진행 ( 상점 기능 )
⏱️ 오늘의 일정
최종 프로젝트 진행 ( 상점 기능 )
📜 최종 프로젝트 진행 ( 상점 기능 )
최종 프로젝트를 진행했다.
게임에 맞게 상점 기능을 구현했다.
export const fleaMarketCardCreate = async (level: number, roomId: number, cardCount: number): Promise<void> => {
const cards: CardType[] = [];
let fleaMarketCards = await getRedisData('fleaMarketCards');
if (!fleaMarketCards) {
fleaMarketCards = { [roomId]: [] };
} else if (!fleaMarketCards[roomId]) {
fleaMarketCards[roomId] = [];
}
for (let i = 0; i < cardCount; i++) {
const randomCardType = randomNumber(1, 23) as CardType;
cards.push(randomCardType);
}
fleaMarketCards[roomId][level] = cards;
await setRedisData('fleaMarketCards', fleaMarketCards);
}
게임을 시작 하면 위 함수를 호출한다.
level에 따라 카드를 생성해 redis에 roomId를 key값으로 해서 저장한다.
let redisFleaMarketCards = await getRedisData('fleaMarketCards');
if (!redisFleaMarketCards) {
console.error("fleaMarketOpen 레디스에 플리 마켓 카드 없음");
return;
}
const fleaMarketCards = redisFleaMarketCards[room.id];
if (!fleaMarketCards) {
console.error("fleaMarketOpen 방에 생성된 플리 마켓 카드 없음");
return;
}
sendPacket(socket, config.packetType.FLEA_MARKET_PICK_RESPONSE, {
fleaMarketCardTypes: fleaMarketCards
});
상점 오픈 요청이 서버로 오면 레디스에서 카드목록을 읽어와 클라에게 전달한다.
let redisFleaMarketCards = await getRedisData('fleaMarketCards');
if (!redisFleaMarketCards) {
console.error("fleaMarketItemSelect 레디스에 상점 카드가 없음")
return;
}
const cards = redisFleaMarketCards[room.id];
if (!cards || cards.length === 0 || cards.length < fleaMarketItemSelectPayload.pickIndex) {
console.error("fleaMarketItemSelect 레디스 상점 카드에 선택한 카드가 없음");
return;
}
const fleMarketPickCard = cards[fleaMarketItemSelectPayload.pickIndex];
if (!fleMarketPickCard) {
console.error("fleaMarketItemSelect PickCard empty");
return;
}
const newCard: Card = {
type: fleMarketPickCard,
count: 1
}
cardPickUser.character.handCards.push(newCard);
redisFleaMarketCards[room.id] = cards.filter((card: number) => card !== fleMarketPickCard);
await setRedisData('fleaMarketCards', redisFleaMarketCards);
sendPacket(socket, config.packetType.FLEA_MARKET_CARD_PICK_RESPONSE,
{
userId: cardPickUser.id,
handCards: cardPickUser.character.handCards
}
);
클라가 카드를 선택하면 레디스에 저장되어 있는 카드중에서 해당 카드를 가져와
카드를 생성하고 저장한 후, 클라에게 결과를 전달한다.
선택한 카드를 레디스에서 제거해서, 다른 유저들은 해당 카드를 선택하지 못하도록 한다.
지금은 똑같은 카드를 선택하게 되면 막아주는 부분이 없는데,
클라에서 추가로 카드의 타입을 전달해 검증하는 로직을 추가할 예정!
'내일배움캠프' 카테고리의 다른 글
[내일배움캠프][TIL] 최종 프로젝트 ( 채팅 서버 완성 ) (1) | 2024.12.04 |
---|---|
[내일배움캠프][TIL] 최종 프로젝트 진행 ( 채팅서버 구현 시작 ) (0) | 2024.11.26 |
[내일배움캠프][TIL] 최종 프로젝트 진행 ( 몬스터 사망 보상 ) (0) | 2024.11.21 |
[내일배움캠프][TIL] 최종프로젝트 진행 ( 기본틀 완성 ) (0) | 2024.11.20 |
[내일배움캠프][TIL] 최종프로젝트 진행 ( 기본틀 부분완성 ) (0) | 2024.11.18 |