#pragma once #include #include // 표준 헤더 크기: 2바이트 크기 + 2바이트 ID #pragma pack(push, 1) struct PacketHeader { uint16_t size; uint16_t id; }; #pragma pack(pop) // 처리를 쉽게 하기 위한 단순 패킷 래퍼 struct Packet { PacketHeader header; // Payload 데이터 (벡터 또는 문자열) std::vector payload; }; enum class PacketID : uint16_t { Ping = 1, // 로그인 요청 (PKT_CS_Login) CS_Login = 10, // 로그인 결과 응답 (PKT_SC_LoginResult) SC_LoginResult = 11, Chat = 20, // 검 키우기 관련 패킷 // 강화 요청 CS_UpgradeSword = 30, // 강화 결과 응답 SC_UpgradeResult = 31, // 판매 요청 CS_SellSword = 35, // 판매 결과 응답 SC_SellResult = 36, // 랭킹 조회 요청 CS_RankingRequest = 40, // 랭킹 리스트 응답 SC_RankingList = 41, }; // 게임 규칙 관련 상수 namespace GameConfig { const uint32_t MAX_SWORD_LEVEL = 20; const uint64_t INITIAL_GOLD = 10000; } // namespace GameConfig // 고정 크기 데이터 전송을 위한 구조체 정의 #pragma pack(push, 1) struct PKT_CS_Login { // 유저 닉네임 (최대 32자) char nickname[32]; }; struct PKT_SC_LoginResult { // 0: 이미 접속 중, 1: 성공 uint8_t result; }; struct PKT_SC_UpgradeResult { // 0: 파괴, 1: 성공, 2: 실패 uint8_t result; // 현재 강화 레벨 uint32_t currentLevel; // 현재 보유 골드 uint64_t currentGold; }; struct PKT_SC_SellResult { // 판매 후 획득 골드 uint64_t earnedGold; // 현재 총 골드 uint64_t totalGold; }; struct RankingEntry { // 유저 이름 (최대 32자) char username[32]; // 검 레벨 uint32_t swordLevel; }; struct PKT_SC_RankingList { // 랭킹 리스트 개수 uint32_t count; // 이후 RankingEntry[count] 만큼 데이터가 따라옴 }; #pragma pack(pop)