#pragma once #include "KTypes.h" // 맵 파일 관련 #define NFMFILE_SIGN "nFlavor Map" const DWORD c_dwNFMCurrentVer = 22; const DWORD c_dwNFMSegmentVer = 0; #define NFM_SP_GRASS_FILE_SIGN "nFlavor SpeedGrass" const DWORD c_dwNFMSpeedGrassVer = 1; #define NFM_QUEST_FILE_SIGN "nFlavor QuestProp" const DWORD c_dwNFMQuestPropVer = 3; #define NFM_PVS_FILE_SIGN "RAPPELZ PVS" const DWORD c_dwNFM_PVS_Ver = 1; #define NFM_CAMERA_WORK_FILE_SIGN "nFlavor CameraWork" const DWORD c_dwNFMCameraWorkVer = 1; #pragma pack(push, 1) struct NFM_HEADER_V22 { char szSign[16]; DWORD dwVersion; DWORD dwMapPropertiesOffset; ///< 맵 속성 정보 시작 위치 DWORD dwTerrainSegmentOffset; ///< 지형 세그먼트 정보 시작 위치 DWORD dwPropOffset; ///< Prop 정보 시작 위치 DWORD dwVectorAttrOffset; ///< 벡터 속성 정보 시작 위치 DWORD dwWaterOffset; ///< 물 정보 시작 위치 DWORD dwGrassColonyOffset; ///< 풀 군락 정보 시작 위치 DWORD dwEventAreaOffset; ///< 풀 군락 정보 시작 위치 int nTileCountPerSegment; int nSegmentCountPerMap; float fTileLength; }; typedef NFM_HEADER_V22 NFM_LATESTHEADER; struct NFM_HEADER_V19 { char szSign[16]; DWORD dwVersion; DWORD dwMapPropertiesOffset; ///< 맵 속성 정보 시작 위치 DWORD dwTerrainSegmentOffset; ///< 지형 세그먼트 정보 시작 위치 DWORD dwPropOffset; ///< Prop 정보 시작 위치 DWORD dwVectorAttrOffset; ///< 벡터 속성 정보 시작 위치 DWORD dwWaterOffset; ///< 물 정보 시작 위치 DWORD dwGrassColonyOffset; ///< 풀 군락 정보 시작 위치 int nTileCountPerSegment; int nSegmentCountPerMap; float fTileLength; }; typedef NFM_HEADER_V19 NFM_HEADER_V18; typedef NFM_HEADER_V18 NFM_HEADER_V17; struct NFM_HEADER_V16 { char szSign[16]; DWORD dwVersion; DWORD dwMapPropertiesOffset; ///< 맵 속성 정보 시작 위치 DWORD dwTerrainSegmentOffset; ///< 지형 세그먼트 정보 시작 위치 DWORD dwPropOffset; ///< Prop 정보 시작 위치 DWORD dwVectorAttrOffset; ///< 벡터 속성 정보 시작 위치 DWORD dwWaterOffset; ///< 물 정보 시작 위치 int nTileCountPerSegment; int nSegmentCountPerMap; float fTileLength; }; //typedef NFM_HEADER_V16 NFM_LATESTHEADER; typedef NFM_HEADER_V16 NFM_HEADER_V15; struct NFM_HEADER_V14 { char szSign[16]; DWORD dwVersion; DWORD dwTerrainSegmentOffset; ///< 지형 세그먼트 정보 시작 위치 DWORD dwPropOffset; ///< Prop 정보 시작 위치 DWORD dwVectorAttrOffset; ///< 벡터 속성 정보 시작 위치 int nTileCountPerSegment; int nSegmentCountPerMap; float fTileLength; }; typedef NFM_HEADER_V14 NFM_HEADER_V13; typedef NFM_HEADER_V13 NFM_HEADER_V12; struct NFM_HEADER_V10 { char szSign[16]; DWORD dwVersion; DWORD dwTerrainSegmentOffset; ///< 지형 세그먼트 정보 시작 위치 DWORD dwPropOffset; ///< Prop 정보 시작 위치 int nTileCountPerSegment; int nSegmentCountPerMap; float fTileLength; }; typedef NFM_HEADER_V10 NFM_HEADER_V11; struct NFM_SEGMENTHEADER_V11 { DWORD dwVersion; WORD tile[3]; }; struct NFM_VERTEXSTRUCT_V11 { float fHeight; DWORD wFillBits[2]; ///< 제일 낮은 단계의 바닥 텍스처가 아닌경우에 유효하다. 4*4의 2bit 배열 unsigned __int64 wAttribute; KTripleColor Color; }; struct NFM_VERTEXSTRUCT_V10 { float fHeight; WORD wTile; WORD wAttribute; KTripleColor Color; }; struct NFM_VERTEXSTRUCT_V9 { float fHeight; WORD wTile; KTripleColor Color; }; struct NFM_VERTEXSTRUCT_V8 { float fHeight; WORD wTile; }; struct NFM_PROPSTRUCT_V15 { int nPropIndex; float x, y; float fZOffset; float fRotateX, fRotateY, fRotateZ; float fScaleX, fScaleY, fScaleZ; WORD wPropNum; bool bLockHeight; float fLockHeight; short nTextureGroupIndex; }; struct NFM_PROPSTRUCT_V14 { int nPropIndex; float x, y; float fZOffset; float fRotateX, fRotateY, fRotateZ; float fScaleX, fScaleY, fScaleZ; WORD wPropNum; bool bLockHeight; float fLockHeight; }; struct NFM_PROPSTRUCT_V13 { int nPropIndex; float x, y; float fZOffset; float fRotateX, fRotateY, fRotateZ; float fScale; WORD wPropNum; }; struct NFM_PROPSTRUCT_V10 { int nPropIndex; float x, y; float fRotation; WORD wPropNum; }; struct NFM_PROPSTRUCT_V8 { float x, y; float fRotation; WORD wPropNum; }; struct NFM_SPEED_GRASS_HEADER_V1 { char szSign[20]; DWORD dwVersion; }; struct NFM_SPEED_GRASS_V1 { float px,py; float nx,ny,nz; }; struct NFM_SPEED_GRASS_COLONY_INFO { int nPolygonID; float fDensity; float fDisTribution; float fSize; float fHeightP, fHeightM; KColor Color; float fColorRatio; float fColorTone; float fChroma; float fBrightness; float fCombinationRatio; float fWindReaction; }; struct NFM_QUEST_PROP_HEADER_V1 { char szSign[18]; DWORD dwVersion; int nPropCount; }; struct NFM_QUEST_PROPSTRUCT_V3 { int nQuestDBID; float x,y; float fZOffSet; float fRotateX, fRotateY, fRotateZ; float fScaleX, fScaleY, fScaleZ; WORD wPropNum; bool bLockHeight; float fLockHeight; short nTextureGroupIndex; }; struct NFM_QUEST_PROPSTRUCT_V2 { int nQuestDBID; float x,y; float fZOffSet; float fRotateX, fRotateY, fRotateZ; float fScaleX, fScaleY, fScaleZ; WORD wPropNum; bool bLockHeight; float fLockHeight; }; struct NFM_QUEST_PROPSTRUCT_V1 { int nQuestDBID; float x,y; float fZOffSet; float fRotateX, fRotateY, fRotateZ; float fScale; WORD wPropNum; }; /// PVS struct NFM_PVS_HEADER_V1 { char szSign[16]; unsigned short dwVersion; unsigned char nSegmentCountPerMap; unsigned char nMapStartPosX; unsigned char nMapStartPosY; unsigned short nSegmentCount; int nPropCount; unsigned char nSegmentLeft; unsigned char nSegmentTop; unsigned char nSegmentRight; unsigned char nSegmentBottom; }; /// 로컬로 저장됨 struct NFM_PVS_SEGMENT_V1 { unsigned char nSegmentX; ///< 0~63 unsigned char nSegmentY; ///< 0~63 unsigned short nIncludeSegmentCount; ///< 0~4096 }; /// 로컬로 저장됨 struct NFM_SEGMENT_DATA_V1 { unsigned char nSegmentX; ///< 0~63 unsigned char nSegmentY; ///< 0~63 }; /// 로컬로 저장됨 struct NFM_PVS_PROP_V1 { unsigned char nSegmentX; ///< 0~63 unsigned char nSegmentY; ///< 0~63 int nIncludePropCount; }; struct NFM_PROP_DATA_V1 { size_t nSegmentIdx; size_t nPropIdx; }; /// 카메라 연출 struct NFM_CAMERA_WORK_HEADER_V1 { char szSign[19]; DWORD dwVersion; unsigned short camerawork; }; struct NFM_CAMERA_WORK_STRUCT_V1 { float px,py,pz; float tx,ty,tz; float opx,opy; float otx,oty; DWORD m_dwSpeed; float m_fTargetRotation; float m_fCameraRotation; }; #pragma pack(pop) // Prop 관련 /** 상위 12비트는 map index, 하위 20비트는 prop index로 사용한다. 따라서 map index는 0 ~ 4095까지 가능하고, prop index는 0 ~ 1048575 까지 가능하다. ( 일단 충분히 큰 값이라 생각하고 현재 맵툴에서 따로 index의 한계를 제한해두지는 않았음. ) */ typedef DWORD TERRAINPROP_ID; inline TERRAINPROP_ID CreateTerrainPropID( int nMapIndex, int nPropIndex ) { return (TERRAINPROP_ID(nMapIndex) << 20) | (TERRAINPROP_ID(nPropIndex) & 0x000FFFFF); } inline int GetMapIndexOfTerrainPropID( TERRAINPROP_ID TerrainPropID ) { return int(TerrainPropID >> 20); } inline int GetPropIndexOfTerrainPropID( TERRAINPROP_ID TerrainPropID ) { return int(TerrainPropID & 0x000FFFFF); }