Files
2026-06-01 12:46:52 +02:00

167 lines
7.3 KiB
C++

#pragma once
#include <mmo/ArMove.h>
#include <geometry/X2DPolygon.h>
#include "GameContent.h"
#include "GameRule.h"
// 배틀 아레나 경기장 정보 보관용
enum _BATTLE_ARENA_TYPE
{
BAT_CLASSIC = 0,
BAT_BINGO = 1,
BAT_SLAUGHTER = 2,
};
// 아레나 유저 등급 구분
enum _BATTLE_GRADE
{
BG_INVALID = -1,
BG_ROOKIE = 0,
BG_GROW = 1,
BG_MAJOR = 2,
MAX_BATTLE_GRADE,
};
// 아레나 이탈 유형 코드(BattleArenaBase에서 사용하지 않고 BattleArenaManager나 패킷 방송 시 사용하지만 include 문제를 피하기 위해 여기에 둠)
enum _ARENA_LEAVE_TYPE
{
ALT_UNKNOWN = 0,
ALT_USER_REQUEST = 1, // 대기열/경기 이탈 두 경우 모두 사용됨
ALT_GAME_OVER = 2, // 경기 이탈 시에만 사용됨
ALT_PARTICIPATING_SPECIAL_PARTY = 3, // 대기열 이탈 시에만 사용됨
ALT_FAILED_TO_JOIN_BATTLE = 4, // 대기열 이탈 시에만 사용됨
ALT_FAILED_TO_START_BATTLE = 5, // 대기열 이탈 시에만 사용됨(경기 시작 실패)
ALT_DISCONNECT = 6, // 대기열/경기 이탈 두 경우 모두 사용됨(대기열에 있다가 접속 끊긴 경우, 경기 중에 오프라인 된 후에 제한 시간 경과로 이탈되는 경우)
ALT_ABSENT = 7, // 경기 중에 잠수 신고를 통해 경기에서 이탈된 경우
ALT_LEAVE_ARENA = 8, // 아레나에서 워프를 통해 다른 지역으로 이탈함으로 인해 경기에서 이탈된 경우(워프 자체가 근본적으로 차단되어야 함)
ALT_ENTER_INSTANCE_DUNGEON = 9, // 인스턴스 던전에 입장하기 위해 대기열에서 이탈되는 경우
ALT_ENTER_DEATHMATCH = 10, // 데스매치 존에 입장하기 위해 대기열에서 이탈되는 경우
ALT_ENTER_HUNTAHOLIC = 11, // 헌터홀릭 로비(?)에 입장하기 위해 대기열에서 이탈되는 경우
ALT_EXERCISE_PARTY_KICK = 12, // 연습 경기 파티 구성 중 추방에 의해 이탈되는 경우
};
// 아레나 경기 종료 타입
enum _ARENA_END_TYPE
{
AET_UNKNOWN = 0,
AET_ONE_TEAM_NO_MEMBER = 1, // 한 팀의 멤버가 모두 이탈하여 경기 종료(종료 유형이지만 보상이 없다는 내용도 포함)
AET_MAX_SCORE_REACHED = 2, // 목표 점수 도달로 경기 종료
AET_TIME_OVER = 3, // 시간 초과로 경기 종료
};
// 아레나 경기 보상 타입
enum _ARENA_REWARD_TYPE
{
ART_UNKNOWN = 0,
ART_FULL_REWARD = 1, // 값 없음(지정 안하면 이거)
ART_HALF_REWARD_BY_FEW_MEMBER = 2, // 한 팀의 멤버 수가 팀 최대 인원의 50% 미만이어서 보상이 절반으로 감소
ART_NO_REWARD_BY_NO_MEMBER = 3, // 한 팀의 멤버가 모두 이탈해서 경기가 중단되어 보상 없음
ART_NO_REWARD_BY_MIN_TIME = 4, // 최소 경기 시간 미달로 인해 보상 없음
ART_NO_REWARD_BY_EXERCISE = 5, // 연습 경기는 보상 없음
};
// 아레나 경기 내부의 프랍의 상태(슬래터 프랍 또는 빙고 프랍 9개)
enum _PROP_STATE
{
PS_NOT_EXIST = 0,
PS_NEUTRAL = 1,
PS_OWNED_BY_TEAM_0 = 2,
PS_OWNED_BY_TEAM_1 = 3,
};
struct BATTLE_ARENA_MONSTER_RESPAWN
{
int nID; // 몬스터 리스폰 정보 ID
X2D::Box< AR_UNIT > bxArea; // 리스폰 지역 사각형
int nMonsterID; // 몬스터 ID
int nCount; // 리스폰 마리 수
AR_TIME nPeriod; // 리스폰 간격(단위: 1/100 초)
bool bWandering; // 주변 방황 여부(false: 제자리 고정, true: 방황)
float fFace; // 리젠 후 몬스터가 바라볼 방향(스킬 이펙트 방향 지정을 위해 필요)
};
struct BATTLE_ARENA_FIELD_PROP_RESPAWN_INFO : public GameContent::FIELD_PROP_RESPAWN_INFO
{
BATTLE_ARENA_FIELD_PROP_RESPAWN_INFO( int _nPropId, AR_UNIT _x, AR_UNIT _y, float _fZOffset,
float _fRotateX, float _fRotateY, float _fRotateZ, float _fScaleX, float _fScaleY, float _fScaleZ, bool _bLockHeight, float _fLockHeight,
int _nPropIndexInArena )
: GameContent::FIELD_PROP_RESPAWN_INFO( _nPropId, _x, _y, 0, _fZOffset, _fRotateX, _fRotateY, _fRotateZ, _fScaleX, _fScaleY, _fScaleZ, _bLockHeight, _fLockHeight )
, nPropIndexInArena( _nPropIndexInArena )
{}
int nPropIndexInArena;
};
// 서버/클라 공용 BattleArenaBase
struct BattleArenaBase
{
int nID;
_BATTLE_ARENA_TYPE eType;
char nTeamCount;
char nMinMember; // 경기를 시작하기 위한 최소 인원
char nMaxMember; // 경기에 참여할 수 있는 최대 인원
int nObjectivePoint; // 경기 승리를 위해 먼저 도달해야할 목표 점수
AR_TIME nMinPlayDurationForReward; // 경기 종료 시 보상을 정상적으로 받기 위해 최소한으로 플레이해야 하는 시간
unsigned int nArenaRegionLeft;
unsigned int nArenaRegionTop;
unsigned int nArenaRegionRight;
unsigned int nArenaRegionBottom;
AR_TIME nCountdownDuration; // 경기 생성 시점부터 경기 시작 및 입장 제한 카운트다운 시간
AR_TIME nBattleDuration; // 경기 진행 시간
};
// 서버용 BattleArenaBase
struct BattleArenaBaseServer : public BattleArenaBase
{
inline bool IsExerciseGameArena() const { return nID == GameRule::BATTLE_ARENA_EXERCISE_GAME_ARENA_ID; }
int nQuickJoinLimitPoint; // 빠른 입장으로 경기 중간에 입장을 혀용하는 최대 점수(특정 팀의 점수가 이 수치보다 높으면 빠른 입장으로 입장 불가)
AR_TIME nQuickJoinLimitTime; // 빠른 입장으로 경기 중간에 입장을 혀용하는 최대 시간(시작 시점 + nQuickJoinLimitTime 이전까지만 빠른 입장 가능)
int nScorePerKill; // 경기 중 1킬당 획득 점수
int nAPPerKill; // 경기 중 1킬당 획득 AP(실시간 지급)
int nMaxAPByKill; // 경기 중 킬을 통해 얻을 수 있는 AP 상한
int nAPPerPropActivate; // 경기 중 프랍 활성화 1회당 획득 AP(실시간 지급)
int nMaxAPByPropActivate; // 경기 중 프랍 활성화를 통해 얻을 수 있는 AP 상한
int nRewardAPWin[ 3 /* BattleArenaManager::MAX_BATTLE_GRADE */ ]; // 승리 시 얻는 등급별 보상 AP
int nRewardAPDraw[ 3 /* BattleArenaManager::MAX_BATTLE_GRADE */ ]; // 무승부 시 얻는 등급별 보상 AP
int nRewardAPLose[ 3 /* BattleArenaManager::MAX_BATTLE_GRADE */ ]; // 패배 시 얻는 등급별 보상 AP
int nMinAPForMVP;
ArPosition posStart[ GameRule::BATTLE_ARENA_MAX_TEAM_COUNT ];
std::string strScriptOnCreate;
std::string strScriptOnEnter;
std::string strScriptOnStart;
std::string strScriptOnEnd;
std::string strScriptOnLeave;
std::string strScriptOnDestroy;
std::string strScriptOnKill;
// 경기 시작 시점부터 리젠될 몬스터 리젠 정보
std::vector< const BATTLE_ARENA_MONSTER_RESPAWN * > vMonsterRespawnList;
// 경기 시작 시점부터 리젠될 필드 프랍 리젠 정보(슬로터 프랍, 빙고 프랍 등)
std::vector< const BATTLE_ARENA_FIELD_PROP_RESPAWN_INFO * > vFieldPropRespawnList;
// 경기 생성 시점에 리젠되어 경기 시작 시점에 제거될 프랍(경기장 진입 제한용 프랍)
std::vector< const BATTLE_ARENA_FIELD_PROP_RESPAWN_INFO * > vArenaBlockerFieldPropRespawnList;
// 경기 시작 영역(경기 생성 시점부터 시작 전까지는 해당 영역을 벗어날 수 없음)
const X2D::Polygon< AR_UNIT > * apBeginAreaList[ GameRule::BATTLE_ARENA_MAX_TEAM_COUNT ];
};