Initial commit: ROW Client source code

Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

94
.gitignore vendored Normal file
View File

@@ -0,0 +1,94 @@
# Visual Studio build artifacts
*.obj
*.pdb
*.idb
*.ilk
*.exp
*.lib
*.dll
*.exe
*.pch
*.ipch
*.suo
*.user
*.sdf
*.opensdf
*.ncb
*.aps
*.sbr
*.bsc
*.tlb
*.tli
*.tlh
*.tmp
*.log
*.vspscc
*.vssscc
*.pidb
*.svclog
*.scc
# Build directories
[Dd]ebug/
[Dd]ebug_MY/
[Rr]elease/
[Rr]elease_NoGD/
[Rr]elease_MY/
x64/
x86/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
ipch/
*.VC.db
*.VC.VC.opendb
# Intermediate directories
Intermediate/
BuildLog.htm
# ReSharper
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio cache files
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio Code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# NuGet Packages
*.nupkg
**/packages/*
!**/packages/build/
*.nuget.props
*.nuget.targets
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Game-specific (keep documentation)
!claudedocs/

219
Client/CLAUDE.md Normal file
View File

@@ -0,0 +1,219 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is the NeoRylClient, a C++ MMORPG game client built with Visual Studio 2010 using DirectX for graphics rendering. The codebase follows a component-based architecture with clear separation between game logic, networking, UI, and rendering systems.
## Build System
### Building the Project
Use Visual Studio 2010 or later to build this project:
```bash
# Open the solution
devenv NeoRylClient.sln
# Build from command line (if MSBuild is available)
msbuild NeoRylClient.sln /p:Configuration=Debug /p:Platform=Win32
msbuild NeoRylClient.sln /p:Configuration=Release /p:Platform=Win32
```
### Build Configurations
- **Debug**: Standard debug build with full debugging symbols
- **Debug_MY**: Custom debug configuration (outputs to `D:\Navezine\ROWTest_MY\`)
- **Release**: Standard release build (outputs to `../../../Game/`)
- **Release_NoGD**: Release build without GameGuard (outputs to `../../Executable/Release_NoGD\`)
- **Release_MY**: Custom release configuration
### Project Dependencies
The solution builds in this order:
1. MemoryManager (custom memory management)
2. Caldron (core engine utilities)
3. CrossM (cross-platform compatibility layer)
4. Effect (visual effects system)
5. SoundLib (audio system)
6. Zalla3D Base Class (3D engine foundation)
7. Zalla3D Scene Class (3D scene management)
8. CharacterActionControl (character animation and control)
9. GlobalScript (game logic and network layer)
10. ScriptEngine (custom scripting language VM)
11. LUA (Lua scripting support)
12. NeoRylClient (main game client)
## Architecture
### Core Systems
**Network Layer** (`GlobalScript/Network/`):
- Client-server communication using custom networking framework
- `ClientNet::CClientEventHandler` base class for event handling
- `AuthHandler`: Handles authentication server communication
- `GameHandler`: Event-driven game server communication with command registration system
- `UDPHandler`: UDP-based communication for real-time updates
- Packet-based protocol with `PktBase` as the base packet structure
**Event Processing** (`RYLClient/EventHandler/GameProcess/`):
- Domain-specific event processors organized by game feature
- `GameProcess` namespace contains specialized processors:
- `LoginoutProcess`: Character login/logout handling
- `CharInfoProcess`: Character information updates
- `FightProcess`: Combat system events
- `ItemProcess`: Item management events
- `SkillProcess`: Skill system events
- `ChatProcess`: Chat and communication
- `QuestProcess`: Quest system
- `MoveProcess`: Character movement
- `CastleProcess`: Castle/siege warfare
- `BattleGroundClientProcess`: Battleground PvP events
- `BroadcastProcess`: Server broadcasts
- `CommunityProcess`: Guild and social features
**Scene Management** (`RYLClient/RYLClient/`):
- `CRYLSceneManager`: Central scene coordinator
- Scene hierarchy:
- `RYLIntroScene`: Game startup/intro
- `RYLLoginScene`: Login screen
- `RYLRaceSelectScene`: Race/class selection
- `RYLCharacterSelectScene`: Character selection
- `RYLGameScene`: Main gameplay scene
- `RYLLoadingScene`: Loading screens between scenes
**UI System** (`RYLClient/RYLUI/`):
- Custom UI framework built on GM (Game Management) base classes
- Component hierarchy: `GMUIObject` → specialized UI controls
- UI Controls: Button, CheckBox, ComboBox, ListBox, Label, Edit, TabButton, Dialog
- Custom extensions: `RYLButton`, `RYLDialog`, `RYLMessageBox`, `RYLImageManager`
- `RYLTextureManager`: Manages UI textures and sprites
- `RYLImageCabinet`: Centralized image resource management
**Character System** (`CharacterActionControl/`):
- `RYLCreatureManager`: Manages all entities (players, NPCs, monsters)
- `RYLCreature`: Base entity class with rendering and animation
- `RYLCharacterControl`: Player character control and input handling
- Specialized controls for different weapon types and combat modes
- `CameraControl`: Camera system with scripting support
**Script Engine** (`ScriptEngine/`):
- Custom scripting language VM with compiler toolchain
- Flex/Bison-based parser (`string.l`, `string.y`)
- Intermediate code generation and virtual machine execution
- Symbol table, syntax tree, and relocation table support
- Used for game logic scripting alongside Lua
**Game Data Management**:
- `CRYLGameData`: Central game state and data manager
- `CRYLNetworkData`: Network state management
- `CRYLCommunityData`: Social features data (guild, friends, etc.)
- `CCharStatus`: Character stats and attributes
- `CRYLCastleManager` / `CRYLCampManager`: Territory control systems
- `CRYLSkillScriptMgr`: Lua-based skill scripting
### Key Design Patterns
**Event-Driven Network Architecture**:
- Game server events use a registration system in `CGameEventHandler`
- Register handlers with `AddHandler(commandId, functionPointer, ignoreStatusMask)`
- Events dispatched through `OnDispatch()` to registered function pointers
- Each event function signature: `bool EventFunc(CClientEventHandler*, PktBase*)`
**Manager Pattern**:
- Multiple manager classes coordinate subsystems (Scene, Creature, Texture, Castle, Camp, Notice)
- Managers are owned by `CClientMain` and accessed globally
**Namespace Organization**:
- `ClientNet`: Network layer abstractions
- `GameProcess`: Game event processing logic
- `Skill`, `Item`: Domain-specific data structures
- `DbgUtils`: Debug utilities
- `GameClientLog`: Logging functionality
## Working with the Codebase
### Adding Network Event Handlers
Event handlers are registered in `GameHandler` during initialization:
```cpp
// In game initialization
pGameHandler->AddHandler(CMD_YOUR_EVENT, &YourEventFunction);
// Event function in appropriate GameProcess file
namespace GameProcess {
GAME_EVENT_FUNC(YourEventFunction) {
// Extract packet data
// Update game state
return true;
}
}
```
### UI Development
UI dialogs inherit from `RYLDialog` and use the component system:
```cpp
class CYourDialog : public CRYLDialog {
RYLButton* m_pButton;
RYLLabel* m_pLabel;
void InitControls();
void OnButtonClick();
};
```
UI resources are managed through `RYLTextureManager` and loaded from image files.
### Character/Entity Management
All visible entities go through `RYLCreatureManager`:
- Creates and destroys creature instances
- Updates position, animation, and rendering
- Handles entity lifecycle and cleanup
### Scene Transitions
Scene changes flow through `CRYLSceneManager`:
- Properly cleanup current scene before transition
- Initialize new scene resources
- Handle loading screens for resource-intensive transitions
## Code Conventions
- **Character Set**: MultiByte (not Unicode)
- **Naming**:
- Classes: Prefix with `C` (e.g., `CClientMain`, `CRYLGameData`)
- Managers: Suffix with `Manager` (e.g., `CRYLCreatureManager`)
- Event handlers: Suffix with `Handler` (e.g., `CGameEventHandler`)
- UI controls: Prefix with `RYL` or `GMUI` (e.g., `RYLButton`, `GMUIObject`)
- **Hungarian Notation**: Used extensively (m_ for members, p for pointers, dw for DWORD, etc.)
- **Headers**: Include guards use `#ifndef __FILENAME_H__` pattern
- **Namespaces**: Event processors in `GameProcess`, network in `ClientNet`
## Dependencies
**External Libraries**:
- DirectX SDK (graphics and sound)
- Winsock2 (networking)
- Lua (embedded in RYLClient/LUA/)
- EAX (3D audio - eax.dll, eax.lib, eaxguid.lib)
- DbgHelp (crash dumps - dbghelp.dll, DbgHelp.Lib)
**Engine Modules** (located in `../Engine/`):
- Caldron: Core utilities
- CrossM: Cross-platform layer
- Effect: Visual effects
- SoundLib: Audio engine
- Zalla3D: 3D rendering engine
## Special Notes
- The main client executable is named `NeoRylClient` but outputs to different directories depending on build configuration
- Lua scripting is integrated through the LUA project (dependency of NeoRylClient)
- The custom script engine uses Flex/Bison; if modifying grammar, run `Parse.bat` in ScriptEngine directory
- Character encoding in source files may contain Korean comments (MultiByte character set)
- Anti-cheat integration through GameGuard (referenced in headers and build configs)

View File

@@ -0,0 +1,979 @@
#include "CCameraScript.h"
#include "SceneManager.h"
#include "GMMemory.h"
extern D3DXVECTOR3 g_vecCube[8];
extern WORD g_vecCubeIndex[36];
CCameraScript::CCameraScript() {
m_pDevice = CSceneManager::GetDevice();
m_pDevice->GetTransform(D3DTS_VIEW, &m_matBeforeView);
InitCameraScript();
m_iFixCount = 0;
m_bBackWord = false;
m_bInitSet = false;
}
CCameraScript::~CCameraScript() {
m_lstEvent.clear();
m_lstPosSpline.clear();
m_lstLookSpline.clear();
m_pDevice->SetTransform(D3DTS_VIEW, &m_matBeforeView);
}
void CCameraScript::ReWindFix() {
if(m_iFixCount > 0)
m_iFixCount--;
else
m_iFixCount = (m_iEventNum - 1);
}
void CCameraScript::Rewind() {
if(m_iBeforeEvent > 0)
m_iBeforeEvent--;
else
m_iBeforeEvent = (m_iEventNum - 1);
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
void CCameraScript::FoWindFix() {
if(m_iFixCount < (m_iEventNum - 1))
m_iFixCount++;
else
m_iFixCount = 0;
}
void CCameraScript::Fowind() {
if(m_iBeforeEvent < (m_iEventNum-1))
m_iBeforeEvent++;
else
m_iBeforeEvent = 0;
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
void CCameraScript::Jump(int iEvent) {
if((iEvent >= 0) && (iEvent < m_iEventNum)) {
m_iBeforeEvent = iEvent;
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
}
void CCameraScript::InitFrame() {
// m_bStart = false;
m_dwBeforeTick = 0;
m_fRunFrame = 0.0f;
m_iBeforeEvent = 0;
}
void CCameraScript::SetVecTakePos()
{
D3DXVECTOR3 vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
D3DXVECTOR3 vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
D3DXVECTOR3 vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
m_CurrentEvent.m_vecCameraPos = vecInterPos;
m_CurrentEvent.m_vecCameraLook = vecInterLook;
m_CurrentEvent.m_vecCameraUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
}
void CCameraScript::PlayScript(int iRoll,int iLoop,bool bFix) {
int i;
if(m_bStart == false)
return;
m_dwCurrentTick = timeGetTime();
float fSkipFrame = 0.0f;
if(m_dwBeforeTick == 0) { // 첫 시작 프레임
fSkipFrame = 0;
m_matBeforePos = *(CSceneManager::m_ViewCamera->GetMatPosition());
m_matBeforeView2 = CSceneManager::m_ViewCamera->m_matView;
}
else {
fSkipFrame = ((int)m_dwCurrentTick - (int)m_dwBeforeTick) / (float)CAMERAFRAMESTEP;
}
if(iRoll == 0) { // Play
if(m_fRunFrame < m_lstEvent[m_iBeforeEvent].m_fFrame )
{
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
}
i = m_iBeforeEvent + 1;
for( i; i < m_iEventNum; i++ ) {
if(m_fRunFrame >= m_lstEvent[i].m_fFrame) {
m_iBeforeEvent = i;
}
}
if((m_iEventNum - 1) == m_iBeforeEvent) { // Looping 처리
if(iLoop == 1) {
m_iBeforeEvent = 0;
m_dwBeforeTick = 0;
m_fRunFrame = 0.0f;
}
else { // Looping X
m_iBeforeEvent = m_iEventNum - 1;
m_fRunFrame = m_lstEvent[m_iBeforeEvent].m_fFrame;
m_bStart = false;
InitFrame();
if(bFix)
{
CSceneManager::m_ViewCamera->SetMatView(m_matBeforeView2);
CSceneManager::m_ViewCamera->SetMatPosition(m_matBeforePos);
CSceneManager::m_ViewCamera->MoveFrustum();
CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_matBeforePos._41,m_matBeforePos._42,m_matBeforePos._43));
}
}
}
float fInterpol;
if(m_iBeforeEvent == (m_iEventNum - 1))
fInterpol = 1.0f;
else {
fInterpol = (float)(m_fRunFrame - m_lstEvent[m_iBeforeEvent].m_fFrame) / (m_lstEvent[m_iBeforeEvent + 1].m_fFrame - m_lstEvent[m_iBeforeEvent].m_fFrame);
}
m_CurrentEvent.m_fFrame = m_fRunFrame;
// Interpolation에 따른 보간
D3DXVECTOR3 vecInterpol;
D3DXVECTOR3 vecInterPos;
D3DXVECTOR3 vecInterLook;
D3DXVECTOR3 vecInterUp;
switch(m_lstEvent[m_iBeforeEvent].m_iInterpolation) {
case C_LINE:
if(fInterpol < 0.000001f) {
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
}
else {
int PosStart = m_lstEvent[m_iBeforeEvent].m_iPosStart;
int iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iPosEnd - m_lstEvent[m_iBeforeEvent].m_iPosStart;
iInterpolNum *= fInterpol;
vecInterPos = m_lstPosSpline[ PosStart + iInterpolNum];
PosStart = m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iLookEnd - m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum *= fInterpol;
vecInterLook = m_lstLookSpline[ PosStart + iInterpolNum];
/* vecInterpol = m_lstEvent[m_iBeforeEvent + 1].m_vecCameraPos - m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos + (vecInterpol * fInterpol);
vecInterpol = m_lstEvent[m_iBeforeEvent + 1].m_vecCameraLook - m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook + (vecInterpol * fInterpol);
*/
vecInterpol = m_lstEvent[m_iBeforeEvent + 1].m_vecCameraUp - m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp + (vecInterpol * fInterpol);
}
break;
case C_BEZIER1: // 제어점 3
if(fInterpol < 0.000001f) {
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
}
else {
int PosStart = m_lstEvent[m_iBeforeEvent].m_iPosStart;
int iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iPosEnd - m_lstEvent[m_iBeforeEvent].m_iPosStart;
iInterpolNum *= fInterpol;
vecInterPos = m_lstPosSpline[ PosStart + iInterpolNum];
PosStart = m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum = m_lstEvent[m_iBeforeEvent].m_iLookEnd - m_lstEvent[m_iBeforeEvent].m_iLookStart;
iInterpolNum *= fInterpol;
vecInterLook = m_lstLookSpline[ PosStart + iInterpolNum];
float fInterpol2 = fInterpol * fInterpol;
/* vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos * ((1.0f - fInterpol) * (1.0f - fInterpol))
+ (m_lstEvent[m_iBeforeEvent].m_vecControlPoint[0] * 2 * (1.0f - fInterpol) * fInterpol ) + (m_lstEvent[m_iBeforeEvent + 1].m_vecCameraPos * fInterpol2);
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook * ((1.0f - fInterpol) * (1.0f - fInterpol))
+ (m_lstEvent[m_iBeforeEvent].m_vecControlPoint[0] * 2 * (1.0f - fInterpol) * fInterpol ) + (m_lstEvent[m_iBeforeEvent + 1].m_vecCameraLook * fInterpol2);*/
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp * ((1.0f - fInterpol) * (1.0f - fInterpol))
+ (m_lstEvent[m_iBeforeEvent].m_vecControlPoint[0] * 2 * (1.0f - fInterpol) * fInterpol ) + (m_lstEvent[m_iBeforeEvent + 1].m_vecCameraUp * fInterpol2);
}
break;
/*case C_BEZIER2: // 제어점 4
if(fInterpol < 0.000001f) {
vecInterPos = m_lstEvent[m_iBeforeEvent].m_vecCameraPos;
vecInterLook = m_lstEvent[m_iBeforeEvent].m_vecCameraLook;
vecInterUp = m_lstEvent[m_iBeforeEvent].m_vecCameraUp;
}
else {
}
break;*/
default:
break;
};
m_CurrentEvent.m_vecCameraPos = vecInterPos;
m_CurrentEvent.m_vecCameraLook = vecInterLook;
m_CurrentEvent.m_vecCameraUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
}
D3DXMatrixLookAtLH(&m_matCurrentFrame,
&(m_CurrentEvent.m_vecCameraPos),&(m_CurrentEvent.m_vecCameraLook),&(m_CurrentEvent.m_vecCameraUp));
//m_fRunFrame += m_dwBeforeTick = m_dwCurrentTick = timeGetTime();
m_fRunFrame += fSkipFrame;
m_dwBeforeTick = m_dwCurrentTick = timeGetTime();
}
bool CCameraScript::SaveScript(char *strFileName) {
if((strFileName != NULL) && strlen(strFileName) > 1) {
FILE *fp = fopen(strFileName,"wb");
if(fp != NULL) {
float fVersion = CAMERASCRIPTVERSION;
fwrite((float *)&fVersion,sizeof(float),1,fp);
fwrite((int *)&m_iEventNum,sizeof(int),1,fp);
fwrite((CCameraEvent *)&(m_lstEvent[0]),sizeof(CCameraEvent),m_iEventNum,fp);
fclose(fp);
}
else {
return false;
}
}
return true;
}
bool CCameraScript::LoadScript(char *strFileName) {
//InitCameraScript();
if((strFileName != NULL) && strlen(strFileName) > 1) {
float fVersion = 0.0f;
char strPath[256] = {0};
strcpy(strPath,EFFECTSCRIPTPATH);
strcat(strPath,strFileName);
FILE *fp = fopen(strPath,"rb");
if(fp != NULL) {
fread((float *)&fVersion,sizeof(float),1,fp);
if((fVersion >= 0.9f) && (fVersion <= 1.1f)) {
int i;
fread((int *)&m_iEventNum,sizeof(int),1,fp);
for( i = 0; i < m_iEventNum; i++ ) {
CCameraEvent EmptyNode;
m_lstEvent.push_back(EmptyNode);
}
fread((CCameraEvent *)&(m_lstEvent[0]),sizeof(CCameraEvent),m_iEventNum,fp);
}
fclose(fp);
m_iInsertLook = 1;
CreateSpline();
}
else {
return false;
}
}
return true;
}
void CCameraScript::InitCameraScript(bool bInitPos,D3DXVECTOR3 vecInitPos,D3DXVECTOR3 vecInitLook) {
m_lstEvent.clear();
m_iEventNum = 0;
m_iBeforeEvent = 0;
m_fRunFrame = 0.0f;
m_dwBeforeTick = 0;
m_bStart = false;
m_lstPosSpline.clear();
m_bCreateSpline = false;
m_lstLookSpline.clear();
m_bCreateLookSpline = false;
m_iInsertLook = 0;
m_iFixCount = 0;
m_bBackWord = false;
m_vecCameraInitPos = vecInitPos;
m_vecCameraInitLook = vecInitLook;
m_bInitSet = bInitPos;
}
int CCameraScript::GetFixCount(int &iIndex,float &fFrame) {
iIndex = m_lstEvent[m_iFixCount].m_iIndex;
fFrame = m_lstEvent[m_iFixCount].m_fFrame;
return m_iFixCount;
}
void CCameraScript::FixLook(int iEvent,D3DXVECTOR3 vecLook) {
m_lstEvent[iEvent].m_vecCameraLook = vecLook;
}
void CCameraScript::InsertLookPos(D3DXVECTOR3 vecLook) {
if(m_iInsertLook >= (int)m_lstEvent.size()) {
MessageBox(NULL,"Look Pos 초과 ","error",MB_OK);
return;
}
m_lstEvent[m_iInsertLook].m_vecCameraLook = vecLook;
m_iInsertLook++;
char tmp[256]= {0};
int iNum = m_iInsertLook - m_lstEvent.size();
/* sprintf(tmp,"%d 개의 Target Point 를 더 찍을수 있습니다.",iNum);
MessageBox(NULL,tmp,"msg",MB_OK);
*/
}
int CCameraScript::InsertEvent( D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp,float fFrame,int iInterpol ) {
CCameraEvent Node;
Node.m_iIndex = m_iEventNum;
Node.m_iInterpolation = iInterpol;
Node.m_vecCameraPos = vecPos;
Node.m_vecCameraLook = vecLook;
Node.m_vecCameraUp = vecUp;
Node.m_fFrame = fFrame;
m_lstEvent.push_back(Node);
return m_iEventNum++;
}
void CCameraScript::FixEvent( int iEvent,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp,float fFrame,int iInterpol ) {
if((iEvent< 0) || (iEvent >= m_iEventNum) )
return;
m_lstEvent[iEvent].m_vecCameraPos = vecPos;
m_lstEvent[iEvent].m_vecCameraLook = vecLook;
m_lstEvent[iEvent].m_vecCameraUp = vecUp;
m_lstEvent[iEvent].m_fFrame = fFrame;
m_lstEvent[iEvent].m_iInterpolation = iInterpol;
}
void CCameraScript::DeleteEvent(float fFrame,int iInterpol) {
if(m_iEventNum <= 0)
return;
int i;
for( i = 0 ; i < m_iEventNum; i++ )
{
if(((m_lstEvent[i].m_fFrame - fFrame) + (float)(m_lstEvent[i].m_iInterpolation - iInterpol)) <= 0.001f) {
m_lstEvent.erase(m_lstEvent.begin() + i);
m_iEventNum--;
return;
}
}
}
void CCameraScript::DeleteEvent(int iIndex) {
if((iIndex <= 0) || (iIndex >= m_iEventNum))
return;
int i;
for( i = 0 ; i < m_iEventNum; i++ )
{
if(i == iIndex) {
m_lstEvent.erase(m_lstEvent.begin() + i);
m_iEventNum--;
InitFrame();
m_iFixCount = 0;
if(m_iInsertLook >= m_iEventNum)
m_iInsertLook = (m_iEventNum - 1);
m_bCreateLookSpline = false;
m_bCreateSpline = false;
m_bStart = false;
return;
}
}
}
/*
void CCameraScript::SetPlay(bool bFlag) {
m_bStart = bFlag;
InitFrame();
if(bFlag == false) {
CSceneManager::m_ViewCamera->SetMatView(m_matBeforeView2);
CSceneManager::m_ViewCamera->SetMatPosition(m_matBeforePos);
CSceneManager::m_ViewCamera->MoveFrustum();
CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_matBeforePos._41,m_matBeforePos._42,m_matBeforePos._43));
}
}*/
void CCameraScript::RenderPos_Up() {
int i;
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
for( i = 0; i < m_iEventNum; i++ ) {
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
identity._41 = m_lstEvent[i].m_vecCameraPos.x + m_lstEvent[i].m_vecCameraUp.x * 50.0f;
identity._42 = m_lstEvent[i].m_vecCameraPos.y + m_lstEvent[i].m_vecCameraUp.y * 50.0f;
identity._43 = m_lstEvent[i].m_vecCameraPos.z + m_lstEvent[i].m_vecCameraUp.z * 50.0f;
identity._11 = 1.0f;
identity._22 = 1.0f;
identity._33 = 1.0f;
if(i == m_iFixCount) {
identity._11 = 9.0f;
identity._22 = 9.0f;
identity._33 = 9.0f;
}
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
if((i != 0) && ( i != (m_iEventNum -1)))
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffff4444);
else
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
if(i == m_iFixCount) {
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
}
m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
identity._41 = m_lstEvent[i].m_vecCameraPos.x;
identity._42 = m_lstEvent[i].m_vecCameraPos.y;
identity._43 = m_lstEvent[i].m_vecCameraPos.z;
identity._11 = 1.0f;
identity._22 = 1.0f;
identity._33 = 1.0f;
if(i == m_iFixCount) {
identity._11 = 9.0f;
identity._22 = 9.0f;
identity._33 = 9.0f;
}
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
if((i != 0) && ( i != (m_iEventNum -1)))
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffff0000);
else
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
if(i == m_iFixCount) {
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
}
m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
m_pDevice->SetRenderState(D3DRS_FOGENABLE,FALSE);
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
}
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderLook() {
int i;
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
for( i = 0; i < m_iEventNum; i++ ) {
D3DXMatrixIdentity(&identity);
identity._41 = m_lstEvent[i].m_vecCameraLook.x;
identity._42 = m_lstEvent[i].m_vecCameraLook.y;
identity._43 = m_lstEvent[i].m_vecCameraLook.z;
identity._11 = 10.0f;
identity._22 = 10.0f;
identity._33 = 10.0f;
if(i == m_iFixCount) {
identity._11 = 15.0f;
identity._22 = 15.0f;
identity._33 = 15.0f;
}
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
if((i != 0) && ( i != (m_iEventNum -1)))
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffffff00);
else
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffffffff);
if(i == m_iFixCount) {
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xff0000ff);
}
m_pDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,
0,8,12,g_vecCubeIndex,D3DFMT_INDEX16,g_vecCube,sizeof(D3DXVECTOR3));
m_pDevice->SetRenderState(D3DRS_FOGENABLE,FALSE);
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
}
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderLookSpline() {
if((m_lstLookSpline.size() <= 0) || (m_bCreateLookSpline == false))
return;
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
int iSplineNum = m_lstLookSpline.size();
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xffffff00);
m_pDevice->DrawPrimitiveUP(D3DPT_LINESTRIP,(iSplineNum - 1),&(m_lstLookSpline[0]),sizeof(D3DXVECTOR3));
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderPosSpline() {
if((m_lstPosSpline.size() <= 0) || (m_bCreateSpline == false))
return;
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
int iSplineNum = m_lstPosSpline.size();
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xff00ffff);
m_pDevice->DrawPrimitiveUP(D3DPT_LINESTRIP,(iSplineNum - 1),&(m_lstPosSpline[0]),sizeof(D3DXVECTOR3));
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::RenderLine() {
int i;
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );
m_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pDevice->SetVertexShader(D3DFVF_XYZ);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
D3DXMATRIX identity;
D3DXMATRIX worldTm;
m_pDevice->GetTransform(D3DTS_WORLD,&worldTm);
for( i = 0; i < m_iEventNum; i++ ) {
D3DXVECTOR3 vecUp = D3DXVECTOR3(m_lstEvent[i].m_vecCameraPos.x + m_lstEvent[i].m_vecCameraUp.x * 50.0f,
m_lstEvent[i].m_vecCameraPos.y + m_lstEvent[i].m_vecCameraUp.y * 50.0f,
m_lstEvent[i].m_vecCameraPos.z + m_lstEvent[i].m_vecCameraUp.z * 50.0f);
D3DXVECTOR3 vecPos = D3DXVECTOR3(m_lstEvent[i].m_vecCameraPos.x,
m_lstEvent[i].m_vecCameraPos.y,
m_lstEvent[i].m_vecCameraPos.z);
D3DXVECTOR3 vecLook = D3DXVECTOR3(m_lstEvent[i].m_vecCameraLook.x,
m_lstEvent[i].m_vecCameraLook.y,
m_lstEvent[i].m_vecCameraLook.z);
D3DXVECTOR3 vecLinePos[2];
vecLinePos[0] = vecUp;
vecLinePos[1] = vecPos;
/* vecLinePos[2] = vecPos;
vecLinePos[3] = vecLook;
*/
D3DXMatrixIdentity(&identity);
m_pDevice->SetTransform(D3DTS_WORLD,&identity);
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR,0xff000000);
m_pDevice->DrawPrimitiveUP(D3DPT_LINELIST,1,vecLinePos,sizeof(D3DXVECTOR3));
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
}
m_pDevice->SetTransform(D3DTS_WORLD,&worldTm);
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
}
void CCameraScript::CreateSpline() {
m_lstPosSpline.clear();
m_lstLookSpline.clear();
float fU,fU2,fU3;
float i,j;
for( i = 0; i < (m_iEventNum); i++ ) {
m_lstEvent[i].m_iPosStart = m_lstPosSpline.size();
for(j = 0;j < CAMERASPLINEUNIT;j++) {
fU = (float)j / (float)CAMERASPLINEUNIT;
fU2 = fU * fU;
fU3 = fU2 * fU;
D3DXVECTOR3 vecNode;
vecNode.x = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraPos.x +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraPos.x +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraPos.x +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraPos.x) / 6.0f;
vecNode.y = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraPos.y +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraPos.y +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraPos.y +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraPos.y) / 6.0f;
vecNode.z = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraPos.z +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraPos.z +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraPos.z +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraPos.z) / 6.0f;
m_lstPosSpline.push_back(vecNode);
}
m_lstEvent[i].m_iPosEnd = m_lstPosSpline.size();
}
m_bCreateSpline = true;
if(m_iInsertLook <= 0)
{
m_bCreateLookSpline = false;
return;
}
else {
for( i = 0; i < (m_iEventNum); i++ ) {
m_lstEvent[i].m_iLookStart = m_lstLookSpline.size();
for(j = 0;j < CAMERASPLINEUNIT;j++) {
fU = (float)j / (float)CAMERASPLINEUNIT;
fU2 = fU * fU;
fU3 = fU2 * fU;
D3DXVECTOR3 vecNode;
vecNode.x = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraLook.x +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraLook.x +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraLook.x +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraLook.x) / 6.0f;
vecNode.y = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraLook.y +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraLook.y +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraLook.y +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraLook.y) / 6.0f;
vecNode.z = ( (-1 * fU3 + 3 * fU2 - 3*fU + 1) *
m_lstEvent[(i == 0) ? 0 : (i - 1)].m_vecCameraLook.z +
(3* fU3 - 6 * fU2 + 0 * fU + 4) *
m_lstEvent[i + 0].m_vecCameraLook.z +
(-3* fU3 + 3 * fU2 + 3 * fU + 1) *
m_lstEvent[(i <= (m_iEventNum - 2)) ? i + 1 : i].m_vecCameraLook.z +
(1* fU3 + 0 * fU2 + 0 * fU + 0) *
m_lstEvent[(i <= (m_iEventNum - 3)) ? i + 2 : i].m_vecCameraLook.z) / 6.0f;
m_lstLookSpline.push_back(vecNode);
}
m_lstEvent[i].m_iLookEnd = m_lstLookSpline.size();
}
}
m_bCreateLookSpline = true;
}
void CCameraScript::BackWordEvent() // Event를 되돌린다.
{
int iCurrent;
int iBackCurrent;
m_bBackWord = !m_bBackWord;
D3DXVECTOR3 vecTmpSwap;
for(int i = 0; i < floorf((float)m_iEventNum / 2.0f); i++ )
{
iCurrent = i;
iBackCurrent = (m_iEventNum - 1) - i;
if(iCurrent != iBackCurrent)
{
vecTmpSwap = m_lstEvent[iCurrent].m_vecCameraLook;
m_lstEvent[iCurrent].m_vecCameraLook = m_lstEvent[iBackCurrent].m_vecCameraLook;
m_lstEvent[iBackCurrent].m_vecCameraLook = vecTmpSwap;
vecTmpSwap = m_lstEvent[iCurrent].m_vecCameraPos;
m_lstEvent[iCurrent].m_vecCameraPos = m_lstEvent[iBackCurrent].m_vecCameraPos;
m_lstEvent[iBackCurrent].m_vecCameraPos = vecTmpSwap;
vecTmpSwap = m_lstEvent[iCurrent].m_vecCameraUp;
m_lstEvent[iCurrent].m_vecCameraUp = m_lstEvent[iBackCurrent].m_vecCameraUp;
m_lstEvent[iBackCurrent].m_vecCameraUp = vecTmpSwap;
}
}
if(m_bInitSet)
{
D3DXVECTOR3 vecUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
FixEvent(m_iEventNum -1,m_vecCameraInitPos,m_vecCameraInitLook,vecUp);
InsertEvent(m_vecCameraInitPos,m_vecCameraInitLook,vecUp,m_lstEvent[m_iEventNum -1].m_fFrame + 25.0f,0);
//FixEvent(m_iEventNum -2,m_vecCameraInitPos,m_vecCameraInitLook,vecUp);
}
}
void CCameraScript::FixEvent(int iEvent,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp)
{
if((iEvent< 0) || (iEvent >= m_iEventNum) )
return;
m_lstEvent[iEvent].m_vecCameraPos = vecPos;
m_lstEvent[iEvent].m_vecCameraLook = vecLook;
m_lstEvent[iEvent].m_vecCameraUp = vecUp;
}
void CCameraScript::SetPlay(bool bFlag,bool bBack,bool bStartPos) {
m_bStart = bFlag;
if(bBack && bFlag)
{
if(!m_bBackWord)
{
BackWordEvent();
m_iInsertLook = 1;
CreateSpline();
}
}
else if(bFlag)
{
if(m_bBackWord)
{
BackWordEvent();
m_iInsertLook = 1;
CreateSpline();
}
}
if(bStartPos && bFlag && !bBack) // Start pos 부터 보간 시작(0 프레임 이벤트 수정)
{
matrix *matPos= CSceneManager::GetCamera()->GetMatPosition();
vector3 vecCameraToward = CSceneManager::GetCamera()->GetViewTowardVector();
//vector3 vecCameraUp = CSceneManager::GetCamera()->GetViewUpVector();
D3DXVECTOR3 vecCameraSPos = D3DXVECTOR3(matPos->_41,matPos->_42,matPos->_43);
D3DXVECTOR3 vecCameraSLook = D3DXVECTOR3(vecCameraSPos.x + vecCameraToward.x * 50.0f,vecCameraSPos.y + vecCameraToward.y* 50.0f,vecCameraSPos.z + vecCameraToward.z* 50.0f);
//D3DXVECTOR3 vecCameraSUp = D3DXVECTOR3(vecCameraUp.x,vecCameraUp.y,vecCameraUp.z);
D3DXVECTOR3 vecCameraSUp = D3DXVECTOR3(0.0f,1.0f,0.0f);
FixEvent(0,vecCameraSPos,vecCameraSLook,vecCameraSUp);
m_iInsertLook = 1;
CreateSpline();
}
InitFrame();
if(bFlag == false) {
CSceneManager::m_ViewCamera->SetMatView(m_matBeforeView2);
CSceneManager::m_ViewCamera->SetMatPosition(m_matBeforePos);
CSceneManager::m_ViewCamera->MoveFrustum();
CSceneManager::m_ViewCamera->SetVecPosition(vector3(m_matBeforePos._41,m_matBeforePos._42,m_matBeforePos._43));
}
}

View File

@@ -0,0 +1,154 @@
#ifndef __CCAMERASCRIPT_H__
#define __CCAMERASCRIPT_H__
#include <d3d8.h>
#include <d3dx8.h>
#include <vector>
#include <windows.h>
#include <string.h>
#include "matrix.h"
using namespace std;
enum C_INTERPOLATION {
C_LINE, // Linear
C_BEZIER1, // Bezier (제어점 3)
C_BEZIER2, // Bezier (제어점 4)
C_NOTINTERPOLATION, // 보간 없음
};
#define CAMERAEVENTEMPTY -1
#define CAMERAZEROFRAME 0.0f
#define CAMERASCRIPTVERSION 1.0f
#define CAMERAFRAMESTEP 30.0f
#define CAMERASPLINEUNIT 100
class CCameraScript {
private:
// 시퀀스 unit
class CCameraEvent {
public:
int m_iIndex; // 시퀀스 인덱스
int m_iInterpolation; // 전 Event와의 보간 방법 선택
float m_fFrame; // 시작으로 부터의 프레임
D3DXVECTOR3 m_vecControlPoint[2]; // 베지어 곡선 Control Point
D3DXVECTOR3 m_vecCameraPos;
D3DXVECTOR3 m_vecCameraLook;
D3DXVECTOR3 m_vecCameraUp;
int m_iPosStart; // Pos Spline 에서의 시작 index
int m_iPosEnd; // Pos Spline 에서의 종료 index
int m_iLookStart; // Look Spline 에서의 시작 index
int m_iLookEnd; // Look Spline 에서의 종료 index
CCameraEvent() {
m_iIndex = CAMERAEVENTEMPTY;
m_iInterpolation = C_LINE;
m_fFrame = CAMERAZEROFRAME;
m_vecCameraPos = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vecCameraUp = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_vecCameraLook = D3DXVECTOR3(0.0f,0.0f,0.0f);
m_iPosStart = CAMERAEVENTEMPTY;
m_iPosEnd = CAMERAEVENTEMPTY;
m_iLookStart = CAMERAEVENTEMPTY;
m_iLookEnd = CAMERAEVENTEMPTY;
}
~CCameraEvent() {}
};
vector<CCameraEvent> m_lstEvent;
vector<D3DXVECTOR3> m_lstPosSpline;
bool m_bCreateSpline;
vector<D3DXVECTOR3> m_lstLookSpline;
bool m_bCreateLookSpline;
int m_iInsertLook;
int m_iEventNum;
int m_iBeforeEvent;
float m_fRunFrame; // 시작한 다음의 지나간 시간 frame
D3DXMATRIX m_matBeforeView;
CCameraEvent m_CurrentEvent; // 현재 프레임에 맞는, Event Unit
D3DXMATRIX m_matCurrentFrame; // 현재 Frame View Matrix
LPDIRECT3DDEVICE8 m_pDevice; // Direct3D Device
DWORD m_dwBeforeTick;
DWORD m_dwCurrentTick;
bool m_bStart;
matrix m_matBeforePos;
matrix m_matBeforeView2;
int m_iFixCount;
bool m_bBackWord;
D3DXVECTOR3 m_vecCameraInitPos;
D3DXVECTOR3 m_vecCameraInitLook;
bool m_bInitSet;
public:
CCameraScript();
~CCameraScript();
void InitCameraScript(bool bInitPos = false,D3DXVECTOR3 vecInitPos = D3DXVECTOR3(0.0f,0.0f,0.0f),D3DXVECTOR3 vecInitLook = D3DXVECTOR3(0.0f,0.0f,0.0f));
void InitFrame();
int InsertEvent(D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp,float fFrame,int iInterpol);
void InsertLookPos(D3DXVECTOR3 vecLook);
void FixEvent(int iEvent,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp);
void FixEvent(int iEvent,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecLook,D3DXVECTOR3 vecUp,float fFrame,int iInterpol);
void FixLook(int iEvent,D3DXVECTOR3 vecLook);
void DeleteEvent(float fFrame,int iInterpol);
void DeleteEvent(int iIndex);
bool SaveScript(char *strFileName);
bool LoadScript(char *strFileName);
void CreateSpline();
void PlayScript(int iRoll,int iLoop,bool bFix);
void Rewind();
void Fowind();
void Jump(int iEvent); //iEvent로 jump
// void SetPlay(bool bFlag);
void SetPlay(bool bFlag,bool bBack = false,bool bStartPos = false);
void SetVecTakePos(); //좌표 리셋 함수
D3DXVECTOR3 GetVecPos() { return m_CurrentEvent.m_vecCameraPos; }
D3DXVECTOR3 GetVecLook() { return m_CurrentEvent.m_vecCameraLook; }
D3DXVECTOR3 GetVecUp() { return m_CurrentEvent.m_vecCameraUp; }
D3DXMATRIX GetCurrentViewMat() { return m_matCurrentFrame; }
void RenderPos_Up();
void RenderLook();
void RenderLine();
void RenderPosSpline();
void RenderLookSpline();
bool ISPlay() { return m_bStart;}
int GetExistEventNum() { return m_iEventNum;}
int GetFixCount(int &iIndex,float &fFrame);
void ReWindFix();
void FoWindFix();
void BackWordEvent();
//
void HALT()
{
m_bStart = false;
}
};
#endif

View File

@@ -0,0 +1,534 @@
// CameraControl.cpp: implementation of the CCameraControl class.
//
//////////////////////////////////////////////////////////////////////
#include "CameraControl.h"
#include "SceneManager.h"
#include "FrameTimer.h"
#include "FullSceneEffect.h"
#include "GMMemory.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
float CCameraControl::m_fJumpRate=0.0f;
float CCameraControl::m_fCameraShakeRateTime=-1.0f;
float CCameraControl::m_fCameraShakeNowTime=0.0f;
vector3 CCameraControl::m_vecCameraShakeLength=vector3(0.0f,0.0f,0.0f);
float CCameraControl::m_fFadeOutStart=0.0f;
float CCameraControl::m_fFadeOutMaintenance=0.0f;
float CCameraControl::m_fFadeOutEnd=0.0f;
float CCameraControl::m_fFadeOutNowTime=0.0f;
float CCameraControl::m_fFadeInStart=0.0f;
float CCameraControl::m_fFadeInMaintenance=0.0f;
float CCameraControl::m_fFadeInEnd=0.0f;
float CCameraControl::m_fFadeInNowTime=0.0f;
color CCameraControl::m_FadeInColor;
DWORD CCameraControl::m_nCameraAnimationTimer=0xffffffff;
CCameraControl::CCameraControl()
{
m_fCameraRotX = 3.14159f / 2.0f;
m_fCameraRotY = 0.4f;
m_fBattleCameraRotY = 0.3f;
m_fBattleInterCharacterCamera = 600.0f; // Minotaurs 배틀모드 초기 카메라 위치
m_fMouseClickInterCharacterCamera=1000.0f;
m_nCameraMode=1;
m_fDirection = 0.0f;
m_FadeInColor.c=0xffffffff;
}
CCameraControl::~CCameraControl()
{
}
void CCameraControl::UpdateBattleCharacter(vector3 vecChrPos, float fDirection, float fInitY, float fInitZ)
{
if(m_nCameraMode>=2)
{
UpdateControlCamera();
return;
}
m_fDirection = fDirection;
vecChrPos += vector3(0.0f, fInitY, fInitZ);
if(m_fBattleCameraRotY > 3.14159f/2.0f-0.3f)
m_fBattleCameraRotY=3.14159f/2.0f-0.3f;
if(m_fBattleCameraRotY< -3.14159f/2.0f+0.7f)
m_fBattleCameraRotY=-3.14159f/2.0f+0.7f;
vector3 vecCameraInterPos;
if(m_fJumpRate>0.0f)
{
vector3 vecJumpRate=sinf(m_fJumpRate)*vector3(0.0f,10.0f,0.0f);
vecChrPos-=vecJumpRate;
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fJumpRate+=((int)fCameraUpdate)*0.08f;
if(m_fJumpRate>3.14159f)
{
m_fJumpRate=0.0f;
}
}
m_fCameraShakeRateTime;
static vector3 m_vecCameraShakeLength;
vector3 vecCameraShake=vector3(0.0f,0.0f,0.0f);
static bool bStart = false;
if(m_fCameraShakeRateTime>0.0f)
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fCameraShakeNowTime+=(int)fCameraUpdate;
if(m_fCameraShakeNowTime>m_fCameraShakeRateTime)
{
m_fCameraShakeRateTime=-1.0f;
}
vecCameraShake=vector3( (rand()%1000)-500 , (rand()%1000)-500 , (rand()%1000)-500 );
vecCameraShake.Normalize();
vecCameraShake.x=vecCameraShake.x*CCameraControl::m_vecCameraShakeLength.x;
vecCameraShake.y=vecCameraShake.y*CCameraControl::m_vecCameraShakeLength.y;
vecCameraShake.z=vecCameraShake.z*CCameraControl::m_vecCameraShakeLength.z;
CSceneManager::m_pFullSceneEffect->SetFlag(FULLSCENE_MOTIONBLUR,true);
bStart = true;
}
else if(bStart){
bStart = false;
CSceneManager::m_pFullSceneEffect->SetFlag(FULLSCENE_MOTIONBLUR,false);
}
//vecCameraInterPos+=vecCameraShake;
CalcCameraPosition(vecChrPos,fDirection,m_fBattleCameraRotY,m_fBattleInterCharacterCamera,vecCameraInterPos);
if(m_fBattleInterCharacterCamera < 200.0f)
{
float fDownFocus = (40.0f - ((m_fBattleInterCharacterCamera - 100.0f) / 2.50f));
vecChrPos.y = vecChrPos.y - fDownFocus;
vecCameraInterPos.y = vecCameraInterPos.y - fDownFocus;
}
SetCamera(vecCameraInterPos, vecCameraShake, vecChrPos);
/* matrix matView;
matView.CameraLookAt(vecCameraInterPos+vecCameraShake, vecChrPos+vecCameraShake, vector3(0.0f, 1.0f, 0.0f));
matrix matInv;
matInv.Inverse(matView);
m_vecCameraPos=vecCameraInterPos;
CSceneManager::GetCamera()->SetMatPosition(matInv);
CSceneManager::GetCamera()->SetMatView(matView);
CSceneManager::GetCamera()->SetVecPosition(vecChrPos);
CSceneManager::GetCamera()->MoveFrustum();
if(m_fFadeOutStart> 0.0f)
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fFadeOutNowTime+=(int)fCameraUpdate;
float fSetTime;
if(m_fFadeOutNowTime <= m_fFadeOutStart)
{
fSetTime=m_fFadeOutNowTime/m_fFadeOutStart;
}
if( m_fFadeOutNowTime > m_fFadeOutStart &&
m_fFadeOutNowTime < m_fFadeOutStart+m_fFadeOutMaintenance)
{
fSetTime=1.0f;
}
if( m_fFadeOutNowTime >= m_fFadeOutStart+m_fFadeOutMaintenance)
{
fSetTime=m_fFadeOutNowTime-(m_fFadeOutStart+m_fFadeOutMaintenance);
fSetTime=1.0f-(fSetTime/m_fFadeOutEnd);
}
CSceneManager::m_WeatherManager.m_CustomWaterColor=true;
CSceneManager::m_WeatherManager.m_CustomWaterRate=fSetTime;
if( m_fFadeOutNowTime >= m_fFadeOutStart+m_fFadeOutMaintenance+m_fFadeOutEnd)
{
CSceneManager::m_WeatherManager.m_CustomWaterColor=false;
m_fFadeOutStart=0.0f;
m_fFadeOutMaintenance=0.0f;
m_fFadeOutEnd=0.0f;
m_fFadeOutNowTime=0.0f;
}
}
if(m_fFadeInStart> 0.0f)
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fFadeInNowTime+=(int)fCameraUpdate;
float fSetTime;
if(m_fFadeInNowTime <= m_fFadeInStart)
{
fSetTime=m_fFadeInNowTime/m_fFadeInStart;
}
if( m_fFadeInNowTime > m_fFadeInStart &&
m_fFadeInNowTime < m_fFadeInStart+m_fFadeInMaintenance)
{
fSetTime=1.0f;
}
if( m_fFadeInNowTime >= m_fFadeInStart+m_fFadeInMaintenance)
{
fSetTime=m_fFadeInNowTime-(m_fFadeInStart+m_fFadeInMaintenance);
fSetTime=1.0f-(fSetTime/m_fFadeInEnd);
}
if(fSetTime<1.0f && fSetTime>0.0f)
{
int a=0;
}
color InterColor;
color ZeroColor;
ZeroColor.c=0x00000000;
InterColor=color::Interpolation(ZeroColor,m_FadeInColor,fSetTime);
CSceneManager::m_FullSceneFade=InterColor;
//CSceneManager::m_FullSceneFade.c=0x00ff0000;
if( m_fFadeInNowTime >= m_fFadeInStart+m_fFadeInMaintenance+m_fFadeInEnd)
{
m_fFadeInStart=0.0f;
m_fFadeInMaintenance=0.0f;
m_fFadeInEnd=0.0f;
m_fFadeInNowTime=0.0f;
CSceneManager::m_FullSceneFade.c=0x0;
}
}*/
}
void CCameraControl::UpdateClickMode(vector3 vecChrPos, float fInitY, float fInitZ)
{
if(m_nCameraMode>=2)
{
UpdateControlCamera();
return;
}
vecChrPos += vector3(0.0f, fInitY, fInitZ); // 포커스를 정하는 백터
if(m_fCameraRotY > 3.14159f/2.0f-0.3f)
m_fCameraRotY=3.14159f/2.0f-0.3f;
if(m_fCameraRotY< -3.14159f/2.0f+0.7f)
m_fCameraRotY=-3.14159f/2.0f+0.7f;
//CalcCameraPosition(vecChrPos,-m_fCameraRotX,vecCameraInterPos);
m_fCameraShakeRateTime;
static vector3 m_vecCameraShakeLength;
vector3 vecCameraShake=vector3(0.0f,0.0f,0.0f);
if(m_fCameraShakeRateTime>0.0f)
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fCameraShakeNowTime+=(int)fCameraUpdate;
if(m_fCameraShakeNowTime>m_fCameraShakeRateTime)
{
m_fCameraShakeRateTime=-1.0f;
}
vecCameraShake=vector3( (rand()%1000)-500 , (rand()%1000)-500 , (rand()%1000)-500 );
vecCameraShake.Normalize();
vecCameraShake.x=vecCameraShake.x*CCameraControl::m_vecCameraShakeLength.x;
vecCameraShake.y=vecCameraShake.y*CCameraControl::m_vecCameraShakeLength.y;
vecCameraShake.z=vecCameraShake.z*CCameraControl::m_vecCameraShakeLength.z;
}
vector3 vecCameraInterPos;
CalcCameraPosition(vecChrPos,-m_fCameraRotX,m_fCameraRotY,m_fMouseClickInterCharacterCamera,vecCameraInterPos);
if(m_fMouseClickInterCharacterCamera < 200.0f)
{
float fDownFocus = (40.0f - ((m_fMouseClickInterCharacterCamera - 100.0f) / 2.50f));
vecChrPos.y = vecChrPos.y - fDownFocus;
vecCameraInterPos.y = vecCameraInterPos.y - fDownFocus;
}
SetCamera(vecCameraInterPos, vecCameraShake, vecChrPos);
/*
matrix matRotation,matResult;
matResult.Translation(vector3(1.0f,0.0f,0.0f));
D3DXQUATERNION qR;
D3DXQuaternionRotationYawPitchRoll(&qR,-m_fCameraRotX,0.0f,m_fCameraRotY);
D3DXMatrixRotationQuaternion(matRotation,&qR);
matResult=matResult*matRotation;
//vector3 vecCameraPosition=matResult.GetLoc();
vector3 vecCameraInterPos=matResult.GetLoc();
vector3 vecResultCameraPos = (vecCameraInterPos * m_fMouseClickInterCharacterCamera) + vecChrPos;
/////////////////////Terrain//////////////////
//List<vector3> PolyList;
CSceneManager::m_HeightField.GetLineIntersectPoly(vecChrPos,vecResultCameraPos,PolyList);
float fCollisionLens=m_fMouseClickInterCharacterCamera;
float fLens;
vector3 vecPoly[3];
if(PolyList.num>0)
{
for(int cIndices=0;cIndices<PolyList.num/3;cIndices++)
{
vecPoly[0]=PolyList[cIndices*3+0];
vecPoly[1]=PolyList[cIndices*3+1];
vecPoly[2]=PolyList[cIndices*3+2];
if(CIntersection::PolygonRay(vecChrPos,vecResultCameraPos,vecPoly,fLens) && fCollisionLens > fLens && fLens > 0.0f)
{
fCollisionLens=fLens;
}
}
}
float fChrInter=fCollisionLens;
vecCameraInterPos=vecCameraInterPos*fChrInter+vecChrPos;
float fCameraHeight=CSceneManager::m_HeightField.GetHeight(vecCameraInterPos);
if(vecCameraInterPos.y < fCameraHeight +30.0f)
{
vecCameraInterPos.y=fCameraHeight +30.0f;
}
*/
}
void CCameraControl::ModeConvertAnimation()
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
//fCameraUpdate=
}
void CCameraControl::UpdateControlCamera()
{
if(m_nCameraMode==100)
return;
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fTime+=fCameraUpdate;
vector3 vecAdder=m_vecVelocity*fCameraUpdate;
m_vecNowPosition=m_vecNowPosition+vecAdder;
vector3 vecForLens=m_vecEndPosition-m_vecStartPosition;
vector3 vecNowLens=m_vecNowPosition-m_vecStartPosition;
static float fVelScalar=0.0f;
m_vecVelocity+=m_vecAccelate*fCameraUpdate;
if(vecForLens.GetLens() < vecNowLens.GetLens())
{
m_nCameraMode=m_nPrepareCameraMode;
}
matrix matView;
matView.CameraLookAt(m_vecNowPosition, m_vecTargetCameraPosition, vector3(0.0f, 1.0f, 0.0f));
matrix matInv;
matInv.Inverse(matView);
m_vecCameraPos=m_vecNowPosition;
CSceneManager::GetCamera()->SetMatPosition(matInv);
CSceneManager::GetCamera()->SetMatView(matView);
CSceneManager::GetCamera()->SetVecPosition(m_vecNowPosition);
CSceneManager::GetCamera()->MoveFrustum();
}
void CCameraControl::CalcCameraPosition(vector3 vecChrPos,float fCameraDirection,float fCameraYDirection,float fInterCamera,vector3 &vecCameraInterPos)
{
matrix matRotation,matResult;
matResult.Translation(vector3(1.0f,0.0f,0.0f));
D3DXQUATERNION qR;
D3DXQuaternionRotationYawPitchRoll(&qR,fCameraDirection,0.0f,fCameraYDirection);
D3DXMatrixRotationQuaternion(matRotation,&qR);
matResult=matResult*matRotation;
//vector3 vecCameraPosition=matResult.GetLoc();
vecCameraInterPos=matResult.GetLoc();
vector3 vecResultCameraPos = (vecCameraInterPos * fInterCamera) + vecChrPos;
/////////////////////Terrain//////////////////
std::vector<vector3> PolyList;
CSceneManager::m_HeightField.GetLineIntersectPoly(vecChrPos,vecResultCameraPos,PolyList);
float fCollisionLens=fInterCamera;
float fLens;
vector3 vecPoly[3];
if(PolyList.size()>0)
{
for(int cIndices=0;cIndices<(int)PolyList.size()/3;cIndices++)
{
vecPoly[0]=PolyList[cIndices*3+0];
vecPoly[1]=PolyList[cIndices*3+1];
vecPoly[2]=PolyList[cIndices*3+2];
if(CIntersection::PolygonRay(vecChrPos,vecResultCameraPos,vecPoly,fLens) && fCollisionLens > fLens && fLens > 0.0f)
{
fCollisionLens=fLens;
}
}
}
float fChrInter=fCollisionLens;
vecCameraInterPos=vecCameraInterPos*fChrInter+vecChrPos;
float fCameraHeight=CSceneManager::m_HeightField.GetHeight(vecCameraInterPos);
if(vecCameraInterPos.y < fCameraHeight +30.0f)
{
vecCameraInterPos.y = fCameraHeight +30.0f;
}
}
void CCameraControl::SetFadeOut(float fStart, float fMaintenance, float fEnd)
{
m_fFadeOutStart=fStart;
m_fFadeOutMaintenance=fMaintenance;
m_fFadeOutEnd=fEnd;
m_fFadeOutNowTime=0.0f;
}
void CCameraControl::SetFadeIn(float fStart, float fMaintenance, float fEnd,color FadeColor)
{
m_fFadeInStart=fStart;
m_fFadeInMaintenance=fMaintenance;
m_fFadeInEnd=fEnd;
m_fFadeInNowTime=0.0f;
m_FadeInColor=FadeColor;
}
void CCameraControl::SetCamera(vector3 &vecCameraInterPos, vector3 &vecCameraShake, vector3 &vecChrPos)
{
matrix matView;
matView.CameraLookAt(vecCameraInterPos+vecCameraShake, vecChrPos, vector3(0.0f, 1.0f, 0.0f));
matrix matInv;
matInv.Inverse(matView);
m_vecCameraPos=vecCameraInterPos;
CSceneManager::GetCamera()->SetMatPosition(matInv);
CSceneManager::GetCamera()->SetMatView(matView);
CSceneManager::GetCamera()->SetVecPosition(vecChrPos);
CSceneManager::GetCamera()->MoveFrustum();
if(m_fFadeOutStart> 0.0f)
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fFadeOutNowTime+=(int)fCameraUpdate;
float fSetTime;
if(m_fFadeOutNowTime <= m_fFadeOutStart)
{
fSetTime=m_fFadeOutNowTime/m_fFadeOutStart;
}
if( m_fFadeOutNowTime > m_fFadeOutStart &&
m_fFadeOutNowTime < m_fFadeOutStart+m_fFadeOutMaintenance)
{
fSetTime=1.0f;
}
if( m_fFadeOutNowTime >= m_fFadeOutStart+m_fFadeOutMaintenance)
{
fSetTime=m_fFadeOutNowTime-(m_fFadeOutStart+m_fFadeOutMaintenance);
fSetTime=1.0f-(fSetTime/m_fFadeOutEnd);
//if(fSetTime<0.0f)
// fSetTime=0.0f;
}
if(fSetTime>=0.0f)
{
CSceneManager::m_WeatherManager.m_CustomWaterColor=true;
CSceneManager::m_WeatherManager.m_CustomWaterRate=fSetTime;
}
if( m_fFadeOutNowTime >= m_fFadeOutStart+m_fFadeOutMaintenance+m_fFadeOutEnd)
{
CSceneManager::m_WeatherManager.m_CustomWaterColor=false;
m_fFadeOutStart=0.0f;
m_fFadeOutMaintenance=0.0f;
m_fFadeOutEnd=0.0f;
m_fFadeOutNowTime=0.0f;
}
}
if(m_fFadeInStart> 0.0f)
{
float fCameraUpdate=CFrameTimer::GetUpdateTimer(m_nCameraAnimationTimer);
m_fFadeInNowTime+=(int)fCameraUpdate;
float fSetTime;
if(m_fFadeInNowTime <= m_fFadeInStart)
{
fSetTime=m_fFadeInNowTime/m_fFadeInStart;
}
if( m_fFadeInNowTime > m_fFadeInStart &&
m_fFadeInNowTime < m_fFadeInStart+m_fFadeInMaintenance)
{
fSetTime=1.0f;
}
if( m_fFadeInNowTime >= m_fFadeInStart+m_fFadeInMaintenance)
{
fSetTime=m_fFadeInNowTime-(m_fFadeInStart+m_fFadeInMaintenance);
fSetTime=1.0f-(fSetTime/m_fFadeInEnd);
}
if(fSetTime<1.0f && fSetTime>0.0f)
{
int a=0;
}
color InterColor;
color ZeroColor;
ZeroColor.c=0x00000000;
InterColor=color::Interpolation(ZeroColor,m_FadeInColor,fSetTime);
CSceneManager::m_FullSceneFade=InterColor;
//CSceneManager::m_FullSceneFade.c=0x00ff0000;
if( m_fFadeInNowTime >= m_fFadeInStart+m_fFadeInMaintenance+m_fFadeInEnd)
{
m_fFadeInStart=0.0f;
m_fFadeInMaintenance=0.0f;
m_fFadeInEnd=0.0f;
m_fFadeInNowTime=0.0f;
CSceneManager::m_FullSceneFade.c=0x0;
}
}
}

View File

@@ -0,0 +1,72 @@
// CameraControl.h: interface for the CCameraControl class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_CAMERACONTROL_H__4E002D9F_8CCD_44AF_8371_3BA39A220DC0__INCLUDED_)
#define AFX_CAMERACONTROL_H__4E002D9F_8CCD_44AF_8371_3BA39A220DC0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "3DMath.h"
#include <d3d8.h>
class CCameraControl
{
public:
void SetCamera(vector3 &vecCameraInterPos, vector3 &vecCameraShake, vector3 &vecChrPos);
static void SetFadeIn(float fStart,float fMaintenance,float fEnd,color FadeColor);
static void SetFadeOut(float fStart,float fMaintenance,float fEnd);
void CalcCameraPosition(vector3 vecChrPos,float fCameraDirection,float fCameraYDirection,float fInterCamera,vector3 &vecCameraInterPos);
void UpdateControlCamera();
void ModeConvertAnimation();
void UpdateClickMode(vector3 vecChrPos, float fInitY, float fInitZ = 0.0f);
void UpdateBattleCharacter(vector3 vecChrPos,float fDirection, float fInitY, float fInitZ = 0.0f);
int m_nCameraMode;//0 마우스 클릭모드,1 배틀,2 프로그램제어 카메라 (쉐이크,스크립트...)
int m_nPrepareCameraMode;
static float m_fJumpRate;
static float m_fCameraShakeRateTime;
static float m_fCameraShakeNowTime;
static vector3 m_vecCameraShakeLength;
static float m_fFadeOutStart;
static float m_fFadeOutMaintenance;
static float m_fFadeOutEnd;
static float m_fFadeOutNowTime;
static float m_fFadeInStart;
static float m_fFadeInMaintenance;
static float m_fFadeInEnd;
static float m_fFadeInNowTime;
static color m_FadeInColor;
//
vector3 m_vecStartPosition,m_vecEndPosition;
vector3 m_vecVelocity,m_vecAccelate;
vector3 m_vecNowPosition;
float m_fTotalTimeInterval;
float m_fTime;
//
float m_fCameraRotX,m_fCameraRotY;//클릭모드용
float m_fBattleCameraRotY;
float m_fDirection;
float m_fMouseClickInterCharacterCamera,m_fBattleInterCharacterCamera;
vector3 m_vecTargetCameraPosition;
vector3 m_vecCameraPos;
//
static DWORD m_nCameraAnimationTimer;
CCameraControl();
virtual ~CCameraControl();
};
#endif // !defined(AFX_CAMERACONTROL_H__4E002D9F_8CCD_44AF_8371_3BA39A220DC0__INCLUDED_)

View File

@@ -0,0 +1,381 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="CharacterActionControl"
ProjectGUID="{3A5BBAD5-1C45-4F24-973C-DC63B5C0F8AF}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;&quot;../../Engine/Zalla3D Base Class&quot;;&quot;../../Engine/Zalla3D Scene Class&quot;;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CharacterActionControl.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;&quot;../../Engine/Zalla3D Base Class&quot;;&quot;../../Engine/Zalla3D Scene Class&quot;;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CharacterActionControl.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release_NoGD|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;&quot;../../Engine/Zalla3D Base Class&quot;;&quot;../../Engine/Zalla3D Scene Class&quot;;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CharacterActionControl.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release_MY|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;&quot;../../Engine/Zalla3D Base Class&quot;;&quot;../../Engine/Zalla3D Scene Class&quot;;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CharacterActionControl.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Debug_MY|Win32"
OutputDirectory="../../Library/$(ConfigurationName)"
IntermediateDirectory="../../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;&quot;../../Engine/Zalla3D Base Class&quot;;&quot;../../Engine/Zalla3D Scene Class&quot;;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile="$(OutDir)/CharacterActionControl.lib"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="소스 파일"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\CameraControl.cpp">
</File>
<File
RelativePath=".\CCameraScript.cpp">
</File>
<File
RelativePath=".\InputDevice.cpp">
</File>
<File
RelativePath=".\InputJoystick.cpp">
</File>
<File
RelativePath=".\InputKeyboard.cpp">
</File>
<File
RelativePath=".\InputMouse.cpp">
</File>
</Filter>
<Filter
Name="헤더 파일"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\CameraControl.h">
</File>
<File
RelativePath=".\CCameraScript.h">
</File>
<File
RelativePath=".\CreatureSize.h">
</File>
<File
RelativePath=".\InputDevice.h">
</File>
<File
RelativePath=".\InputJoystick.h">
</File>
<File
RelativePath=".\InputKeyboard.h">
</File>
<File
RelativePath=".\InputMouse.h">
</File>
</Filter>
<Filter
Name="리소스 파일"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
<Filter
Name="Creature Files"
Filter="">
<File
RelativePath=".\RYLCreature.cpp">
</File>
<File
RelativePath=".\RYLCreature.h">
</File>
<Filter
Name="Creature Effect Files"
Filter="">
<File
RelativePath=".\RYLCreatureEffect.cpp">
</File>
<File
RelativePath=".\RYLCreatureEffect.h">
</File>
<File
RelativePath=".\RYLDamageEffect.cpp">
</File>
<File
RelativePath=".\RYLDamageEffect.h">
</File>
</Filter>
</Filter>
<Filter
Name="Creature Common Files"
Filter="">
<File
RelativePath=".\RYLCreatureCommon.h">
</File>
</Filter>
<Filter
Name="Creature Manager Files"
Filter="">
<File
RelativePath=".\RYLCharacterDataManager.cpp">
</File>
<File
RelativePath=".\RYLCharacterDataManager.h">
</File>
<File
RelativePath=".\RYLCreatureManager.cpp">
</File>
<File
RelativePath=".\RYLCreatureManager.h">
</File>
</Filter>
<Filter
Name="Creature Control Files"
Filter="">
<File
RelativePath=".\RYLCharacterControl.cpp">
</File>
<File
RelativePath=".\RYLCharacterControl.h">
</File>
<File
RelativePath=".\RYLDropshipControl.cpp">
</File>
<File
RelativePath=".\RYLDropshipControl.h">
</File>
<File
RelativePath=".\RYLObjectControl.cpp">
</File>
<File
RelativePath=".\RYLObjectControl.h">
</File>
<Filter
Name="Siege"
Filter="">
<File
RelativePath=".\RYLLongAttackWeaponControl.cpp">
</File>
<File
RelativePath=".\RYLLongAttackWeaponControl.h">
</File>
<File
RelativePath=".\RYLShortAttackWeaponControl.cpp">
</File>
<File
RelativePath=".\RYLShortAttackWeaponControl.h">
</File>
</Filter>
<Filter
Name="Castle"
Filter="">
<File
RelativePath=".\RYLLongDefenceWeaponControl.cpp">
</File>
<File
RelativePath=".\RYLLongDefenceWeaponControl.h">
</File>
<File
RelativePath=".\RYLShortDefenceWeaponControl.cpp">
</File>
<File
RelativePath=".\RYLShortDefenceWeaponControl.h">
</File>
</Filter>
</Filter>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -0,0 +1,229 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug_MY|Win32">
<Configuration>Debug_MY</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_MY|Win32">
<Configuration>Release_MY</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_NoGD|Win32">
<Configuration>Release_NoGD</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{3A5BBAD5-1C45-4F24-973C-DC63B5C0F8AF}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">../../Library/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;../../Engine/Zalla3D Base Class;../../Engine/Zalla3D Scene Class;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CharacterActionControl.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;../../Engine/Zalla3D Base Class;../../Engine/Zalla3D Scene Class;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<OpenMPSupport>true</OpenMPSupport>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CharacterActionControl.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;../../Engine/Zalla3D Base Class;../../Engine/Zalla3D Scene Class;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CharacterActionControl.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;../../Engine/Zalla3D Base Class;../../Engine/Zalla3D Scene Class;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CharacterActionControl.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MY|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../RYLClient;../RYLClient/RYLUI;../RYLClient/RYLClient;../RYLClient/EventHandler;../../Engine/Effect;../../Engine/SoundLib;../../Engine/Zalla3D Base Class;../../Engine/Zalla3D Scene Class;../../Engine/Caldron;../GlobalScript;../../MemoryManager;../../Engine/CrossM/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Lib>
<OutputFile>$(OutDir)CharacterActionControl.lib</OutputFile>
</Lib>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="CameraControl.cpp" />
<ClCompile Include="CCameraScript.cpp" />
<ClCompile Include="InputDevice.cpp" />
<ClCompile Include="InputJoystick.cpp" />
<ClCompile Include="InputKeyboard.cpp" />
<ClCompile Include="InputMouse.cpp" />
<ClCompile Include="RYLCreature.cpp" />
<ClCompile Include="RYLCreatureEffect.cpp" />
<ClCompile Include="RYLDamageEffect.cpp" />
<ClCompile Include="RYLCharacterDataManager.cpp" />
<ClCompile Include="RYLCreatureManager.cpp" />
<ClCompile Include="RYLCharacterControl.cpp" />
<ClCompile Include="RYLDropshipControl.cpp" />
<ClCompile Include="RYLObjectControl.cpp" />
<ClCompile Include="RYLLongAttackWeaponControl.cpp" />
<ClCompile Include="RYLShortAttackWeaponControl.cpp" />
<ClCompile Include="RYLLongDefenceWeaponControl.cpp" />
<ClCompile Include="RYLShortDefenceWeaponControl.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="CameraControl.h" />
<ClInclude Include="CCameraScript.h" />
<ClInclude Include="CreatureSize.h" />
<ClInclude Include="InputDevice.h" />
<ClInclude Include="InputJoystick.h" />
<ClInclude Include="InputKeyboard.h" />
<ClInclude Include="InputMouse.h" />
<ClInclude Include="RYLCreature.h" />
<ClInclude Include="RYLCreatureEffect.h" />
<ClInclude Include="RYLDamageEffect.h" />
<ClInclude Include="RYLCreatureCommon.h" />
<ClInclude Include="RYLCharacterDataManager.h" />
<ClInclude Include="RYLCreatureManager.h" />
<ClInclude Include="RYLCharacterControl.h" />
<ClInclude Include="RYLDropshipControl.h" />
<ClInclude Include="RYLObjectControl.h" />
<ClInclude Include="RYLLongAttackWeaponControl.h" />
<ClInclude Include="RYLShortAttackWeaponControl.h" />
<ClInclude Include="RYLLongDefenceWeaponControl.h" />
<ClInclude Include="RYLShortDefenceWeaponControl.h" />
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\MemoryManager\MemoryManager.vcxproj">
<Project>{b6bdd524-1dde-4a65-aed7-9ee4bc86a05d}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="소스 파일">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="헤더 파일">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="리소스 파일">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
</Filter>
<Filter Include="Creature Files">
<UniqueIdentifier>{f16294ca-1c1e-45a5-b1e0-6a6d8ddd305a}</UniqueIdentifier>
</Filter>
<Filter Include="Creature Files\Creature Effect Files">
<UniqueIdentifier>{e6772d5c-058a-4853-beab-86f64cd2a536}</UniqueIdentifier>
</Filter>
<Filter Include="Creature Common Files">
<UniqueIdentifier>{7aed39bc-386a-45a2-9cb2-7425fd71020b}</UniqueIdentifier>
</Filter>
<Filter Include="Creature Manager Files">
<UniqueIdentifier>{fa13df36-776a-448f-9936-280b50406ebe}</UniqueIdentifier>
</Filter>
<Filter Include="Creature Control Files">
<UniqueIdentifier>{8853dde1-0a12-4907-8cb5-ff31050aa058}</UniqueIdentifier>
</Filter>
<Filter Include="Creature Control Files\Siege">
<UniqueIdentifier>{4bf65774-aea6-41a1-a1ad-05da2e78821c}</UniqueIdentifier>
</Filter>
<Filter Include="Creature Control Files\Castle">
<UniqueIdentifier>{193e3faa-674b-461d-9d7e-7946ac6b7f92}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="CameraControl.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="CCameraScript.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="InputDevice.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="InputJoystick.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="InputKeyboard.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="InputMouse.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="RYLCreature.cpp">
<Filter>Creature Files</Filter>
</ClCompile>
<ClCompile Include="RYLCreatureEffect.cpp">
<Filter>Creature Files\Creature Effect Files</Filter>
</ClCompile>
<ClCompile Include="RYLDamageEffect.cpp">
<Filter>Creature Files\Creature Effect Files</Filter>
</ClCompile>
<ClCompile Include="RYLCharacterDataManager.cpp">
<Filter>Creature Manager Files</Filter>
</ClCompile>
<ClCompile Include="RYLCreatureManager.cpp">
<Filter>Creature Manager Files</Filter>
</ClCompile>
<ClCompile Include="RYLCharacterControl.cpp">
<Filter>Creature Control Files</Filter>
</ClCompile>
<ClCompile Include="RYLDropshipControl.cpp">
<Filter>Creature Control Files</Filter>
</ClCompile>
<ClCompile Include="RYLObjectControl.cpp">
<Filter>Creature Control Files</Filter>
</ClCompile>
<ClCompile Include="RYLLongAttackWeaponControl.cpp">
<Filter>Creature Control Files\Siege</Filter>
</ClCompile>
<ClCompile Include="RYLShortAttackWeaponControl.cpp">
<Filter>Creature Control Files\Siege</Filter>
</ClCompile>
<ClCompile Include="RYLLongDefenceWeaponControl.cpp">
<Filter>Creature Control Files\Castle</Filter>
</ClCompile>
<ClCompile Include="RYLShortDefenceWeaponControl.cpp">
<Filter>Creature Control Files\Castle</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="CameraControl.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="CCameraScript.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="CreatureSize.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="InputDevice.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="InputJoystick.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="InputKeyboard.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="InputMouse.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="RYLCreature.h">
<Filter>Creature Files</Filter>
</ClInclude>
<ClInclude Include="RYLCreatureEffect.h">
<Filter>Creature Files\Creature Effect Files</Filter>
</ClInclude>
<ClInclude Include="RYLDamageEffect.h">
<Filter>Creature Files\Creature Effect Files</Filter>
</ClInclude>
<ClInclude Include="RYLCreatureCommon.h">
<Filter>Creature Common Files</Filter>
</ClInclude>
<ClInclude Include="RYLCharacterDataManager.h">
<Filter>Creature Manager Files</Filter>
</ClInclude>
<ClInclude Include="RYLCreatureManager.h">
<Filter>Creature Manager Files</Filter>
</ClInclude>
<ClInclude Include="RYLCharacterControl.h">
<Filter>Creature Control Files</Filter>
</ClInclude>
<ClInclude Include="RYLDropshipControl.h">
<Filter>Creature Control Files</Filter>
</ClInclude>
<ClInclude Include="RYLObjectControl.h">
<Filter>Creature Control Files</Filter>
</ClInclude>
<ClInclude Include="RYLLongAttackWeaponControl.h">
<Filter>Creature Control Files\Siege</Filter>
</ClInclude>
<ClInclude Include="RYLShortAttackWeaponControl.h">
<Filter>Creature Control Files\Siege</Filter>
</ClInclude>
<ClInclude Include="RYLLongDefenceWeaponControl.h">
<Filter>Creature Control Files\Castle</Filter>
</ClInclude>
<ClInclude Include="RYLShortDefenceWeaponControl.h">
<Filter>Creature Control Files\Castle</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,503 @@
// CreatureSize.h: interface for the CCreatureSize class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_CREATURESIZE_H__BBEA8409_2ADF_4341_B6EB_3D7628A334F9__INCLUDED_)
#define AFX_CREATURESIZE_H__BBEA8409_2ADF_4341_B6EB_3D7628A334F9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CCreatureSize
{
public:
vector3 vecMonsterMinBox[200];
vector3 vecMonsterMaxBox[200];
CCreatureSize()
{
vecMonsterMinBox[1]=vector3(-35.0f, 0.0f, -55.0f);
vecMonsterMaxBox[1]=vector3(35.0f, 0.0f, 65.0f);
vecMonsterMinBox[2]=vector3(-42.0f, 0.0f, -66.0f);
vecMonsterMaxBox[2]=vector3(42.0f, 0.0f, 78.0f);
vecMonsterMinBox[3]=vector3(-49.0f, 0.0f, -77.0f);
vecMonsterMaxBox[3]=vector3(49.0f, 0.0f, 91.0f);
vecMonsterMinBox[4]=vector3(-49.0f, 0.0f, -77.0f);
vecMonsterMaxBox[4]=vector3(49.0f, 0.0f, 91.0f);
vecMonsterMinBox[5]=vector3(-49.0f, 0.0f, -77.0f);
vecMonsterMaxBox[5]=vector3(49.0f, 0.0f, 91.0f);
vecMonsterMinBox[6]=vector3(-49.0f, 0.0f, -77.0f);
vecMonsterMaxBox[6]=vector3(49.0f, 0.0f, 91.0f);
vecMonsterMinBox[7]=vector3(-56.0f, 0.0f, -88.0f);
vecMonsterMaxBox[7]=vector3(56.0f, 0.0f, 104.0f);
vecMonsterMinBox[8]=vector3(-56.0f, 0.0f, -88.0f);
vecMonsterMaxBox[8]=vector3(56.0f, 0.0f, 104.0f);
vecMonsterMinBox[9]=vector3(-32.0f, 0.0f, -40.0f);
vecMonsterMaxBox[9]=vector3(32.0f, 0.0f, 40.0f);
vecMonsterMinBox[10]=vector3(-45.0f, 0.0f, -35.0f);
vecMonsterMaxBox[10]=vector3(35.0f, 0.0f, 55.0f);
vecMonsterMinBox[11]=vector3(-40.0f, 0.0f, -25.0f);
vecMonsterMaxBox[11]=vector3(40.0f, 0.0f, 25.0f);
vecMonsterMinBox[12]=vector3(-40.0f, 0.0f, -55.0f);
vecMonsterMaxBox[12]=vector3(30.0f, 0.0f, 20.0f);
vecMonsterMinBox[13]=vector3(-40.0f, 0.0f, -55.0f);
vecMonsterMaxBox[13]=vector3(30.0f, 0.0f, 20.0f);
vecMonsterMinBox[14]=vector3(-49.5f, 0.0f, -38.5f);
vecMonsterMaxBox[14]=vector3(38.5f, 0.0f, 60.5f);
vecMonsterMinBox[15]=vector3(-44.0f, 0.0f, -27.5f);
vecMonsterMaxBox[15]=vector3(44.0f, 0.0f, 27.5f);
vecMonsterMinBox[16]=vector3(-44.0f, 0.0f, -60.5f);
vecMonsterMaxBox[16]=vector3(33.0f, 0.0f, 22.0f);
vecMonsterMinBox[17]=vector3(-44.0f, 0.0f, -60.5f);
vecMonsterMaxBox[17]=vector3(33.0f, 0.0f, 22.0f);
vecMonsterMinBox[18]=vector3(-54.0f, 0.0f, -42.0f);
vecMonsterMaxBox[18]=vector3(42.0f, 0.0f, 66.0f);
vecMonsterMinBox[19]=vector3(-48.0f, 0.0f, -30.0f);
vecMonsterMaxBox[19]=vector3(48.0f, 0.0f, 30.0f);
vecMonsterMinBox[20]=vector3(-50.0f, 0.0f, -25.0f);
vecMonsterMaxBox[20]=vector3(65.0f, 0.0f, 155.0f);
vecMonsterMinBox[21]=vector3(-48.0f, 0.0f, -66.0f);
vecMonsterMaxBox[21]=vector3(36.0f, 0.0f, 24.0f);
vecMonsterMinBox[22]=vector3(-48.0f, 0.0f, -66.0f);
vecMonsterMaxBox[22]=vector3(36.0f, 0.0f, 24.0f);
vecMonsterMinBox[23]=vector3(-30.0f, 0.0f, -15.0f);
vecMonsterMaxBox[23]=vector3(35.0f, 0.0f, 150.0f);
vecMonsterMinBox[24]=vector3(-25.0f, 0.0f, -20.0f);
vecMonsterMaxBox[24]=vector3(25.0f, 0.0f, 35.0f);
vecMonsterMinBox[25]=vector3(-20.0f, 0.0f, -70.0f);
vecMonsterMaxBox[25]=vector3(15.0f, 0.0f, 55.0f);
vecMonsterMinBox[26]=vector3(-95.0f, 0.0f, -80.0f);
vecMonsterMaxBox[26]=vector3(95.0f, 0.0f, 100.0f);
vecMonsterMinBox[27]=vector3(-36.0f, 0.0f, -18.0f);
vecMonsterMaxBox[27]=vector3(42.0f, 0.0f, 180.0f);
vecMonsterMinBox[28]=vector3(-35.0f, 0.0f, -17.5f);
vecMonsterMaxBox[28]=vector3(24.5f, 0.0f, 45.5f);
vecMonsterMinBox[29]=vector3(-30.0f, 0.0f, -24.0f);
vecMonsterMaxBox[29]=vector3(30.0f, 0.0f, 42.0f);
vecMonsterMinBox[30]=vector3(-24.0f, 0.0f, -84.0f);
vecMonsterMaxBox[30]=vector3(18.0f, 0.0f, 66.0f);
vecMonsterMinBox[31]=vector3(-142.5f, 0.0f, -120.0f);
vecMonsterMaxBox[31]=vector3(142.5f, 0.0f, 150.0f);
vecMonsterMinBox[32]=vector3(-50.0f, 0.0f, -25.0f);
vecMonsterMaxBox[32]=vector3(35.0f, 0.0f, 65.0f);
vecMonsterMinBox[33]=vector3(-190.0f, 0.0f, -160.0f);
vecMonsterMaxBox[33]=vector3(190.0f, 0.0f, 200.0f);
vecMonsterMinBox[34]=vector3(-60.0f, 0.0f, -30.0f);
vecMonsterMaxBox[34]=vector3(42.0f, 0.0f, 78.0f);
vecMonsterMinBox[35]=vector3(-120.0f, 0.0f, -115.0f);
vecMonsterMaxBox[35]=vector3(95.0f, 0.0f, 120.0f);
vecMonsterMinBox[36]=vector3(-90.0f, 0.0f, -120.0f);
vecMonsterMaxBox[36]=vector3(90.0f, 0.0f, 80.0f);
vecMonsterMinBox[37]=vector3(-45.0f, 0.0f, -165.0f);
vecMonsterMaxBox[37]=vector3(55.0f, 0.0f, 80.0f);
vecMonsterMinBox[38]=vector3(-45.0f, 0.0f, -180.0f);
vecMonsterMaxBox[38]=vector3(50.0f, 0.0f, 90.0f);
vecMonsterMinBox[39]=vector3(-45.0f, 0.0f, -180.0f);
vecMonsterMaxBox[39]=vector3(50.0f, 0.0f, 90.0f);
vecMonsterMinBox[40]=vector3(-35.0f, 0.0f, -28.0f);
vecMonsterMaxBox[40]=vector3(35.0f, 0.0f, 49.0f);
vecMonsterMinBox[41]=vector3(-60.0f, 0.0f, -30.0f);
vecMonsterMaxBox[41]=vector3(42.0f, 0.0f, 78.0f);
vecMonsterMinBox[42]=vector3(-44.0f, 0.0f, -55.0f);
vecMonsterMaxBox[42]=vector3(44.0f, 0.0f, 55.0f);
vecMonsterMinBox[43]=vector3(-78.0f, 0.0f, -72.0f);
vecMonsterMaxBox[43]=vector3(60.0f, 0.0f, 78.0f);
vecMonsterMinBox[44]=vector3(-108.0f, 0.0f, -144.0f);
vecMonsterMaxBox[44]=vector3(108.0f, 0.0f, 96.0f);
vecMonsterMinBox[45]=vector3(-54.0f, 0.0f, -198.0f);
vecMonsterMaxBox[45]=vector3(66.0f, 0.0f, 96.0f);
vecMonsterMinBox[46]=vector3(-54.0f, 0.0f, -216.0f);
vecMonsterMaxBox[46]=vector3(60.0f, 0.0f, 108.0f);
vecMonsterMinBox[47]=vector3(-54.0f, 0.0f, -216.0f);
vecMonsterMaxBox[47]=vector3(60.0f, 0.0f, 108.0f);
vecMonsterMinBox[48]=vector3(-70.0f, 0.0f, -35.0f);
vecMonsterMaxBox[48]=vector3(49.0f, 0.0f, 91.0f);
vecMonsterMinBox[49]=vector3(-168.0f, 0.0f, -161.0f);
vecMonsterMaxBox[49]=vector3(133.0f, 0.0f, 168.0f);
vecMonsterMinBox[50]=vector3(-20.0f, 0.0f, -45.0f);
vecMonsterMaxBox[50]=vector3(20.0f, 0.0f, 140.0f);
vecMonsterMinBox[51]=vector3(-55.0f, 0.0f, -200.0f);
vecMonsterMaxBox[51]=vector3(45.0f, 0.0f, 60.0f);
vecMonsterMinBox[52]=vector3(-55.0f, 0.0f, -200.0f);
vecMonsterMaxBox[52]=vector3(45.0f, 0.0f, 60.0f);
vecMonsterMinBox[53]=vector3(-55.0f, 0.0f, -200.0f);
vecMonsterMaxBox[53]=vector3(45.0f, 0.0f, 60.0f);
vecMonsterMinBox[54]=vector3(-20.0f, 0.0f, -45.0f);
vecMonsterMaxBox[54]=vector3(20.0f, 0.0f, 140.0f);
vecMonsterMinBox[55]=vector3(-96.0f, 0.0f, -90.0f);
vecMonsterMaxBox[55]=vector3(96.0f, 0.0f, 108.0f);
vecMonsterMinBox[56]=vector3(-55.0f, 0.0f, -200.0f);
vecMonsterMaxBox[56]=vector3(45.0f, 0.0f, 60.0f);
vecMonsterMinBox[57]=vector3(-55.0f, 0.0f, -200.0f);
vecMonsterMaxBox[57]=vector3(45.0f, 0.0f, 60.0f);
vecMonsterMinBox[58]=vector3(-55.0f, 0.0f, -200.0f);
vecMonsterMaxBox[58]=vector3(45.0f, 0.0f, 60.0f);
vecMonsterMinBox[59]=vector3(-20.0f, 0.0f, -45.0f);
vecMonsterMaxBox[59]=vector3(20.0f, 0.0f, 145.0f);
vecMonsterMinBox[60]=vector3(-28.0f, 0.0f, -63.0f);
vecMonsterMaxBox[60]=vector3(28.0f, 0.0f, 203.0f);
vecMonsterMinBox[61]=vector3(-60.0f, 0.0f, -75.0f);
vecMonsterMaxBox[61]=vector3(60.0f, 0.0f, 75.0f);
vecMonsterMinBox[62]=vector3(-126.0f, 0.0f, -168.0f);
vecMonsterMaxBox[62]=vector3(126.0f, 0.0f, 112.0f);
vecMonsterMinBox[63]=vector3(-63.0f, 0.0f, -231.0f);
vecMonsterMaxBox[63]=vector3(77.0f, 0.0f, 112.0f);
vecMonsterMinBox[64]=vector3(-63.0f, 0.0f, -252.0f);
vecMonsterMaxBox[64]=vector3(70.0f, 0.0f, 126.0f);
vecMonsterMinBox[65]=vector3(-63.0f,0.0f, -252.0f);
vecMonsterMaxBox[65]=vector3(70.0f, 0.0f, 126.0f);
vecMonsterMinBox[66]=vector3(-70.0f,0.0f, -20.0f);
vecMonsterMaxBox[66]=vector3(70.0f, 0.0f, 70.0f);
vecMonsterMinBox[67]=vector3(-70.0f,0.0f, -20.0f);
vecMonsterMaxBox[67]=vector3(70.0f, 0.0f, 70.0f);
vecMonsterMinBox[68]=vector3(-112.0f,0.0f, -105.0f);
vecMonsterMaxBox[68]=vector3(112.0f, 0.0f, 126.0f);
vecMonsterMinBox[69]=vector3(-70.0f,0.0f, -20.0f);
vecMonsterMaxBox[69]=vector3(70.0f, 0.0f, 70.0f);
vecMonsterMinBox[70]=vector3(-70.0f,0.0f, -20.0f);
vecMonsterMaxBox[70]=vector3(70.0f, 0.0f, 70.0f);
vecMonsterMinBox[71]=vector3(-119.0f,0.0f, -49.0f);
vecMonsterMaxBox[71]=vector3(119.0f, 0.0f, 189.0f);
vecMonsterMinBox[72]=vector3(-168.0f,0.0f, -184.0f);
vecMonsterMaxBox[72]=vector3(88.0f, 0.0f, 192.0f);
vecMonsterMinBox[73]=vector3(-25.0f,0.0f, -20.0f);
vecMonsterMaxBox[73]=vector3(20.0f, 0.0f, 40.0f);
vecMonsterMinBox[74]=vector3(-75.0f,0.0f, -110.0f);
vecMonsterMaxBox[74]=vector3(60.0f, 0.0f, 90.0f);
vecMonsterMinBox[75]=vector3(-75.0f,0.0f, -110.0f);
vecMonsterMaxBox[75]=vector3(60.0f, 0.0f, 90.0f);
vecMonsterMinBox[76]=vector3(-25.0f,0.0f, -20.0f);
vecMonsterMaxBox[76]=vector3(20.0f, 0.0f, 40.0f);
vecMonsterMinBox[77]=vector3(-65.0f,0.0f, -50.0f);
vecMonsterMaxBox[77]=vector3(75.0f, 0.0f, 75.0f);
vecMonsterMinBox[78]=vector3(-70.0f,0.0f, -90.0f);
vecMonsterMaxBox[78]=vector3(30.0f, 0.0f, 45.0f);
vecMonsterMinBox[79]=vector3(-65.0f,0.0f, -50.0f);
vecMonsterMaxBox[79]=vector3(75.0f, 0.0f, 75.0f);
vecMonsterMinBox[80]=vector3(-65.0f,0.0f, -50.0f);
vecMonsterMaxBox[80]=vector3(75.0f, 0.0f, 75.0f);
vecMonsterMinBox[81]=vector3(-80.0f,0.0f, -65.0f);
vecMonsterMaxBox[81]=vector3(100.0f, 0.0f, 85.0f);
vecMonsterMinBox[82]=vector3(-55.0f,0.0f, -45.0f);
vecMonsterMaxBox[82]=vector3(55.0f, 0.0f, 70.0f);
vecMonsterMinBox[83]=vector3(-55.0f,0.0f, -45.0f);
vecMonsterMaxBox[83]=vector3(55.0f, 0.0f, 70.0f);
vecMonsterMinBox[84]=vector3(-20.0f,0.0f, -70.0f);
vecMonsterMaxBox[84]=vector3(15.0f, 0.0f, 55.0f);
vecMonsterMinBox[85]=vector3(-58.5f,0.0f, -36.0f);
vecMonsterMaxBox[85]=vector3(108.0f, 0.0f, 144.0f);
vecMonsterMinBox[86]=vector3(-71.5f,0.0f, -44.0f);
vecMonsterMaxBox[86]=vector3(132.0f, 0.0f, 176.0f);
vecMonsterMinBox[87]=vector3(-24.0f,0.0f, -84.0f);
vecMonsterMaxBox[87]=vector3(18.0f, 0.0f, 66.0f);
vecMonsterMinBox[88]=vector3(-240.0f,0.0f, -230.0f);
vecMonsterMaxBox[88]=vector3(190.0f, 0.0f, 240.0f);
vecMonsterMinBox[89]=vector3(-22.5f,0.0f, -52.5f);
vecMonsterMaxBox[89]=vector3(22.5f, 0.0f, 127.5f);
vecMonsterMinBox[90]=vector3(-66.0f,0.0f, -11.0f);
vecMonsterMaxBox[90]=vector3(82.5f, 0.0f, 66.0f);
vecMonsterMinBox[91]=vector3(-78.0f,0.0f, -72.0f);
vecMonsterMaxBox[91]=vector3(60.0f, 0.0f, 78.0f);
vecMonsterMinBox[92]=vector3(-98.0f,0.0f, -91.0f);
vecMonsterMaxBox[92]=vector3(147.0f, 0.0f, 140.0f);
vecMonsterMinBox[93]=vector3(-55.0f,0.0f, -45.0f);
vecMonsterMaxBox[93]=vector3(55.0f, 0.0f, 70.0f);
vecMonsterMinBox[94]=vector3(-91.0f,0.0f, -56.0f);
vecMonsterMaxBox[94]=vector3(168.0f, 0.0f, 224.0f);
vecMonsterMinBox[95]=vector3(-150.0f,0.0f, -65.0f);
vecMonsterMaxBox[95]=vector3(105.0f, 0.0f, 160.0f);
vecMonsterMinBox[96]=vector3(-130.0f,0.0f, -80.0f);
vecMonsterMaxBox[96]=vector3(240.0f, 0.0f, 320.0f);
vecMonsterMinBox[97]=vector3(-45.0f,0.0f, -105.0f);
vecMonsterMaxBox[97]=vector3(45.0f, 0.0f, 255.0f);
vecMonsterMinBox[98]=vector3(-150.0f,0.0f, -65.0f);
vecMonsterMaxBox[98]=vector3(105.0f, 0.0f, 160.0f);
vecMonsterMinBox[99]=vector3(-130.0f,0.0f, -55.0f);
vecMonsterMaxBox[99]=vector3(80.0f, 0.0f, 130.0f);
vecMonsterMinBox[100]=vector3(-115.0f,0.0f, -55.0f);
vecMonsterMaxBox[100]=vector3(80.0f, 0.0f, 75.0f);
vecMonsterMinBox[101]=vector3(-180.0f,0.0f, -78.0f);
vecMonsterMaxBox[101]=vector3(126.0f, 0.0f, 192.0f);
vecMonsterMinBox[102]=vector3(-156.0f,0.0f, -66.0f);
vecMonsterMaxBox[102]=vector3(96.0f, 0.0f, 156.0f);
vecMonsterMinBox[103]=vector3(-96.0f,0.0f, -16.0f);
vecMonsterMaxBox[103]=vector3(120.0f, 0.0f, 96.0f);
vecMonsterMinBox[104]=vector3(-138.0f,0.0f, -66.0f);
vecMonsterMaxBox[104]=vector3(96.0f, 0.0f, 90.0f);
vecMonsterMinBox[105]=vector3(-50.0f,0.0f, -25.0f);
vecMonsterMaxBox[105]=vector3(60.0f, 0.0f, 130.0f);
vecMonsterMinBox[106]=vector3(-50.0f,0.0f, -20.0f);
vecMonsterMaxBox[106]=vector3(45.0f, 0.0f, 40.0f);
vecMonsterMinBox[107]=vector3(-25.0f,0.0f, -35.0f);
vecMonsterMaxBox[107]=vector3(25.0f, 0.0f, 150.0f);
vecMonsterMinBox[108]=vector3(-25.0f,0.0f, -35.0f);
vecMonsterMaxBox[108]=vector3(25.0f, 0.0f, 150.0f);
vecMonsterMinBox[109]=vector3(-30.0f,0.0f, -35.0f);
vecMonsterMaxBox[109]=vector3(40.0f, 0.0f, 60.0f);
vecMonsterMinBox[110]=vector3(-30.0f,0.0f, -35.0f);
vecMonsterMaxBox[110]=vector3(40.0f, 0.0f, 60.0f);
vecMonsterMinBox[111]=vector3(-60.0f,0.0f, -30.0f);
vecMonsterMaxBox[111]=vector3(72.0f, 0.0f, 156.0f);
vecMonsterMinBox[112]=vector3(-60.0f,0.0f, -24.0f);
vecMonsterMaxBox[112]=vector3(54.0f, 0.0f, 48.0f);
vecMonsterMinBox[113]=vector3(-210.0f,0.0f, -91.0f);
vecMonsterMaxBox[113]=vector3(147.0f, 0.0f, 224.0f);
vecMonsterMinBox[114]=vector3(-182.0f,0.0f, -77.0f);
vecMonsterMaxBox[114]=vector3(112.0f, 0.0f, 182.0f);
vecMonsterMinBox[115]=vector3(-161.0f,0.0f, -77.0f);
vecMonsterMaxBox[115]=vector3(112.0f, 0.0f, 105.0f);
vecMonsterMinBox[116]=vector3(-85.0f,0.0f, -110.0f);
vecMonsterMaxBox[116]=vector3(85.0f, 0.0f, 230.0f);
vecMonsterMinBox[117]=vector3(-36.0f,0.0f, -42.0f);
vecMonsterMaxBox[117]=vector3(48.0f, 0.0f, 72.0f);
vecMonsterMinBox[118]=vector3(-36.0f,0.0f, -42.0f);
vecMonsterMaxBox[118]=vector3(48.0f, 0.0f, 72.0f);
vecMonsterMinBox[119]=vector3(-25.0f,0.0f, -35.0f);
vecMonsterMaxBox[119]=vector3(25.0f, 0.0f, 150.0f);
vecMonsterMinBox[120]=vector3(-95.0f,0.0f, 0.0f);
vecMonsterMaxBox[120]=vector3(95.0f, 0.0f, 165.0f);
vecMonsterMinBox[121]=vector3(-114.0f,0.0f, 0.0f);
vecMonsterMaxBox[121]=vector3(114.0f, 0.0f, 198.0f);
vecMonsterMinBox[122]=vector3(-25.0f,0.0f, -20.0f);
vecMonsterMaxBox[122]=vector3(20.0f, 0.0f, 40.0f);
vecMonsterMinBox[123]=vector3(-25.0f,0.0f, -20.0f);
vecMonsterMaxBox[123]=vector3(20.0f, 0.0f, 40.0f);
vecMonsterMinBox[124]=vector3(-65.0f,0.0f, -50.0f);
vecMonsterMaxBox[124]=vector3(75.0f, 0.0f, 75.0f);
vecMonsterMinBox[125]=vector3(-85.0f,0.0f, -110.0f);
vecMonsterMaxBox[125]=vector3(85.0f, 0.0f, 230.0f);
vecMonsterMinBox[126]=vector3(-133.0f,0.0f, 0.0f);
vecMonsterMaxBox[126]=vector3(133.0f, 0.0f, 231.0f);
vecMonsterMinBox[127]=vector3(-70.0f,0.0f, -35.0f);
vecMonsterMaxBox[127]=vector3(84.0f, 0.0f, 182.0f);
vecMonsterMinBox[128]=vector3(-70.0f,0.0f, -28.0f);
vecMonsterMaxBox[128]=vector3(63.0f, 0.0f, 56.0f);
vecMonsterMinBox[129]=vector3(-42.0f,0.0f, -49.0f);
vecMonsterMaxBox[129]=vector3(56.0f, 0.0f, 84.0f);
vecMonsterMinBox[130]=vector3(-42.0f,0.0f, -49.0f);
vecMonsterMaxBox[130]=vector3(56.0f, 0.0f, 84.0f);
vecMonsterMinBox[131]=vector3(-80.0f,0.0f, -40.0f);
vecMonsterMaxBox[131]=vector3(96.0f, 0.0f, 208.0f);
vecMonsterMinBox[132]=vector3(-84.5f,0.0f, -78.0f);
vecMonsterMaxBox[132]=vector3(65.0f, 0.0f, 84.5f);
vecMonsterMinBox[133]=vector3(-104.0f,0.0f, -96.0f);
vecMonsterMaxBox[133]=vector3(80.0f, 0.0f, 104.0f);
vecMonsterMinBox[134]=vector3(-104.0f,0.0f, -96.0f);
vecMonsterMaxBox[134]=vector3(80.0f, 0.0f, 104.0f);
vecMonsterMinBox[135]=vector3(-104.0f,0.0f, -96.0f);
vecMonsterMaxBox[135]=vector3(80.0f, 0.0f, 104.0f);
vecMonsterMinBox[136]=vector3(-80.0f,0.0f, -70.0f);
vecMonsterMaxBox[136]=vector3(70.0f, 0.0f, 145.0f);
vecMonsterMinBox[137]=vector3(-80.0f,0.0f, -55.0f);
vecMonsterMaxBox[137]=vector3(60.0f, 0.0f, 115.0f);
vecMonsterMinBox[138]=vector3(-240.0f,0.0f, -262.5f);
vecMonsterMaxBox[138]=vector3(405.0f, 0.0f, 225.0f);
vecMonsterMinBox[139]=vector3(-250.0f,0.0f, -205.0f);
vecMonsterMaxBox[139]=vector3(195.0f, 0.0f, 135.0f);
vecMonsterMinBox[140]=vector3(-25.0f,0.0f, -25.0f);
vecMonsterMaxBox[140]=vector3(25.0f, 0.0f, 25.0f);
vecMonsterMinBox[141]=vector3(-145.0f,0.0f, -280.0f);
vecMonsterMaxBox[141]=vector3(135.0f, 0.0f, 230.0f);
vecMonsterMinBox[142]=vector3(-40.0f,0.0f, -90.0f);
vecMonsterMaxBox[142]=vector3(40.0f, 0.0f, 280.0f);
vecMonsterMinBox[143]=vector3(-40.0f,0.0f, -90.0f);
vecMonsterMaxBox[143]=vector3(40.0f, 0.0f, 290.0f);
vecMonsterMinBox[144]=vector3(-50.0f,0.0f, -70.0f);
vecMonsterMaxBox[144]=vector3(50.0f, 0.0f, 300.0f);
vecMonsterMinBox[145]=vector3(-50.0f,0.0f, -70.0f);
vecMonsterMaxBox[145]=vector3(50.0f, 0.0f, 300.0f);
vecMonsterMinBox[146]=vector3(-81.0f,0.0f, -108.0f);
vecMonsterMaxBox[146]=vector3(81.0f, 0.0f, 72.0f);
vecMonsterMinBox[147]=vector3(-40.5f,0.0f, -148.5f);
vecMonsterMaxBox[147]=vector3(49.5f, 0.0f, 72.0f);
vecMonsterMinBox[148]=vector3(-30.0f,0.0f, -37.5f);
vecMonsterMaxBox[148]=vector3(30.0f, 0.0f, 37.5f);
vecMonsterMinBox[149]=vector3(-45.0f,0.0f, -22.5f);
vecMonsterMaxBox[149]=vector3(58.5f, 0.0f, 139.5f);
vecMonsterMinBox[150]=vector3(-72.0f,0.0f, -67.5f);
vecMonsterMaxBox[150]=vector3(72.0f, 0.0f, 81.0f);
vecMonsterMinBox[151]=vector3(-49.5f,0.0f, -180.0f);
vecMonsterMaxBox[151]=vector3(40.5f, 0.0f, 54.0f);
vecMonsterMinBox[152]=vector3(-54.0f,0.0f, -9.0f);
vecMonsterMaxBox[152]=vector3(67.5f, 0.0f, 54.0f);
vecMonsterMinBox[153]=vector3(-84.0f,0.0f, -78.0f);
vecMonsterMaxBox[153]=vector3(126.0f, 0.0f, 120.0f);
vecMonsterMinBox[154]=vector3(-96.0f,0.0f, -84.0f);
vecMonsterMaxBox[154]=vector3(84.0f, 0.0f, 174.0f);
vecMonsterMinBox[155]=vector3(-96.0f,0.0f, -66.0f);
vecMonsterMaxBox[155]=vector3(72.0f, 0.0f, 138.0f);
vecMonsterMinBox[156]=vector3(-95.0f,0.0f, 0.0f);
vecMonsterMaxBox[156]=vector3(95.0f, 0.0f, 165.0f);
vecMonsterMinBox[157]=vector3(-90.0f,0.0f, -120.0f);
vecMonsterMaxBox[157]=vector3(90.0f, 0.0f, 80.0f);
vecMonsterMinBox[158]=vector3(-45.0f,0.0f, -165.0f);
vecMonsterMaxBox[158]=vector3(55.0f, 0.0f, 80.0f);
vecMonsterMinBox[159]=vector3(-45.0f,0.0f, -22.5f);
vecMonsterMaxBox[159]=vector3(58.5f, 0.0f, 139.5f);
}
~CCreatureSize() { }
};
#endif // !defined(AFX_CREATURESIZE_H__BBEA8409_2ADF_4341_B6EB_3D7628A334F9__INCLUDED_)

View File

@@ -0,0 +1,320 @@
#include "stdafx.h"
#include "InputDevice.h"
CInputDevice::CInputDevice()
: m_pDirectInput(NULL), m_pDIDeviceKeyboard(NULL), m_pDIDeviceMouse(NULL), m_pDIDeviceJoystick(NULL),
m_bKeyboard(false), m_bMouse(false), m_bJoystick(false), m_bForcefeedback(false), m_ucSliderCount(0),
m_lpdiEffect(NULL), m_ucPOVCount(0), m_ucButtionCount(0)
{
memset(m_aKey, 0, sizeof(unsigned char)*256);
memset(&m_dims2, 0, sizeof(DIMOUSESTATE2));
memset(&m_dijs2, 0, sizeof(DIJOYSTATE2));
for (unsigned char ucIndex = 0; ucIndex < 4; ucIndex++)
{
m_dijs2.rgdwPOV[ucIndex] = -1;
}
}
CInputDevice::~CInputDevice()
{
}
bool CInputDevice::Initialize(HWND hWnd, bool bKeyboard, bool bMouse, bool bJoystick)
{
HRESULT hr = DirectInput8Create(
GetModuleHandle(NULL),
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(VOID**)&m_pDirectInput,
NULL);
DI_FAILED(hr);
m_hWnd = hWnd;
// 키보드 생성
if (true == bKeyboard)
{
hr = m_pDirectInput->CreateDevice(GUID_SysKeyboard, &m_pDIDeviceKeyboard, NULL);
DI_FAILED(hr);
hr = m_pDIDeviceKeyboard->SetDataFormat(&c_dfDIKeyboard);
DI_FAILED(hr);
hr = m_pDIDeviceKeyboard->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE);
DI_FAILED(hr);
m_pDIDeviceKeyboard->Acquire();
m_bKeyboard = bKeyboard;
}
// 마우스 생성
if (true == bMouse)
{
hr = m_pDirectInput->CreateDevice(GUID_SysMouse, &m_pDIDeviceMouse, NULL);
DI_FAILED(hr);
hr = m_pDIDeviceMouse->SetDataFormat(&c_dfDIMouse2);
DI_FAILED(hr);
hr = m_pDIDeviceMouse->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
DI_FAILED(hr);
m_pDIDeviceMouse->Acquire();
m_bMouse = bMouse;
}
// 조이스틱 생성
if (true == bJoystick)
{
hr = m_pDirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY);
DI_FAILED(hr);
}
return true;
}
void CInputDevice::Release(void)
{
if (NULL != m_pDIDeviceKeyboard)
{
m_pDIDeviceKeyboard->Unacquire();
SAFE_RELEASE(m_pDIDeviceKeyboard);
}
if (NULL != m_pDIDeviceMouse)
{
m_pDIDeviceMouse->Unacquire();
SAFE_RELEASE(m_pDIDeviceMouse);
}
if (NULL != m_lpdiEffect)
{
m_lpdiEffect->Stop();
SAFE_RELEASE(m_lpdiEffect);
}
if (NULL != m_pDIDeviceJoystick)
{
m_pDIDeviceJoystick->Unacquire();
SAFE_RELEASE(m_pDIDeviceJoystick);
}
SAFE_RELEASE(m_pDirectInput);
}
void CInputDevice::Process(void)
{
HRESULT hr;
// 키보드 처리
if (NULL != m_pDIDeviceKeyboard && true == m_bKeyboard)
{
ZeroMemory(m_aKey, sizeof(m_aKey));
hr = m_pDIDeviceKeyboard->GetDeviceState(sizeof(m_aKey), m_aKey);
if (FAILED(hr))
{
hr = m_pDIDeviceKeyboard->Acquire();
if (hr == DIERR_OTHERAPPHASPRIO || hr == DIERR_NOTACQUIRED)
{
}
}
}
// 마우스 처리
if (NULL != m_pDIDeviceMouse && true == m_bMouse)
{
ZeroMemory(&m_dims2, sizeof(DIMOUSESTATE2));
hr = m_pDIDeviceMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &m_dims2);
if (FAILED(hr))
{
hr = m_pDIDeviceMouse->Acquire();
if (hr==DIERR_OTHERAPPHASPRIO || hr==DIERR_NOTACQUIRED)
{
}
}
}
// 조이스틱 처리
if (NULL != m_pDIDeviceJoystick && true == m_bJoystick)
{
hr = m_pDIDeviceJoystick->Poll();
if (FAILED(hr))
{
hr = m_pDIDeviceJoystick->Acquire();
if (hr==DIERR_OTHERAPPHASPRIO || hr==DIERR_NOTACQUIRED)
{
}
}
else
{
ZeroMemory(&m_dijs2, sizeof(DIJOYSTATE2));
hr = m_pDIDeviceJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &m_dijs2);
if (FAILED(hr))
{
hr = m_pDIDeviceJoystick->Acquire();
if (hr==DIERR_OTHERAPPHASPRIO || hr==DIERR_NOTACQUIRED)
{
}
}
}
}
}
BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext)
{
CInputDevice* pInputDevice = CInputDevice::GetInstance();
HRESULT hr = pInputDevice->m_pDirectInput->CreateDevice(pdidInstance->guidInstance, &pInputDevice->m_pDIDeviceJoystick, NULL);
DI_FAILED(hr);
hr = pInputDevice->m_pDIDeviceJoystick->SetDataFormat(&c_dfDIJoystick2);
DI_FAILED(hr);
hr = pInputDevice->m_pDIDeviceJoystick->SetCooperativeLevel(pInputDevice->GetWindowHandle(), DISCL_EXCLUSIVE | DISCL_FOREGROUND);
DI_FAILED(hr);
DIDEVCAPS didevcaps;
memset(&didevcaps, 0, sizeof(DIDEVCAPS));
didevcaps.dwSize = sizeof(DIDEVCAPS);
hr = pInputDevice->m_pDIDeviceJoystick->GetCapabilities(&didevcaps);
DI_FAILED(hr);
if (didevcaps.dwFlags & DIDC_FORCEFEEDBACK)
{
pInputDevice->m_bForcefeedback = true;
}
if (pInputDevice->m_bForcefeedback)
{
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = FALSE;
hr = pInputDevice->m_pDIDeviceJoystick->SetProperty( DIPROP_AUTOCENTER, &dipdw.diph);
DI_FAILED(hr);
hr = pInputDevice->m_pDIDeviceJoystick->EnumObjects(EnumAxesCallback,
(VOID*)&pInputDevice->m_dwNumForceFeedbackAxis, DIDFT_AXIS);
DI_FAILED(hr);
if (pInputDevice->m_dwNumForceFeedbackAxis > 2)
{
pInputDevice->m_dwNumForceFeedbackAxis = 2;
}
DWORD rgdwAxes[2] = { DIJOFS_X, DIJOFS_Y };
LONG rglDirection[2] = { 0, 0 };
DICONSTANTFORCE cf = { 0 };
DIEFFECT eff;
ZeroMemory(&eff, sizeof(eff));
eff.dwSize = sizeof(DIEFFECT);
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
eff.dwDuration = INFINITE;
eff.dwSamplePeriod = 0;
eff.dwGain = DI_FFNOMINALMAX;
eff.dwTriggerButton = DIEB_NOTRIGGER;
eff.dwTriggerRepeatInterval = 0;
eff.cAxes = pInputDevice->m_dwNumForceFeedbackAxis;
eff.rgdwAxes = rgdwAxes;
eff.rglDirection = rglDirection;
eff.lpEnvelope = 0;
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
eff.lpvTypeSpecificParams = &cf;
eff.dwStartDelay = 0;
hr = pInputDevice->m_pDIDeviceJoystick->CreateEffect( GUID_ConstantForce,
&eff, &pInputDevice->m_lpdiEffect, NULL);
DI_FAILED(hr);
if (!pInputDevice->m_lpdiEffect)
{
return FALSE;
}
}
pInputDevice->m_ucButtionCount = static_cast<unsigned char>(didevcaps.dwButtons);
hr = pInputDevice->m_pDIDeviceJoystick->EnumObjects(EnumObjectsCallback,
(VOID*)pInputDevice->GetWindowHandle(), DIDFT_ALL);
DI_FAILED(hr);
pInputDevice->m_pDIDeviceJoystick->Acquire();
pInputDevice->m_bJoystick = true;
return TRUE;
}
BOOL CALLBACK EnumObjectsCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext)
{
CInputDevice* pInputDevice = CInputDevice::GetInstance();
if (pdidoi->dwType & DIDFT_AXIS)
{
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType;
diprg.lMin = -1000;
diprg.lMax = +1000;
HRESULT hr = pInputDevice->m_pDIDeviceJoystick->SetProperty(DIPROP_RANGE, &diprg.diph );
DI_FAILED(hr);
}
if (GUID_Slider == pdidoi->guidType)
{
pInputDevice->m_ucSliderCount++;
}
if (GUID_POV == pdidoi->guidType)
{
pInputDevice->m_ucPOVCount++;
}
return TRUE;
}
BOOL CALLBACK EnumAxesCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext )
{
DWORD* pdwNumForceFeedbackAxis = (DWORD*) pContext;
if( (pdidoi->dwFlags & DIDOI_FFACTUATOR) != 0 )
{
(*pdwNumForceFeedbackAxis)++;
}
return DIENUM_CONTINUE;
}

View File

@@ -0,0 +1,117 @@
#pragma once
#include <dinput.h>
#define DI_FAILED(hr) \
{ \
if (FAILED(hr)) \
{ \
return false; \
} \
}
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
/*!
\class CInputDevice
DX Input을 기반으로 입력 처리를 하는 클래스
*/
class CInputDevice
{
public:
static CInputDevice* GetInstance()
{
static CInputDevice inputDevice;
return &inputDevice;
}
/*!
\brief DX Input 초기화 함수
\param hWnd 윈도우 핸들
\param bKeyboard 키보드 사용 유무
\param bMouse 마우스 사용 유무
\param bJoystick 조이스틱 사용 유무
*/
bool Initialize(HWND hWnd, bool bKeyboard, bool bMouse, bool bJoystick);
//! DX Input Release 함수
void Release(void);
//! 입력 처리 하는 함수
void Process(void);
//! 윈도우 핸들을 넘겨 주는 함수
inline HWND GetWindowHandle(void) { return m_hWnd; }
//! 키보드 사용 유무를 넘겨 주는 함수
inline bool IsKeyboard(void) { return m_bKeyboard; }
//! 마우스 사용 유무를 넘겨 주는 함수
inline bool IsMouse(void) { return m_bMouse; }
//! 조이스틱 사용 유무를 넘겨 주는 함수
inline bool IsJoystick(void) { return m_bJoystick; }
//! 키 상태를 넘겨 주는 함수
inline unsigned char* GeteyboardState(void) { return m_aKey; }
//! 마우스 상태를 넘겨 주는 함수
inline DIMOUSESTATE2* GetMouseState(void) { return &m_dims2; }
//! 조이스틱 상태를 넘겨 주는 함수
inline DIJOYSTATE2* GetJoyState(void) { return &m_dijs2; }
//! 조이스틱 버튼에 수를 넘겨 주는 함수
inline unsigned char GetJoyButtonCount(void) { return m_ucButtionCount; }
//! 조이스틱 Force Feedback Axis 수를 넘겨 주는 함수
unsigned long GetNumForceFeedbackAxis(void) { return m_dwNumForceFeedbackAxis; }
//! 조이스틱 Force Feedback 지원 여부를 넘겨 주는 함수
inline bool GetForceFeedBack(void) { return m_bForcefeedback; }
//! 조이스틱 Force Feedback 지원 여부 설정함수.
inline void SetForceFeedBack(bool bForceFeedBack) { m_bForcefeedback = bForceFeedBack; }
friend class CInputJoystick;
friend class CInputMouse;
friend class CInputKeyboard;
private:
//! 조이스틱 생성 콜백 함수
friend BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext);
//! 조이스틱 오브젝트 콜백 함수(버튼, Slider, POV).
friend BOOL CALLBACK EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext );
//! 조이스틱 Axix 콜백 함수.
friend BOOL CALLBACK EnumAxesCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext );
private:
CInputDevice();
~CInputDevice();
HWND m_hWnd; //!< 윈도우 핸들
IDirectInput8* m_pDirectInput; //!< 다이렉트 인풋
IDirectInputDevice8* m_pDIDeviceKeyboard; //!< 키보드 다이렉트 인풋 디바이스
IDirectInputDevice8* m_pDIDeviceMouse; //!< 마우스 다이렉트 인풋 디바이스
IDirectInputDevice8* m_pDIDeviceJoystick; //!< 조이스틱 다이렉트 인풋 디바이스
bool m_bKeyboard; //!< 키보드 사용 유무
bool m_bMouse; //!< 마우스 사용 유무
bool m_bJoystick; //!< 조이스틱 사용 유무
bool m_bForcefeedback; //!< Force Feedback 사용 유무
unsigned char m_aKey[256]; //!< 키 입력을 저장하는 변수
DIMOUSESTATE2 m_dims2; //!< 마우스 정보를 저장하는 변수
DIJOYSTATE2 m_dijs2;
unsigned char m_ucSliderCount; //!< Slider Controls 수.
unsigned char m_ucPOVCount; //!< POV Controls 수.
unsigned char m_ucButtionCount; //!< Buttons 수.
unsigned long m_dwNumForceFeedbackAxis; //!< Force Feed Back Axis 수.
LPDIRECTINPUTEFFECT m_lpdiEffect; //!< Force Feed Back 사용하는 Effect.
};

View File

@@ -0,0 +1,195 @@
#include "InputDevice.h"
#include "InputJoystick.h"
#include <math.h>
CInputJoystick::CInputJoystick()
{
m_Sensitivity = 200;
}
CInputJoystick::~CInputJoystick()
{
}
CInputJoystick* CInputJoystick::GetInstance()
{
static CInputJoystick inputJoystick;
return &inputJoystick;
}
bool CInputJoystick::GetCheckInputJoystick()
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
for (unsigned char ucKey = 0; ucKey < CInputDevice::GetInstance()->GetJoyButtonCount(); ucKey++)
{
if (GetJoyButton(ucKey))
{
return true;
}
}
if (GetX() || GetY() || GetZ())
{
return true;
}
if (GetRotationZ())
{
return true;
}
if (GetPOV())
{
return true;
}
return false;
}
bool CInputJoystick::GetJoyButton(unsigned char ucKey)
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
if (ucKey < CInputDevice::GetInstance()->GetJoyButtonCount())
{
if ( pdijs2 ->rgbButtons[ucKey] & 0x80 )
{
return true;
}
}
return false;
}
unsigned long CInputJoystick::GetPOV()
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
int iPOV = (int)pdijs2->rgdwPOV[0];
unsigned long dwKey = 0;
if (iPOV!=-1)
{
iPOV = iPOV / 100;
if (iPOV >= 0 && iPOV <= 360)
{
switch (iPOV)
{
case 0:
dwKey |= POV_UP;
break;
case 90:
dwKey |= POV_RIGHT;
break;
case 180:
dwKey |= POV_DOWN;
break;
case 270:
dwKey |= POV_LEFT;
break;
case 45:
dwKey |= POV_UP;
dwKey |= POV_RIGHT;
break;
case 135:
dwKey |= POV_DOWN;
dwKey |= POV_RIGHT;
break;
case 225:
dwKey |= POV_DOWN;
dwKey |= POV_LEFT;
break;
case 315:
dwKey |= POV_UP;
dwKey |= POV_LEFT;
break;
}
return dwKey;
}
}
return 0;
}
void CInputJoystick::StartForceFeedback(long lForceX, long lForceY, unsigned long dwTick)
{
CInputDevice* pInputDevice = CInputDevice::GetInstance();
if (pInputDevice->GetForceFeedBack())
{
LONG rglDirection[2] = { 0, 0 };
DICONSTANTFORCE cf;
if( pInputDevice->GetNumForceFeedbackAxis() == 1 )
{
cf.lMagnitude = lForceX;
rglDirection[0] = 0;
}
else
{
rglDirection[0] = lForceX;
rglDirection[1] = lForceY;
cf.lMagnitude = (unsigned long)sqrt((double)(lForceX*lForceX + lForceY*lForceY));
}
DIEFFECT eff;
ZeroMemory( &eff, sizeof(eff) );
eff.dwSize = sizeof(DIEFFECT);
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
eff.cAxes = CInputDevice::GetInstance()->GetNumForceFeedbackAxis();
eff.rglDirection = rglDirection;
eff.lpEnvelope = 0;
eff.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
eff.lpvTypeSpecificParams = &cf;
eff.dwStartDelay = 0;
eff.dwDuration = dwTick*1000;
pInputDevice->m_lpdiEffect->SetParameters( &eff, DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_DURATION | DIEP_START );
pInputDevice->m_pDIDeviceJoystick->Acquire();
pInputDevice->m_lpdiEffect->Start(1, 0);
}
}
void CInputJoystick::StopForceFeedback()
{
CInputDevice* pInputDevice = CInputDevice::GetInstance();
if (pInputDevice->GetForceFeedBack())
{
pInputDevice->m_lpdiEffect->Stop();
}
}
long CInputJoystick::GetX()
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
return pdijs2->lX / GetSensitivity();
}
long CInputJoystick::GetY()
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
return pdijs2->lY / GetSensitivity();
}
long CInputJoystick::GetZ()
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
return pdijs2->lZ / GetSensitivity();
}
long CInputJoystick::GetRotationZ()
{
DIJOYSTATE2* pdijs2 = CInputDevice::GetInstance()->GetJoyState();
return pdijs2->lRz / GetSensitivity();
}

View File

@@ -0,0 +1,62 @@
#pragma once
/*!
\class CInputJoystick
조이스틱 관련 클래스.
*/
class CInputJoystick
{
public:
static CInputJoystick* GetInstance();
//! 조이스틱에 입력이 있는지 체크하는 함수.
bool GetCheckInputJoystick(void);
//! 조이스틱 방향키 입력 얻는 함수
unsigned long GetPOV(void);
//! 조이스틱 버튼 입력 얻는 함수
bool GetJoyButton(unsigned char ucKey);
//! 조이스틱 X 값.
long GetX(void);
//! 조이스틱 Y 값.
long GetY(void);
//! 조이스틱 Z 값.
long GetZ(void);
//! 조이스틱 회전 Z 값.
long GetRotationZ();
//! 조이스틱 감도 설정 함수
void SetSensitivity(unsigned char cFactor) { m_Sensitivity = (cFactor > 1) ? cFactor : 1; }
unsigned char GetSensitivity() { return m_Sensitivity; }
/*!
\brief 조이스틱 Force Feedback 시작함수.
\param lForceX 진동값.
\param lForceY 진동값(축이 2개일때 사용).
\param dwTick 진동 시간(단위 : Tick).
*/
void StartForceFeedback(long lForceX, long lForceY, unsigned long dwTick);
//! 조이스틱 Force Feedback 정지함수.
void StopForceFeedback(void);
enum Const
{
POV_LEFT = 0x01,
POV_RIGHT = 0x02,
POV_UP = 0x04,
POV_DOWN = 0x08
};
unsigned char m_Sensitivity; // 감도
CInputJoystick();
~CInputJoystick();
};

View File

@@ -0,0 +1,28 @@
#include "InputDevice.h"
#include "InputKeyboard.h"
CInputKeyboard::CInputKeyboard()
{
}
CInputKeyboard::~CInputKeyboard()
{
}
CInputKeyboard* CInputKeyboard::GetInstance()
{
static CInputKeyboard inputKeyboard;
return &inputKeyboard;
}
bool CInputKeyboard::GetKeyPress(unsigned char ucKey)
{
unsigned char* pKey = CInputDevice::GetInstance()->GeteyboardState();
if (pKey[ucKey] & 0x80)
{
return true;
}
return false;
}

View File

@@ -0,0 +1,19 @@
#pragma once
/*!
\class CInputKeyboard
키보드 관련 클래스.
*/
class CInputKeyboard
{
public:
static CInputKeyboard* GetInstance();
//! 키 입력 함수
bool GetKeyPress(unsigned char ucKey);
CInputKeyboard();
~CInputKeyboard();
};

View File

@@ -0,0 +1,61 @@
#include "InputDevice.h"
#include "InputMouse.h"
CInputMouse::CInputMouse()
{
}
CInputMouse::~CInputMouse()
{
}
CInputMouse* CInputMouse::GetInstance()
{
static CInputMouse inputMouse;
return &inputMouse;
}
bool CInputMouse::GetLButtonDown()
{
DIMOUSESTATE2* pdms = CInputDevice::GetInstance()->GetMouseState();
if (pdms->rgbButtons[0])
{
return true;
}
return false;
}
bool CInputMouse::GetRButtonDown()
{
DIMOUSESTATE2* pdms = CInputDevice::GetInstance()->GetMouseState();
if (pdms->rgbButtons[1])
{
return true;
}
return false;
}
int CInputMouse::GetMousePosX()
{
DIMOUSESTATE2* pdms = CInputDevice::GetInstance()->GetMouseState();
return pdms->lX;
}
int CInputMouse::GetMousePosY()
{
DIMOUSESTATE2* pdms = CInputDevice::GetInstance()->GetMouseState();
return pdms->lY;
}
int CInputMouse::GetMouseWheelPos()
{
DIMOUSESTATE2* pdms = CInputDevice::GetInstance()->GetMouseState();
return pdms->lZ;
}

View File

@@ -0,0 +1,31 @@
#pragma once
/*!
\class CInputJoystick
마우스 관련 클래스.
*/
class CInputMouse
{
public:
static CInputMouse* GetInstance();
//! 마우스에 이동한 만큼에 값을 넘겨 주는 함수
int GetMousePosX(void);
//! 마우스에 이동한 만큼에 값을 넘겨 주는 함수
int GetMousePosY(void);
//! 마우스에 휠 이동한 만큼에 값을 넘겨 주는 함수
int GetMouseWheelPos(void);
//! 마우스에 L 버튼이 다운이 되었는지 넘겨 주는 함수
bool GetLButtonDown(void);
//! 마우스에 R 버튼이 다운이 되었는지 넘겨 주는 함수
bool GetRButtonDown(void);
CInputMouse();
~CInputMouse();
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,66 @@
//================================================================
//
// Name : RYLCharacterControl.h
// Desc : ij¸¯ÅÍ ÄÁÆ®·Ñ
// Date : 2004. 05. 17
//
//================================================================
#ifndef __RYL_CHARACTERCONTROL_H__
#define __RYL_CHARACTERCONTROL_H__
#include "RYLObjectControl.h"
class CRYLCharacterControl
{
private :
CCharacterControl* m_lpObjControl ;
RYLCreature* m_lpCreature;
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
BOOL m_bLeftMousePress;
BOOL m_bRightMousePress;
BOOL m_bClickPlayerAndNpc;
BOOL m_bClickSkill;
unsigned long m_dwNormalTargetID;
unsigned long m_dwSpecialTargetID;
BOOL m_bLeftClickDown;
bool m_bKeyPress;
public :
CRYLCharacterControl( CCharacterControl* lpObjControl ) ;
~CRYLCharacterControl() ;
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int nMouseX = 0,int nMouseY = 0 ) ;
VOID MouseClickModeSelfCharacterUpdate( BOOL bKeyAble, BOOL bEdge, int nMouseX, int nMouseY ) ;
RYLCreature* MouseClickModeSelectSpecialTarget( RYLCreature* pCreature, int nMouseX, int nMouseY );
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
VOID RestoreCamera() ;
RYLCreature* GetCreature() { return m_lpCreature; }
CCharacterControl *GetCreatureControl() { return m_lpObjControl; }
VOID SetCreature( RYLCreature* pCreature ) { m_lpCreature = pCreature; }
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
} ;
#endif //__RYL_CHARACTERCONTROL_H__

View File

@@ -0,0 +1,264 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLCharacterDataManager.cpp
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: contain and manage characters's data
//
// Date: 2004. 3. 26. ( Fri )
//--------------------------------------------------------------------------------------------------------------------------
#include "RYLCharacterDataManager.h"
#include <algorithm>
#include "GMMemory.h"
//--------------------------------------------------------------------------------------------------------------------------
// functors
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// ftDeleteCharDataMemory() : Container 원소 메모리 날리기
static void ftDeleteCharDataMemory( CharDataNode* pObject )
{
delete pObject;
pObject = NULL;
}
//--------------------------------------------------------------------------------------------------------------------------
// FindFreedNode() : Cantainer의 원소들 중에 쓰이지 않는 노드 찾기
static bool ftFindFreeNode( const CharDataNode* node )
{
if( !node->m_bIsUsingNode )
return true;
return false;
}
//--------------------------------------------------------------------------------------------------------------------------
// class ftFindCharDataByID : ID로 CharData list에서 node 찾기
class ftFindCharDataByID
{
private:
unsigned long m_ulCharID;
public:
ftFindCharDataByID( unsigned long ulCharID ) : m_ulCharID( ulCharID )
{
}
bool operator()( const CharDataNode* node ) const
{
if( node->m_ulCharID == m_ulCharID )
return true;
return false;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLCharacterDataManager
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
RYLCharacterDataManager* RYLCharacterDataManager::m_pInstance = NULL; // initialize static member variable
//--------------------------------------------------------------------------------------------------------------------------
// constructor, destructor
//--------------------------------------------------------------------------------------------------------------------------
RYLCharacterDataManager::RYLCharacterDataManager( unsigned int unCharPoolMax )
{
m_ulCharCount = 0;
InitCharDataManager( unCharPoolMax );
}
RYLCharacterDataManager::~RYLCharacterDataManager()
{
DeleteAllCharData();
}
//--------------------------------------------------------------------------------------------------------------------------
// member functions
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::InitCharDataManager()
void RYLCharacterDataManager::InitCharDataManager( unsigned int unMaxCash )
{
// clear pool
if( !m_lstCharData.empty() )
{
for_each( m_lstCharData.begin(), m_lstCharData.end(), ftDeleteCharDataMemory );
}
// allocate pool
m_unMaxCash = unMaxCash;
/*for( unsigned int i = 0 ; i < m_unMaxCash ; ++i )
{
CharDataNode* pNode = new CharDataNode;
m_lstCharData.push_back( pNode );
}*/
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::AddCharData()
CharDataNode* RYLCharacterDataManager::AddCharData( CharDataNode* pNode )
{
// if added character is already exist in list, return it's node ID
list<CharDataNode*>::iterator iter = find_if( m_lstCharData.begin(), m_lstCharData.end(), ftFindCharDataByID( pNode->m_ulCharID ) );
if( iter != m_lstCharData.end() )
{
delete pNode;
pNode = NULL;
(*iter)->m_bIsUsingNode = true;
return (*iter);
}
++m_ulCharCount;
pNode->m_ulNodeID = m_ulCharCount;
pNode->m_bIsUsingNode = true; // turn on 'using flag'
// find free node
iter = find_if( m_lstCharData.begin(), m_lstCharData.end(), ftFindFreeNode );
if( iter != m_lstCharData.end() )
{
// if free node exist
*(*iter) = *pNode;
delete pNode ;
pNode = NULL ;
pNode = (*iter) ;
}
else
{
m_lstCharData.push_back( pNode );
}
return pNode;
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::DeleteCharData()
void RYLCharacterDataManager::DeleteCharData( unsigned long ulCharID )
{
list<CharDataNode*>::iterator iter = find_if( m_lstCharData.begin(), m_lstCharData.end(), ftFindCharDataByID( ulCharID ) );
if( iter != m_lstCharData.end() )
{
if( m_lstCharData.size() > m_unMaxCash )
{
ftDeleteCharDataMemory( (*iter) );
m_lstCharData.erase( iter );
}
else
{
(*iter)->m_bIsUsingNode = false;
}
}
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::GetCharData()
CharDataNode* RYLCharacterDataManager::GetCharData( unsigned long ulCharID )
{
list<CharDataNode*>::iterator iter = find_if( m_lstCharData.begin(), m_lstCharData.end(), ftFindCharDataByID( ulCharID ) );
if( iter != m_lstCharData.end() && (*iter)->m_bIsUsingNode )
return (*iter);
return NULL;
}
CharDataNode* RYLCharacterDataManager::GetCharData( char* szName )
{
list<CharDataNode*>::iterator pos = m_lstCharData.begin();
list<CharDataNode*>::iterator end = m_lstCharData.end();
for(; pos!=end; ++pos)
{
if(strcmp((*pos)->m_strName.c_str(), szName)==0)
return (*pos);
}
return NULL;
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::InitCharData()
CharDataNode* RYLCharacterDataManager::InitCharData( unsigned long ulCharID, char cRace )
{
CharDataNode* pData = GetCharData( ulCharID ) ;
if ( NULL == pData )
{
return NULL ;
}
pData->m_strName.clear() ;
pData->m_cSex = 1 ;
pData->m_cHair = 2 ;
pData->m_cFace = 1 ;
pData->m_cNation = 0 ;
pData->m_cRace = cRace ;
pData->m_usClass = 0 ;
if ( 0 == cRace )
{
pData->m_cNation = 1 ;
pData->m_usClass = 1 ;
}
else
{
pData->m_cNation = 2 ;
pData->m_usClass = 17 ;
}
pData->m_ulFame = 0 ;
pData->m_ulMileage = 0 ;
pData->m_ulGuildID = 0 ;
pData->m_ulPartyID = 0 ;
pData->m_ulTeamID = 0 ;
pData->m_cLevel = 0 ;
pData->m_lCurrHP = 0 ;
pData->m_lCurrMP = 0 ;
pData->m_ulMaxHP = 0 ;
pData->m_ulMaxMP = 0 ;
pData->m_bPeaceMode = false ;
pData->m_nChrPattern = 0 ;
pData->m_strChatMessage.clear() ;
pData->m_ulTargetCharID = 0xFFFFFFFF ;
pData->m_ulSummonMasterCharID = 0xFFFFFFFF ;
pData->m_strStreetStallName.clear() ;
return pData ;
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::DeleteAllCharData()
void RYLCharacterDataManager::DeleteAllCharData()
{
for_each( m_lstCharData.begin(), m_lstCharData.end(), ftDeleteCharDataMemory );
m_lstCharData.clear();
m_pSelfData = NULL;
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::SwapPartyID()
void RYLCharacterDataManager::SwapPartyID( unsigned long ulOldPartyID, unsigned long ulNewPartyID )
{
for( list<CharDataNode*>::iterator iter = m_lstCharData.begin() ; iter != m_lstCharData.end() ; ++iter )
{
if( (*iter)->m_ulPartyID == ulOldPartyID )
(*iter)->m_ulPartyID = ulNewPartyID;
}
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLCharacterDataManager::

View File

@@ -0,0 +1,196 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLCharacterDataManager.h
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: contain and manage characters's data
//
// Date: 2004. 3. 26. ( Fri )
//--------------------------------------------------------------------------------------------------------------------------
#ifndef __ZRYL_CHARACTER_DATA_MANAGER_H__
#define __ZRYL_CHARACTER_DATA_MANAGER_H__
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include <list>
#include <string>
using namespace std;
//--------------------------------------------------------------------------------------------------------------------------
// Enums, Structs
//--------------------------------------------------------------------------------------------------------------------------
struct CharDataNode
{
unsigned long m_ulCharID; // character ID
unsigned long m_ulNodeID; // node ID in list
string m_strName; // name
char m_cSex; // sex
char m_cHair; // hair style
char m_cFace; // face style
char m_cNation; // Carterant : 0, Mercadia : 1
char m_cRace; // Human : 0, Akhan : 1
unsigned short m_usClass; // class( job? )
unsigned long m_ulFame; // famous
unsigned long m_ulMileage; // mileage
unsigned long m_ulGuildID; // guild id
unsigned long m_ulPartyID; // party id
unsigned long m_ulTempGID; // Àӽà ±æµå Á¤º¸.
unsigned long m_ulTeamID; // team id
char m_cLevel; // level
long m_lCurrHP; // current HP
long m_lCurrMP; // current MP
unsigned long m_ulMaxHP; // max hp
unsigned long m_ulMaxMP; // max mp
bool m_bPeaceMode; // peace mode setting
int m_nChrPattern; // pattern
string m_strChatMessage; // stall chat message
bool m_bIsUsingNode; // using state
unsigned long m_ulTargetCharID; // target character id
unsigned long m_ulSummonMasterCharID; // summon matser id
string m_strStreetStallName; // stall name
unsigned int m_dwPlayTime; // PlayTime
CharDataNode()
: m_ulCharID(0), m_ulNodeID(0xFFFFFFFF), m_cSex(0), m_cHair(0), m_cFace(0), m_cNation(0), m_cRace(0), m_usClass(0),
m_ulFame(0), m_ulMileage(0), m_ulGuildID(0), m_ulPartyID(0), m_ulTeamID(0), m_ulTempGID(0),
m_cLevel(0), m_lCurrHP(0), m_lCurrMP(0), m_ulMaxHP(0), m_ulMaxMP(0), m_bPeaceMode(0), m_nChrPattern(0),
m_bIsUsingNode(false), m_ulTargetCharID(0xFFFFFFFF), m_ulSummonMasterCharID(0xFFFFFFFF), m_dwPlayTime(0)
{
m_strName.reserve( 128 );
m_strName.clear();
m_strChatMessage.reserve( 128 );
m_strChatMessage.clear();
m_strStreetStallName.reserve( 128 );
m_strStreetStallName.clear();
}
~CharDataNode()
{
m_strName.clear();
m_strChatMessage.clear();
m_strStreetStallName.clear();
}
void operator=( const CharDataNode& node )
{
m_ulCharID = node.m_ulCharID;
m_ulNodeID = node.m_ulNodeID;
m_strName = node.m_strName;
m_cSex = node.m_cSex;
m_cHair = node.m_cHair;
m_cFace = node.m_cFace;
m_cNation = node.m_cNation;
m_cRace = node.m_cRace;
m_usClass = node.m_usClass;
m_ulFame = node.m_ulFame;
m_ulMileage = node.m_ulMileage;
m_ulGuildID = node.m_ulGuildID;
m_ulPartyID = node.m_ulPartyID;
m_ulTempGID = node.m_ulTempGID;
m_ulTeamID = node.m_ulTeamID;
m_cLevel = node.m_cLevel;
m_lCurrHP = node.m_lCurrHP;
m_lCurrMP = node.m_lCurrMP;
m_ulMaxHP = node.m_ulMaxHP;
m_ulMaxMP = node.m_ulMaxMP;
m_bPeaceMode = node.m_bPeaceMode;
m_nChrPattern = node.m_nChrPattern;
m_strChatMessage = node.m_strChatMessage;
m_bIsUsingNode = node.m_bIsUsingNode;
m_ulTargetCharID = node.m_ulTargetCharID;
m_ulSummonMasterCharID = node.m_ulSummonMasterCharID;
m_strStreetStallName = node.m_strStreetStallName;
}
};
//--------------------------------------------------------------------------------------------------------------------------
// Consts
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// Classes
//--------------------------------------------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLCharacterDataManager
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
class RYLCharacterDataManager
{
private:
CharDataNode* m_pSelfData;
list<CharDataNode*> m_lstCharData;
unsigned long m_ulCharCount;
unsigned int m_unMaxCash;
public:
//--------------------------------------------------------------------------------------------------------------------------
// Constructor, Destructor
RYLCharacterDataManager( unsigned int unMaxCash = 30 );
~RYLCharacterDataManager();
//--------------------------------------------------------------------------------------------------------------------------
// Init Manager
void InitCharDataManager( unsigned int unCharPoolMax );
//--------------------------------------------------------------------------------------------------------------------------
// character list dealing functions
void SetSelfData( CharDataNode* pNode ) { m_pSelfData = pNode; }
CharDataNode* GetSelfData() { return m_pSelfData; }
CharDataNode* AddCharData( CharDataNode* node );
CharDataNode* GetCharData( unsigned long ulCharID );
CharDataNode* GetCharData( char* szName );
CharDataNode* InitCharData( unsigned long ulCharID, char cRace ) ;
void DeleteAllCharData();
void DeleteCharData( unsigned long ulCharID );
inline void SetMaxCash( unsigned int unMaxCash ) { m_unMaxCash = unMaxCash; }
inline unsigned int GetMaxCash() { return m_unMaxCash; }
//--------------------------------------------------------------------------------------------------------------------------
// °¢Á¾ data º¯°æ
void SwapPartyID( unsigned long ulOldPartyID, unsigned long ulNewPartyID );
//--------------------------------------------------------------------------------------------------------------------------
// singletone
private:
static RYLCharacterDataManager* m_pInstance;
public:
static RYLCharacterDataManager* Instance()
{
if( !m_pInstance )
{
m_pInstance = new RYLCharacterDataManager;
}
return m_pInstance;
}
};
#endif // __ZRYL_CHARACTER_DATA_MANAGER_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,569 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLCreature.h
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: base class for Creature
//
// Date: 2004. 3. 25. ( Tue )
//--------------------------------------------------------------------------------------------------------------------------
#ifndef __RYL_CREATURE_H__
#define __RYL_CREATURE_H__
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include <string>
#include <Network/Broadcast/BroadcastCharacterData.h>
#include <Creature/Siege/SiegeConstants.h>
#include <Item/ItemConstants.h>
#include "Z3DGeneralChrModel.h"
#include "Z3DBoundingVolumeObject.h"
#include "SceneManager.h"
#include "RYLCreatureEffect.h"
#include "RYLDamageEffect.h"
//#include "RYLCreatureCommon.h"
using namespace std;
class CRYLLabel ;
class CRYLListBox ;
class CRYLPicture ;
class CCharacterControl ;
//--------------------------------------------------------------------------------------------------------------------------
// Enums, Structs
//--------------------------------------------------------------------------------------------------------------------------
typedef struct CharActionNode
{
unsigned long m_ulLowerChrAction;
unsigned long m_ulUpperChrAction;
float m_fDirection;
vector3 m_vecNextPosition;
float m_fVec;
unsigned short m_usAniNum;
unsigned short m_usAniNumCount;
unsigned long m_ulFrame;
CharActionNode()
{
m_ulLowerChrAction = 0;
m_ulUpperChrAction = 0;
m_fDirection = 0;
m_vecNextPosition.x = 0;
m_vecNextPosition.y = 0;
m_vecNextPosition.z = 0;
m_fVec = 0;
m_usAniNum = 0;
m_usAniNumCount = 0;
m_ulFrame = 0;
}
void operator=( const CharActionNode& node )
{
m_ulLowerChrAction = node.m_ulLowerChrAction;
m_ulUpperChrAction = node.m_ulUpperChrAction;
m_fDirection = node.m_fDirection;
m_vecNextPosition = node.m_vecNextPosition;
m_fVec = node.m_fVec;
m_usAniNum = node.m_usAniNum;
m_usAniNumCount = node.m_usAniNumCount;
m_ulFrame = node.m_ulFrame;
}
} CharActionNode;
//--------------------------------------------------------------------------------------------------------------------------
// Classes
//--------------------------------------------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLCreature
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
class RYLCreature
{
//--------------------------------------------------------------------------------------------------------------------------
// friend class
friend class RYLCreatureEffect;
friend class RYLCreatureManager;
//--------------------------------------------------------------------------------------------------------------------------
// member variables
//--------------------------------------------------------------------------------------------------------------------------
protected:
//--------------------------------------------------------------------------------------------------------------------------
// unique creature ID
unsigned long m_ulCharID; // special identifier allocated this creature
static unsigned long m_ulAddedOrder; //
unsigned long m_ulAddedID; //
//--------------------------------------------------------------------------------------------------------------------------
// creature type
unsigned long m_ulCreatureType; // creature type
//--------------------------------------------------------------------------------------------------------------------------
// is used?
bool m_bUsed;
bool m_bFirstPositionSend;
bool m_bMemoryReusable;
//--------------------------------------------------------------------------------------------------------------------------
// data for basic rendering
string m_strCharName; // creature name
CRYLLabel* m_pCharStreetStallNameLabel ; // creature street stall name label
CRYLLabel* m_pCharNameLabel ; // creature name label
CRYLLabel* m_pCharTempGuildNameLabel;
CRYLLabel* m_pCharJobNameLabel ;
CRYLLabel* m_pCharChatMsgLabel ;
CRYLPicture* m_pSignpostImg ;
CZ3DGeneralChrModel* m_pCharModel; // creature model data
string m_strGCMDSName; // modeling data file name
string m_strFaceType; // model face type
string m_strHairType; // model hair type
unsigned short m_usShape[Item::EquipmentPos::MAX_EQUPMENT_POS]; // save the creature shape data ( for identifier )
const char* m_strShape[Item::EquipmentPos::MAX_EQUPMENT_POS]; // save the creature shape data ( for name )
Broadcast2nd::CNetworkEquipGrade m_EquipGrade; // 장비 그레이드별 이펙트용
vector3 m_vecPosition; // position
vector3 m_vecNamePosition; // name position
float m_fDirection; // direction
unsigned long m_dwLastUpdateActionTimer; //
unsigned long m_ulWeaponPos; //
unsigned char m_ucRideFlag; //
unsigned char m_ucEnableRide; // 라이드를 탄상태다
unsigned char m_ucRace; // 0 : Human, 1 : Akhan
unsigned short m_usClass; // character Class
float m_fScale; // Creature scale
float m_fFixAngle; //
unsigned char m_cGMModelFlag; // GM 모델 변경 여부.
unsigned char m_cRealmPoint; // 국가전쟁 공헌훈장 포인트.
unsigned char m_cTactics; // 용병 정보.
public:
//--------------------------------------------------------------------------------------------------------------------------
// concerned with skill action : 얼마 안쓰이기땜에 그냥 public으로 선언해서 편하게 쓰는 것이 -_-;;
unsigned long m_ulAttackCombo;
unsigned long m_ulSkillComboCount;
bool m_bNoneComboAttackMode;
bool m_bSkillCombo;
//--------------------------------------------------------------------------------------------------------------------------
// chatting timer : 이것도 역시...(-_-)
float m_fChatTimer;
static unsigned long m_ulRunFactorTimer; // Run 타임. m_dwRunFactorTimer = CFrameTimer::Regist(200.0f);
private:
float m_fRunFactor; //
vector3 m_vecJumpAttackVector; //
float m_fSelfCharLens; // Lens
bool m_bViewName; // 게임 화면 내의 캐릭터 이름 감추기 옵션( 개별 Creature )
//--------------------------------------------------------------------------------------------------------------------------
// creature action
unsigned long m_ulUpperCharActionID; // upper action identifier
unsigned long m_ulLowerCharActionID; // lower action identifier
bool m_bUpperActing; // is upper part acting?
bool m_bLowerActing; // is lower part acting?
bool m_bUpperAble; // is upper action available?
bool m_bLowerAble; // is lower action available?
CharActionNode m_Action;
list<CharActionNode*>::iterator m_iterBeforeAction; // 외부에서 list 순회를 원할때 직전에 순회한 위치를 저장하고 있다가 다음 위치를 넘겨준다.
queue<CharActionNode*> m_queActionData; // Action Queue
//--------------------------------------------------------------------------------------------------------------------------
// concerned with "DEAD" process
float m_fDeadTimer; //
bool m_bFirstDead; // True일 시 Dead Action 한번 취해줌. 그 이후 모든 SetAction에 대해서 처리 안함.
bool m_bCharDead; // died?
bool m_bStillCasting;
//--------------------------------------------------------------------------------------------------------------------------
// flags for current creature state
bool m_bFlying; // 점프중인가?
DWORD m_dwFlyingTick;
bool m_bSitMode; // not sitting down?
bool m_bFlyFirstCheck;
//-----------------------------------------
// 어택 상태 설정
bool m_bSkillAttacked;
//--------------------------------------------------------------------------------------------------------------------------
// concerned with slide character
CEffScript::CEffExt6 m_effSlideValue; //
bool m_bSlide; //
//--------------------------------------------------------------------------------------------------------------------------
// concerned with collision
unsigned char m_ucCDTType; // collision check type
//--------------------------------------------------------------------------------------------------------------------------
// concerned with creature effect
RYLCreatureEffect* m_pCreatureEffect; //
//--------------------------------------------------------------------------------------------------------------------------
// concerned with damage effect
RYLDamageEffect* m_pDamageEffect; //
//--------------------------------------------------------------------------------------------------------------------------
// 공성 관련
unsigned long m_dwCampOrCastleID; // 요새 = 요새(캠프) ID, 성 = 성ID
unsigned long m_dwOwnerID; // 공성병기 = 주인 CID, 수성 병기 = 주인 CID
unsigned short m_wObjectType; // Siege::SiegeObjectType 참고
unsigned char m_cState; // Siege::State
unsigned char m_cSubState; // Siege::State
unsigned char m_cUpgradeStep; // 업그레이드 단계
unsigned char m_cUpgradeType; // 상징물만 해당( 보석에의한 업그레이드 상태 )
unsigned long m_dwDoorBlockrate; // 성문에만 해당( 블럭율 )
bool m_bOBBEnable; // OBB 여부
CZ3DOBB* m_pZ3DOBB; // OBB
DWORD m_dwRiderID[Siege::AIRSHIP_RIDER_NUM]; // 병기 탄 사람 ID ( 0 번째는 주인, 1-9 는 손님 )
bool m_bRideEnable; // 캐릭터가 병기에 탑승하고 있는지 없는지의 여부
BOOL m_bRepairFullHP; // 수성 병기 수리시에 전부 수리인지 여부
//--------------------------------------------------------------------------------------------------------------------------
// 길드전, 국가전 전쟁 플래그
unsigned char m_cRealmWarFlag; // 국가 전쟁 플래그
unsigned char m_cGuildWarFlag; // 길드 전쟁 플래그
//--------------------------------------------------------------------------------------------------------------------------
// member functions
//--------------------------------------------------------------------------------------------------------------------------
public:
//--------------------------------------------------------------------------------------------------------------------------
// Constructor, Destructor
RYLCreature();
RYLCreature( unsigned long ulCharID, const char* pstrName, const char* pstrGCMDSName,
vector3 vecCharPos, float fDirection );
RYLCreature( unsigned long ulCharID, const char* pstrName, const char* pstrGCMDSName,
const char* pstrFaceType, const char* pstrHairType, const char** pstrShape,
unsigned char ucRace, vector3 vecCharPos, float fDirection );
RYLCreature( unsigned long ulCharID, vector3 vecPosition );
virtual ~RYLCreature();
//--------------------------------------------------------------------------------------------------------------------------
// Init Creature
void InitCreature( bool bRespawn = false );
//--------------------------------------------------------------------------------------------------------------------------
// get creature id
unsigned long GetCharID( void ) { return m_ulCharID; }
//--------------------------------------------------------------------------------------------------------------------------
// get creature type
unsigned long GetCreatureType( void ) { return m_ulCreatureType; }
//--------------------------------------------------------------------------------------------------------------------------
// set creature used or not( Manager클래스에서 creature pool 관리를 위해 사용 )
inline void SetIsUsed( bool bUsed ) { m_bUsed = bUsed; }
inline bool GetIsUsed( void ) { return m_bUsed; }
inline void SetMemoryReusable( bool bReusable ) { m_bMemoryReusable = bReusable; }
inline bool GetMemoryReusable( void ) { return m_bMemoryReusable; }
//--------------------------------------------------------------------------------------------------------------------------
// concerned with rendering data
inline void SetCharModel( CZ3DGeneralChrModel* pCharModel ) { m_pCharModel = pCharModel; }
inline CZ3DGeneralChrModel* GetCharModel( void ) { return m_pCharModel; }
inline void SetAlphaLevel( float fAlphaFactor ) { m_pCharModel->SetAlphaLevel( fAlphaFactor ); }
//void SetPosition( float fPosX, float fPosY, float fPosZ );
void SetPosition( vector3 &vecPos );
vector3* GetPosition( void );
vector3* GetNamePosition( void );
void SetDirection( float fDirection );
float GetDirection( void );
inline void SetWeaponPos( unsigned long ulWeaponPos ) { m_ulWeaponPos = ulWeaponPos; }
inline unsigned long GetWeaponPos( void ) { return m_ulWeaponPos; }
inline void SetRideFlag( unsigned char cRideFlag ) { m_ucRideFlag = cRideFlag; }
inline unsigned char GetRideFlag( void ) { return m_ucRideFlag; }
inline void SetFixAngle( float fFixAngle ) { m_fFixAngle = fFixAngle; }
inline float GetFixAngle( void ) { return m_fFixAngle; }
inline void SetScale( float fScale ) { m_fScale = fScale; }
inline float GetScale( void ) { return m_fScale; }
inline void SetRunFactor( float fRunFactor ) { m_fRunFactor = fRunFactor; }
inline float GetRunFactor( void ) { return m_fRunFactor; }
inline void SetJumpAttackVector( vector3 vecJumpAttackVector ) { m_vecJumpAttackVector = vecJumpAttackVector; }
inline vector3 GetJumpAttackVector( void ) { return m_vecJumpAttackVector; }
inline void SetSelfLens( float fCharLens) { m_fSelfCharLens = fCharLens; }
inline float GetSelfLens( void ) { return m_fSelfCharLens; }
inline void SetViewName( bool bViewName ) { m_bViewName = bViewName; }
inline bool GetViewName( void ) { return m_bViewName; }
inline void SetModelFileName( const char* pstrGCMDSName ) { m_strGCMDSName = pstrGCMDSName; }
inline string* GetModelFileName( void ) { return &m_strGCMDSName; }
inline void SetFaceType( const char* pstrFaceType ) { m_strFaceType = pstrFaceType; }
inline string* GetFaceType( void ) { return &m_strFaceType; }
inline void SetHairType( const char* pstrHairType ) { m_strHairType = pstrHairType; }
inline string* GetHairType( void ) { return &m_strHairType; }
//--------------------------------------------------------------------------------------------------------------------------
// setting action
void SetActionID( unsigned long* pulActionID, const char* pstrAction );
void SetActionString( const unsigned long ulActionID, char* pstrAction );
bool SetAction( unsigned long ulUpperAction, unsigned long ulLowerAction );
bool SetAction( const char* pstrUpperAction, const char* pstrLowerAction );
inline void SetCurrentAction( CharActionNode pAction ) { m_Action = pAction; }
inline CharActionNode* GetCurrentAction( void ) { return &m_Action; }
void UpdatePlayerAction();
void UpdateMonsterAction();
inline void SetGMModelFlag(unsigned char cGMModelFlag) { m_cGMModelFlag = cGMModelFlag; }
inline unsigned char GetGMModelFlag(void) { return m_cGMModelFlag; }
inline void SetRealmPoint(unsigned char cRealmPoint) { m_cRealmPoint = cRealmPoint; }
inline unsigned char GetRealmPoint(void) { return m_cRealmPoint; }
inline void SetTactics(unsigned char cTactics) { m_cTactics = cTactics; }
inline unsigned char GetTactics(void) { return m_cTactics; }
public:
void AddActionData( CharActionNode* pAction );
private:
bool SetActionSub( unsigned long ulUpperAction, const char* pstrUpperAction, unsigned long ulLowerAction, const char* pstrLowerAction );
public:
inline unsigned long GetLowerActionID( void ) { return m_ulLowerCharActionID; }
inline unsigned long GetUpperActionID( void ) { return m_ulUpperCharActionID; }
inline void SetUpperAble( bool bAble ) { m_bUpperAble = bAble; }
inline bool GetUpperAble( void ) { return m_bUpperAble; }
inline void SetLowerAble( bool bAble ) { m_bLowerAble = bAble; }
inline bool GetLowerAble( void ) { return m_bLowerAble; }
inline void SetUpperActing( bool bActing ) { m_bUpperActing = bActing; }
inline bool GetUpperActing( void ) { return m_bUpperActing; }
inline void SetLowerActing( bool bActing ) { m_bLowerActing = bActing; }
inline bool GetLowerActing( void ) { return m_bLowerActing; }
public:
inline void SetShape( bool bForceChange = false ) { SetShape( m_strShape, m_EquipGrade, bForceChange ); }
void SetShape( const char** strShape, const Broadcast2nd::CNetworkEquipGrade& equipGrade, bool bForceChange = false );
inline const char** GetShapeString( void ) { return m_strShape; }
Broadcast2nd::CNetworkEquipGrade GetEquipGrade(void);
void InitCharAction( void ); // initialize action
void InitWeapon( unsigned long ulEquip ); // initialize character weapon(?)
bool IsCancelAction( unsigned long ulPart );
void Respawn( void );
bool Landing( CCharacterControl* lpObjControl );
//--------------------------------------------------------------------------------------------------------------------------
// do action funcions
enum { MOVE_FOWARD = 0, MOVE_RIGHT, MOVE_BACK, MOVE_LEFT }; // Direction Identifier
void Walk( unsigned char ucDirection, float fRunFactor = 0.0f ); // move forward, back, left, right
void Dead( void ); // set dead motion
void Wait( void );
void ToggleCrouch( void ); // Toggle "Crouch" <-> "Stand up"
bool Dash( unsigned char ucDirection );
bool Jump( void );
void BeginCast( const char* pstrMotion );
bool Casting( unsigned long ulUpperAct = 0xFFFFFFFF, unsigned long ulLowerAct = 0xFFFFFFFF );
void CancelSkill( void );
void EndSkill( const char* pstrMotion );
void SkillAttack( unsigned long ulUpperAct, unsigned long unLowerAct );
bool Attack( unsigned long ulUpperAct = 0xFFFFFFFF, unsigned long ulLowerAct = 0xFFFFFFFF );
//--------------------------------------------------------------------------------------------------------------------------
// slide
inline void SetSlideValue( CEffScript::CEffExt6 effValue ) { m_effSlideValue = effValue; m_bSlide = true;}
void PlaySlide( void );
void RenderSlide( float fBx, float fBy, float fBz, float fNx, float fNy, float fNz, float fUnitSize );
//--------------------------------------------------------------------------------------------------------------------------
// get dead state
inline void SetIsDead( bool bCharDead ) { m_bCharDead = bCharDead; }
inline bool GetIsDead( void ) { return m_bCharDead; }
inline void SetDeadTimer( float fDeadTimer ) { m_fDeadTimer = fDeadTimer; }
inline float GetDeadTimer( void ) { return m_fDeadTimer; }
//--------------------------------------------------------------------------------------------------------------------------
// 스킬 관련
inline bool GetStillCasting( void ) { return m_bStillCasting; }
inline void SetStillCasting( bool bStillCasting ) { m_bStillCasting = bStillCasting; }
//--------------------------------------------------------------------------------------------------------------------------
// creature current state
inline void SetFlying( bool bFlying )
{
m_bFlying = bFlying;
m_dwFlyingTick = timeGetTime();
}
inline bool GetFlying( bool bTimeCheck = false )
{
// edtih 2009.08.12 점프중 스킬 사용 불가 테스트 하는 루틴.
if(bTimeCheck && m_bFlying)
{
if(abs((long)timeGetTime()-(long)m_dwFlyingTick) > 3000)
{
m_bFlying = false;
}
}
return m_bFlying;
}
inline void SetSitMode( bool bSitMode ) { m_bSitMode = bSitMode; }
inline bool GetSitMode( void ) { return m_bSitMode; }
inline void SetFlyFirstCheck( bool bFlyFirstCheck ) { m_bFlyFirstCheck = bFlyFirstCheck; }
inline bool GetFlyFirstCheck( void ) { return m_bFlyFirstCheck; }
bool IsInSafetyZone( void );
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Collision type
inline void SetCDTType( unsigned char ucCDTType ) { m_ucCDTType = ucCDTType; }
inline unsigned char GetCDTType( void ) { return m_ucCDTType; }
//--------------------------------------------------------------------------------------------------------------------------
// clear self object
void ClearCreature( void );
//--------------------------------------------------------------------------------------------------------------------------
// get creature effect
inline RYLCreatureEffect* GetEffect( void ) { return m_pCreatureEffect; }
//--------------------------------------------------------------------------------------------------------------------------
// get damage effect
inline RYLDamageEffect* GetDamageEffect( void ) { return m_pDamageEffect; }
//--------------------------------------------------------------------------------------------------------------------------
// 공성 관련
float AttackWeaponRun( float fRunFactor );
//--------------------------------------------------------------------------------------------------------------------------
// 공성관련
unsigned long GetCampID( void ) { return m_dwCampOrCastleID ; }
unsigned long GetCastleID( void ) { return m_dwCampOrCastleID ; }
void SetCampID( unsigned long dwCampID ) { m_dwCampOrCastleID = dwCampID ; }
void SetCastleID( unsigned long dwCastleID ) { m_dwCampOrCastleID = dwCastleID ; }
void SetCampOrCastleID( unsigned long dwCampOrCastleID ) { m_dwCampOrCastleID = dwCampOrCastleID ; }
unsigned long GetOwnerID( void ) { return m_dwOwnerID ; }
void SetOwnerID( unsigned long dwOwnerID ) { m_dwOwnerID = dwOwnerID ; }
unsigned short GetObjectType( void ) { return m_wObjectType ; }
void SetObjectType( unsigned short wObjectType ) { m_wObjectType = wObjectType ; }
unsigned char GetState( void ) { return m_cState ; }
void SetState( unsigned char cState ) { m_cState = cState ; }
unsigned char GetSubState( void ) { return m_cSubState ; }
void SetSubState( unsigned char cSubState ) { m_cSubState = cSubState ; }
unsigned char GetUpgradeStep( void ) { return m_cUpgradeStep ; }
void SetUpgradeStep( unsigned char cUpgradeStep ) { m_cUpgradeStep = cUpgradeStep ; }
unsigned char GetUpgradeType( void ) { return m_cUpgradeType ; }
void SetUpgradeType( unsigned char cUpgradeType ) { m_cUpgradeType = cUpgradeType ; }
CZ3DOBB* GetOBB( void ) { return m_pZ3DOBB; }
void SetOBB( CZ3DOBB* pZ3DOBB ) { m_pZ3DOBB = pZ3DOBB; }
bool GetOBBEnable( void ) { return m_bOBBEnable ; }
void SetOBBEnable( bool bOBBEnable ) { m_bOBBEnable = bOBBEnable ; }
unsigned long GetDoorBlockrate( void ) { return m_dwDoorBlockrate ; }
void SetDoorBlockrate( unsigned long dwDoorBlockrate ) { m_dwDoorBlockrate = dwDoorBlockrate ; }
bool GetIsCastleObject( void ) ;
bool GetIsCastleNPC( void ) ;
bool GetIsSiegeArms( void ) ;
// 병기 ID
DWORD GetRiderID( int iIndex ) { return m_dwRiderID[ iIndex ] ; }
void AddRiderID( DWORD dwRiderID ) ;
void DeleteRiderID( DWORD dwRiderID ) ;
void SetRiders( DWORD* pdwRiders ) ;
bool GetRideEnable( void ) { return m_bRideEnable ; }
void SetRideEnable( bool bRide ) { m_bRideEnable = bRide ; }
//------------------------------------------------------------------------
// 성문
unsigned long GetCastleDoorUpgradePrice( void ) ;
unsigned long GetCastleDoorUpgradeTime( void ) ;
unsigned long GetCastleDoorRepairPrice( void ) ;
unsigned long GetCastleDoorRecoveryPrice( void ) ;
unsigned long GetCastleDoorRecoveryTime( void ) ;
unsigned short GetRealObjType( bool bEmblemEnable = false ) ;
unsigned long GetCastleArmsDevelopePrice( DWORD dwArmsType ) ;
unsigned long GetCastleArmsDevelopeTime( DWORD dwArmsType ) ;
unsigned long GetCastleArmsRepairPrice() ;
unsigned long GetCastleArmsRepairTime() ;
BOOL GetRepairFullHP() const { return m_bRepairFullHP ; }
void SetRepairFullHP( BOOL bFull ) { m_bRepairFullHP = bFull ; }
CRYLLabel* GetCharStreetStallNameLabel() { return m_pCharStreetStallNameLabel ; }
CRYLLabel* GetCharNameLabel() { return m_pCharNameLabel ; }
CRYLLabel* GetCharTeampGuildNameLabel() { return m_pCharTempGuildNameLabel; }
CRYLLabel* GetCharJobNameLabel() { return m_pCharJobNameLabel ; }
CRYLLabel* GetCharChatMsgLabel() { return m_pCharChatMsgLabel ; }
void MakeSignpostImg( char* pszText, bool bNPC = true ) ;
CRYLPicture* GetSignpostImg() { return m_pSignpostImg ; }
void DeleteSignpostImg() ;
//--------------------------------------------------------------------------------------------------------------------------
// 길드전, 국가전 전쟁 플래그
unsigned char GetGuildWarFlag( void ) const { return m_cGuildWarFlag ; }
unsigned char GetRealmWarFlag( void ) const { return m_cRealmWarFlag ; }
void SetGuildWarFlag( unsigned char cFlag ) { m_cGuildWarFlag = cFlag ; }
void SetRealmWarFlag( unsigned char cFlag ) { m_cRealmWarFlag = cFlag ; }
};
#endif // __RYL_CREATURE_H__

View File

@@ -0,0 +1,172 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: ZCreatureCommon.h
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: const variables which is using commonly in several files that concerned with character control
//
// Date: 2004. 3. 25. ( Thu )
//--------------------------------------------------------------------------------------------------------------------------
#ifndef __ZCREATURE_COMMON_H__
#define __ZCREATURE_COMMON_H__
//--------------------------------------------------------------------------------------------------------------------------
// Enums
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// enum CHAR_ACT_ENUM : 캐릭터 액션 목록
// 액션 한계값은 255임.
enum CHAR_ACT_ENUM
{
CA_WAIT = 0,
CA_RUN = 1,
CA_ATTACK = 2,
CA_MOVEATTACK = 3,
CA_WALKBACK = 4,
CA_WALKLEFT = 5,
CA_WALKRIGHT = 6,
CA_BASH = 7,
CA_WALK = 8,
CA_FALLDOWN = 9,
CA_REST = 10,
CA_SITDOWN = 11,
CA_STANDUP = 12,
CA_ATTACKADVANCE = 13,
CA_ATTACKLEFT = 14,
CA_ATTACKRIGHT = 15,
CA_ATTACKRETREAT = 16,
CA_ATTACK2 = 17,
CA_ATTACK3 = 18,
CA_ATTACK4 = 19,
CA_RESPAWN = 20,
CA_JUMP = 21,
CA_LEFTDASH = 22,
CA_RIGHTDASH = 23,
CA_CASTING = 24,
CA_FIRE1 = 25,
CA_FIRE2 = 26,
CA_COMBINATIONBLOW = 27,
CA_BACKSTAB = 28,
CA_AIMEDSHOT2 = 29,
CA_ATTACK5 = 30,
CA_ATTACK6 = 31,
CA_BACKDASH = 32,
CA_AIMEDSHOT1 = 33,
CA_JUMPATTACK = 34,
CA_JUMPATTACK2 = 35,
CA_FRONTDASH = 36,
CA_LAND = 37,
CA_FORWARDJUMP = 38,
CA_BACKJUMP = 40,
CA_SHOT = 41,
CA_JUMPSHOT = 42,
CA_OVERBASH1 = 43,
CA_OVERBASH2 = 44,
CA_OVERBASH3 = 45,
CA_OVERBASH4 = 46,
CA_OVERBASH5 = 47,
CA_POWERDRAIN = 48,
CA_TURNPUNCH1 = 49,
CA_TURNPUNCH2 = 50,
CA_TURNPUNCH3 = 51,
CA_JUMPATTACK3 = 52,
CA_AIMEDSHOT3 = 53,
CA_STUN = 54,
CA_ROUNDSWING = 55,
CA_SUMMON = 56,
CA_HIT1 = 57,
CA_WAITH1 = 58,
CA_HIT2 = 59,
CA_WAITH2 = 60,
CA_ADVANCE = 61,
CA_SWIM = 100,
CA_FORWARD = 101, // 충차 앞으로 굴러가는 애니
CA_BACKWARD = 102, // 충차 뒤로 굴러가는 애니
CA_GATHERSTART = 111,
CA_GATHER01 = 111,
CA_GATHER02 = 112,
CA_GATHER03 = 113,
CA_GATHER04 = 114,
CA_GATHER05 = 115,
CA_GATHER06 = 116,
CA_GATHER07 = 117,
CA_GATHER08 = 118,
CA_GATHER09 = 119,
CA_GATHER10 = 120,
CA_GATHEREND = 120,
CA_SOCIALSTART = 151,
CA_SOCIAL_LAUGH = 151,
CA_SOCIAL_DESPAIR = 152,
CA_SOCIAL_SHY = 153,
CA_SOCIAL_SURPRISE = 154,
CA_SOCIAL_ROAR = 155,
CA_SOCIAL_WAVE = 156,
CA_SOCIAL_THANK = 157,
CA_SOCIAL_SORRY = 158,
CA_SOCIAL_SALUTE = 159,
CA_SOCIAL_CHEER = 160,
CA_SOCIAL_NOD = 161,
CA_SOCIAL_NO = 162,
CA_SOCIAL_CHARGE = 163,
CA_SOCIAL_COMFORT = 164,
CA_SOCIAL_TALK = 165,
CA_SOCIALEND = 165,
CA_ACTIONEND = 165,
CA_MAX = 255,
};
//enum CHANT_ENUM
//{
// CHANT_BATTLE_SONG = 1,
// CHANT_MAINTENANCE_CHANT = 2,
// CHANT_ACCELERATION_CHANT = 3,
// CHANT_LIFE_AURA = 4,
//
// CHANT_STRENGTH = 12,
// CHANT_SLOW = 13,
// CHANT_ARMOR_BROKEN = 14,
// CHANT_BLAZE = 15,
// CHANT_CHARGING = 16,
// CHANT_STEALTH = 17,
// CHANT_MANASHELL = 18,
// CHANT_ENCOURAGE = 19,
// CHANT_ENCHANT_WEAPON = 20,
// CHANT_BRIGHT_ARMOR = 21,
// CHANT_HARD_SKIN = 22,
// CHANT_FLEXIBILITY = 23,
// CHANT_GUARD = 24,
// CHANT_HOLD = 25,
// CHANT_STUN = 26,
// CHANT_FROZEN = 27,
// CHANT_POISONED = 28,
// CHANT_LOWERSTRENGTH = 29,
//
// CHANT_INVINCIBLE = 30,
//
// CHANT_HIDE = 31,
//
// CHANT_MAX
//};
enum Damage_Type
{
Type_Front = 0, Type_Side = 1, Type_Back = 2,
Type_Guard = 3, Type_Critical = 4, Type_Heal = 5,
Type_ManaHeal = 6, Type_Chant = 7, Type_Enchant = 8,
Type_Disenchant = 9, Type_Evade = 10, Type_Resist = 11,
Type_ManaShell = 12, Type_Poisoned = 13, Type_NonShow = 14,
Type_Miss = 15, Type_Fired = 20, Type_MAX = 21
};
//--------------------------------------------------------------------------------------------------------------------------
// Consts
//--------------------------------------------------------------------------------------------------------------------------
#endif //__ZCREATURE_COMMON_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,250 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLCreatureEffect.h
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: single Creature's effect management class
//
// Date: 2004. 4. 8. ( Thu )
//--------------------------------------------------------------------------------------------------------------------------
#ifndef __RYL_CREATURE_EFFECT_H__
#define __RYL_CREATURE_EFFECT_H__
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include "SceneManager.h"
#include <Creature/CreatureStructure.h>
#include <string>
#include <vector>
#include <list>
using namespace std;
//--------------------------------------------------------------------------------------------------------------------------
// Enums, Structs
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// struct RYLBodyEffect : Creature 몸에 붙는 Effect
struct RYLBodyEffect
{
CEffScript* m_pBodyEffScript;
bool m_bPivotRot;
int m_nPivotIndex;
string m_strPivotName;
string m_strEffName;
bool m_bIsUseEff;
unsigned long m_ulEffID;
D3DXVECTOR3 m_D3DVecEffPos;
RYLBodyEffect()
{
m_pBodyEffScript= NULL;
m_bPivotRot = false;
m_nPivotIndex = -1;
m_strPivotName.reserve( 128 );
m_strEffName.reserve( 128 );
m_bIsUseEff = false;
m_ulEffID = 0;
m_D3DVecEffPos.x = m_D3DVecEffPos.y = m_D3DVecEffPos.z = 0.0f;
}
~RYLBodyEffect()
{
m_strPivotName.clear();
m_strEffName.clear();
if( m_pBodyEffScript )
{
if( !CSceneManager::m_EffectManager.CheckNullScript( m_pBodyEffScript ) )
{
m_pBodyEffScript->SetAllLoopOff();
m_pBodyEffScript->SetVisibility( false );
m_pBodyEffScript = NULL;
}
}
}
};
//--------------------------------------------------------------------------------------------------------------------------
// struct RYLArrowEffect
struct RYLArrowEffect
{
CEffScript* m_pArrowEffScript;
string m_strPivotName;
RYLArrowEffect()
{
m_pArrowEffScript = NULL;
m_strPivotName.clear();
}
~RYLArrowEffect()
{
m_strPivotName.clear();
if( m_pArrowEffScript )
{
if( !CSceneManager::m_EffectManager.CheckNullScript( m_pArrowEffScript ) )
{
m_pArrowEffScript->SetAllLoopOff();
m_pArrowEffScript->SetVisibility( false );
m_pArrowEffScript = NULL;
}
}
}
};
//--------------------------------------------------------------------------------------------------------------------------
// struct RYLWeaponEffect : Weapon에 붙는 effect
struct RYLWeaponEffect
{
CEffScript* m_pWeaponEffScript;
string m_strEffectName;
int m_nWeaponEffectNum; //effect의 갯수
int m_nWeaponPosNum; //effect의 갯수중에 현 effect 노드의 위치
RYLWeaponEffect()
{
m_pWeaponEffScript = NULL;
m_strEffectName.clear();
m_nWeaponEffectNum = 0;
m_nWeaponPosNum = 0;
}
~RYLWeaponEffect()
{
if( m_pWeaponEffScript )
{
if( !CSceneManager::m_EffectManager.CheckNullScript( m_pWeaponEffScript ) )
{
m_pWeaponEffScript->SetAllLoopOff();
m_pWeaponEffScript->SetVisibility( false );
m_pWeaponEffScript = NULL;
}
}
}
};
//--------------------------------------------------------------------------------------------------------------------------
// Consts
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// Classes
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// pre-defined class
class RYLCreature;
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLCreatureEffect
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
class RYLCreatureEffect
{
private:
//--------------------------------------------------------------------------------------------------------------------------
// Effect 객체를 갖고 있는 mother creature 객체의 pointer( 할당/삭제 금지! )
RYLCreature* m_pMotherCreature;
//--------------------------------------------------------------------------------------------------------------------------
// concerned with chant effect
EnchantInfo m_EnchantInfo; // current chant status
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Body Effect
list<RYLBodyEffect*> m_lstBodyEff;
bool m_bBodyEffExist;
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Arrow Effect
list<RYLArrowEffect*> m_lstArrowEff;
bool m_bArrowEffExist;
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Weapon Effect
list<RYLWeaponEffect*> m_lstWeaponEff;
bool m_bWeaponEffExist;
public:
//--------------------------------------------------------------------------------------------------------------------------
// Constructor, Destructor
RYLCreatureEffect( RYLCreature* pMotherCreature );
~RYLCreatureEffect();
//--------------------------------------------------------------------------------------------------------------------------
// set effect visibility
void SetEffectVisibility( bool bVisible );
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Body Effect
// 캐릭 pos 에 effect 붙일경우
void AddBodyEffect( string strScriptFile, unsigned long ulEffID = 0, bool bMine = true, bool bVisibility = true );
// pivot 하나에 effect 붙임 ( pivot name으로.. )
void AddBodyEffect( string strScriptFile, string strPivot, bool bRot = false, unsigned long ulEffID = 0 );
// pivot 하나에 effect 붙임 ( pivot id로.. )
void AddBodyEffect( string strScriptFile, int nPivotID, bool bRot = false, unsigned long ulEffID = 0 );
void DeleteBodyEffect(); // 전 effect delete
void DeleteBodyEffect( string strPivot ); // 한 pivot에 붙은 effect delete
void DeleteBodyEffect( const unsigned long ulEffID ); // effect id로 delete
void DeleteBodyEffectName( string strScriptFile ); // effect script 이름에 따라 delete
// all creature update
void BodyEffectUpdate();
// single creature update
void BodyEffectUpdate( list<RYLBodyEffect*>::iterator& iterEffect, bool bAllUpdate = false );
void SetEffect(); // monster 관련 GCMDS에서 effect 불러 붙이는 코드
// Monster
void MonsterEffectProcess( const char* pstrFileName, int nEffectValue );
// chant
inline EnchantInfo& GetChantStatus() { return m_EnchantInfo; }
bool GetChantStatus( unsigned long ulChantKind );
void SetChantEffect( bool bSelf, bool bGoodChantEffectShow, bool bBadChantEffectShow );
void SetChantEffect( const EnchantInfo& Info, bool bSelf, bool bGoodChantEffectShow, bool bBadChantEffectShow );
void SetChantEffect( unsigned long ulChant, bool bToggle, bool bSelf, bool bGoodChantEffectShow, bool bBadChantEffectShow );
//--------------------------------------------------------------------------------------------------------------------------
// support body effect
private:
bool CheckInBodyEffect( string strScriptFile ); // 현재 body effect list안에 이 이팩트가 존재 하는지 검사
void RenderSnap( float fBeforex, float fBeforey, float fBeforez,
float fNowx, float fNowy, float fNowz,
float fUnitsize, const char *pstrEffName );
public:
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Arrow Effect
// pivot에 arrow 붙이기
void AddArrow( const char *pstrPivotName, D3DXQUATERNION Quat, int nDiv = 0 );
// all arrow update
void ArrowUpdate();
// single arrow update
void ArrowUpdate( const unsigned int unIndex );
void DeleteArrow( int nIndex );
//--------------------------------------------------------------------------------------------------------------------------
// concerned with Weapon Effect
void AddWeaponEffect( string strEsfName, int nEffectNum, bool bVisible );
void DeleteWeaponEffect(); //전 weapon effect delete
void DeleteWeaponEffect(string strEsfName, int nEffNum ); //esfname을 가지는 effect delete
void WeaponEffectUpdate();
//--------------------------------------------------------------------------------------------------------------------------
// clear self object
void ClearEffect();
};
#endif //__RYL_CREATURE_EFFECT_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,205 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLCreatureManager.h
//
// Programmer: RYLergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: Creature Managerment Class
//
// Date: 2004. 4. 7. ( Wen )
//--------------------------------------------------------------------------------------------------------------------------
#ifndef __RYLCREATURE_MANAGER_H__
#define __RYLCREATURE_MANAGER_H__
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include "RYLCreature.h"
class CCharacterControl;
class CZ3DGeneralChrModel;
//--------------------------------------------------------------------------------------------------------------------------
// Enums, Structs
//--------------------------------------------------------------------------------------------------------------------------
struct CharModelNode
{
CZ3DGeneralChrModel* m_pCharModel;
string m_strGCMDSName;
unsigned long m_ulUsedCharID;
};
//--------------------------------------------------------------------------------------------------------------------------
// Consts
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// Classes
//--------------------------------------------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLCreatureManager
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
class RYLCreatureManager
{
private:
typedef map<unsigned long, unsigned long> ArmsMap;
//--------------------------------------------------------------------------------------------------------------------------
// creature list
RYLCreature* m_pSelfCreature; // self creature
map<unsigned long,RYLCreature*> m_mapCreature; // creature map
list<CharModelNode*> m_lstCharModel; // model data list
map<unsigned long,RYLCreature*>::iterator m_iterBeforeCreature; // 외부에서 map 순회를 원할때 직전에 순회한 위치를 저장하고 있다가 다음 위치를 넘겨준다.
list<CharModelNode*>::iterator m_iterBeforeModel; // 외부에서 map 순회를 원할때 직전에 순회한 위치를 저장하고 있다가 다음 위치를 넘겨준다.
ArmsMap m_ArmsMap;
unsigned int m_unMaxCash; // cash size
//--------------------------------------------------------------------------------------------------------------------------
// CCharacterControl
CCharacterControl* m_pObjControl;
//--------------------------------------------------------------------------------------------------------------------------
// concerned with effect
bool m_bGoodChantEffectShow; // good effect show?
bool m_bBadChantEffectShow; // bad effect show?
public:
//--------------------------------------------------------------------------------------------------------------------------
// Constructor, Destructor
RYLCreatureManager( unsigned int unMaxCash = 30 );
~RYLCreatureManager();
//--------------------------------------------------------------------------------------------------------------------------
// Binding functions
static char* (*GetMotionSheet)( char* pstrWeaponName, char* pstrShieldName, unsigned short usClass );
static unsigned long (*GetWeaponType)( char* strWeaponName );
static unsigned long (*GetClientIdentity)( unsigned long dwChrID ) ;
static unsigned long (*GetClientEnemyType)( unsigned long dwChrID) ;
//--------------------------------------------------------------------------------------------------------------------------
//
void SetObjectControl( CCharacterControl* pObjControl ) { m_pObjControl = pObjControl; }
//--------------------------------------------------------------------------------------------------------------------------
// creature managing
unsigned long AddCreature( unsigned long ulCharID, const char* pstrName, const char* pstrGCMDSName,
vector3 vecPosition, float fDirection, bool bCollision, unsigned long dwNation = 0,
int iValue = -1, CZ3DGeneralChrModel **ppOld = NULL,bool bHouse = false,int iHouseType = -1,
D3DXVECTOR3 vecPos = D3DXVECTOR3(0.0f,0.0f,0.0f) ) ;
unsigned long AddCreature( unsigned long ulCharID, const char* pstrName, const char* pstrGCMDSName,
const char* pstrFaceType, const char* pstrHairType,
const char** pstrShape, const Broadcast2nd::CNetworkEquipGrade& equipGrade,
unsigned char ucRace, vector3 vecPosition, float fDirection, bool bCollision,
int iValue = -1, CZ3DGeneralChrModel **ppOld = NULL,bool bHouse = false,int iHouseType = -1,
D3DXVECTOR3 vecPos = D3DXVECTOR3(0.0f,0.0f,0.0f) ) ;
unsigned long AddCreature( unsigned long ulCharID, vector3 vecPosition,
int iValue = -1, CZ3DGeneralChrModel **ppOld = NULL,
bool bHouse = false, int iHouseType = -1,
D3DXVECTOR3 vecPos = D3DXVECTOR3(0.0f,0.0f,0.0f) );
// Special Case : 공성관련하여 공성 무기와 기존 캐릭터를 Switching 하기 위한 목적.
RYLCreature* AddSiegeCreature( RYLCreature* pSiegeCreature, unsigned long ulCharID, const char* pstrName, vector3 vecPosition, float fDirection, const char* pstrType );
void DeleteCreature( unsigned long ulCharID, BOOL bForceDelete = FALSE );
void SwitchCreature( RYLCreature* pNode1, RYLCreature* pNode2 ) ;
// Creature를 리스트 상에서 지워준다.( Creature는 그대로 놔둔 채 주소를 리턴... )
void AddCreatureList( RYLCreature* pCreature );
RYLCreature* DeleteCreatureList( unsigned long ulCharID );
RYLCreature* GetCreature( CZ3DGeneralChrModel *pModel );
RYLCreature* GetCreature( unsigned long ulCharID );
RYLCreature* GetCreature( char* szName );
RYLCreature* GetCreatureByAddedOrder( unsigned long ulAddedOrder );
inline RYLCreature* GetSelfCreature() { return m_pSelfCreature; }
inline void SetSelfCreature( RYLCreature* pSelfCreature ) { m_pSelfCreature = pSelfCreature; }
void SortCreatureMap();
void GetCharIDArray( vector<unsigned long>& vtCharID ); // 캐릭터 ID만 모아서 배열로...
const char* GetCreatureName( unsigned long ulCharID ); // 캐릭터의 존재 유무를 판단할 때도 사용( NULL이면 무효 )
RYLCreature* GetCreatureListHead();
RYLCreature* GetCreatureListNext();
CZ3DGeneralChrModel* GetModelListHead();
CZ3DGeneralChrModel* GetModelListNext();
inline void SetMaxCash( unsigned int unMaxCash ) { m_unMaxCash = unMaxCash; }
inline unsigned int GetMaxCash() { return m_unMaxCash; }
//--------------------------------------------------------------------------------------------------------------------------
// model memory managing
CZ3DGeneralChrModel* AllocModel( RYLCreature* pCreature, bool bHouse = false, int iHouseType = -1, D3DXVECTOR3 vecPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f) );
CZ3DGeneralChrModel* AllocTransformModel( unsigned long ulCharID, const char* pstrGCMDSName, bool bHouse = false, int iHouseType = -1, D3DXVECTOR3 vecPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f) );
void FreeModel( CZ3DGeneralChrModel* pModel, BOOL bForceDelete = FALSE );
CharModelNode* CheckUsableModelNode( const char* pstrGCMDSName );
bool CheckExistModel( CZ3DGeneralChrModel* pModel );
// 2005.06.20, yundi, PC가 0번인덱스 유지하며 GM캐릭터로 변환위해 추가
CZ3DGeneralChrModel* ReplaceModel( RYLCreature* pCreature, const char* pstrGCMDSName );
//---------------------------------------------------------------- ----------------------------------------------------------
// get character list
void GetSendCharacterChatList( list<unsigned long>& lstChar );
void GetSendCharacterAroundList( list<unsigned long>& lstChar, unsigned long ulSummonID = 0, bool bSummonAttacked = false );
void GetSendCharacterAroundList( list<unsigned long>& lstChar, unsigned long ulSummonID[ 10 ] );
void GetSendCharacterList( list<unsigned long>& lstChar );
//--------------------------------------------------------------------------------------------------------------------------
// clear self object
void ClearCreatureManager();
//--------------------------------------------------------------------------------------------------------------------------
// add action node to single creature
void AddAction( unsigned long ulCharID, unsigned long ulUpperAni, unsigned long ulLowerAni,
float fDirection, vector3 &vecNextPosition,
float fVec = 0.0f, unsigned short usAniNum = 0, unsigned long ulFrame = 0 );
//--------------------------------------------------------------------------------------------------------------------------
// Transformation
void Transformation( unsigned long ulCharID, const char* pstrGCMDSName = NULL );
void AddArmsCreature(unsigned long dwCID, unsigned long dwArmsCID);
void DeleteArmsCreature(unsigned long dwCID);
unsigned long IsArmsCreature(unsigned long dwCID);
void DeleteAllArmsCreature(void);
private:
//--------------------------------------------------------------------------------------------------------------------------
// singleton
static RYLCreatureManager* m_pInstance;
public:
static VOID Release()
{
if( m_pInstance )
{
delete m_pInstance;
m_pInstance = NULL;
}
}
static RYLCreatureManager* Instance()
{
if( !m_pInstance )
{
m_pInstance = new RYLCreatureManager;
}
return m_pInstance;
}
};
#endif //__RYLCREATURE_MANAGER_H__

View File

@@ -0,0 +1,585 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLDamageEffect.cpp
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: single creature's damage management
//
// Date: 2004. 4. 10. ( Sat )
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include "FrameTimer.h"
#include "../RYLClient/RYLClient/RYLTimer.h"
#include "Texture.h"
#include "SceneManager.h"
#include "RYLCreatureCommon.h"
#include "RYLDamageEffect.h"
#include "GMMemory.h"
//--------------------------------------------------------------------------------------------------------------------------
// functor
//--------------------------------------------------------------------------------------------------------------------------
static void ftDeleteDamageEffect( RYLDamageNode* pNode )
{
delete pNode;
pNode = NULL;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLDamageEffect
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------------------------------------------
// constructor, destructor
//--------------------------------------------------------------------------------------------------------------------------
RYLDamageEffect::RYLDamageEffect()
{
m_pNumberTexture = NULL;
}
RYLDamageEffect::~RYLDamageEffect()
{
ClearDamageEffect();
}
//--------------------------------------------------------------------------------------------------------------------------
// member functions
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// RYLDamageEffect::RenderDamage()
void RYLDamageEffect::RenderDamage( LPDIRECT3DDEVICE8 lpD3DDevice, bool bMovieVersion, vector3 vecPos, DAMAGE_TYPE type )
{
if( !m_lstDamageEffect.empty() )
{
float fUpdate = CFrameTimer::GetUpdateTimer( GRYLTimer.GetShowInterfaceTimerID( ) );
short wAlpha;
list<RYLDamageNode*>::iterator iter = m_lstDamageEffect.begin();
while( iter != m_lstDamageEffect.end() )
{
wAlpha = ( (*iter)->sDamageLifeTime / 1500.0f * 255.0f );
if( wAlpha < 0 )
{
wAlpha = 0;
}
unsigned short wMode = 0;
float fRate = 0.0f;
if( !bMovieVersion )
{
fRate = (*iter)->fScale;
switch( (*iter)->usDamageType )
{
case Type_Front:
case Type_Side:
case Type_Back:
case Type_Poisoned:
case Type_Fired:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 1;
}
break;
case ENEMY_DAMAGE:
{
wMode = 0;
}
break;
}
}
break;
case Type_Heal:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 3;
}
break;
case ENEMY_DAMAGE:
{
wMode = 3;
}
break;
}
}
break;
case Type_ManaHeal:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 2;
}
break;
case ENEMY_DAMAGE:
{
wMode = 2;
}
break;
}
}
break;
case Type_Guard:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 7;
}
break;
case ENEMY_DAMAGE:
{
wMode = 8;
}
break;
}
}
break;
case Type_Critical:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 6;
if( (*iter)->sDamageLifeTime >= 1200 )
{
fRate = ( 5.0f - ( 1.0f - ( ( (*iter)->sDamageLifeTime - 1200.0f ) / 300.0f ) ) * 4.0f ) * (*iter)->fScale;
}
else
{
fRate = (*iter)->fScale;
}
}
break;
case ENEMY_DAMAGE:
{
wMode = 5;
if( (*iter)->sDamageLifeTime >= 1200 )
{
fRate = ( 5.0f - ( 1.0f - ( ( (*iter)->sDamageLifeTime - 1200.0f ) / 300.0f ) ) * 4.0f ) * (*iter)->fScale;
}
else
{
fRate = (*iter)->fScale;
}
}
break;
}
}
break;
case Type_Evade:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 9;
}
break;
case ENEMY_DAMAGE:
{
wMode = 9;
}
break;
}
}
break;
case Type_Resist:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 10;
}
break;
case ENEMY_DAMAGE:
{
wMode = 10;
}
break;
}
}
break;
case Type_Miss:
{
switch( type )
{
case FRIENDLY_DAMAGE:
{
wMode = 11;
}
break;
case ENEMY_DAMAGE:
{
wMode = 12;
}
break;
}
}
break;
}
}
RenderDamageNumber( lpD3DDevice,
vecPos.x, vecPos.y - ( 1.0f - (*iter)->sDamageLifeTime / 1500.0f ) * 90.0f,
static_cast<unsigned char>( wAlpha ) * (*iter)->fScale, wMode, (*iter)->lDamageValue, fRate, (*iter)->dwAlign );
(*iter)->sDamageLifeTime -= fUpdate * 2.0f;
if( (*iter)->sDamageLifeTime <= 0 )
{
delete (*iter) ;
(*iter) = NULL ;
m_lstDamageEffect.erase( iter );
return;
}
else
{
++iter;
}
}
}
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLDamageEffect::RenderDamageNumber()
void RYLDamageEffect::RenderDamageNumber( LPDIRECT3DDEVICE8 lpD3DDevice, short sPosX, short sPosY, unsigned char cAlpha, unsigned short wMode, long lValue, float fRate, unsigned long dwAlign )
{
if( !m_pNumberTexture )
{
m_pNumberTexture = new CTexture;
CTexture::SetPath( INTERFACETEXTUREPATH );
m_pNumberTexture->Load( "num.dds" );
}
lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
lpD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ) ;
lpD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ) ;
lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ) ;
lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ) ;
lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ) ;
lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ) ;
lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ) ;
char strNum[ 12 ];
itoa( abs( lValue ), strNum, 10 );
switch( wMode )
{
case 5: // Critical
case 6:
if( strcmp( strNum, "" ) )
{
float fRealX = 23.0f * fRate;
float fRealY = 29.0f * fRate;
int len = strlen( strNum );
float fPosX;
switch(dwAlign)
{
case RYLDamageNode::DN_Center:
fPosX = sPosX - ( (len * fRealX) / 2.0f);
break;
case RYLDamageNode::DN_Left:
fPosX = sPosX - ( (len * fRealX) + (fRealX / 2.0f) );
break;
case RYLDamageNode::DN_Right:
fPosX = sPosX + (fRealX / 2.0f);
break;
}
float fPosY = sPosY - ( ( fRealY - 29.0f ) / 2.0f );
TLVertex pVertices[ 4 ];
pVertices[ 0 ].Diffuse.c = pVertices[ 1 ].Diffuse.c = pVertices[ 2 ].Diffuse.c = pVertices[ 3 ].Diffuse.c = 0xFFFFFFFF;
pVertices[ 0 ].Diffuse.a = pVertices[ 1 ].Diffuse.a = pVertices[ 2 ].Diffuse.a = pVertices[ 3 ].Diffuse.a = cAlpha;
pVertices[ 0 ].Specular.c = pVertices[ 1 ].Specular.c = pVertices[ 2 ].Specular.c = pVertices[ 3 ].Specular.c = 0;
pVertices[ 0 ].w = pVertices[ 1 ].w = pVertices[ 2 ].w = pVertices[ 3 ].w = 0.1f;
pVertices[ 0 ].v.z = pVertices[ 1 ].v.z = pVertices[ 2 ].v.z = pVertices[ 3 ].v.z = 0.1f;
pVertices[ 0 ].v.x = pVertices[ 1 ].v.x = fPosX - 0.5f;
pVertices[ 2 ].v.x = pVertices[ 3 ].v.x = fPosX + fRealX - 0.5f;
pVertices[ 0 ].v.y = pVertices[ 2 ].v.y = fPosY - 0.5f;
pVertices[ 1 ].v.y = pVertices[ 3 ].v.y = fPosY + fRealY - 0.5f;
pVertices[ 0 ].tv = pVertices[ 2 ].tv = ( 92 + ( ( wMode - 5 ) * 29.0f ) ) / 256.0f + 0.0005f;
pVertices[ 1 ].tv = pVertices[ 3 ].tv = ( 92 + ( ( wMode - 5 ) * 29.0f + 29.0f ) ) / 256.0f - 0.0005f;
lpD3DDevice->SetVertexShader( NULL );
lpD3DDevice->SetVertexShader( TLVERTEXFVF );
lpD3DDevice->SetTexture( 1, NULL );
lpD3DDevice->SetTexture( 0, m_pNumberTexture->GetTexture() );
for( int i = 0; i < len; i++ )
{
pVertices[ 0 ].tu = pVertices[ 1 ].tu = ( ( strNum[ i ] - '0' ) * 23.0f ) / 256.0f + 0.0005f;
pVertices[ 2 ].tu = pVertices[ 3 ].tu = ( ( strNum[ i ] - '0' ) * 23.0f + 23.0f ) / 256.0f - 0.0005f;
lpD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TLVertex ) );
pVertices[ 0 ].v.x += fRealX;
pVertices[ 1 ].v.x += fRealX;
pVertices[ 2 ].v.x += fRealX;
pVertices[ 3 ].v.x += fRealX;
}
}
break;
case 7: // Block
case 8:
{
float fRealX = 88.0f * fRate;
float fRealY = 24.0f * fRate;
float fPosX = sPosX - fRealX / 2.0f;
float fPosY = sPosY - ( ( fRealY - 24.0f ) / 2.0f );
TLVertex pVertices[ 4 ];
pVertices[ 0 ].Diffuse.c = pVertices[ 1 ].Diffuse.c = pVertices[ 2 ].Diffuse.c = pVertices[ 3 ].Diffuse.c = 0xFFFFFFFF;
pVertices[ 0 ].Diffuse.a = pVertices[ 1 ].Diffuse.a = pVertices[ 2 ].Diffuse.a = pVertices[ 3 ].Diffuse.a = cAlpha;
pVertices[ 0 ].Specular.c = pVertices[ 1 ].Specular.c = pVertices[ 2 ].Specular.c = pVertices[ 3 ].Specular.c = 0;
pVertices[ 0 ].w = pVertices[ 1 ].w = pVertices[ 2 ].w = pVertices[ 3 ].w = 0.1f;
pVertices[ 0 ].v.z = pVertices[ 1 ].v.z = pVertices[ 2 ].v.z = pVertices[ 3 ].v.z = 0.1f;
pVertices[ 0 ].v.x = pVertices[ 1 ].v.x = fPosX - 0.5f;
pVertices[ 2 ].v.x = pVertices[ 3 ].v.x = fPosX + fRealX - 0.5f;
pVertices[ 0 ].v.y = pVertices[ 2 ].v.y = fPosY - 0.5f;
pVertices[ 1 ].v.y = pVertices[ 3 ].v.y = fPosY + fRealY - 0.5f;
pVertices[ 0 ].tu = pVertices[ 1 ].tu = 0.0005f;
pVertices[ 2 ].tu = pVertices[ 3 ].tu = 88 / 256.0f - 0.0005f;
pVertices[ 0 ].tv = pVertices[ 2 ].tv = ( 150 + ( ( wMode - 7 ) * 24.0f ) ) / 256.0f - 0.0005f;
pVertices[ 1 ].tv = pVertices[ 3 ].tv = ( 150 + ( ( wMode - 7 ) * 24.0f + 24.0f ) ) / 256.0f - 0.0005f;
lpD3DDevice->SetVertexShader( NULL );
lpD3DDevice->SetVertexShader( TLVERTEXFVF );
lpD3DDevice->SetTexture( 1, NULL );
lpD3DDevice->SetTexture( 0, m_pNumberTexture->GetTexture() );
lpD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TLVertex ) );
}
break;
case 9: // Evade
{
float fRealX = 110.0f * fRate;
float fRealY = 25.0f * fRate;
float fPosX = sPosX - fRealX / 2.0f;
float fPosY = sPosY - ( ( fRealY - 25.0f ) / 2.0f );
TLVertex pVertices[ 4 ];
pVertices[ 0 ].Diffuse.c = pVertices[ 1 ].Diffuse.c = pVertices[ 2 ].Diffuse.c = pVertices[ 3 ].Diffuse.c = 0xFFFFFFFF;
pVertices[ 0 ].Diffuse.a = pVertices[ 1 ].Diffuse.a = pVertices[ 2 ].Diffuse.a = pVertices[ 3 ].Diffuse.a = cAlpha;
pVertices[ 0 ].Specular.c = pVertices[ 1 ].Specular.c = pVertices[ 2 ].Specular.c = pVertices[ 3 ].Specular.c = 0;
pVertices[ 0 ].w = pVertices[ 1 ].w = pVertices[ 2 ].w = pVertices[ 3 ].w = 0.1f;
pVertices[ 0 ].v.z = pVertices[ 1 ].v.z = pVertices[ 2 ].v.z = pVertices[ 3 ].v.z = 0.1f;
pVertices[ 0 ].v.x = pVertices[ 1 ].v.x = fPosX - 0.5f;
pVertices[ 2 ].v.x = pVertices[ 3 ].v.x = fPosX + fRealX - 0.5f;
pVertices[ 0 ].v.y = pVertices[ 2 ].v.y = fPosY - 0.5f;
pVertices[ 1 ].v.y = pVertices[ 3 ].v.y = fPosY + fRealY - 0.5f;
pVertices[ 0 ].tu = pVertices[ 1 ].tu = 0.0005f;
pVertices[ 2 ].tu = pVertices[ 3 ].tu = 110 / 256.0f - 0.0005f;
pVertices[ 0 ].tv = pVertices[ 2 ].tv = 198 / 256.0f - 0.0005f;
pVertices[ 1 ].tv = pVertices[ 3 ].tv = 223 / 256.0f - 0.0005f;
lpD3DDevice->SetVertexShader( NULL );
lpD3DDevice->SetVertexShader( TLVERTEXFVF );
lpD3DDevice->SetTexture( 1, NULL );
lpD3DDevice->SetTexture( 0, m_pNumberTexture->GetTexture() );
lpD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TLVertex ) );
}
break;
case 10: // Resist
{
float fRealX = 105.0f * fRate;
float fRealY = 27.0f * fRate;
float fPosX;
switch(dwAlign)
{
case RYLDamageNode::DN_Center:
fPosX = sPosX - fRealX / 2.0f;
break;
case RYLDamageNode::DN_Left:
fPosX = sPosX - ( fRealX + (fRealX / 6.0f) );
break;
case RYLDamageNode::DN_Right:
fPosX = sPosX + (fRealX / 6.0f);
break;
}
float fPosY = sPosY - ( ( fRealY - 27.0f ) / 2.0f );
TLVertex pVertices[ 4 ];
pVertices[ 0 ].Diffuse.c = pVertices[ 1 ].Diffuse.c = pVertices[ 2 ].Diffuse.c = pVertices[ 3 ].Diffuse.c = 0xFFFFFFFF;
pVertices[ 0 ].Diffuse.a = pVertices[ 1 ].Diffuse.a = pVertices[ 2 ].Diffuse.a = pVertices[ 3 ].Diffuse.a = cAlpha;
pVertices[ 0 ].Specular.c = pVertices[ 1 ].Specular.c = pVertices[ 2 ].Specular.c = pVertices[ 3 ].Specular.c = 0;
pVertices[ 0 ].w = pVertices[ 1 ].w = pVertices[ 2 ].w = pVertices[ 3 ].w = 0.1f;
pVertices[ 0 ].v.z = pVertices[ 1 ].v.z = pVertices[ 2 ].v.z = pVertices[ 3 ].v.z = 0.1f;
pVertices[ 0 ].v.x = pVertices[ 1 ].v.x = fPosX - 0.5f;
pVertices[ 2 ].v.x = pVertices[ 3 ].v.x = fPosX + fRealX - 0.5f;
pVertices[ 0 ].v.y = pVertices[ 2 ].v.y = fPosY - 0.5f;
pVertices[ 1 ].v.y = pVertices[ 3 ].v.y = fPosY + fRealY - 0.5f;
pVertices[ 0 ].tu = pVertices[ 1 ].tu = 0.0005f;
pVertices[ 2 ].tu = pVertices[ 3 ].tu = 105 / 256.0f - 0.0005f;
pVertices[ 0 ].tv = pVertices[ 2 ].tv = 223 / 256.0f - 0.0005f;
pVertices[ 1 ].tv = pVertices[ 3 ].tv = 250 / 256.0f - 0.0005f;
lpD3DDevice->SetVertexShader( NULL );
lpD3DDevice->SetVertexShader( TLVERTEXFVF );
lpD3DDevice->SetTexture( 1, NULL );
lpD3DDevice->SetTexture( 0, m_pNumberTexture->GetTexture() );
lpD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TLVertex ) );
}
break;
case 11: // Miss
case 12:
{
float fRealX = 88.0f * fRate;
float fRealY = 24.0f * fRate;
float fPosX = sPosX - fRealX / 2.0f;
float fPosY = sPosY - ( ( fRealY - 24.0f ) / 2.0f );
TLVertex pVertices[ 4 ];
pVertices[ 0 ].Diffuse.c = pVertices[ 1 ].Diffuse.c = pVertices[ 2 ].Diffuse.c = pVertices[ 3 ].Diffuse.c = 0xFFFFFFFF;
pVertices[ 0 ].Diffuse.a = pVertices[ 1 ].Diffuse.a = pVertices[ 2 ].Diffuse.a = pVertices[ 3 ].Diffuse.a = cAlpha;
pVertices[ 0 ].Specular.c = pVertices[ 1 ].Specular.c = pVertices[ 2 ].Specular.c = pVertices[ 3 ].Specular.c = 0;
pVertices[ 0 ].w = pVertices[ 1 ].w = pVertices[ 2 ].w = pVertices[ 3 ].w = 0.1f;
pVertices[ 0 ].v.z = pVertices[ 1 ].v.z = pVertices[ 2 ].v.z = pVertices[ 3 ].v.z = 0.1f;
pVertices[ 0 ].v.x = pVertices[ 1 ].v.x = fPosX - 0.5f;
pVertices[ 2 ].v.x = pVertices[ 3 ].v.x = fPosX + fRealX - 0.5f;
pVertices[ 0 ].v.y = pVertices[ 2 ].v.y = fPosY - 0.5f;
pVertices[ 1 ].v.y = pVertices[ 3 ].v.y = fPosY + fRealY - 0.5f;
pVertices[ 0 ].tu = pVertices[ 1 ].tu = 91 / 256.0f - 0.0005f;
pVertices[ 2 ].tu = pVertices[ 3 ].tu = 163 / 256.0f - 0.0005f;
pVertices[ 0 ].tv = pVertices[ 2 ].tv = ( 150 + ( ( wMode - 11 ) * 24.0f ) ) / 256.0f - 0.0005f;
pVertices[ 1 ].tv = pVertices[ 3 ].tv = ( 150 + ( ( wMode - 11 ) * 24.0f + 24.0f ) ) / 256.0f - 0.0005f;
lpD3DDevice->SetVertexShader( NULL );
lpD3DDevice->SetVertexShader( TLVERTEXFVF );
lpD3DDevice->SetTexture( 1, NULL );
lpD3DDevice->SetTexture( 0, m_pNumberTexture->GetTexture() );
lpD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TLVertex ) );
}
break;
default: // Normal
if( strcmp( strNum, "" ) )
{
float fRealX = 21.0f * fRate;
float fRealY = 23.0f * fRate;
int len = strlen( strNum );
float fPosX;
switch(dwAlign)
{
case RYLDamageNode::DN_Center:
fPosX = sPosX - ( (len * fRealX) / 2.0f);
break;
case RYLDamageNode::DN_Left:
fPosX = sPosX - ( (len * fRealX) + (fRealX / 2.0f) );
break;
case RYLDamageNode::DN_Right:
fPosX = sPosX + (fRealX / 2.0f);
break;
}
float fPosY = sPosY - ( ( fRealY - 23.0f ) / 2.0f );
TLVertex pVertices[ 4 ];
pVertices[ 0 ].Diffuse.c = pVertices[ 1 ].Diffuse.c = pVertices[ 2 ].Diffuse.c = pVertices[ 3 ].Diffuse.c = 0xFFFFFFFF;
pVertices[ 0 ].Diffuse.a = pVertices[ 1 ].Diffuse.a = pVertices[ 2 ].Diffuse.a = pVertices[ 3 ].Diffuse.a = cAlpha;
pVertices[ 0 ].Specular.c = pVertices[ 1 ].Specular.c = pVertices[ 2 ].Specular.c = pVertices[ 3 ].Specular.c = 0;
pVertices[ 0 ].w = pVertices[ 1 ].w = pVertices[ 2 ].w = pVertices[ 3 ].w = 0.1f;
pVertices[ 0 ].v.z = pVertices[ 1 ].v.z = pVertices[ 2 ].v.z = pVertices[ 3 ].v.z = 0.1f;
pVertices[ 0 ].v.x = pVertices[ 1 ].v.x = fPosX - 0.5f;
pVertices[ 2 ].v.x = pVertices[ 3 ].v.x = fPosX + fRealX - 0.5f;
pVertices[ 0 ].v.y = pVertices[ 2 ].v.y = fPosY - 0.5f;
pVertices[ 1 ].v.y = pVertices[ 3 ].v.y = fPosY + fRealY - 0.5f;
pVertices[ 0 ].tv = pVertices[ 2 ].tv = ( wMode * 23.0f ) / 256.0f + 0.0005f;
pVertices[ 1 ].tv = pVertices[ 3 ].tv = ( wMode * 23.0f + 23.0f ) / 256.0f - 0.0005f;
lpD3DDevice->SetVertexShader( NULL );
lpD3DDevice->SetVertexShader( TLVERTEXFVF );
lpD3DDevice->SetTexture( 1, NULL );
lpD3DDevice->SetTexture( 0, m_pNumberTexture->GetTexture() );
for( int i = 0; i < len; i++ )
{
pVertices[ 0 ].tu = pVertices[ 1 ].tu = ( ( strNum[ i ] - '0' ) * 21.0f ) / 256.0f + 0.0005f;
pVertices[ 2 ].tu = pVertices[ 3 ].tu = ( ( strNum[ i ] - '0' ) * 21.0f + 21.0f ) / 256.0f - 0.0005f;
lpD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TLVertex ) );
pVertices[ 0 ].v.x += fRealX;
pVertices[ 1 ].v.x += fRealX;
pVertices[ 2 ].v.x += fRealX;
pVertices[ 3 ].v.x += fRealX;
}
}
break;
}
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLDamageEffect::ClearDamageEffect()
void RYLDamageEffect::ClearDamageEffect()
{
for_each( m_lstDamageEffect.begin(), m_lstDamageEffect.end(), ftDeleteDamageEffect );
m_lstDamageEffect.clear();
if( m_pNumberTexture )
{
delete m_pNumberTexture;
m_pNumberTexture = NULL;
}
}
//--------------------------------------------------------------------------------------------------------------------------
// RYLDamageEffect::

View File

@@ -0,0 +1,93 @@
//--------------------------------------------------------------------------------------------------------------------------
// File Name: RYLDamageEffect.h
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: single creature's damage management
//
// Date: 2004. 3. 10. ( Sat )
//--------------------------------------------------------------------------------------------------------------------------
#ifndef __RYL_DAMAGE_EFFECT_H__
#define __RYL_DAMAGE_EFFECT_H__
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include "Z3DGeneralChrModel.h"
#include <list>
using namespace std;
class CTexture;
class CRYLGameData;
//--------------------------------------------------------------------------------------------------------------------------
// Enums, Structs
//--------------------------------------------------------------------------------------------------------------------------
struct RYLDamageNode
{
short sDamageLifeTime;
long lDamageValue;
unsigned short usDamageType;
float fScale;
long dwAlign; // 0 : Center, 1 : Left, 2 : Right
enum
{
DN_Center = 0,
DN_Left,
DN_Right
};
RYLDamageNode()
{
sDamageLifeTime = 0;
lDamageValue = 0;
usDamageType = 0;
fScale = 0.0f;
dwAlign = DN_Center;
}
};
//--------------------------------------------------------------------------------------------------------------------------
// Consts
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// Classes
//--------------------------------------------------------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class RYLDamageEffect
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
class RYLDamageEffect
{
private:
CTexture* m_pNumberTexture;
list<RYLDamageNode*> m_lstDamageEffect;
public:
//--------------------------------------------------------------------------------------------------------------------------
// Constructor, Destructor
RYLDamageEffect();
~RYLDamageEffect();
//--------------------------------------------------------------------------------------------------------------------------
// add damage effect
inline void AddDamage( RYLDamageNode* pNode ) { m_lstDamageEffect.push_back( pNode ); }
//--------------------------------------------------------------------------------------------------------------------------
// damage rendering
enum DAMAGE_TYPE { FRIENDLY_DAMAGE = 0, ENEMY_DAMAGE = 1 };
void RenderDamage( LPDIRECT3DDEVICE8 lpD3DDevice, bool bMovieVersion, vector3 vecPos, DAMAGE_TYPE type );
private:
void RenderDamageNumber( LPDIRECT3DDEVICE8 lpD3DDevice, short sPosX, short sPosY, unsigned char cAlpha, unsigned short wMode, long lValue, float fRate, unsigned long dwAlign );
public:
//--------------------------------------------------------------------------------------------------------------------------
// clear self object
void ClearDamageEffect();
};
#endif // __RYL_DAMAGE_EFFECT_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,76 @@
//================================================================
//
// Name : RYLDropshipControl.h
// Desc : 수송선 컨트롤
// Date : 2004. 05. 17
//
//================================================================
#ifndef __RYL_DROPSHIPCONTROL_H__
#define __RYL_DROPSHIPCONTROL_H__
#include "RYLObjectControl.h"
#include "RYLLongAttackWeaponControl.h"
class CRYLDropshipControl
{
private :
CCharacterControl* m_lpObjControl ;
CZ3DObject* m_lpWingObject ;
RYLCreature* m_lpSiegeModel; // 공성병기 크리쳐
unsigned char m_byVelocity[ 228 ] ;
unsigned int m_iVelocityControl ;
CRYLEaseOutDivideInterpolation m_EaseOutDivideInterpolation ;
long m_lVelocityUpdate ;
long m_lTireAngleUpdate ;
long m_lRealAngleUpdate ;
public :
FLOAT m_fTireSpeed ;
LONG m_lRealTireRotateUpdate ; // Update Time
FLOAT m_fRealTireAngle ; // 실제 회전각도
LONG m_lTireRotateUpdate ; // 모델에 부착된 타이어 Update time
FLOAT m_fTireAngle ; // 모델에 부착된 타이어 회전각도
FLOAT m_fBodyAngle ; // 몸통 회전
float m_fVelocity ;
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
public :
CRYLDropshipControl( CCharacterControl* lpObjControl ) ;
~CRYLDropshipControl() ;
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int MouseX = 0,int MouseY = 0 ) ;
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
VOID SetModifySkileton() ;
VOID SetSiegeModel( unsigned long dwChrID, const char *strName, vector3 vecChrPos, float fDirection ) ;
RYLCreature* GetCreature() { return m_lpSiegeModel ; }
void SetCreature( RYLCreature* pCreature ) { m_lpSiegeModel = pCreature ; }
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
} ;
#endif //__RYL_DROPSHIPCONTROL_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,59 @@
//================================================================
//
// Name : RYLGMCharacterControl.h
// Desc : GM ij¸¯ÅÍ ÄÁÆ®·Ñ
// Date : 2005. 04. 18
//
//================================================================
#ifndef __RYL_GMCHARACTERCONTROL_H__
#define __RYL_GMCHARACTERCONTROL_H__
#include "RYLObjectControl.h"
class CRYLGMCharacterControl
{
private :
CCharacterControl* m_lpObjControl ;
RYLCreature* m_lpCreature;
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
BOOL m_bLeftMousePress;
BOOL m_bRightMousePress;
BOOL m_bClickPlayerAndNpc;
BOOL m_bClickSkill;
unsigned long m_dwNormalTargetID;
unsigned long m_dwSpecialTargetID;
BOOL m_bLeftClickDown;
bool m_bKeyPress;
public :
CRYLGMCharacterControl( CCharacterControl* lpObjControl ) ;
~CRYLGMCharacterControl() ;
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int nMouseX = 0,int nMouseY = 0 ) ;
VOID MouseClickModeSelfCharacterUpdate( BOOL bKeyAble, BOOL bEdge, int nMouseX, int nMouseY ) ;
RYLCreature* MouseClickModeSelectSpecialTarget( RYLCreature* pCreature, int nMouseX, int nMouseY );
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
VOID RestoreCamera() ;
RYLCreature* GetCreature() { return m_lpCreature; }
CCharacterControl *GetCreatureControl() { return m_lpObjControl; }
VOID SetCreature( RYLCreature* pCreature ) { m_lpCreature = pCreature; }
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
} ;
#endif //__RYL_GMCHARACTERCONTROL_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,174 @@
//================================================================
//
// Name : RYLLongAttackWeaponControl.h
// Desc : 원거리 공성병기 컨트롤
// Date : 2004. 05. 17
//
//================================================================
#ifndef __RYL_LONGATTACKWEAPONCONTROLL_H__
#define __RYL_LONGATTACKWEAPONCONTROLL_H__
#include "RYLObjectControl.h"
typedef struct __SDiffuseVertex
{
D3DXVECTOR3 Position ;
DWORD Color;
} SDiffuseVertex;
#define FVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
class CRYLEaseOutShiftInterpolation
{
private :
int _value ;
int _target ;
int _shift ;
public :
bool Setup( int from, int to, int shift )
{
if ( shift <= 0 )
{
return false ;
}
_value = from ;
_target = to ;
_shift = shift ;
return true ;
}
// 시간에 의존적이지 않음
bool Interpolate()
{
int oldValue = _value ;
if ( _shift > 0 )
{
_value = ( _value * ( ( 1 << _shift ) - 1 ) + _target ) >> _shift ;
}
return ( _value == oldValue ) ;
}
int GetValue()
{
return _value ;
}
} ;
//=================================================================================
class CRYLEaseOutDivideInterpolation : public CRYLEaseOutShiftInterpolation
{
public :
float _value ;
float _target ;
float _divisor ;
public :
bool Setup( float from, float to, float divisor )
{
if ( divisor <= 0 )
{
return false ;
}
_value = from ;
_target = to ;
_divisor = divisor ;
return true ;
}
// 시간에 의존적이지 않음
bool Interpolate()
{
float oldValue = _value ;
if ( _divisor > 0 )
{
_value = ( _value * ( _divisor - 1.0f ) + _target ) / _divisor ;
}
return ( _value == oldValue ) ;
}
float GetValue()
{
return _value ;
}
} ;
class CRYLLongAttackWeaponControl
{
private :
CZ3DObject* m_lpLeftTireObject ; // 왼쪽 바퀴
CZ3DObject* m_lpRightTireObject ; // 오른쪽 바퀴
CZ3DObject* m_lpBodyObject ;
FLOAT m_fBodyAngle ; // 몸통 회전
float m_fVelocity ;
RYLCreature* m_lpSiegeModel;
CCharacterControl* m_lpObjControl ;
CRYLEaseOutDivideInterpolation m_EaseOutDivideInterpolation ;
FLOAT m_fTireSpeed ;
LONG m_lRealTireRotateUpdate ; // Update Time
FLOAT m_fRealTireAngle ; // 실제 회전각도
LONG m_lTireRotateUpdate ; // 모델에 부착된 타이어 Update time
FLOAT m_fTireAngle ; // 모델에 부착된 타이어 회전각도
LONG m_lFlowLine ;
D3DXVECTOR3 m_v3BombPos[ 100 ] ;
SDiffuseVertex m_DiffuseVertex[ 100 ] ;
LPDIRECT3DVERTEXBUFFER8 m_pVertexBuffer ;
CEffScript *test_script ;
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
long m_lTireUpdate ;
long m_lVelocityUpdate ;
long m_lTireAngleUpdate ;
long m_lBodyAngleUpdate ;
long m_lRealAngleUpdate ;
public :
CRYLLongAttackWeaponControl( CCharacterControl* lpObjControl ) ;
~CRYLLongAttackWeaponControl() ;
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int MouseX = 0,int MouseY = 0 ) ;
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
void Render( LPDIRECT3DDEVICE8 pd3dDevice ) ;
VOID SetModifySkileton() ;
VOID SetSiegeModel( unsigned long dwChrID, const char *strName, vector3 vecChrPos, float fDirection ) ;
HRESULT CreateBombLine( vector3& v3Start, vector3& v3Dest) ;
double CalcBi_n( INT n, INT i, DOUBLE u ) ;
RYLCreature* GetCreature() { return m_lpSiegeModel ; }
void SetCreature( RYLCreature* pCreature ) { m_lpSiegeModel = pCreature ; }
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
} ;
#endif //__RYL_LONGATTACKWEAPONCONTROLL_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,65 @@
//================================================================
//
// Name : RYLLongDefenceWeaponControl.h
// Desc : 원거리 수성병기 컨트롤
// Date : 2004. 05. 17
//
//================================================================
#ifndef __RYL_LONGDEFENCEWEAPONCONTROL_H__
#define __RYL_LONGDEFENCEWEAPONCONTROL_H__
#include "RYLObjectControl.h"
#include "RYLLongAttackWeaponControl.h"
class CRYLLongDefenceWeaponControl
{
private :
CRYLEaseOutDivideInterpolation m_EaseOutDivideInterpolation ;
CZ3DObject* m_lpWingObject ;
CZ3DObject* m_lpLeftTireObject ; // 왼쪽 바퀴
CZ3DObject* m_lpRightTireObject ; // 오른쪽 바퀴
FLOAT m_fTireSpeed ;
LONG m_lRealTireRotateUpdate ; // Update Time
FLOAT m_fRealTireAngle ; // 실제 회전각도
LONG m_lTireRotateUpdate ; // 모델에 부착된 타이어 Update time
FLOAT m_fTireAngle ; // 모델에 부착된 타이어 회전각도
CCharacterControl* m_lpObjControl ;
RYLCreature* m_lpSiegeModel ; // 공성병기 크리쳐
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
public :
CRYLLongDefenceWeaponControl( CCharacterControl* lpObjControl ) ;
~CRYLLongDefenceWeaponControl() ;
RYLCreature* GetCreature() { return m_lpSiegeModel ; }
void SetCreature( RYLCreature* pCreature ) { m_lpSiegeModel = pCreature ; }
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
VOID SetModifySkileton() ;
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int MouseX = 0,int MouseY = 0 ) ;
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
VOID SetSiegeModel( unsigned long dwChrID, const char *strName, vector3 vecChrPos, float fDirection ) ;
} ;
#endif //__RYL_LONGDEFENCEWEAPONCONTROL_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,298 @@
// CharacterControl.h: interface for the CCharacterControl class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_CHARACTERCONTROL_H__E5DF7481_5D2B_4E51_B47A_951185AFB01D__INCLUDED_)
#define AFX_CHARACTERCONTROL_H__E5DF7481_5D2B_4E51_B47A_951185AFB01D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define TARGET_SELF 10001
#define TARGET_SELECTCHAR 10000
#include "Z3DGeneralChrModel.h"
#include "SceneManager.h"
#include "RYLCreatureCommon.h"
#include "RYLCreatureManager.h"
#include "RYLCharacterDataManager.h"
#include "CreatureSize.h"
#include "CameraControl.h"
#include "..\\Effect\\CEffscript.h"
#include <Skill/Spell/SpellKind.h>
//===============================================================================
// 병기관련
class CRYLCharacterControl ;
class CRYLShortAttackWeaponControl ;
class CRYLLongAttackWeaponControl ;
class CRYLShortDefenceWeaponControl ;
class CRYLLongDefenceWeaponControl ;
class CRYLDropshipControl ;
#define ATTACKABLE_RANGE 150.0f
#define TARGETNEAR_RANGE 100.0f
#define PLAYERTARGETNEAR_RANGE 1000.0f
enum CONTROL_KIND
{
CHARACTER_CONTROL = 0, // 캐릭터 컨트롤
LONG_ATTACKWEAPON_CONTROL = 1, // 원거리 공성병기 컨트롤
SHORT_ATTACKWEAPON_CONTROL = 2, // 근거리 공성병기 컨트롤
LONG_DEFENCEWEAPON_CONTROL = 3, // 원거리 수성병기 컨트롤
SHORT_DEFENCEWEAPON_CONTROL = 4, // 근거리 수성병기 컨트롤
DROPSHIP_CONTROL = 5, // 수송선 컨트롤
} ;
extern int MAXCHRLOAD;
unsigned char KeyPressed(unsigned char key);
bool CylinderOBBIntersection( vector3 vecPos, vector3 vecDir, float fArcAngle,vector3 vecMax, vector3 vecMin, float fRad );
class CCharacterControl
{
public :
class CAttackedNode
{
public :
DWORD m_dwSrcChrID ;
DWORD m_dwTarChrID ;
DWORD m_dwWeaponType ;
};
class ChrCashNode
{
public :
CZ3DGeneralChrModel* m_lpChrModel ;
CHAR m_strGCMDSName[ MAX_PATH ] ;
INT m_nUsedChrID;
};
BOOL m_bSkillExecuted ; // 스킬 헤제 유무
DWORD m_dwStartSkillTick ; // 스킬 발동( 시작 ) Tick
DWORD m_dwCastingSkillTick ; // 스킬 케스팅 Tick
DWORD m_dwCastingSkillGrade ; // 스킬 그레이드
// ------------------------------------------------
// 캐릭터 리스트( 리팩토링 이후 제거 대상 )
vector3 m_vecPrePosition ; // 자신의 캐릭터 어전 위치(NPC 거리 계산용)
BOOL m_bAttackable ; // 공격 유무
DWORD m_dwMaxCombo ; // 자신의 총 콤보수
// ------------------------------------------------
// 소환수 관련 멤버
BOOL m_bSummon ; // 소환중인 아닌지
BOOL m_bSummonCmd ; // 소환물의 명령을 내리는 중인지 아닌지
unsigned char m_cSummonCmd ; // 소환물의 명령 커맨드
CEffScript* m_lpDuelReady ; // Duel 상태일때 Ready Effect
BOOL m_bComboSuccess ; // 스킬 성공 유무
map< unsigned long, unsigned char > m_lstPreDuelTargetID ; // 서버에서 Fight메시지가 올때까지 여기에 등록이 되어 있다가, (ID, VSType)
map< unsigned long, unsigned char > m_lstDuelTargetID ; // Fight메시지를 받으면 PreDuelTargetID를 여기에 등록한다. (ID, VSType)
DWORD m_dwRunFactorTimer ; // Run 타임. m_dwRunFactorTimer = CFrameTimer::Regist(200.0f);
DWORD m_dwNormalTargetMonsterID ; // Target된 MONSTER ID
DWORD m_dwNormalTargetID ; // Target된 PC ID
DWORD m_dwSpecialTargetID ; // SpecialTarget ID
BOOL m_bAttackResult ; // 공격 성공 유무
BOOL m_bAutoFollowMode ; // AutoFollowMode 유무
DWORD m_dwAutoFollowChrID ; // 상대 캐릭터 따라가기 유무
float m_fRunSpeed ; // Run Speed
float m_fWalkSpeed ; // Walk Speed
float m_fSkillLength ; // Skill Length
float m_fCameraSpeed ; // Camera Speed
BOOL m_bFreelook ; // /Neo 모드을때 Freelook 유무
vector3 m_vecCameraPos ; // 카메라 위치
float m_fCameraDir ; // 카메라 방향
int m_nCharMovingPacketTimerID ; // UDP로 보내지내는 움직임에관한 페킷의 발송시간
int m_SkillAttackValue ; // Skill 에 따라서 나오는 타격 이팩트가 바뀔지 결정하는 플레그
unsigned long m_dwSlideTick ; // 슬라이드 틱
int m_MouseClickMode ; // 마우스 클릭 모드( 전투관련 )
int m_nCameraAnimation ; // 카메라 애니메이션
BOOL m_bCharacterTargetNear ; // Character Target Near
DWORD m_nSelectItem ; // 선택된 Item
bool m_bSkillAttack ; // 스킬 공격 유무
bool m_bGoodChantEffectShow[4] ; // GooodChant Effect Show 유무 파티, 아군, 중립, 적군
bool m_bBadChantEffectShow[4] ; // BadChant Effect Show 유무 파티, 아군, 중립, 적군
long m_lAutoRunCounter ; // AutoRun()을 활성시키기 위한 카운터
unsigned long m_dwAutoTargetID ; // Auto Target ID
bool m_bAutoTargetAttack ; // Auto Target 유무
vector3 m_vecClickPos ; // click pos
bool m_bClickMove ; // 클릭 이동 유무
bool m_bClickAttack ; // 클릭 공격 유무
DWORD m_dwClickModeAttackTargetID ; // 마우스모드에서 공격 타겟 ID
std::vector<CAttackedNode> m_AttackedList ; // 공격노드 리스트
bool m_bClientUsed ; // 클라이언트 사용 유무
CCameraControl m_Camera ; // 카메라 컨트롤
CCreatureSize m_CreatureSize ; // 캐릭터 사이즈
CTexture* m_SimpleHumanTexture[ 4 ] ;
public:
CCharacterControl();
virtual ~CCharacterControl();
// ------------------------------------------------
// DuelTarget
void SetPreDuelTarget( unsigned long dwDuelTargetID, unsigned char cVSType ) ;
void SetDuelTarget( void ) ;
void DeleteDuelTarget( unsigned long dwDuelTargetID ) ;
void InitDuelTarget( void ) ;
unsigned char GetIsDuelTarget( unsigned long dwChrID ) ;
char* GetCreatureName( unsigned long dwChrID ) ;
void InitGlobalAction( void ) ;
BOOL GetAttacking( void ) ;
BOOL CheckMonsterForward( void ) ;
void MakeVisualAttackInfo() ;
void MakeAttackInfo( DWORD dwEnemyChrID ) ;
void PlaySound( int nMethod,vector3 vecPos ) ;
void PlayerProcessOperation( BOOL bKeyAble ) ;
void SetDirectionforMouse( vector3 &vecDirection ) ;
void CheckCameraShakeTiming() ;
void CheckAttackedTiming() ;
void RegistAttacked( DWORD dwSrcChrID,DWORD dwTarChrID, unsigned long dwWeaponType = 0 ) ;
void MakeAttacked( DWORD dwChrID, unsigned long dwWeaponType ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
vector3* GetFindChrPos( unsigned long dwChrID ) ;
void MouseModeChange() ;
void SetCameraToCharDir() ;
////////////// Network Bind Function ///////////////
static vector3 ( *GetMonsterMinBox ) ( unsigned long dwChrID ) ;
static vector3 ( *GetMonsterMaxBox ) ( unsigned long dwChrID ) ;
static bool ( *IsExistToList ) ( unsigned short List_In, DWORD CharID_In ) ;
static bool ( *CharAddressRequireInfo ) ( DWORD SenderID_In, DWORD CharID_In ) ;
static BOOL ( *SendMovingPacket ) ( unsigned long dwUpperAni, unsigned long dwLowerAni, float fDir, vector3 &vecMove ) ;
static BOOL ( *SendCharRespawn ) ( unsigned long dwChrID ) ;
static BOOL ( *SendMoveUpdatePacket ) ( float fDir, vector3 &vecPosition ) ;
static BOOL ( *SendCharAttack ) ( vector3 &vecPos, float fDir, unsigned short wType, bool bCasting,
unsigned char cSkillLock, unsigned char cSkillLevel,
unsigned char cAtCount, unsigned short wDefenserNum,
unsigned long dwDefenser[ 10 ],
bool bMissileAttack, vector3 &vecDstPos ) ;
static bool ( *PickItem ) ( DWORD nItemID ) ;
static BOOL ( *CheckAttackable ) ( void ) ;
static BOOL ( *SendSummonAttack ) ( unsigned long dwTargetID ) ;
static void ( *SetChangeWeapon ) ( BOOL bChangeWeapon ) ;
static void ( *SetAutoRun ) ( BOOL bAutoRun ) ;
static BOOL ( *GetAutoRun ) ( void ) ;
static char* ( *GetMotionSheet ) ( char *strWeaponName, char *strShieldName, unsigned short wClass ) ;
static unsigned long ( *GetWeaponType ) ( char *strWeaponName ) ;
static void ( *CheckTargetLength ) ( unsigned long &dwTargetID ) ;
static void ( *CheckTargetforSkill ) ( unsigned long &dwTargetID, BOOL bCheckLength ) ;
static BOOL ( *CheckSkillStart ) ( BOOL bDown ) ;
static BOOL ( *CheckStillCasting ) ( unsigned long &dwFunction ) ;
static void ( *ChangeWeapon ) ( void ) ;
static void ( *SetKillCounter ) ( long lKillCounter ) ;
static void ( *SetClientExitCounter ) ( long lExitCounter ) ;
static void ( *SetLogoutCounter ) ( long lLogoutCounter ) ;
static void ( *SetPortalCounter ) ( long lPortalCounter ) ;
static void ( *SetSkillUseCounter ) ( long lSkillUseCounter ) ;
static unsigned long ( *GetClientIdentity ) ( unsigned long dwChrID ) ;
static unsigned long ( *GetClientEnemyType ) ( unsigned long dwChrID) ;
static unsigned short ( *GetEnchantLevel ) ( unsigned long lID );
static unsigned long ( *GetEnchantTime ) ( unsigned long lID );
static unsigned short ( *GetSkillIDbyChantID ) ( unsigned char cChant );
static void ( *UpdateCamp ) ( RYLCreature* pCreature );
void WrapSendCharAttack( vector3 &vecPos, float fDir, unsigned short wAtType, bool bCasting,
unsigned char cSkillLock, unsigned char cSkillLevel, unsigned char cAtCount,
unsigned short wDefenserNum, unsigned long lpAtNode[ 10 ],
bool bMissileAttack = false, vector3 &vecDstPos = vector3( 0.0f, 0.0f, 0.0f ) ) ;
void WrapSendMoveUpdatePacket( float fDir,vector3 vecPos ) ;
BOOL WrapSendCharRespawn( DWORD dwChrID ) ;
void WrapSendMovingPacket( DWORD dwUpperAction,DWORD dwLowerAction,float fDir,vector3 vecPos ) ;
unsigned long GetClientSummon( unsigned long dwChrID, BOOL bNation = FALSE, BOOL bForSkill = FALSE ) ;
private:
void UpdateMonster( RYLCreature* pCreature, float fUpdateTime );
void UpdatePlayer( RYLCreature* pCreature, float fUpdateTime );
void UpdateMonster( unsigned long cChr, float fUpdateTime ) ;
void UpdatePlayer( unsigned long cChr, float fUpdateTime ) ;
public:
BOOL GetIsExistChar( unsigned long dwChrID ) ;
void AddActionData( unsigned long dwChrID, unsigned long dwUpperAni,
unsigned long dwLowerAni, float fDirection,
vector3 &vecNextPosition, float fVec = 0.0f,
unsigned short wAniNum = 0, unsigned long dwFrame = 0 ) ;
void Create( void ) ;
void DeleteAllCharacter( void ) ;
void SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
void MakeShake( int nChrID ) ;
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
void MouseMove( int MouseX, int MouseY ) ;
unsigned long GetScreenPosChr( POINT &Point, int nMode = 0, float fLength = 0 ) ;
void SelfCharacterUpdate() ;
public :
// ------------------------------------------------
// 공성관련
CRYLCharacterControl* m_pRYLCharacterControl ;
CRYLShortAttackWeaponControl* m_pRYLShortAttackWeaponControl ;
CRYLLongAttackWeaponControl* m_pRYLLongAttackWeaponControl ;
CRYLShortDefenceWeaponControl* m_pRYLShortDefenceWeaponControl ;
CRYLLongDefenceWeaponControl* m_pRYLLongDefenceWeaponControl ;
CRYLDropshipControl* m_pRYLDropshipControl ;
// 현재 병기컨트롤 종류
CONTROL_KIND m_WeaponControlKind ;
VOID SetWeaponControlKind( CONTROL_KIND Control ) ;
CONTROL_KIND GetWeaponControlKind() { return m_WeaponControlKind ; }
VOID ChangeSiegeModel( unsigned long dwChrID, const char *strName, vector3 vecChrPos, float fDirection, const char* szType ) ;
VOID UpdateCreatureControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int MouseX = 0,int MouseY = 0 ) ;
void Update( float fUpdateTime ) ;
void Render( LPDIRECT3DDEVICE8 pd3dDevice ) ;
void SwapElement( RYLCreature* pNode1, RYLCreature* pNode2 ) ;
HRESULT SwitchModel( unsigned long dwCID,
unsigned short wObjectType,
unsigned char cState,
unsigned char cUpgradeType,
unsigned char cUpgradeStep ) ;
VOID SetNationToCastleNPC( unsigned long dwCastleID, unsigned char cNation ) ;
VOID CharRespawn() ;
} ;
#endif // !defined(AFX_CHARACTERCONTROL_H__E5DF7481_5D2B_4E51_B47A_951185AFB01D__INCLUDED_)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,83 @@
//================================================================
//
// Name : RYLShortAttackWeaponControl.h
// Desc : 근거리 공성병기 컨트롤
// Date : 2004. 05. 17
//
//================================================================
#ifndef __RYL_SHORTATTACKWEAPONCONTROL_H__
#define __RYL_SHORTATTACKWEAPONCONTROL_H__
#include "RYLObjectControl.h"
#include "RYLLongAttackWeaponControl.h"
class CCreture ;
class CRYLShortAttackWeaponControl
{
private :
CCharacterControl* m_lpObjControl ;
CZ3DObject* m_lpLeftTireObject ; // 왼쪽 바퀴
CZ3DObject* m_lpRightTireObject ; // 오른쪽 바퀴
CZ3DObject* m_lpTailTireObject ; // 뒷 바퀴
CZ3DObject* m_lpBodyObject ; // 뒷 바퀴
RYLCreature* m_lpSiegeModel; // 공성병기 크리쳐
unsigned char m_byVelocity[ 228 ] ;
unsigned int m_iVelocityControl ;
CRYLEaseOutDivideInterpolation m_EaseOutDivideInterpolation ;
public :
FLOAT m_fTireSpeed ;
LONG m_lRealTireRotateUpdate ; // Update Time
FLOAT m_fRealTireAngle ; // 실제 회전각도
LONG m_lTireRotateUpdate ; // 모델에 부착된 타이어 Update time
FLOAT m_fTireAngle ; // 모델에 부착된 타이어 회전각도
FLOAT m_fBodyAngle ; // 몸통 회전
float m_fVelocity ;
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
long m_lTireUpdate ;
long m_lVelocityUpdate ;
long m_lTireAngleUpdate ;
long m_lBodyAngleUpdate ;
long m_lRealAngleUpdate ;
public :
CRYLShortAttackWeaponControl( CCharacterControl* lpObjControl ) ;
~CRYLShortAttackWeaponControl() ;
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int MouseX = 0,int MouseY = 0 ) ;
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
VOID SetModifySkileton() ;
VOID SetSiegeModel( unsigned long dwChrID, const char *strName, vector3 vecChrPos, float fDirection ) ;
RYLCreature* GetCreature() { return m_lpSiegeModel ; }
void SetCreature( RYLCreature* pCreature ) { m_lpSiegeModel = pCreature ; }
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
} ;
#endif //__RYL_SHORTATTACKWEAPONCONTROL_H__

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,66 @@
//================================================================
//
// Name : RYLShortDefenceWeaponControl.h
// Desc : 근거리 수성병기 컨트롤
// Date : 2004. 05. 17
//
//================================================================
#ifndef __RYL_SHORTDEFENCEWEAPONCONTROL_H__
#define __RYL_SHORTDEFENCEWEAPONCONTROL_H__
#include "RYLObjectControl.h"
#include "RYLLongAttackWeaponControl.h"
class CRYLShortDefenceWeaponControl
{
private :
CRYLEaseOutDivideInterpolation m_EaseOutDivideInterpolation ;
CZ3DObject* m_lpWingObject ;
CZ3DObject* m_lpLeftTireObject ; // 왼쪽 바퀴
CZ3DObject* m_lpRightTireObject ; // 오른쪽 바퀴
FLOAT m_fTireSpeed ;
LONG m_lRealTireRotateUpdate ; // Update Time
FLOAT m_fRealTireAngle ; // 실제 회전각도
LONG m_lTireRotateUpdate ; // 모델에 부착된 타이어 Update time
FLOAT m_fTireAngle ; // 모델에 부착된 타이어 회전각도
CCharacterControl* m_lpObjControl ;
RYLCreature* m_lpSiegeModel ; // 공성병기 크리쳐
CCharacterLightShadowManager::CCharacterDataNode m_pCharacterDataNode ;
public :
CRYLShortDefenceWeaponControl( CCharacterControl* lpObjControl ) ;
~CRYLShortDefenceWeaponControl() ;
VOID SetModifySkileton() ;
RYLCreature* GetCreature() { return m_lpSiegeModel ; }
void SetCreature( RYLCreature* pCreature ) { m_lpSiegeModel = pCreature ; }
CCharacterLightShadowManager::CCharacterDataNode* GetCharacterDataNode() { return &m_pCharacterDataNode ; }
void SetCharacterDataNode( CCharacterLightShadowManager::CCharacterDataNode pCharacterDataNode )
{
m_pCharacterDataNode = pCharacterDataNode ;
}
HRESULT UpdateControl( BOOL bKeyAble = TRUE, BOOL bEdge = FALSE, int MouseX = 0,int MouseY = 0 ) ;
VOID SetCamera( int dx = 0, int dy = 0, int dz = 0 ) ;
bool MakeAttackInfo( unsigned short wSkill = 0, unsigned char cSkillLock = 0,
unsigned char cSkillLevel = 0, unsigned char cAtCount = 1,
float fAttackAngle = 0.0f, float fAttackRate = 0.0f,
BOOL bAngle = TRUE, BOOL bGod = TRUE ) ;
bool MakeSkillAttackInfo( unsigned long dwTargetID, unsigned short wSkill = 0,
unsigned char cSkillLock = 0, unsigned char cSkillLevel = 0,
unsigned char cAtCount = 1, BOOL bGod = TRUE, BOOL bDead = FALSE ) ;
VOID SetSiegeModel( unsigned long dwChrID, const char *strName, vector3 vecChrPos, float fDirection ) ;
} ;
#endif //__RYL_SHORTDEFENCEWEAPONCONTROL_H__

View File

@@ -0,0 +1,21 @@
========================================================================
정적 라이브러리 : CharacterActionControl 프로젝트 개요
========================================================================
응용 프로그램 마법사에서 이 CharacterActionControl 라이브러리 프로젝트를 만들었습니다.
프로젝트에 대해 소스 파일은 만들어지지 않았습니다.
CharacterActionControl.vcproj
응용 프로그램 마법사를 사용하여 생성한 VC++ 프로젝트의 기본 프로젝트 파일입니다.
해당 파일을 생성한 Visual C++의 버전 정보를 비롯하여
응용 프로그램 마법사에서 선택한 플랫폼, 구성 및
프로젝트 기능에 대한 정보가 들어 있습니다.
/////////////////////////////////////////////////////////////////////////////
기타 참고:
응용 프로그램 마법사에서 사용하는 "TODO:" 주석은 사용자가 추가하거나 사용자 지정해야 하는
소스 코드 부분을 나타냅니다.
/////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,61 @@
// ChangeNameDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "DummyClient.h"
#include "ChangeNameDlg.h"
#include "CharacterData.h"
#include "MainFrm.h"
#include <Network/ClientSocket/Send/SendEtc.h>
#include "GMMemory.h"
// CChangeNameDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CChangeNameDlg, CDialog)
CChangeNameDlg::CChangeNameDlg(CWnd* pParent /*=NULL*/)
: CDialog(CChangeNameDlg::IDD, pParent)
, m_szOldName(_T(""))
, m_szNewName(_T(""))
{
}
CChangeNameDlg::~CChangeNameDlg()
{
}
void CChangeNameDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_OLD_NAME, m_szOldName);
DDV_MaxChars(pDX, m_szOldName, 15);
DDX_Text(pDX, IDC_NEW_NAME, m_szNewName);
DDV_MaxChars(pDX, m_szNewName, 15);
}
BEGIN_MESSAGE_MAP(CChangeNameDlg, CDialog)
END_MESSAGE_MAP()
// CChangeNameDlg 메시지 처리기입니다.
void CChangeNameDlg::OnOK()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
UpdateData(true);
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
CCharacterData* lpCharacterData = characterDataMgr.GetByCharName(m_szOldName);
if(0 != lpCharacterData)
{
SendPacket::CharNameChange(
&lpCharacterData->GetClientSocket().GetHandler(ClientSocket::GameEventHandler),
lpCharacterData->GetUID(), lpCharacterData->GetCID(), m_szNewName);
}
CDialog::OnOK();
}

View File

@@ -0,0 +1,26 @@
#pragma once
// CChangeNameDlg 대화 상자입니다.
class CChangeNameDlg : public CDialog
{
DECLARE_DYNAMIC(CChangeNameDlg)
public:
CChangeNameDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CChangeNameDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_CHANGE_NAME };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
private:
CString m_szOldName;
CString m_szNewName;
protected:
virtual void OnOK();
};

View File

@@ -0,0 +1,276 @@
#include "stdafx.h"
#include "resource.h"
#include "DummyClient.h"
#include "DummyAuthHandler.h"
#include "CharacterData.h"
#include "LoginDlg.h"
#include <Network/ClientNetwork/SessionMgr.h>
#include <Network/ClientNetwork/TCPSession.h>
#include <Network/ClientNetwork/UDPSession.h>
#include <Network/ClientSocket/Send/SendEtc.h>
#include <Utility/Math/Math.h>
#include "GMMemory.h"
CCharacterData::CCharacterData()
{
memset(m_szAccount, 0, sizeof(char) * MAX_ACCOUNT_LEN);
memset(m_szPassword, 0, sizeof(char) * MAX_PASSWORD_LEN);
memset(m_szCharName, 0, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN);
m_dwCheckSum = 0;
m_dwClientVersion = 0;
m_dwUID = 0;
m_dwCID = 0;
m_dwSessionID = 0;
m_dwServerID = 0;
m_cAgentServerType = 0;
m_cFirstLogin = 0;
}
CCharacterData::~CCharacterData()
{
}
bool CCharacterData::Login(const char* szAuthServerIP, const char* szAccount, const char* szPassword,
unsigned long dwCheckSum, unsigned long dwClientVersion)
{
if(!m_ClientSocket.IsConnected(ClientSocket::AuthEventHandler))
{
// 데이터를 로컬에 세팅한 후, 연결을 시도
m_dwCheckSum = dwCheckSum;
m_dwClientVersion = dwClientVersion;
strncpy(m_szAccount, szAccount, MAX_ACCOUNT_LEN);
m_szAccount[MAX_ACCOUNT_LEN - 1] = 0;
strncpy(m_szPassword, szPassword, MAX_PASSWORD_LEN);
m_szPassword[MAX_PASSWORD_LEN - 1] = 0;
return m_ClientSocket.Open(szAuthServerIP, ClientSocket::DEFAULT_AUTH_TCP_PORT, new CDummyAuthHandler(*this));
}
return false;
}
bool CCharacterData::Login(CWnd* lpParentWnd)
{
if(!m_ClientSocket.IsConnected(ClientSocket::AuthEventHandler))
{
CLoginDlg loginDlg(lpParentWnd);
if(IDOK == loginDlg.DoModal())
{
// 데이터를 로컬에 세팅한 후, 연결을 시도
m_dwCheckSum = loginDlg.GetCheckSum();
m_dwClientVersion = loginDlg.GetClientVersion();
strncpy(m_szAccount, loginDlg.GetAccount(), MAX_ACCOUNT_LEN);
m_szAccount[MAX_ACCOUNT_LEN - 1] = 0;
strncpy(m_szPassword, loginDlg.GetPassword(), MAX_PASSWORD_LEN);
m_szPassword[MAX_PASSWORD_LEN - 1] = 0;
return m_ClientSocket.Open(loginDlg.GetAuthServerIP(),
ClientSocket::DEFAULT_AUTH_TCP_PORT, new CDummyAuthHandler(*this));
}
}
return false;
}
void CCharacterData::SetCharView(CHAR_VIEW* lpCharView, unsigned int nViewNum)
{
if(0 != lpCharView)
{
// WORK_LIST 3.2 정섭 슬롯 5개로 늘리기
memcpy(m_charView, lpCharView, sizeof(CHAR_VIEW) * min(nViewNum, MAX_CHAR_VIEW));
}
}
// WORK_LIST 3.1 RcaeBase 파일 합치기 및 캐릭터 선택화면 변경
void CCharacterData::SetCharGuildData(sGuildData* lpGuildData, unsigned int nNum)
{
if(0 != lpGuildData)
{
memcpy(m_charGuildData, lpGuildData, sizeof(sGuildData) * min(nNum, MAX_CHAR_VIEW));
}
}
CCharacterDataMgr::CCharacterDataMgr()
{
m_CharDataVector.reserve(100);
}
CCharacterDataMgr::~CCharacterDataMgr()
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
delete (*pos);
}
}
// 계정명으로 추가
bool CCharacterDataMgr::AddByAccount(CCharacterData* lpCharacterData)
{
if(0 != lpCharacterData && 0 == GetByAccount(lpCharacterData->GetAccount()))
{
m_CharDataVector.push_back(lpCharacterData);
return true;
}
return false;
}
// 계정명으로 얻어옴
CCharacterData* CCharacterDataMgr::GetByAccount(const char* szAccount)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(0 == strcmp(szAccount, lpCharacterData->GetAccount()))
{
return *pos;
}
}
return 0;
}
// UID로 얻어옴
CCharacterData* CCharacterDataMgr::GetByUID(unsigned long dwUID)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(dwUID == lpCharacterData->GetUID())
{
return lpCharacterData;
}
}
return 0;
}
CCharacterData* CCharacterDataMgr::GetByCharName(const char* szCharName)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(0 == strcmp(lpCharacterData->GetCharacterName(), szCharName))
{
return lpCharacterData;
}
}
return 0;
}
// 로그인한 CID로 얻어옴
CCharacterData* CCharacterDataMgr::GetByCID(unsigned long dwCID)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(dwCID == lpCharacterData->GetCID())
{
return lpCharacterData;
}
}
return 0;
}
bool CCharacterDataMgr::RemoveByAccount(const char* szAccount)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(0 == strcmp(szAccount, lpCharacterData->GetAccount()))
{
m_CharDataVector.erase(pos);
return true;
}
}
return false;
}
bool CCharacterDataMgr::RemoveByUID(unsigned long dwUID)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(dwUID == lpCharacterData->GetUID())
{
m_CharDataVector.erase(pos);
return true;
}
}
return false;
}
bool CCharacterDataMgr::RemoveByCID(unsigned long dwCID)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
CCharacterData* lpCharacterData = (*pos);
if(dwCID == lpCharacterData->GetCID())
{
m_CharDataVector.erase(pos);
return true;
}
}
return false;
}
void CCharacterDataMgr::HandleEvents(unsigned long dwProcessPerCall)
{
CharDataVector::iterator pos = m_CharDataVector.begin();
CharDataVector::iterator end = m_CharDataVector.end();
for(; pos != end; ++pos)
{
(*pos)->GetClientSocket().HandleEvents(dwProcessPerCall);
}
}

View File

@@ -0,0 +1,139 @@
#ifndef _RYL_DUMMYCLIENT_CHARACTER_DATA_H_
#define _RYL_DUMMYCLIENT_CHARACTER_DATA_H_
#pragma once
#include <DB/DBdefine.h>
#include <Network/ClientSocket/ClientSocket.h>
namespace ClientNet
{
class CSessionMgr;
}
class CDummyClientSocket : public ClientSocket
{
public:
CDummyClientSocket() { }
virtual ~CDummyClientSocket() { }
};
class CCharacterData
{
public:
enum
{
MAX_ACCOUNT_LEN = 16,
MAX_PASSWORD_LEN = 33,
MAX_CHAR_VIEW = 5 // WORK_LIST 3.2 정섭 슬롯 5개로 늘리기
};
enum SessionType
{
AUTH_SESSION = 0,
GAME_SESSION = 1,
CHAT_SESSION = 2,
UDP_SESSION = 3,
MAX_SESSION = 4
};
CCharacterData();
~CCharacterData();
bool Login(const char* szAuthServerIP, const char* szAccount, const char* szPassword,
unsigned long dwCheckSum, unsigned long dwClientVersion);
bool Login(CWnd* lpParentWnd);
ClientSocket& GetClientSocket() { return m_ClientSocket; }
char* GetAccount() { return m_szAccount; }
char* GetPassword() { return m_szPassword; }
unsigned long GetCheckSum() const { return m_dwCheckSum; }
unsigned long GetClientVersion() const { return m_dwClientVersion; }
unsigned long GetUID() const { return m_dwUID; }
unsigned long GetCID() const { return m_dwCID; }
unsigned long GetSessionID() const { return m_dwSessionID; }
unsigned long GetServerID() const { return m_dwServerID; }
const char* GetCharacterName() const { return m_szCharName; }
void SetUID(unsigned long dwUID) { m_dwUID = dwUID; }
void SetCID(unsigned long dwCID) { m_dwCID = dwCID; } // SendPacket::CharSelect전에, CID세팅 필요.
void SetCharView(CHAR_VIEW* lpCharView, unsigned int nViewNum);
// WORK_LIST 3.1 RcaeBase 파일 합치기 및 캐릭터 선택화면 변경
void SetCharGuildData(sGuildData* lpGuildData, unsigned int nNum);
void SetSessionID(unsigned long dwSessionID) { m_dwSessionID = dwSessionID; }
void SetServerID(unsigned long dwServerID) { m_dwServerID = dwServerID; }
void SetCharacterName(const char* szCharName)
{
strncpy(m_szCharName, szCharName, CHAR_INFOST::MAX_NAME_LEN);
m_szCharName[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
}
unsigned char GetAgentServerType() const { return m_cAgentServerType; }
unsigned char GetFirstLogin() const { return m_cFirstLogin; }
void SetUnifiedLoginInfo(unsigned char cAgentServerType, unsigned char cFirstLogin)
{
m_cAgentServerType = cAgentServerType;
m_cFirstLogin = cFirstLogin;
}
private:
char m_szAccount[MAX_ACCOUNT_LEN];
char m_szPassword[MAX_PASSWORD_LEN];
char m_szCharName[CHAR_INFOST::MAX_NAME_LEN];
unsigned long m_dwCheckSum;
unsigned long m_dwClientVersion;
unsigned long m_dwUID;
unsigned long m_dwCID;
unsigned long m_dwSessionID;
unsigned long m_dwServerID;
// WORK_LIST 3.1 RcaeBase 파일 합치기 및 캐릭터 선택화면 변경
// WORK_LIST 3.2 정섭 슬롯 5개로 늘리기
CHAR_VIEW m_charView[MAX_CHAR_VIEW];
sGuildData m_charGuildData[MAX_CHAR_VIEW];
CDummyClientSocket m_ClientSocket;
unsigned char m_cAgentServerType;
unsigned char m_cFirstLogin;
};
class CCharacterDataMgr
{
public:
CCharacterDataMgr();
~CCharacterDataMgr();
bool AddByAccount(CCharacterData* lpCharacterData); // 추가
CCharacterData* GetByAccount(const char* szAccount); // 계정명으로 얻어옴
CCharacterData* GetByCharName(const char* szCharName); // 캐릭터 이름으로 얻어옴
CCharacterData* GetByUID(unsigned long dwUID); // UID로 얻어옴
CCharacterData* GetByCID(unsigned long dwCID); // 로그인한 CID로 얻어옴
bool RemoveByAccount(const char* szAccount);
bool RemoveByUID(unsigned long dwUID);
bool RemoveByCID(unsigned long dwCID);
void HandleEvents(unsigned long dwProcessPerCall);
private:
typedef std::vector<CCharacterData*> CharDataVector;
CharDataVector m_CharDataVector;
};
#endif

View File

@@ -0,0 +1,191 @@
// CharacterSelectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DummyClient.h"
#include "CharacterSelectDlg.h"
#include ".\characterselectdlg.h"
#include "MainFrm.h"
#include "GuildManager.h"
#include "CharacterData.h"
#include <Network/ClientSocket/Send/SendAuthServer.h>
#include "GMMemory.h"
// CCharacterSelectDlg dialog
IMPLEMENT_DYNAMIC(CCharacterSelectDlg, CDialog)
CCharacterSelectDlg::CCharacterSelectDlg(CCharacterData& characterData, CWnd* pParent /*=NULL*/)
: CDialog(CCharacterSelectDlg::IDD, pParent), m_CharacterData(characterData)
{
}
CCharacterSelectDlg::~CCharacterSelectDlg()
{
}
void CCharacterSelectDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CTRL_CHARSELECT, m_ctrlCharacterSelect);
}
BEGIN_MESSAGE_MAP(CCharacterSelectDlg, CDialog)
ON_WM_NCDESTROY()
ON_NOTIFY(NM_DBLCLK, IDC_CTRL_CHARSELECT, OnNMDblclkCtrlCharselect)
ON_BN_CLICKED(IDOK, OnBnClickedOk)
END_MESSAGE_MAP()
// CCharacterSelectDlg message handlers
BOOL CCharacterSelectDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ctrlCharacterSelect.SetExtendedStyle( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
m_ctrlCharacterSelect.InsertColumn( 0, _T( "이름" ), LVCFMT_CENTER, 80 ) ;
m_ctrlCharacterSelect.InsertColumn( 1, _T( "레벨" ), LVCFMT_CENTER, 60 ) ;
m_ctrlCharacterSelect.InsertColumn( 2, _T( "명성" ), LVCFMT_CENTER, 80 ) ;
m_ctrlCharacterSelect.InsertColumn( 3, _T( "클래스" ), LVCFMT_CENTER, 80 ) ;
m_ctrlCharacterSelect.InsertColumn( 4, _T( "UID"), LVCFMT_CENTER, 80);
m_ctrlCharacterSelect.InsertColumn( 5, _T( "CID"), LVCFMT_CENTER, 80);
return TRUE ;
}
void CCharacterSelectDlg::InsertData(LPCTSTR lpszName,
unsigned long dwUID, unsigned long dwCID,
char cLevel, unsigned long dwFame, unsigned short wClass )
{
if(0 != dwUID && 0 != dwCID)
{
int iCnt = m_ctrlCharacterSelect.GetItemCount();
CString str ;
m_ctrlCharacterSelect.InsertItem( iCnt, lpszName ) ;
str.Format( "%d", cLevel ) ;
m_ctrlCharacterSelect.SetItemText( iCnt, 1, str ) ;
str.Format( "%d", dwFame ) ;
m_ctrlCharacterSelect.SetItemText( iCnt, 2, str ) ;
m_ctrlCharacterSelect.SetItemText( iCnt, 3, CGuildManager::GetClassName( wClass ) ) ;
str.Format( "%d", dwUID ) ;
m_ctrlCharacterSelect.SetItemText( iCnt, 4, str) ;
str.Format( "%d", dwCID ) ;
m_ctrlCharacterSelect.SetItemText( iCnt, 5, str) ;
}
}
void CCharacterSelectDlg::ClearData()
{
m_ctrlCharacterSelect.DeleteAllItems();
}
void CCharacterSelectDlg::OnNcDestroy()
{
CDialog::OnNcDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
delete this;
}
CCharacterSelectDlg* CCharacterSelectDlg::CreateSelectDlg(CCharacterData& characterData)
{
#include "GMUndefNew.h"
CCharacterSelectDlg* lpCharSelectDlg =
new CCharacterSelectDlg(characterData);
#include "GMRedefNew.h"
if(0 != lpCharSelectDlg)
{
lpCharSelectDlg->Create(
IDD_DLG_CHARSELECT, AfxGetMainWnd());
}
return lpCharSelectDlg;
}
void CCharacterSelectDlg::MoveToCenter()
{
CRect rcDlg, rcMain;
GetClientRect(&rcDlg);
AfxGetMainWnd()->GetClientRect(&rcMain);
int x = ( rcMain.Width() - rcDlg.Width() ) / 2 ;
int y = ( rcMain.Height() - rcDlg.Height() ) / 2 ;
MoveWindow( x, y, rcDlg.Width(), rcDlg.Height() + 20 ) ;
}
void CCharacterSelectDlg::OnNMDblclkCtrlCharselect(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
// 다이얼로그를 닫고, CharSelect를 전송한다.
if(NM_DBLCLK == pNMHDR->code)
{
POSITION pos = m_ctrlCharacterSelect.GetFirstSelectedItemPosition();
if (pos != NULL)
{
while (pos)
{
int nItem = m_ctrlCharacterSelect.GetNextSelectedItem(pos);
CString szUID = m_ctrlCharacterSelect.GetItemText(nItem, 4);
CString szCID = m_ctrlCharacterSelect.GetItemText(nItem, 5);
unsigned long dwUID = atol(szUID.GetBuffer(0));
unsigned long dwCID = atol(szCID.GetBuffer(0));
m_CharacterData.SetCID(dwCID);
SendPacket::CharSelect(
&m_CharacterData.GetClientSocket().GetHandler(ClientSocket::AuthEventHandler), dwUID, dwCID);
break;
}
}
OnOK();
}
}
void CCharacterSelectDlg::OnBnClickedOk()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
POSITION pos = m_ctrlCharacterSelect.GetFirstSelectedItemPosition();
if (pos != NULL)
{
while (pos)
{
int nItem = m_ctrlCharacterSelect.GetNextSelectedItem(pos);
CString szUID = m_ctrlCharacterSelect.GetItemText(nItem, 4);
CString szCID = m_ctrlCharacterSelect.GetItemText(nItem, 5);
unsigned long dwUID = atol(szUID.GetBuffer(0));
unsigned long dwCID = atol(szCID.GetBuffer(0));
m_CharacterData.SetCID(dwCID);
SendPacket::CharSelect(
&m_CharacterData.GetClientSocket().GetHandler(ClientSocket::AuthEventHandler),
dwUID, dwCID);
break;
}
}
OnOK();
}

View File

@@ -0,0 +1,48 @@
#pragma once
#include "afxcmn.h"
// CCharacterSelectDlg dialog
// forward decl.
class CCharacterData;
class CCharacterSelectDlg : public CDialog
{
DECLARE_DYNAMIC(CCharacterSelectDlg)
public:
static CCharacterSelectDlg* CreateSelectDlg(CCharacterData& characterData);
void InsertData(LPCTSTR lpszName,
unsigned long dwUID, unsigned long dwCID,
char cLevel, unsigned long dwFame, unsigned short wClass);
void ClearData();
void MoveToCenter();
// Dialog Data
enum { IDD = IDD_DLG_CHARSELECT };
protected:
CCharacterSelectDlg(CCharacterData& characterData, CWnd* pParent = NULL); // standard constructor
virtual ~CCharacterSelectDlg();
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// 메시지 맵 함수를 생성했습니다.
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
private:
CListCtrl m_ctrlCharacterSelect;
CCharacterData& m_CharacterData;
afx_msg void OnNcDestroy();
public:
afx_msg void OnNMDblclkCtrlCharselect(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnClickedOk();
};

View File

@@ -0,0 +1,485 @@
#include "stdafx.h"
#include "resource.h"
#include "MainFrm.h"
#include "CharacterSelectDlg.h"
#include "LoginDlg.h"
#include "DummyAuthHandler.h"
#include "DummyGameHandler.h"
#include "CharacterData.h"
#include "UnifiedCharSelect.h"
#include <string>
#include <Network/ClientSocket/Send/SendAuthServer.h>
#include <Network/ClientSocket/Send/SendLoginOut.h>
#include <Network/ClientSocket/Parse/ParseAuthServer.h>
#include <Network/ClientSocket/Parse/ParseLoginOut.h>
#include <Network/Packet/PacketBase.h>
#include <Network/Packet/PacketCommand.h>
#include "GMMemory.h"
bool ParseAuthAccount(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseUserLogin(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseCharSelect(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseCharCreate(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseCharDelete(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseAuthServerZone(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseUnifiedCharInfo(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseUnifiedCharSelectAck(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
CDummyAuthHandler::CDummyAuthHandler(CCharacterData& characterData)
: m_CharacterData(characterData)
{
}
CDummyAuthHandler::~CDummyAuthHandler()
{
}
int CDummyAuthHandler::OnOpen(int iErrorCode)
{
// 서버로 인증 요청을 한다.
if(0 != iErrorCode ||
!SendPacket::AuthAccount(m_CharacterData.GetClientSocket(), m_CharacterData.GetAccount(),
m_CharacterData.GetPassword(), m_CharacterData.GetClientVersion(), m_CharacterData.GetCheckSum(), 0))
{
// 인증 전송 실패
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.RemoveByAccount(m_CharacterData.GetAccount());
}
else
{
m_CharacterData.GetClientSocket().SetHandler(this, ClientSocket::AuthEventHandler);
}
return 0;
}
int CDummyAuthHandler::OnClose()
{
// 서버에서 연결이 끊겼음을 처리한다.
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.RemoveByAccount(m_CharacterData.GetAccount());
m_CharacterData.GetClientSocket().ResetHandler(this, ClientSocket::AuthEventHandler);
return 0;
}
int CDummyAuthHandler::OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr)
{
bool rc = true;
switch(lpPktBase->GetCmd())
{
case CmdAuthAccount: rc = ParseAuthAccount(this, lpPktBase, m_CharacterData); break;
case CmdUserLogin: rc = ParseUserLogin(this, lpPktBase, m_CharacterData); break;
case CmdServerZone: rc = ParseAuthServerZone(this, lpPktBase, m_CharacterData); break;
case CmdCharSelect: rc = ParseCharSelect(this, lpPktBase, m_CharacterData); break;
// 귀찮아서 처리 안 함.
case CmdCharCreate: rc = ParseCharCreate(this, lpPktBase, m_CharacterData); break;
case CmdCharDelete: rc = ParseCharDelete(this, lpPktBase, m_CharacterData); break;
// 캐릭터 통합 선택 관련해서 넣음.
case CmdUnifiedCharInfo: rc = ParseUnifiedCharInfo(this, lpPktBase, m_CharacterData); break;
case CmdUnifiedCharSelect: rc = ParseUnifiedCharSelectAck(this, lpPktBase, m_CharacterData); break;
}
if(!rc)
{
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.RemoveByAccount(m_CharacterData.GetAccount());
}
return 0;
}
bool ParseAuthAccount(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
unsigned long dwUID = 0;
unsigned char cAgentServerType = 0;
unsigned char cFirstLogin = 0;
unsigned long dwError = ParsePacket::HandleAuthAccount(lpPktBase, dwUID, cAgentServerType, cFirstLogin);
if(0 == dwError)
{
// 인증 성공. 유저ID세팅하고 UserLogin전송
characterData.SetUID(dwUID);
// cAgentServerType, cFirstLogin 값을 저장해 놓았다,
// 나중에 캐릭터 데이터 왔을 때 잘 써먹도록 한다.
characterData.SetUnifiedLoginInfo(cAgentServerType, cFirstLogin);
if (UnifiedConst::Part2 == cAgentServerType)
{
SendPacket::UserLogin(lpHandler, dwUID, FALSE);
}
}
else
{
// 에러코드 출력
const char* szErrorString = "알 수 없는 에러입니다";
switch (dwError)
{
case 3: szErrorString = "체크섬 실패"; break;
case 4: szErrorString = "잘못된 버젼 클라이언트"; break;
case 5: szErrorString = "잘못된 계정/패스"; break;
case 6: szErrorString = "인증 실패"; break;
case 7: szErrorString = "인증 인원 초과"; break;
case 8: szErrorString = "블롯된 계정"; break;
case 10: szErrorString = "기타 인증 에러"; break;
case 11: szErrorString = "등록이 되어 있지 않거나 암호가 틀림"; break;
case 12: szErrorString = "릴사용 동의된 사용자가 아님"; break;
case 13: szErrorString = "릴 사용자가 아니거나 비정상적인 사용자"; break;
case 14: szErrorString = "릴사용 동의한 사용자이지만 게임을 할 수 없는 상태"; break;
case 15: szErrorString = "15세 이하 유저 / 배틀로한은 12세 이하 유저임"; break;
case 20: szErrorString = "등록이 되어 있지 않거나 암호가 틀림"; break;
case 21: szErrorString = "UID 값 이상"; break;
case 22: szErrorString = "미설정된 포인트 량"; break;
case 23: szErrorString = "로그인 인증 오류"; break;
case 24: szErrorString = "포인트 카드 사용자가 아님"; break;
case 25: szErrorString = "남은 포인트가 없거나 음수 데이터"; break;
case 26: szErrorString = "남은 포인트 부족"; break;
case 27: szErrorString = "유효 기간 오류"; break;
case 28: szErrorString = "포인트 결제 오류"; break;
case 29: szErrorString = "정액 사용기간이 시작되지 않았음"; break;
case 30: szErrorString = "정액 사용기간 종료"; break;
case 31: szErrorString = "정액 결제 오류"; break;
case 40: szErrorString = "세션 오픈 에러"; break;
case 41: szErrorString = "세션 열려 있음"; break;
case 42: szErrorString = "세션 종료 시킴"; break;
}
// AuthAccount : 에러메시지 출력 - 모달 다이얼로그 쓰지 마시오!
std::string szErrMessage = "AuthAccount : ";
szErrMessage += szErrorString;
return false;
}
return true;
}
bool ParseUserLogin(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
unsigned long UserID = 0, dwSessionID = 0, dwTabFlag = 0;
unsigned short wAdminLevel = 0;
unsigned char cBillingType = 0, cBillingUser = 0, cLoginType = 0;
int nPlayTime = 0;
time_t ttCurrentTime = 0;
// WORK_LIST 3.2 정섭 슬롯 5개로 늘리기
// WORK_LIST 3.1 RcaeBase 파일 합치기 및 캐릭터 선택화면 변경
// WORK_LIST 2.1 계정 국적 추가
CHAR_VIEW aryCharView[CCharacterData::MAX_CHAR_VIEW];
sGuildData aryCharGuildData[CCharacterData::MAX_CHAR_VIEW];
unsigned char cAccountNation = 0;
unsigned long dwError = ParsePacket::HandleUserLogin(lpPktBase, &dwSessionID,
&UserID, aryCharView, aryCharGuildData, &cAccountNation, &ttCurrentTime, &nPlayTime, &wAdminLevel,
&cBillingType, &cBillingUser, &cLoginType, &dwTabFlag);
if(0 == dwError)
{
// 과금관련이나, 캐릭터 선택화면으로 이동인지 아닌지 여부 따위는 관계 없다.
// 알고 싶은건 오로지 캐릭터 정보뿐.
characterData.SetCharView(aryCharView, CCharacterData::MAX_CHAR_VIEW);
// WORK_LIST 3.1 RcaeBase 파일 합치기 및 캐릭터 선택화면 변경
characterData.SetCharGuildData(aryCharGuildData, CCharacterData::MAX_CHAR_VIEW);
characterData.SetSessionID(dwSessionID);
// 캐릭터 정보를 모달리스로 띄운다.
// (모달 띄울때는 PostMessage등을 메인프레임으로 뿌려서 처리한다.
// 물론 LoginDlg와 같이 ContinueModal을 오버라이딩 해서 theApp.OnIdle이 호출되게 해야 한다.)
// 창을 닫으면 NCDestory에서 Delete하므로 포인터를 갖고 있을 필요는 없다.
// (다른 클래스와 상호참조시, NCDestory쪽에서 참조하는쪽 포인터를 NULL로 세팅하는 부분이 필요하다).
CCharacterSelectDlg* lpCharSelectDlg =
CCharacterSelectDlg::CreateSelectDlg(characterData);
if(0 != lpCharSelectDlg)
{
lpCharSelectDlg->MoveToCenter();
for(int nCount = 0; nCount < CCharacterData::MAX_CHAR_VIEW; ++nCount)
{
CHAR_VIEW& charView = aryCharView[nCount];
lpCharSelectDlg->InsertData(charView.Name,
characterData.GetUID(), charView.CID,
charView.Level, charView.Fame, charView.Class);
}
lpCharSelectDlg->ShowWindow(SW_SHOW);
}
}
else
{
const char* szErrorString = "알 수 없는 에러입니다";
switch(dwError)
{
case 1: szErrorString = "서버 에러입니다"; break;
case 2: szErrorString = "서버에서 데이터를 얻는데 실패했습니다."; break;
case 3: szErrorString = "잘못된 버젼의 클라이언트 입니다. 홈페이지에서 수동패치를 받아 설치해 주십시오."; break;
case 4: szErrorString = "이미 로그인되 있는 계정입니다."; break;
case 5: szErrorString = "로그아웃 중입니다. 잠시 후 다시 접속해주세요."; break;
}
std::string szErrMessage = "UserLogin : ";
szErrMessage += szErrorString;
return false;
}
return true;
}
bool ParseAuthServerZone(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
unsigned long dwServerID = 0;
ClientSocket& clientSocket = characterData.GetClientSocket();
// 이 안에서 ClientSocket::MoveZoneAddr에 주소를 세팅한다.
unsigned long dwError = ParsePacket::HandleServerZone(lpPktBase, clientSocket, &dwServerID);
if (0 == dwError)
{
characterData.SetServerID(dwServerID);
// 인증과의 세션을 닫는다.
clientSocket.Disconnect(ClientSocket::AuthEventHandler);
// ClientSocket::MoveZoneAddr에는 연결할 서버 주소가 들어 있다.
ClientNet::CClientEventHandler* lpGameHandler = new CDummyGameHandler(characterData);
clientSocket.Open(clientSocket.GetAddressString(ClientSocket::MoveZoneAddr),
clientSocket.GetAddressPort(ClientSocket::AddressType::MoveZoneAddr), lpGameHandler);
}
else
{
const char* szErrorString = "알 수 없는 에러입니다";
switch (dwError)
{
case 2: szErrorString = "캐릭터 존이 잘못 되어 있습니다";
case 4: szErrorString = "인원이 초과";
case 5: szErrorString = "세션이 열려 있지 않음";
}
std::string szErrMessage = "AuthServerZone : ";
szErrMessage += szErrorString;
return false;
}
return true;
}
bool ParseCharSelect(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
// ack받아서 serveZone날림.
const unsigned int MAX_CHANNEL = 5;
unsigned short aryChannel[MAX_CHANNEL] = { 0, };
unsigned char cZone = 0;
unsigned long dwError = ParsePacket::HandleCharSelect(lpPktBase, &cZone, aryChannel);
if (0 == dwError)
{
unsigned long dwChannelCount = 0;
for (unsigned long i = 0; i < MAX_CHANNEL; i++)
{
if (aryChannel[i])
{
dwChannelCount++;
}
}
if (0 == dwChannelCount)
{
// 채널 없음 메시지 뿌림
}
else if (1 == dwChannelCount)
{
// 채널이 하나면, 그중 하나에 들어감.
for (char cChannel = 0; cChannel < MAX_CHANNEL; ++cChannel)
{
if (aryChannel[cChannel])
{
SendPacket::ServerZone(lpHandler,
static_cast<char>(cZone), cChannel);
break;
}
}
}
}
else
{
const char* szErrorString = "알 수 없는 에러입니다";
switch (dwError)
{
case 1: szErrorString = "서버 에러"; break;
case 2: szErrorString = "서버 포화"; break;
case 3: szErrorString = "캐릭터 로드 실패"; break;
case 4: szErrorString = "서버 찾기 실패"; break;
case 5: szErrorString = "캐릭터 블록"; break;
}
std::string szErrMessage = "CharSelect : ";
szErrMessage += szErrorString;
return false;
}
return true;
}
bool ParseCharCreate(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
// ack받아서 view에 추가함
return true;
}
bool ParseCharDelete(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
// ack받아서 view에서 지워줌
return true;
}
bool ParseUnifiedCharInfo(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
// 캐릭터 정보 받아서 선택한 후에, 정보 보내도록 한다.
USER_INFO userInfo;
UnifiedStoreInfo* lpUnifiedStoreInfo = 0;
UnifiedCharData* lpUnifiedCharData = 0;
unsigned long dwStoreInfoNum = 0;
unsigned long dwCharDataNum = 0;
unsigned char cRestrictedPart1ToPart2Level = 0 ;
unsigned char cRemainCharTransferCount = 0 ;
unsigned long dwErrorCode = ParsePacket::HandleUnifiedCharInfo( lpPktBase,
cRestrictedPart1ToPart2Level,
cRemainCharTransferCount,
userInfo,
&lpUnifiedStoreInfo,
dwStoreInfoNum,
&lpUnifiedCharData,
dwCharDataNum ) ;
if (0 == dwErrorCode)
{
unsigned long dwCharNum = 0;
// 고를만한 캐릭터가 없으면 그냥 로그인해버린다.
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
{
if(0 != userInfo.CharID[nCount])
{
++dwCharNum;
}
}
if ((0 == dwStoreInfoNum ||
(1 == dwStoreInfoNum && lpUnifiedStoreInfo->cOldServerGroupID == characterData.GetAgentServerType()))
&& dwCharNum == dwCharDataNum)
{
UnifiedCharData* lpPos = lpUnifiedCharData;
UnifiedCharData* lpEnd = lpUnifiedCharData + dwCharDataNum;
for(; lpPos != lpEnd; ++lpPos)
{
if(!userInfo.HasCharacter(lpPos->dwNewCID))
{
break;
}
}
if(lpPos == lpEnd)
{
SendPacket::UserLogin(lpHandler, characterData.GetUID(), FALSE);
return true;
}
}
CUnifiedCharSelect* lpUnifiedCharSelect =
CUnifiedCharSelect::CreateUnifiedCharSelect(characterData);
if(0 != lpUnifiedCharSelect)
{
lpUnifiedCharSelect->SetData(userInfo,
lpUnifiedStoreInfo, dwStoreInfoNum,
lpUnifiedCharData, dwCharDataNum);
lpUnifiedCharSelect->ShowWindow(SW_SHOW);
}
}
return true;
}
bool ParseUnifiedCharSelectAck(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
// 받으면 에러 나면 에러코드를, 아니면 UserLogin을 보낸다.
unsigned long dwError = ParsePacket::HandleUnifiedCharSelectAck(lpPktBase);
if (0 == dwError)
{
// 성공했으니 UserLogin을 보내 보자.
SendPacket::UserLogin(lpHandler, characterData.GetUID(), FALSE);
}
else
{
const char* szErrorString = "알 수 없는 에러입니다";
switch (dwError)
{
case PktUnifiedCharSelectAck::SERVER_ERROR: szErrorString = "서버 에러"; break;
case PktUnifiedCharSelectAck::PACKET_ERROR: szErrorString = "패킷 에러"; break;
case PktUnifiedCharSelectAck::PASSWORD_FAILED: szErrorString = "재인증 실패"; break;
case PktUnifiedCharSelectAck::WRONG_STORE_SELECTED: szErrorString = "잘못된 창고 선택(내 소유 아닌것 선택)"; break;
case PktUnifiedCharSelectAck::WRONG_CHAR_SELECTED: szErrorString = "잘못된 캐릭터 선택(내 소유 아닌것 선택. 이미 선택한 것 선택)"; break;
case PktUnifiedCharSelectAck::UNIFIED_STORE_READ_ERROR: szErrorString = "선택한 창고 읽기 실패"; break;
case PktUnifiedCharSelectAck::UNIFIED_STORE_WRITE_ERROR: szErrorString = "선택한 창고 기록 실패"; break;
case PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR: szErrorString = "캐릭터 선택 정보 기록 실패"; break;
case PktUnifiedCharSelectAck::CHAR_VIEW_RELOAD_ERROR: szErrorString = "캐릭터 뷰 리로드 실패"; break;
}
std::string szErrMessage = "UnifiedCharSelect : ";
szErrMessage += szErrorString;
}
return true;
}

View File

@@ -0,0 +1,29 @@
#ifndef _DUMMY_AUTH_HANDLER_H_
#define _DUMMY_AUTH_HANDLER_H_
#pragma once
#include <Network/ClientNetwork/ClientEventHandler.h>
// forward delc.
class CCharacterData;
class CSession;
class CDummyAuthHandler : public ClientNet::CClientEventHandler
{
public:
CDummyAuthHandler(CCharacterData& characterData);
~CDummyAuthHandler();
private:
int OnOpen(int iErrorCode);
int OnClose();
int OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr);
CCharacterData& m_CharacterData;
};
#endif

View File

@@ -0,0 +1,90 @@
// DummyClient.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
//
#include "stdafx.h"
#include "DummyClient.h"
#include "MainFrm.h"
#include "DummyClientDoc.h"
#include "DummyClientView.h"
#include ".\DummyClient.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CDummyClientApp
BEGIN_MESSAGE_MAP(CDummyClientApp, CWinApp)
// 표준 파일을 기초로 하는 문서 명령입니다.
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
END_MESSAGE_MAP()
// CDummyClientApp 생성
CDummyClientApp::CDummyClientApp()
{
// TODO: 여기에 생성 코드를 추가합니다.
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}
// 유일한 CDummyClientApp 개체입니다.
CDummyClientApp theApp;
// CDummyClientApp 초기화
BOOL CDummyClientApp::InitInstance()
{
// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControls()가 필요합니다.
// InitCommonControls()를 사용하지 않으면 창을 만들 수 없습니다.
InitCommonControls();
CWinApp::InitInstance();
// OLE 라이브러리를 초기화합니다.
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
LoadStdProfileSettings(4); // MRU를 포함하여 표준 INI 파일 옵션을 로드합니다.
// 응용 프로그램의 문서 템플릿을 등록합니다. 문서 템플릿은
// 문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CDummyClientDoc),
RUNTIME_CLASS(CMainFrame), // 주 SDI 프레임 창입니다.
RUNTIME_CLASS(CDummyClientView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// 표준 셸 명령, DDE, 파일 열기에 대한 명령줄을 구문 분석합니다.
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// 명령줄에 지정된 명령을 디스패치합니다. 응용 프로그램이 /RegServer, /Register, /Unregserver 또는 /Unregister로 시작된 경우 FALSE를 반환합니다.
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
// 접미사가 있을 경우에만 DragAcceptFiles를 호출합니다.
// SDI 응용 프로그램에서는 ProcessShellCommand 후에 이러한 호출이 발생해야 합니다.
return TRUE;
}

View File

@@ -0,0 +1,33 @@
// DummyClient.h : DummyClient 응용 프로그램에 대한 주 헤더 파일
//
#pragma once
#ifndef __AFXWIN_H__
#error PCH에서 이 파일을 포함하기 전에 'stdafx.h'를 포함하십시오.
#endif
#include "resource.h" // 주 기호
// CDummyClientApp:
// 이 클래스의 구현에 대해서는 DummyClient.cpp을 참조하십시오.
//
class CDummyClientApp : public CWinApp
{
public:
CDummyClientApp();
// 재정의
public:
virtual BOOL InitInstance();
// 구현
DECLARE_MESSAGE_MAP()
};
extern CDummyClientApp theApp;

View File

@@ -0,0 +1,525 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 한국어 resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#pragma code_page(949)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\DummyClient.ico"
IDR_DummyClientTYPE ICON "res\\DummyClientDoc.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDR_MAINFRAME BITMAP "res\\Toolbar.bmp"
/////////////////////////////////////////////////////////////////////////////
//
// Toolbar
//
IDR_MAINFRAME TOOLBAR 16, 15
BEGIN
BUTTON ID_FILE_NEW
BUTTON ID_FILE_OPEN
BUTTON ID_FILE_SAVE
SEPARATOR
BUTTON ID_EDIT_CUT
BUTTON ID_EDIT_COPY
BUTTON ID_EDIT_PASTE
SEPARATOR
BUTTON ID_FILE_PRINT
BUTTON ID_APP_ABOUT
END
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MAINFRAME MENU
BEGIN
POPUP "파일(&F)"
BEGIN
MENUITEM "새 연결 작성\tCtrl+N(&N)", ID_FILE_NEW
MENUITEM "캐릭터 이름 바꾸기", ID_CHAR_NAME_CHANGE
MENUITEM "열기...\tCtrl+O(&O)", ID_FILE_OPEN
MENUITEM "저장\tCtrl+S(&S)", ID_FILE_SAVE
MENUITEM "다른 이름으로 저장(&A)...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "최근에 사용한 파일", ID_FILE_MRU_FILE1, GRAYED
MENUITEM SEPARATOR
MENUITEM "끝내기(&X)", ID_APP_EXIT
END
POPUP "편집(&E)"
BEGIN
MENUITEM "실행 취소\tCtrl+Z(&U)", ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "잘라내기\tCtrl+X(&T)", ID_EDIT_CUT
MENUITEM "복사\tCtrl+C(&C)", ID_EDIT_COPY
MENUITEM "붙여넣기\tCtrl+V(&P)", ID_EDIT_PASTE
END
POPUP "보기(&V)"
BEGIN
MENUITEM "도구 모음(&T)", ID_VIEW_TOOLBAR
MENUITEM "상태 표시줄(&S)", ID_VIEW_STATUS_BAR
END
POPUP "도움말(&H)"
BEGIN
MENUITEM "DummyClient 정보(&A)...", ID_APP_ABOUT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDR_MAINFRAME ACCELERATORS
BEGIN
"N", ID_FILE_NEW, VIRTKEY, CONTROL
"O", ID_FILE_OPEN, VIRTKEY, CONTROL
"S", ID_FILE_SAVE, VIRTKEY, CONTROL
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL
"X", ID_EDIT_CUT, VIRTKEY, CONTROL
"C", ID_EDIT_COPY, VIRTKEY, CONTROL
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL
VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT
VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT
VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL
VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT
VK_F6, ID_NEXT_PANE, VIRTKEY
VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT
END
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "DummyClient 정보"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "DummyClient Version 1.0",IDC_STATIC,40,10,119,8,
SS_NOPREFIX
LTEXT "Copyright (C) 2004",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "확인",IDOK,178,7,50,16,WS_GROUP
END
IDD_UNIFIED_CHAR_SELECT DIALOGEX 0, 0, 451, 246
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "UnifiedCharSelect"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "확인",IDOK,258,225,50,14
PUSHBUTTON "취소",IDCANCEL,394,225,50,14
CONTROL "",IDC_UNIFIED_STORE_LIST,"SysListView32",LVS_REPORT |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,213,83
CONTROL "",IDC_UNIFIED_CHAR_LIST,"SysListView32",LVS_REPORT |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,97,213,100
EDITTEXT IDC_UNIFIED_PASSWORD,54,203,158,14,ES_AUTOHSCROLL
LTEXT "Password : ",IDC_STATIC,14,205,38,8
CONTROL "",IDC_SELECTED_CHAR,"SysListView32",LVS_REPORT |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,226,97,218,100
EDITTEXT IDC_SELECTED_STORE,298,79,146,14,ES_AUTOHSCROLL |
ES_READONLY
END
IDD_CHANGE_NAME DIALOGEX 0, 0, 228, 46
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "확인",IDOK,171,7,50,14
PUSHBUTTON "취소",IDCANCEL,171,25,50,14
EDITTEXT IDC_NEW_NAME,67,25,99,14,ES_AUTOHSCROLL
EDITTEXT IDC_OLD_NAME,67,7,99,14,ES_AUTOHSCROLL
LTEXT "Old Name",IDC_STATIC,27,10,32,8
LTEXT "New Name",IDC_STATIC,25,26,35,8
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041203b5"
BEGIN
VALUE "CompanyName", "TODO: <회사 이름>"
VALUE "FileDescription", "TODO: <파일 설명>"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "DummyClient.exe"
VALUE "LegalCopyright", "TODO: (c) <회사 이름>. All rights reserved."
VALUE "OriginalFilename", "DummyClient.exe"
VALUE "ProductName", "TODO: <제품 이름>"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "변환", 0x412, 949
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 228
TOPMARGIN, 7
BOTTOMMARGIN, 48
END
IDD_UNIFIED_CHAR_SELECT, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 444
TOPMARGIN, 7
BOTTOMMARGIN, 239
END
IDD_CHANGE_NAME, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 221
TOPMARGIN, 7
BOTTOMMARGIN, 39
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDR_MAINFRAME "DummyClient\n\nDummyClient\n\n\nDummyClient.Document\nDummyClient.Document"
END
STRINGTABLE
BEGIN
AFX_IDS_APP_TITLE "DummyClient"
AFX_IDS_IDLEMESSAGE "준비"
END
STRINGTABLE
BEGIN
ID_INDICATOR_EXT "EXT"
ID_INDICATOR_CAPS "CAP"
ID_INDICATOR_NUM "NUM"
ID_INDICATOR_SCRL "SCRL"
ID_INDICATOR_OVR "OVR"
ID_INDICATOR_REC "REC"
END
STRINGTABLE
BEGIN
ID_FILE_NEW "새 문서를 만듭니다.\n새로 만들기"
ID_FILE_OPEN "기존 문서를 엽니다.\n열기"
ID_FILE_CLOSE "액티브 문서를 닫습니다.\n닫기"
ID_FILE_SAVE "액티브 문서를 저장합니다.\n저장"
ID_FILE_SAVE_AS "액티브 문서를 새 이름으로 저장합니다.\n다른 이름으로 저장"
END
STRINGTABLE
BEGIN
ID_APP_ABOUT "프로그램 정보, 버전 번호, 저작권을 표시합니다.\n정보"
ID_APP_EXIT "문서를 저장할지를 묻고 응용 프로그램을 끝냅니다.\n끝내기"
END
STRINGTABLE
BEGIN
ID_FILE_MRU_FILE1 "현재 문서를 엽니다."
ID_FILE_MRU_FILE2 "현재 문서를 엽니다."
ID_FILE_MRU_FILE3 "현재 문서를 엽니다."
ID_FILE_MRU_FILE4 "현재 문서를 엽니다."
ID_FILE_MRU_FILE5 "현재 문서를 엽니다."
ID_FILE_MRU_FILE6 "현재 문서를 엽니다."
ID_FILE_MRU_FILE7 "현재 문서를 엽니다."
ID_FILE_MRU_FILE8 "현재 문서를 엽니다."
ID_FILE_MRU_FILE9 "현재 문서를 엽니다."
ID_FILE_MRU_FILE10 "현재 문서를 엽니다."
ID_FILE_MRU_FILE11 "현재 문서를 엽니다."
ID_FILE_MRU_FILE12 "현재 문서를 엽니다."
ID_FILE_MRU_FILE13 "현재 문서를 엽니다."
ID_FILE_MRU_FILE14 "현재 문서를 엽니다."
ID_FILE_MRU_FILE15 "현재 문서를 엽니다."
ID_FILE_MRU_FILE16 "현재 문서를 엽니다."
END
STRINGTABLE
BEGIN
ID_NEXT_PANE "다음 창으로 전환합니다.\n다음 창"
ID_PREV_PANE "이전 창으로 전환합니다.\n이전 창"
END
STRINGTABLE
BEGIN
ID_WINDOW_SPLIT "활성 창을 여러 개의 창으로 분할합니다.\n분할"
END
STRINGTABLE
BEGIN
ID_EDIT_CLEAR "선택 영역을 지웁니다.\n지우기"
ID_EDIT_CLEAR_ALL "모든 것을 지웁니다.\n모두 지우기"
ID_EDIT_COPY "선택 영역을 복사하여 클립보드에 넣습니다.\n복사"
ID_EDIT_CUT "선택 영역을 잘라내어 클립보드에 넣습니다.\n잘라내기"
ID_EDIT_FIND "지정한 텍스트를 찾습니다.\n찾기"
ID_EDIT_PASTE "클립보드 내용을 삽입합니다.\n붙여넣기"
ID_EDIT_REPEAT "마지막 작업을 반복합니다.\n반복"
ID_EDIT_REPLACE "특정 텍스트를 다른 텍스트로 바꿉니다.\n바꾸기"
ID_EDIT_SELECT_ALL "전체 문서를 선택합니다.\n모두 선택"
ID_EDIT_UNDO "마지막 작업 실행을 취소합니다.\n실행 취소"
ID_EDIT_REDO "이전에 실행 취소된 작업을 다시 실행합니다.\n다시 실행"
END
STRINGTABLE
BEGIN
ID_VIEW_TOOLBAR "도구 모음을 표시하거나 숨깁니다.\n도구 모음 설정/해제"
ID_VIEW_STATUS_BAR "상태 표시줄을 표시하거나 숨깁니다.\n상태 표시줄 설정/해제"
END
STRINGTABLE
BEGIN
AFX_IDS_SCSIZE "창 크기를 변경합니다."
AFX_IDS_SCMOVE "창 위치를 변경합니다."
AFX_IDS_SCMINIMIZE "창을 아이콘으로 축소합니다."
AFX_IDS_SCMAXIMIZE "창을 전체 화면 크기로 확대합니다."
AFX_IDS_SCNEXTWINDOW "다음 문서 창으로 전환합니다."
AFX_IDS_SCPREVWINDOW "이전 문서 창으로 전환합니다."
AFX_IDS_SCCLOSE "문서를 저장할 것인지 확인하고 활성 창을 닫습니다."
END
STRINGTABLE
BEGIN
AFX_IDS_SCRESTORE "창을 보통 크기로 복원합니다."
AFX_IDS_SCTASKLIST "작업 목록 활성화"
END
#endif // 한국어 resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 영어(미국) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_DummyClient_FORM DIALOGEX 0, 0, 529, 222
STYLE DS_SETFONT | WS_CHILD
FONT 8, "MS Sans Serif", 400, 0, 0x0
BEGIN
GROUPBOX "Info",IDC_STATIC,7,7,201,208
LTEXT "Method",IDC_STATIC,101,20,25,8
COMBOBOX IDC_GUILDINFOSORT_COMBO,131,18,73,105,CBS_DROPDOWN |
CBS_SORT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_GUILDINFO_LISTCTRL,"SysListView32",LVS_REPORT |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,14,34,189,80
CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS | UDS_HORZ,
161,119,39,12
LTEXT "Name",IDC_STATIC,13,141,19,8
LTEXT "Crest",IDC_STATIC,13,159,17,8
LTEXT "Master",IDC_STATIC,13,181,22,8
LTEXT "Rep",IDC_STATIC,13,195,13,8
LTEXT "Tend.",IDC_STATIC,109,158,20,8
LTEXT "Pol.",IDC_STATIC,109,178,13,8
LTEXT "Lev.",IDC_STATIC,109,196,14,8
PUSHBUTTON "Find",IDC_BTN_FIND,109,137,26,14
PUSHBUTTON "Apply",IDC_BTN_APPLY,138,137,34,14
PUSHBUTTON "Cancel",IDC_BTN_CREST,68,156,30,14
PUSHBUTTON "Cancel",IDC_BTN_LEV,162,193,31,14
EDITTEXT IDC_EDT_NAME,40,138,58,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_CREST,40,157,25,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_MASTER,40,176,58,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_REP,40,193,58,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_TEND,129,156,62,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_POL,129,176,62,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_LEV,129,193,31,14,ES_AUTOHSCROLL
GROUPBOX "Safe",IDC_STATIC,211,7,110,108
LTEXT "Balance",IDC_STATIC,221,24,27,8
EDITTEXT IDC_EDT_BALANCE,253,21,64,14,ES_AUTOHSCROLL
PUSHBUTTON "Withdraw",IDC_BTN_WITHDRAW,219,39,50,14
PUSHBUTTON "Deposit",IDC_BTN_DEPOSIT,219,58,50,14
PUSHBUTTON "Details",IDC_BTN_DETAILS,219,77,50,14
PUSHBUTTON "Release",IDC_BTN_RELEASE,219,96,50,14
GROUPBOX "Member",IDC_STATIC,323,7,196,208
LTEXT "Method",IDC_STATIC,409,19,25,8
EDITTEXT IDC_EDT_FAME,376,122,96,14,ES_AUTOHSCROLL
COMBOBOX IDC_GUILDMBRSORT_COMBO,438,18,75,142,CBS_DROPDOWN |
CBS_SORT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_GUILDMBR_LISTCTRL,"SysListView32",LVS_REPORT |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,333,34,176,79
LTEXT "Fame",IDC_STATIC,339,125,18,8
LTEXT "By gold",IDC_STATIC,339,144,24,8
LTEXT "Location",IDC_STATIC,339,163,28,8
EDITTEXT IDC_EDT_GOLD,376,141,95,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_LOCATION,376,160,95,14,ES_AUTOHSCROLL
PUSHBUTTON "Reflush",IDC_BTN_REFLUSH,239,154,50,14
GROUPBOX "Menu",IDC_STATIC,211,115,109,100
PUSHBUTTON "Create",IDC_BTN_CREATE,240,134,50,14
END
IDD_DLG_LOGIN DIALOGEX 0, 0, 168, 133
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Login"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
CONTROL "",IDC_IPADDRESS1,"SysIPAddress32",WS_TABSTOP,57,16,91,
14
EDITTEXT IDC_EDT_LOGIN2,57,35,91,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_LOGIN3,57,52,91,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_LOGIN,57,69,91,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDT_PASSWORD,57,87,91,14,ES_AUTOHSCROLL
DEFPUSHBUTTON "Login",IDOK,34,110,50,14
DEFPUSHBUTTON "Exit",IDCANCEL,99,110,50,14
LTEXT "Login",IDC_STATIC,33,73,18,8
LTEXT "Password",IDC_STATIC,20,90,32,8
LTEXT "Auth server IP",IDC_STATIC,9,19,48,8
LTEXT "Checksum",IDC_STATIC,20,37,33,8
LTEXT "ClientVersion",IDC_STATIC,10,56,42,8
END
IDD_DLG_CHARSELECT DIALOGEX 0, 0, 217, 127
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Character Select"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,47,105,50,14
PUSHBUTTON "Cancel",IDCANCEL,105,105,50,14
CONTROL "",IDC_CTRL_CHARSELECT,"SysListView32",LVS_REPORT |
LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,203,90
END
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)\r\n"
"LANGUAGE 18, 1\r\n"
"#pragma code_page(949)\r\n"
"#include ""res\\DummyClient.rc2"" // Microsoft Visual C++에서 편집되지 않은 리소스\r\n"
"#include ""afxres.rc"" // 표준 구성 요소\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // 영어(미국) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
LANGUAGE 18, 1
#pragma code_page(949)
#include "res\DummyClient.rc2" // Microsoft Visual C++에서 편집되지 않은 리소스
#include "afxres.rc" // 표준 구성 요소
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -0,0 +1,393 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="DummyClient"
ProjectGUID="{68812F54-DCD1-4CE1-8259-3D79E565C67F}"
SccProjectName="SAK"
SccAuxPath="SAK"
SccLocalPath="SAK"
SccProvider="SAK"
Keyword="MFCProj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="1"
CharacterSet="2"
DeleteExtensionsOnClean="*.map;*.htm;*.idb;*.dat;*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;$(TargetPath)">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../../Client/GlobalScript;../../MemoryManager"
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="winmm.lib"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="1"
CharacterSet="2"
DeleteExtensionsOnClean="*.map;*.htm;*.idb;*.dat;*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;$(TargetPath)">
<Tool
Name="VCCLCompilerTool"
Optimization="3"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="FALSE"
ImproveFloatingPointConsistency="TRUE"
FavorSizeOrSpeed="2"
EnableFiberSafeOptimizations="FALSE"
OptimizeForWindowsApplication="TRUE"
AdditionalIncludeDirectories="../../Client/GlobalScript;../../MemoryManager"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
StringPooling="TRUE"
MinimalRebuild="FALSE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="FALSE"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="0"
AssemblerOutput="2"
AssemblerListingLocation="$(IntDir)/"
ObjectFile="$(IntDir)/"
ProgramDataBaseFileName="$(IntDir)/vc70.pdb"
BrowseInformation="0"
WarningLevel="3"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"
CompileAs="2"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="winmm.lib"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="ReleaseWithMemory|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="1"
CharacterSet="2"
DeleteExtensionsOnClean="*.map;*.htm;*.idb;*.dat;*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;$(TargetPath)">
<Tool
Name="VCCLCompilerTool"
Optimization="3"
GlobalOptimizations="TRUE"
InlineFunctionExpansion="0"
EnableIntrinsicFunctions="FALSE"
ImproveFloatingPointConsistency="TRUE"
FavorSizeOrSpeed="2"
EnableFiberSafeOptimizations="FALSE"
OptimizeForWindowsApplication="TRUE"
AdditionalIncludeDirectories="../../Client/GlobalScript;../../MemoryManager"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;GM_USE_MEMORY"
StringPooling="TRUE"
MinimalRebuild="FALSE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="FALSE"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="0"
AssemblerOutput="2"
AssemblerListingLocation="$(IntDir)/"
ObjectFile="$(IntDir)/"
ProgramDataBaseFileName="$(IntDir)/vc70.pdb"
BrowseInformation="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"
CompileAs="2"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="winmm.lib"
LinkIncremental="1"
IgnoreDefaultLibraryNames=""
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Guild Files"
Filter="">
<File
RelativePath=".\GuildInfo.cpp">
</File>
<File
RelativePath=".\GuildInfo.h">
</File>
<File
RelativePath=".\GuildManager.cpp">
</File>
<File
RelativePath=".\GuildManager.h">
</File>
<File
RelativePath=".\GuildMember.cpp">
</File>
<File
RelativePath=".\GuildMember.h">
</File>
<File
RelativePath=".\GuildSafe.cpp">
</File>
<File
RelativePath=".\GuildSafe.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
<File
RelativePath=".\res\DummyClient.ico">
</File>
<File
RelativePath=".\DummyClient.rc">
</File>
<File
RelativePath=".\res\DummyClient.rc2">
</File>
<File
RelativePath=".\res\DummyClientDoc.ico">
</File>
<File
RelativePath=".\res\Toolbar.bmp">
</File>
</Filter>
<Filter
Name="Dialog Files"
Filter="">
<File
RelativePath=".\ChangeNameDlg.cpp">
</File>
<File
RelativePath=".\ChangeNameDlg.h">
</File>
<File
RelativePath=".\CharacterSelectDlg.cpp">
</File>
<File
RelativePath=".\CharacterSelectDlg.h">
</File>
<File
RelativePath=".\LoginDlg.cpp">
</File>
<File
RelativePath=".\LoginDlg.h">
</File>
<File
RelativePath=".\UnifiedCharSelect.cpp">
</File>
<File
RelativePath=".\UnifiedCharSelect.h">
</File>
</Filter>
<Filter
Name="MFC Files"
Filter="">
<File
RelativePath=".\DummyClient.cpp">
</File>
<File
RelativePath=".\DummyClient.h">
</File>
<File
RelativePath=".\DummyClientDoc.cpp">
</File>
<File
RelativePath=".\DummyClientDoc.h">
</File>
<File
RelativePath=".\DummyClientView.cpp">
</File>
<File
RelativePath=".\DummyClientView.h">
</File>
<File
RelativePath=".\MainFrm.cpp">
</File>
<File
RelativePath=".\MainFrm.h">
</File>
<File
RelativePath=".\Resource.h">
</File>
<File
RelativePath=".\stdafx.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="ReleaseWithMemory|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
<File
RelativePath=".\stdafx.h">
</File>
</Filter>
<Filter
Name="Network"
Filter="">
<File
RelativePath=".\CharacterData.cpp">
</File>
<File
RelativePath=".\CharacterData.h">
</File>
<File
RelativePath=".\DummyAuthHandler.cpp">
</File>
<File
RelativePath=".\DummyAuthHandler.h">
</File>
<File
RelativePath=".\DummyGameHandler.cpp">
</File>
<File
RelativePath=".\DummyGameHandler.h">
</File>
</Filter>
<File
RelativePath=".\res\DummyClient.manifest">
</File>
<File
RelativePath=".\DummyGuildHandler.cpp">
</File>
<File
RelativePath=".\DummyGuildHandler.h">
</File>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
<Global
Name="RESOURCE_FILE"
Value="DummyClient.rc"/>
</Globals>
</VisualStudioProject>

View File

@@ -0,0 +1,74 @@
// DummyClientDoc.cpp : CDummyClientDoc 클래스의 구현
//
#include "stdafx.h"
#include "DummyClient.h"
#include "DummyClientDoc.h"
#include "CharacterData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CDummyClientDoc
IMPLEMENT_DYNCREATE(CDummyClientDoc, CDocument)
// CDummyClientDoc 생성/소멸
CDummyClientDoc::CDummyClientDoc()
{
// TODO: 여기에 일회성 생성 코드를 추가합니다.
}
CDummyClientDoc::~CDummyClientDoc()
{
}
BOOL CDummyClientDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 여기에 다시 초기화 코드를 추가합니다.
// SDI 문서는 이 문서를 다시 사용합니다.
return TRUE;
}
// CDummyClientDoc serialization
void CDummyClientDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
}
}
// CDummyClientDoc 진단
#ifdef _DEBUG
void CDummyClientDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDummyClientDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG

View File

@@ -0,0 +1,34 @@
// DummyClientDoc.h : CDummyClientDoc 클래스의 인터페이스
//
#pragma once
class CDummyClientDoc : public CDocument
{
protected: // serialization에서만 만들어집니다.
CDummyClientDoc();
DECLARE_DYNCREATE(CDummyClientDoc)
// 특성
public:
// 작업
public:
// 재정의
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
// 구현
public:
virtual ~CDummyClientDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};

View File

@@ -0,0 +1,206 @@
// DummyClientView.cpp : CDummyClientView 클래스의 구현
//
#include "stdafx.h"
#include "DummyClient.h"
#include "DummyClientDoc.h"
#include "DummyClientView.h"
#include ".\DummyClientview.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CDummyClientView
IMPLEMENT_DYNCREATE(CDummyClientView, CFormView)
BEGIN_MESSAGE_MAP(CDummyClientView, CFormView)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_BTN_APPLY, OnBnClickedBtnApply)
ON_BN_CLICKED(IDC_BTN_CREST, OnBnClickedBtnCrest)
ON_BN_CLICKED(IDC_BTN_DEPOSIT, OnBnClickedBtnDeposit)
ON_BN_CLICKED(IDC_BTN_DETAILS, OnBnClickedBtnDetails)
ON_BN_CLICKED(IDC_BTN_FIND, OnBnClickedBtnFind)
ON_BN_CLICKED(IDC_BTN_LEV, OnBnClickedBtnLev)
ON_BN_CLICKED(IDC_BTN_RELEASE, OnBnClickedBtnRelease)
ON_BN_CLICKED(IDC_BTN_WITHDRAW, OnBnClickedBtnWithdraw)
ON_BN_CLICKED(IDC_BTN_REFLUSH, OnBnClickedBtnReflush)
ON_BN_CLICKED(IDC_BTN_CREATE, OnBnClickedBtnCreate)
END_MESSAGE_MAP()
// CDummyClientView 생성/소멸
CDummyClientView::CDummyClientView()
: CFormView(CDummyClientView::IDD)
, m_strName(_T(""))
, m_strCrest(_T(""))
, m_strMaster(_T(""))
, m_strRep(_T(""))
, m_strTend(_T(""))
, m_strPol(_T(""))
, m_strLev(_T(""))
, m_strBalance(_T(""))
, m_strFame(_T(""))
, m_strGold(_T(""))
, m_strLocation(_T(""))
{
// TODO: 여기에 생성 코드를 추가합니다.
}
CDummyClientView::~CDummyClientView()
{
}
void CDummyClientView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_GUILDINFOSORT_COMBO, m_cbGuildInfoMethod);
DDX_Control(pDX, IDC_GUILDMBRSORT_COMBO, m_cbMemberSortMethod);
DDX_Control(pDX, IDC_GUILDINFO_LISTCTRL, m_ctrlGuildInfo);
DDX_Control(pDX, IDC_GUILDMBR_LISTCTRL, m_ctrlMemberInfo);
DDX_Text(pDX, IDC_EDT_NAME, m_strName);
DDX_Text(pDX, IDC_EDT_CREST, m_strCrest);
DDX_Text(pDX, IDC_EDT_MASTER, m_strMaster);
DDX_Text(pDX, IDC_EDT_REP, m_strRep);
DDX_Text(pDX, IDC_EDT_TEND, m_strTend);
DDX_Text(pDX, IDC_EDT_POL, m_strPol);
DDX_Text(pDX, IDC_EDT_LEV, m_strLev);
DDX_Text(pDX, IDC_EDT_BALANCE, m_strBalance);
DDX_Text(pDX, IDC_EDT_FAME, m_strFame);
DDX_Text(pDX, IDC_EDT_GOLD, m_strGold);
DDX_Text(pDX, IDC_EDT_LOCATION, m_strLocation);
}
BOOL CDummyClientView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
return CFormView::PreCreateWindow(cs);
}
void CDummyClientView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_cbGuildInfoMethod.AddString( "순위(명성)" ) ;
m_cbGuildInfoMethod.AddString( "우호길드" ) ;
m_cbGuildInfoMethod.AddString( "적대길드" ) ;
m_cbGuildInfoMethod.AddString( "비우호/비적대길드" ) ;
m_cbGuildInfoMethod.AddString( "길드명" ) ;
m_cbGuildInfoMethod.AddString( "자신의 길드" ) ;
m_cbMemberSortMethod.AddString("길드 마스터") ;
m_cbMemberSortMethod.AddString("중간 관리자") ;
m_cbMemberSortMethod.AddString("일반 길드원") ;
m_cbMemberSortMethod.AddString("탈퇴 대기자") ;
m_cbMemberSortMethod.AddString("가입 대기자") ;
m_ctrlGuildInfo.InsertColumn( 0, _T( "순위" ), LVCFMT_CENTER, 40 ) ;
m_ctrlGuildInfo.InsertColumn( 1, _T( "길드명" ), LVCFMT_CENTER, 60 ) ;
m_ctrlGuildInfo.InsertColumn( 2, _T( "길드마스터" ), LVCFMT_CENTER, 80 ) ;
m_ctrlGuildInfo.InsertColumn( 3, _T( "길드명성" ), LVCFMT_CENTER, 60 ) ;
m_ctrlGuildInfo.InsertColumn( 4, _T( "마크" ), LVCFMT_CENTER, 40 ) ;
m_ctrlMemberInfo.InsertColumn( 0, _T( "서열" ), LVCFMT_CENTER, 40 ) ;
m_ctrlMemberInfo.InsertColumn( 1, _T( "클래스" ), LVCFMT_CENTER, 60 ) ;
m_ctrlMemberInfo.InsertColumn( 2, _T( "레벨" ), LVCFMT_CENTER, 40 ) ;
m_ctrlMemberInfo.InsertColumn( 3, _T( "명성" ), LVCFMT_CENTER, 40 ) ;
m_ctrlMemberInfo.InsertColumn( 4, _T( "이름" ), LVCFMT_CENTER, 80 ) ;
}
// CDummyClientView 진단
#ifdef _DEBUG
void CDummyClientView::AssertValid() const
{
CFormView::AssertValid();
}
void CDummyClientView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CDummyClientDoc* CDummyClientView::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDummyClientDoc)));
return (CDummyClientDoc*)m_pDocument;
}
#endif //_DEBUG
// CDummyClientView 메시지 처리기
int CDummyClientView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
BOOL CDummyClientView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
void CDummyClientView::OnBnClickedBtnApply()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnCrest()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnDeposit()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnDetails()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnFind()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnLev()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnRelease()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnWithdraw()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnReflush()
{
// TODO: Add your control notification handler code here
}
void CDummyClientView::OnBnClickedBtnCreate()
{
// TODO: Add your control notification handler code here
}

View File

@@ -0,0 +1,80 @@
// DummyClientView.h : iCDummyClientView 클래스의 인터페이스
//
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
class CDummyClientView : public CFormView
{
protected: // serialization에서만 만들어집니다.
CDummyClientView();
DECLARE_DYNCREATE(CDummyClientView)
public:
enum{ IDD = IDD_DummyClient_FORM };
// 특성
public:
CDummyClientDoc* GetDocument() const;
// 작업
public:
// 재정의
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
virtual void OnInitialUpdate(); // 생성 후 처음 호출되었습니다.
// 구현
public:
virtual ~CDummyClientView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 메시지 맵 함수를 생성했습니다.
protected:
DECLARE_MESSAGE_MAP()
public:
CComboBox m_cbGuildInfoMethod;
CComboBox m_cbMemberSortMethod;
CListCtrl m_ctrlGuildInfo;
CListCtrl m_ctrlMemberInfo;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
afx_msg void OnBnClickedBtnApply();
afx_msg void OnBnClickedBtnCrest();
afx_msg void OnBnClickedBtnDeposit();
afx_msg void OnBnClickedBtnDetails();
afx_msg void OnBnClickedBtnFind();
afx_msg void OnBnClickedBtnLev();
afx_msg void OnBnClickedBtnRelease();
afx_msg void OnBnClickedBtnWithdraw();
CString m_strName;
CString m_strCrest;
CString m_strMaster;
CString m_strRep;
CString m_strTend;
CString m_strPol;
CString m_strLev;
CString m_strBalance;
CString m_strFame;
CString m_strGold;
CString m_strLocation;
afx_msg void OnBnClickedBtnReflush();
afx_msg void OnBnClickedBtnCreate();
};
#ifndef _DEBUG // DummyClientView.cpp의 디버그 버전
inline CDummyClientDoc* CDummyClientView::GetDocument() const
{ return reinterpret_cast<CDummyClientDoc*>(m_pDocument); }
#endif

View File

@@ -0,0 +1,214 @@
#include "stdafx.h"
#include "DummyGameHandler.h"
#include "CharacterData.h"
#include "MainFrm.h"
#include <Network/Packet/PacketBase.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#include <Network/ClientSocket/Send/SendLoginout.h>
#include <Network/ClientSocket/Send/SendMove.h>
#include <Network/ClientSocket/Parse/ParseLoginout.h>
#include <Network/ClientSocket/Parse/ParseItem.h>
#include <Network/ClientSocket/Parse/ParseMove.h>
#include <Network/ClientSocket/Parse/ParseEtc.h>
#include "GMMemory.h"
bool ParseCharLogin(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseCharDepositUpdate(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
bool ParseCharNameChange(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData);
CDummyGameHandler::CDummyGameHandler(CCharacterData& characterData)
: m_CharacterData(characterData)
{
}
CDummyGameHandler::~CDummyGameHandler()
{
}
int CDummyGameHandler::OnOpen(int iErrorCode)
{
if(0 != iErrorCode ||
!SendPacket::CharLogin(m_CharacterData.GetClientSocket(), m_CharacterData.GetUID(),
m_CharacterData.GetCID(), m_CharacterData.GetSessionID()))
{
// 에러코드 리턴
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.RemoveByAccount(m_CharacterData.GetAccount());
}
else
{
m_CharacterData.GetClientSocket().SetHandler(this, ClientSocket::GameEventHandler);
}
return 0;
}
int CDummyGameHandler::OnClose()
{
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.RemoveByAccount(m_CharacterData.GetAccount());
m_CharacterData.GetClientSocket().ResetHandler(this, ClientSocket::GameEventHandler);
return 0;
}
int CDummyGameHandler::OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr)
{
bool rc = true;
switch(lpPktBase->GetCmd())
{
case CmdCharLogin: rc = ParseCharLogin(this, lpPktBase, m_CharacterData); break;
case CmdDepositUpdate: rc = ParseCharDepositUpdate(this, lpPktBase, m_CharacterData); break;
case CmdCharNameChange: rc = ParseCharNameChange(this, lpPktBase, m_CharacterData); break;
}
if(!rc)
{
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.RemoveByAccount(m_CharacterData.GetAccount());
}
return 0;
}
bool ParseCharLogin(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase, CCharacterData& characterData)
{
CHAR_INFOST charInfoST;
CHAR_POS charPos;
QUICK quickSlot;
SKILL skillSlot;
SPELL spell;
unsigned long dwServerID, dwServerTime;
unsigned short wEquipSize, wInvenSize, wExtraSize, wExchangeSize, wTempInven;
char *lpEquipBuffer, *lpInvenBuffer, *lpExtraBuffer, *lpExchangeBuffer, *lpTempInvenBuffer;
bool bPeace;
bool bCheckRelation;
unsigned char cNameChangeCount;
unsigned char cAdminFlag;
unsigned char cGuildWarFlag;
unsigned char cRealmWarFlag;
unsigned char cRealmPoint;
unsigned char cTacticsFlag;
ClientSocket& clientSocket = characterData.GetClientSocket();
unsigned long dwError = ParsePacket::HandleCharLogin(lpPktBase, clientSocket,
&bPeace, &bCheckRelation, &cNameChangeCount, &cAdminFlag,
&cGuildWarFlag, &cRealmWarFlag, &cRealmPoint, &cTacticsFlag,
&charInfoST, &skillSlot, &quickSlot, &spell,
&charPos, &dwServerTime, &dwServerID,
&wEquipSize, &lpEquipBuffer, &wInvenSize, &lpInvenBuffer,
&wExtraSize, &lpExtraBuffer, &wExchangeSize, &lpExchangeBuffer,
&wTempInven, &lpTempInvenBuffer);
if (0 == dwError)
{
// 받은 데이터를 적절히 저장한다.
// 당장은 필요 없으니 즐....
// 캐릭터 이름을 세팅한다
characterData.SetCharacterName(charInfoST.Name);
CCharacterDataMgr& characterDataMgr =
static_cast<CMainFrame*>(AfxGetMainWnd())->GetCharacterDataMgr();
characterDataMgr.AddByAccount(&characterData);
}
else
{
const char* szErrorString = 0;
switch (dwError)
{
case 2: szErrorString = "데이터 얻기 실패"; break;
case 4: szErrorString = "이미 접속중"; break;
case 24: szErrorString = "포인트 카드 사용자가 아님"; break;
}
std::string szErrorMessage = "CmdCharLogin : ";
szErrorMessage += szErrorString;
}
return true;
}
bool ParseCharDepositUpdate(ClientNet::CClientEventHandler* lpHandler, PktBase* lpPktBase,
CCharacterData& characterData)
{
unsigned long dwFlag;
char* lpStoreBuffer;
unsigned short wStoreSize;
unsigned char cTab;
bool bComplete;
ClientSocket& clientSocket = characterData.GetClientSocket();
unsigned long dwError = ParsePacket::HandleDepositUpdate(lpPktBase,
&dwFlag, &cTab, &bComplete, &wStoreSize, &lpStoreBuffer);
if (0 == dwError)
{
// 창고 데이터는 받던지 말던지;;;
if (bComplete)
{
// 로그인 성공이다. 이때 관련 처리를 한다.
}
}
return true;
}
bool ParseCharNameChange(ClientNet::CClientEventHandler* lpHandler,
PktBase* lpPktBase, CCharacterData& characterData)
{
char* szChangedName = 0;
unsigned char cNameChangeCount = 0;
unsigned long dwError = ParsePacket::HandleCharNameChange(lpPktBase, szChangedName, &cNameChangeCount);
if(0 == dwError)
{
characterData.SetCharacterName(szChangedName);
}
else
{
switch(dwError)
{
case PktCharNameChange::ERR_SERVER:
case PktCharNameChange::ERR_CANNOT_FIND_CHARACTER:
case PktCharNameChange::ERR_NAMECHANGE_COUNT:
case PktCharNameChange::ERR_INVALID_NAME:
case PktCharNameChange::ERR_CANNOT_USE_NAME:
case PktCharNameChange::ERR_ALREADY_USE_NAME:
break;
}
}
return true;
}

View File

@@ -0,0 +1,29 @@
#ifndef _DUMMY_GAME_HANDLER_H_
#define _DUMMY_GAME_HANDLER_H_
#pragma once
#include <Network/ClientNetwork/ClientEventHandler.h>
// forward delc.
class CCharacterData;
class CSession;
class CDummyGameHandler : public ClientNet::CClientEventHandler
{
public:
CDummyGameHandler(CCharacterData& characterData);
~CDummyGameHandler();
private:
int OnOpen(int iErrorCode);
int OnClose();
int OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr);
CCharacterData& m_CharacterData;
};
#endif

View File

@@ -0,0 +1,13 @@
#include "StdAfx.h"
#include ".\dummyguildhandler.h"
#include "GMMemory.h"
/*
CDummyGuildHandler::CDummyGuildHandler(void)
{
}
CDummyGuildHandler::~CDummyGuildHandler(void)
{
}
*/

View File

@@ -0,0 +1,19 @@
#ifndef _DUMMY_GUILD_HANDLER_
#define _DUMMY_GUILD_HANDLER_
/*
#pragma once
#include <Network/ClientNetwork/ClientEventHandler.h>
// forward delc.
class CCharacterData;
class CSession;
class CDummyGuildHandler : public ClientNet::CClientEventHandler
{
public:
CDummyGuildHandler( ClientNet::CSessionMgr& sessionMgr, CCharacterData& characterData ) ;
~CDummyGuildHandler();
};
*/
#endif //_DUMMY_GUILD_HANDLER

View File

@@ -0,0 +1,11 @@
#include "StdAfx.h"
#include ".\guildinfo.h"
#include "GMMemory.h"
CGuildInfo::CGuildInfo(void)
{
}
CGuildInfo::~CGuildInfo(void)
{
}

View File

@@ -0,0 +1,8 @@
#pragma once
class CGuildInfo
{
public:
CGuildInfo(void);
~CGuildInfo(void);
};

View File

@@ -0,0 +1,62 @@
#include "StdAfx.h"
#include ".\guildmanager.h"
#include "GuildInfo.h"
#include "GuildSafe.h"
#include "GuildMember.h"
#include "GMMemory.h"
CString CGuildManager::m_strClass[ 25 ] ;
CGuildManager::CGuildManager(void)
{
m_strClass[ 0 ] = "None" ; // 450
m_strClass[ 1 ] = "파이터" ; // 451
m_strClass[ 2 ] = "로그" ; // 452
m_strClass[ 3 ] = "메이지" ; // 453
m_strClass[ 4 ] = "어콜라이트" ; // 454
m_strClass[ 5 ] = "디펜더" ; // 455
m_strClass[ 6 ] = "워리어" ; // 456
m_strClass[ 7 ] = "어쎄신" ; // 457
m_strClass[ 8 ] = "아처" ; // 458
m_strClass[ 9 ] = "소서러" ; // 459
m_strClass[ 10 ] = "엔찬터" ; // 460
m_strClass[ 11 ] = "프리스트" ; // 461
m_strClass[ 12 ] = "클레릭" ; // 462
m_strClass[ 13 ] = "" ; // 463
m_strClass[ 14 ] = "" ; // 464
m_strClass[ 15 ] = "" ; // 465
m_strClass[ 16 ] = "" ; // 466
m_strClass[ 17 ] = "컴배턴트" ; // 467
m_strClass[ 18 ] = "오피세이터" ; // 468
m_strClass[ 19 ] = "템플러" ; // 469
m_strClass[ 20 ] = "어태커" ; // 470
m_strClass[ 21 ] = "거너" ; // 471
m_strClass[ 22 ] = "룬오프" ; // 472
m_strClass[ 23 ] = "라이프오프" ; // 473
m_strClass[ 24 ] = "쉐도우오프" ; // 474
}
CGuildManager::~CGuildManager(void)
{
}
CString CGuildManager::GetClassName( unsigned short wClass )
{
if (1 <= wClass && wClass <= 24)
return m_strClass[ wClass ] ;
else
return m_strClass[ 0 ];
}
void CGuildManager::Reflush()
{
}
void CGuildManager::UpdateGuildMessageBox()
{
}
void CGuildManager::CheckGuildStipulation()
{
}

View File

@@ -0,0 +1,31 @@
#pragma once
class CGuildInfo ;
class CGuildSafe ;
class CGuildMember ;
class CGuildManager
{
public :
//======================================
// * 권한설정과 마크 변경은 제외
//======================================
CGuildInfo* m_pGuildInfo ;
CGuildSafe* m_pGuildSafe ;
CGuildMember* m_pGuildMember ;
DWORD m_dwCresteGuildResult ;
CHAR m_szCreateGuildName[ 128 ] ;
DWORD m_dwResCheckGuildName ;
static CString m_strClass[ 25 ] ;
public:
CGuildManager(void);
~CGuildManager(void);
void Reflush() ;
void UpdateGuildMessageBox() ;
void CheckGuildStipulation() ;
static CString GetClassName( unsigned short wClass ) ;
};

View File

@@ -0,0 +1,11 @@
#include "StdAfx.h"
#include ".\guildmember.h"
#include "GMMemory.h"
CGuildMember::CGuildMember(void)
{
}
CGuildMember::~CGuildMember(void)
{
}

View File

@@ -0,0 +1,8 @@
#pragma once
class CGuildMember
{
public:
CGuildMember(void);
~CGuildMember(void);
};

View File

@@ -0,0 +1,11 @@
#include "StdAfx.h"
#include ".\guildsafe.h"
#include "GMMemory.h"
CGuildSafe::CGuildSafe(void)
{
}
CGuildSafe::~CGuildSafe(void)
{
}

View File

@@ -0,0 +1,8 @@
#pragma once
class CGuildSafe
{
public:
CGuildSafe(void);
~CGuildSafe(void);
};

View File

@@ -0,0 +1,152 @@
// LoginDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DummyClient.h"
#include "LoginDlg.h"
#include ".\logindlg.h"
#include "MainFrm.h"
#include "CharacterSelectDlg.h"
#include "GMMemory.h"
// CLoginDlg dialog
const char* szSetupFileName = "./DummyClient.ini";
IMPLEMENT_DYNAMIC(CLoginDlg, CDialog)
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
, m_szAccount(_T(""))
, m_szPassword(_T(""))
, m_szCheckSum(_T(""))
, m_dwClientVersion(0)
, m_nLoopCount(0)
{
}
CLoginDlg::~CLoginDlg()
{
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDT_LOGIN, m_szAccount);
DDX_Text(pDX, IDC_EDT_PASSWORD, m_szPassword);
DDX_Text(pDX, IDC_IPADDRESS1, m_AuthServerIP);
DDX_Text(pDX, IDC_EDT_LOGIN2, m_szCheckSum);
DDX_Text(pDX, IDC_EDT_LOGIN3, m_dwClientVersion);
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
ON_BN_CLICKED(ID_BTN_EXIT, OnBnClickedBtnExit)
ON_BN_CLICKED(ID_BTN_LOGIN, OnBnClickedBtnLogin)
ON_WM_DESTROY()
END_MESSAGE_MAP()
// CLoginDlg message handlers
//----------------------------------------------------------------------
// Desc : 로그인 처리
//----------------------------------------------------------------------
void CLoginDlg::OnBnClickedBtnExit()
{
// TODO: Add your control notification handler code here
}
//----------------------------------------------------------------------
// Desc : 종료
//----------------------------------------------------------------------
void CLoginDlg::OnBnClickedBtnLogin()
{
// TODO: Add your control notification handler code here
// 새 캐릭터 데이터 인스턴스 생성후에, 연결 호출
}
void CLoginDlg::MoveToCenter()
{
CRect rcDlg, rcMain;
GetClientRect(&rcDlg);
AfxGetMainWnd()->GetClientRect(&rcMain);
int x = ( rcMain.Width() - rcDlg.Width() ) / 2 ;
int y = ( rcMain.Height() - rcDlg.Height() ) / 2 ;
MoveWindow( x, y, rcDlg.Width(), rcDlg.Height() + 20 ) ;
}
BOOL CLoginDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
// 레지스트리 파일에서 서버주소, 버전, 체크섬을 읽어온다.
m_dwClientVersion = GetPrivateProfileInt(
"DummyLoginSetup", "ClientVersion", 0, szSetupFileName);
char szTemp[MAX_PATH];
GetPrivateProfileString("DummyLoginSetup", "CheckSum",
"", szTemp, MAX_PATH - 1, szSetupFileName);
szTemp[MAX_PATH - 1] = 0;
m_szCheckSum = szTemp;
GetPrivateProfileString("DummyLoginSetup", "AuthServerAddress",
"", szTemp, MAX_PATH - 1, szSetupFileName);
szTemp[MAX_PATH - 1] = 0;
m_AuthServerIP = szTemp;
GetPrivateProfileString("DummyLoginSetup", "Account",
"", szTemp, MAX_PATH - 1, szSetupFileName);
szTemp[MAX_PATH - 1] = 0;
m_szAccount = szTemp;
GetPrivateProfileString("DummyLoginSetup", "Password",
"", szTemp, MAX_PATH - 1, szSetupFileName);
szTemp[MAX_PATH - 1] = 0;
m_szPassword = szTemp;
MoveToCenter();
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CLoginDlg::OnDestroy()
{
UpdateData(TRUE);
char szClientVersion[MAX_PATH];
itoa(m_dwClientVersion, szClientVersion, 10);
WritePrivateProfileString("DummyLoginSetup", "ClientVersion", szClientVersion, szSetupFileName);
WritePrivateProfileString("DummyLoginSetup", "CheckSum", m_szCheckSum, szSetupFileName);
WritePrivateProfileString("DummyLoginSetup", "AuthServerAddress",
m_AuthServerIP.GetBuffer(0), szSetupFileName);
WritePrivateProfileString("DummyLoginSetup", "Account",
m_szAccount.GetBuffer(0), szSetupFileName);
WritePrivateProfileString("DummyLoginSetup", "Password",
m_szPassword.GetBuffer(0), szSetupFileName);
CDialog::OnDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}

View File

@@ -0,0 +1,58 @@
#pragma once
#include "afxcmn.h"
// CLoginDlg dialog
class CLoginDlg : public CDialog
{
DECLARE_DYNAMIC(CLoginDlg)
public:
CLoginDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CLoginDlg();
void ClearAuthInfo() { m_szAccount = "", m_szPassword = ""; }
// Dialog Data
enum { IDD = IDD_DLG_LOGIN };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedBtnExit();
afx_msg void OnBnClickedBtnLogin();
DWORD GetCheckSum()
{
char* szEndPtr = 0;
return strtoul(m_szCheckSum.GetBuffer(0), &szEndPtr, 16);
}
DWORD GetClientVersion() { return m_dwClientVersion; }
CString GetAccount() { return m_szAccount; }
CString GetPassword() { return m_szPassword; }
CString GetAuthServerIP() { return m_AuthServerIP; }
private:
void MoveToCenter();
CString m_szAccount;
CString m_szPassword;
CString m_AuthServerIP;
CString m_szCheckSum;
DWORD m_dwClientVersion;
LONG m_nLoopCount;
public:
virtual BOOL OnInitDialog();
afx_msg void OnDestroy();
};

View File

@@ -0,0 +1,203 @@
// MainFrm.cpp : CMainFrame 클래스의 구현
//
#include "stdafx.h"
#include "DummyClient.h"
#include "MainFrm.h"
#include ".\mainfrm.h"
#include "LoginDlg.h"
#include "CharacterSelectDlg.h"
#include "GuildManager.h"
#include "CharacterData.h"
#include "ChangeNameDlg.h"
#include <mmsystem.h>
#include <Network/ClientNetwork/SessionMgr.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMainFrame
const int g_nTimerID_Network = 1;
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_SETFOCUS()
ON_WM_SHOWWINDOW()
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_WM_TIMER()
ON_COMMAND(ID_CHAR_NAME_CHANGE, OnCharNameChange)
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // 상태 줄 표시기
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
// CMainFrame 생성/소멸
CMainFrame::CMainFrame()
: m_lpGuildManager(0),
m_lpCharacterDataMgr(0),
m_dwLastPingTime(timeGetTime())
{
// TODO: 여기에 멤버 초기화 코드를 추가합니다.
}
CMainFrame::~CMainFrame()
{
if ( 0 != m_lpGuildManager )
{
delete m_lpGuildManager ;
m_lpGuildManager = 0 ;
}
if ( 0 != m_lpCharacterDataMgr )
{
delete m_lpCharacterDataMgr ;
m_lpCharacterDataMgr = 0 ;
}
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
/*
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("도구 모음을 만들지 못했습니다.\n");
return -1; // 만들지 못했습니다.
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("상태 표시줄을 만들지 못했습니다.\n");
return -1; // 만들지 못했습니다.
}
// TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
*/
m_lpGuildManager = new CGuildManager ;
if (0 == m_lpGuildManager)
{
return -1;
}
m_lpCharacterDataMgr = new CCharacterDataMgr ;
if (0 == m_lpCharacterDataMgr)
{
return -1;
}
SetTimer(g_nTimerID_Network, 100, 0);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
return TRUE;
}
// CMainFrame 진단
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
// CMainFrame 메시지 처리기
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
//CFrameWnd::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
}
void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
CFrameWnd::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
}
void CMainFrame::OnFileNew()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
CCharacterData* lpCharacterData = new CCharacterData;
if(0 != lpCharacterData)
{
if(!lpCharacterData->Login(this) ||
!m_lpCharacterDataMgr->AddByAccount(lpCharacterData))
{
delete lpCharacterData;
}
}
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if(nIDEvent == g_nTimerID_Network)
{
m_lpCharacterDataMgr->HandleEvents(100);
}
CFrameWnd::OnTimer(nIDEvent);
}
void CMainFrame::PostNcDestroy()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
KillTimer(g_nTimerID_Network);
CFrameWnd::PostNcDestroy();
}
void CMainFrame::OnCharNameChange()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
CChangeNameDlg nameDlg;
nameDlg.DoModal();
}

View File

@@ -0,0 +1,70 @@
// MainFrm.h : CMainFrame 클래스의 인터페이스
//
#pragma once
class CGuildManager;
class CCharacterDataMgr;
namespace ClientNet
{
class CSessionMgr;
}
class CMainFrame : public CFrameWnd
{
protected: // serialization에서만 만들어집니다.
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// 특성
private:
unsigned long m_dwLastPingTime;
CGuildManager* m_lpGuildManager;
CCharacterDataMgr* m_lpCharacterDataMgr;
//작업
public:
CGuildManager& GetGuildManager() { return *m_lpGuildManager; }
CCharacterDataMgr& GetCharacterDataMgr() { return *m_lpCharacterDataMgr; }
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
// 구현
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // 컨트롤 모음이 포함된 멤버입니다.
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
// 메시지 맵 함수를 생성했습니다.
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
afx_msg void OnFileNew();
afx_msg void OnTimer(UINT nIDEvent);
protected:
virtual void PostNcDestroy();
public:
afx_msg void OnCharNameChange();
};

View File

@@ -0,0 +1,14 @@
길드테스트 프로그램 ChangeLog
2004.10.16 22:51 - by Sparrowhawk
구조 개선 필요 -
CCharacterData가 LoginDlg및 CharacterSelectDlg를 가지도록 구조를 개선한다.
매개변수나 호출 함수에 따라서, 다이얼로그를 띄우거나, 함수로 값을 받도록 한다.
작업 상황 - 인증까지 완료. 다이얼로그쪽에서 호출하는 부분 및 캐릭터 선택부분 작업 필요
해야 할 부분 - 게임서버 핸들러 작성, 채팅서버 핸들러 작성, UDP핸들러 작성.
게임서버에 정상적인 로그인 과정을 거쳐 로그인할 수 있도록 함.

View File

@@ -0,0 +1,370 @@
// UnifiedCharSelect.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "DummyClient.h"
#include "UnifiedCharSelect.h"
#include "CharacterData.h"
#include <Network/Packet/PacketStruct/CharItemPacket.h>
#include <Network/ClientSocket/Send/SendAuthServer.h>
#include ".\unifiedcharselect.h"
#include "GMMemory.h"
// CUnifiedCharSelect 대화 상자입니다.
IMPLEMENT_DYNAMIC(CUnifiedCharSelect, CDialog)
CUnifiedCharSelect::CUnifiedCharSelect(CCharacterData& characterData, CWnd* pParent /*=NULL*/)
: CDialog(CUnifiedCharSelect::IDD, pParent), m_CharacterData(characterData)
, m_UnifiedPassword(_T(""))
, m_SelectedStore(_T(""))
, m_cSelectedStore(0)
{
memset(&m_UserInfo, 0, sizeof(USER_INFO));
memset(m_UnifiedStoreInfo, 0, sizeof(UnifiedStoreInfo) * PktUnifiedCharInfo::MAX_STORE_INFO);
memset(m_UnifiedCharData, 0, sizeof(UnifiedCharData) * PktUnifiedCharInfo::MAX_CHAR_DATA);
m_dwUnifiedStoreInfoNum = 0;
m_dwUnifiedCharDataNum = 0;
}
CUnifiedCharSelect::~CUnifiedCharSelect()
{
}
void CUnifiedCharSelect::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_UNIFIED_STORE_LIST, m_StoreInfoList);
DDX_Control(pDX, IDC_UNIFIED_CHAR_LIST, m_CharDataList);
DDX_Control(pDX, IDC_SELECTED_CHAR, m_SelectedCharList);
DDX_Text(pDX, IDC_UNIFIED_PASSWORD, m_UnifiedPassword);
DDX_Text(pDX, IDC_SELECTED_STORE, m_SelectedStore);
}
BEGIN_MESSAGE_MAP(CUnifiedCharSelect, CDialog)
ON_NOTIFY(NM_DBLCLK, IDC_UNIFIED_CHAR_LIST, OnNMDblclkUnifiedCharList)
ON_NOTIFY(NM_DBLCLK, IDC_UNIFIED_STORE_LIST, OnNMDblclkUnifiedStoreList)
ON_NOTIFY(NM_DBLCLK, IDC_SELECTED_CHAR, OnNMDblclkSelectedChar)
ON_WM_NCDESTROY()
END_MESSAGE_MAP()
// CUnifiedCharSelect 메시지 처리기입니다.
BOOL CUnifiedCharSelect::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
m_StoreInfoList.InsertColumn(0, "ServerGroupID", LVCFMT_LEFT, 100);
m_StoreInfoList.InsertColumn(1, "TabNum", LVCFMT_LEFT, 60);
m_StoreInfoList.InsertColumn(2, "Gold", LVCFMT_LEFT, 60);
m_CharDataList.InsertColumn(0, "CID", LVCFMT_LEFT, 80);
m_CharDataList.InsertColumn(1, "OldServerGroupID", LVCFMT_LEFT, 40);
m_CharDataList.InsertColumn(2, "Name", LVCFMT_LEFT, 120);
m_CharDataList.InsertColumn(3, "Class", LVCFMT_LEFT, 60);
m_CharDataList.InsertColumn(4, "Level", LVCFMT_LEFT, 60);
m_SelectedCharList.InsertColumn(0, "CID", LVCFMT_LEFT, 80);
m_SelectedCharList.InsertColumn(1, "Name", LVCFMT_LEFT, 120);
m_SelectedCharList.InsertColumn(2, "Class", LVCFMT_LEFT, 60);
m_SelectedCharList.InsertColumn(3, "Level", LVCFMT_LEFT, 60);
m_UnifiedPassword = m_CharacterData.GetPassword();
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CUnifiedCharSelect::SetData(USER_INFO& userInfo,
UnifiedStoreInfo* lpUnifiedStoreInfo, unsigned long dwUnifiedStoreInfoNum,
UnifiedCharData* lpUnifiedCharData, unsigned long dwUnifiedCharDataNum)
{
// 데이터를 넣고, 리스트에 추가하고, 화면을 갱신한다.
m_UserInfo = userInfo;
memcpy(m_UnifiedStoreInfo, lpUnifiedStoreInfo,
sizeof(UnifiedStoreInfo) * min(dwUnifiedStoreInfoNum, unsigned long(PktUnifiedCharInfo::MAX_STORE_INFO)));
memcpy(m_UnifiedCharData, lpUnifiedCharData,
sizeof(UnifiedCharData) * min(dwUnifiedCharDataNum, unsigned long(PktUnifiedCharInfo::MAX_CHAR_DATA)));
m_dwUnifiedStoreInfoNum = dwUnifiedStoreInfoNum;
m_dwUnifiedCharDataNum = dwUnifiedCharDataNum;
const int MAX_BUFFER = 1024;
char szTempBuffer[MAX_BUFFER];
// 리스트박스에 창고 데이터를 추가한다.
for(unsigned long dwCount = 0; dwCount < dwUnifiedStoreInfoNum; ++dwCount)
{
unsigned long dwTabFlagNum = 0;
if(m_UnifiedStoreInfo[dwCount].Flag & PktDepositUpdateDB::ITEM_TAB1) { ++dwTabFlagNum; }
if(m_UnifiedStoreInfo[dwCount].Flag & PktDepositUpdateDB::ITEM_TAB2) { ++dwTabFlagNum; }
if(m_UnifiedStoreInfo[dwCount].Flag & PktDepositUpdateDB::ITEM_TAB3) { ++dwTabFlagNum; }
if(m_UnifiedStoreInfo[dwCount].Flag & PktDepositUpdateDB::ITEM_TAB4) { ++dwTabFlagNum; }
m_StoreInfoList.InsertItem(dwCount, ultoa(m_UnifiedStoreInfo[dwCount].cOldServerGroupID, szTempBuffer, 10));
m_StoreInfoList.SetItemText(dwCount, 1, ultoa(dwTabFlagNum, szTempBuffer, 10));
m_StoreInfoList.SetItemText(dwCount, 2, ultoa(m_UnifiedStoreInfo[dwCount].Gold, szTempBuffer, 10));
}
// 리스트박스에 캐릭터 데이터를 추가한다.
unsigned long dwItemIndex = 0;
unsigned long dwSelectedItemIndex = 0;
for(unsigned long dwCount = 0; dwCount < dwUnifiedCharDataNum; ++dwCount)
{
unsigned long dwViewCount = 0;
for(; dwViewCount < USER_INFO::MAX_CHAR_NUM; ++dwViewCount)
{
if (0 != m_UserInfo.CharID[dwViewCount] &&
m_UnifiedCharData[dwCount].dwNewCID == m_UserInfo.CharID[dwViewCount])
{
m_SelectedCharList.InsertItem(dwSelectedItemIndex, ultoa(m_UnifiedCharData[dwCount].dwNewCID, szTempBuffer, 10));
m_SelectedCharList.SetItemText(dwSelectedItemIndex, 1, m_UnifiedCharData[dwCount].szName);
m_SelectedCharList.SetItemText(dwSelectedItemIndex, 2, ultoa(m_UnifiedCharData[dwCount].sClass, szTempBuffer, 10));
m_SelectedCharList.SetItemText(dwSelectedItemIndex, 3, ultoa(m_UnifiedCharData[dwCount].cLevel, szTempBuffer, 10));
dwViewCount += USER_INFO::MAX_CHAR_NUM;
++dwSelectedItemIndex;
}
}
if (dwViewCount == USER_INFO::MAX_CHAR_NUM)
{
m_CharDataList.InsertItem(dwItemIndex, ultoa(m_UnifiedCharData[dwCount].dwNewCID, szTempBuffer, 10));
m_CharDataList.SetItemText(dwItemIndex, 1, ultoa(m_UnifiedCharData[dwCount].cOldServerGroupID, szTempBuffer, 10));
m_CharDataList.SetItemText(dwItemIndex, 2, m_UnifiedCharData[dwCount].szName);
m_CharDataList.SetItemText(dwItemIndex, 3, ultoa(m_UnifiedCharData[dwCount].sClass, szTempBuffer, 10));
m_CharDataList.SetItemText(dwItemIndex, 4, ultoa(m_UnifiedCharData[dwCount].cLevel, szTempBuffer, 10));
++dwItemIndex;
}
}
const char* szWindowText = "Unknown";
switch(m_CharacterData.GetAgentServerType())
{
case UnifiedConst::Part2Unified:
szWindowText = "파트2 통합서버(한국)";
break;
case UnifiedConst::Part2Selectable:
szWindowText = "파트2 통합서버(중국)";
break;
}
SetWindowText(szWindowText);
}
bool CUnifiedCharSelect::HasUserInfo(unsigned long dwCID)
{
for(int nViewCount = 0; nViewCount < USER_INFO::MAX_CHAR_NUM; ++nViewCount)
{
if(m_UserInfo.CharID[nViewCount] == dwCID)
{
return true;
}
}
return false;
}
void CUnifiedCharSelect::OnOK()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
UpdateData(true);
unsigned long ardwCID[USER_INFO::MAX_CHAR_NUM];
unsigned long ardwViewCID[USER_INFO::MAX_CHAR_NUM];
memset(ardwCID, 0, sizeof(unsigned long) * USER_INFO::MAX_CHAR_NUM);
memset(ardwViewCID, 0, sizeof(unsigned long) * USER_INFO::MAX_CHAR_NUM);
if(UnifiedConst::Part2Unified == m_CharacterData.GetAgentServerType())
{
for(int nViewCount = 0; nViewCount < USER_INFO::MAX_CHAR_NUM; ++nViewCount)
{
ardwViewCID[nViewCount] = m_UserInfo.CharID[nViewCount];
}
CString szCID;
char* lpStopPos = 0;
int nMaxCount = m_SelectedCharList.GetItemCount();
for (int nCount = 0; nCount < nMaxCount; ++nCount)
{
szCID = m_SelectedCharList.GetItemText(nCount, 0);
for(int nViewCount = 0; nViewCount < USER_INFO::MAX_CHAR_NUM; ++nViewCount)
{
unsigned long dwCID = strtoul(szCID, &lpStopPos, 10);
if(0 == m_UserInfo.CharID[nViewCount] && !HasUserInfo(dwCID))
{
m_UserInfo.CharID[nViewCount] = ardwCID[nViewCount] = dwCID;
nViewCount = USER_INFO::MAX_CHAR_NUM;
}
}
}
unsigned char cSelectedNation = 0 ;
SendPacket::UnifiedCharSelect(&m_CharacterData.GetClientSocket().GetHandler(ClientSocket::AuthEventHandler),
m_UnifiedPassword, ardwCID, USER_INFO::MAX_CHAR_NUM, m_cSelectedStore, cSelectedNation);
CDialog::OnOK();
}
else if(UnifiedConst::Part2Selectable == m_CharacterData.GetAgentServerType() && 0 != m_cSelectedStore)
{
/*
SendPacket::UnifiedCharSelect(m_CharacterData.GetClientSocket().GetSession(
ClientSocket::AuthEventHandler), m_UnifiedPassword, ardwCID,
USER_INFO::MAX_CHAR_NUM, m_cSelectedStore);
*/
CDialog::OnOK();
}
}
void CUnifiedCharSelect::OnNMDblclkUnifiedCharList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
// 이미 선택한 캐릭터가 아니면, 선택 추가한다.
if(NM_DBLCLK == pNMHDR->code && m_SelectedCharList.GetItemCount() < USER_INFO::MAX_CHAR_NUM)
{
POSITION pos = m_CharDataList.GetFirstSelectedItemPosition();
if (pos != NULL)
{
UpdateData(true);
int nItem = m_CharDataList.GetNextSelectedItem(pos);
CString szCID = m_CharDataList.GetItemText(nItem, 0);
char* stopPtr = 0;
unsigned long dwCharDataCID = strtoul(szCID, &stopPtr, 10);
int nMaxCount = m_SelectedCharList.GetItemCount();
for (int nCount = 0; nCount < nMaxCount; ++nCount)
{
szCID = m_SelectedCharList.GetItemText(nCount, 0);
if(dwCharDataCID == strtoul(szCID, &stopPtr, 10))
{
break;
}
}
if (nCount == nMaxCount)
{
m_SelectedCharList.InsertItem(nMaxCount, m_CharDataList.GetItemText(nItem, 0));
m_SelectedCharList.SetItemText(nMaxCount, 1, m_CharDataList.GetItemText(nItem, 2));
m_SelectedCharList.SetItemText(nMaxCount, 2, m_CharDataList.GetItemText(nItem, 3));
m_SelectedCharList.SetItemText(nMaxCount, 3, m_CharDataList.GetItemText(nItem, 4));
UpdateData(false);
}
}
}
}
void CUnifiedCharSelect::OnNMDblclkUnifiedStoreList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
if(NM_DBLCLK == pNMHDR->code)
{
POSITION pos = m_StoreInfoList.GetFirstSelectedItemPosition();
if (pos != NULL)
{
UpdateData(true);
int nItem = m_StoreInfoList.GetNextSelectedItem(pos);
CString szStoreID = m_StoreInfoList.GetItemText(nItem, 0);
m_SelectedStore.Format("Selected Store : %s", szStoreID);
m_cSelectedStore = atoi(szStoreID);
UpdateData(false);
}
}
}
void CUnifiedCharSelect::OnNMDblclkSelectedChar(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
// 이미 선택한 캐릭터가 아니면 목록에서 삭제한다.
if(NM_DBLCLK == pNMHDR->code && UnifiedConst::Part2Unified == m_CharacterData.GetAgentServerType())
{
POSITION pos = m_SelectedCharList.GetFirstSelectedItemPosition();
if (pos != NULL)
{
UpdateData(true);
int nItem = m_SelectedCharList.GetNextSelectedItem(pos);
CString szCID = m_SelectedCharList.GetItemText(nItem, 0);
char* stopPtr = 0;
unsigned long dwCID = strtoul(szCID, &stopPtr, 10);
for(unsigned long dwCount = 0; dwCount < USER_INFO::MAX_CHAR_NUM; ++dwCount)
{
if (0 != m_UserInfo.CharID[dwCount] && dwCID == m_UserInfo.CharID[dwCount])
{
break;
}
}
if (dwCount == USER_INFO::MAX_CHAR_NUM)
{
m_SelectedCharList.DeleteItem(nItem);
UpdateData(false);
}
}
}
}
void CUnifiedCharSelect::OnNcDestroy()
{
CDialog::OnNcDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
delete this;
}
CUnifiedCharSelect* CUnifiedCharSelect::CreateUnifiedCharSelect(CCharacterData& characterData, CWnd* pParentWnd)
{
#include "GMUndefNew.h"
CUnifiedCharSelect* lpUnifiedCharSelect =
new CUnifiedCharSelect(characterData, pParentWnd);
#include "GMRedefNew.h"
if(0 != lpUnifiedCharSelect)
{
lpUnifiedCharSelect->Create(IDD, AfxGetMainWnd());
}
return lpUnifiedCharSelect;
}

View File

@@ -0,0 +1,69 @@
#pragma once
#include <DB/DBDefine.h>
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
#include "afxcmn.h"
// CUnifiedCharSelect 대화 상자입니다.
class CCharacterData;
class CUnifiedCharSelect : public CDialog
{
DECLARE_DYNAMIC(CUnifiedCharSelect)
public:
// 대화 상자 데이터입니다.
enum { IDD = IDD_UNIFIED_CHAR_SELECT };
static CUnifiedCharSelect* CreateUnifiedCharSelect(CCharacterData& characterData, CWnd* pParentWnd = NULL);
void SetData(USER_INFO& userInfo,
UnifiedStoreInfo* lpUnifiedStoreInfo, unsigned long dwUnifiedStoreInfoNum,
UnifiedCharData* lpUnifiedCharData, unsigned long dwUnifiedCharDataNum);
protected:
CUnifiedCharSelect(CCharacterData& characterData, CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CUnifiedCharSelect();
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
private:
bool HasUserInfo(unsigned long dwCID);
USER_INFO m_UserInfo;
UnifiedStoreInfo m_UnifiedStoreInfo[PktUnifiedCharInfo::MAX_STORE_INFO];
UnifiedCharData m_UnifiedCharData[PktUnifiedCharInfo::MAX_CHAR_DATA];
unsigned long m_dwUnifiedStoreInfoNum;
unsigned long m_dwUnifiedCharDataNum;
CListCtrl m_StoreInfoList;
CListCtrl m_CharDataList;
CListCtrl m_SelectedCharList;
CString m_UnifiedPassword;
CString m_SelectedStore;
CCharacterData& m_CharacterData;
unsigned char m_cSelectedStore;
protected:
virtual void OnOK();
public:
virtual BOOL OnInitDialog();
afx_msg void OnNMDblclkUnifiedCharList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclkUnifiedStoreList(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclkSelectedChar(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNcDestroy();
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.DummyClient"
type="win32"
/>
<description>여기에 응용 프로그램 설명을 추가합니다.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

View File

@@ -0,0 +1,13 @@
//
// DummyClient.RC2 - resources Microsoft Visual C++에서 직접 편집하지 않는 리소스
//
#ifdef APSTUDIO_INVOKED
#error 이 파일은 Microsoft Visual C++에서 편집할 수 없습니다.
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// 여기에 수동으로 편집한 리소스를 추가합니다.
/////////////////////////////////////////////////////////////////////////////

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,88 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by DummyClient.rc
//
#define IDD_ABOUTBOX 100
#define IDP_OLE_INIT_FAILED 100
#define IDD_DummyClient_FORM 101
#define IDR_MAINFRAME 128
#define IDR_DummyClientTYPE 129
#define IDD_DLG_LOGIN 131
#define IDD_DLG_CHARSELECT 132
#define IDD_UNIFIED_CHAR_SELECT 135
#define IDD_CHANGE_NAME 136
#define IDC_EDT_LOGIN 1000
#define IDC_EDT_PASSWORD 1001
#define ID_BTN_LOGIN 1002
#define ID_BTN_EXIT 1003
#define IDC_CTRL_CHARSELECT 1004
#define IDC_EDT_LOGIN2 1006
#define IDC_EDT_LOGIN3 1007
#define IDC_GUILDINFOSORT_COMBO 1010
#define IDC_GUILDINFO_LISTCTRL 1011
#define IDC_SPIN1 1012
#define IDC_BUTTON1 1013
#define IDC_BTN_FIND 1013
#define IDC_BUTTON2 1014
#define IDC_BTN_APPLY 1014
#define IDC_BUTTON3 1015
#define IDC_BTN_CREST 1015
#define IDC_BUTTON4 1016
#define IDC_BTN_LEV 1016
#define IDC_EDIT1 1017
#define IDC_EDT_NAME 1017
#define IDC_NEW_NAME 1017
#define IDC_EDIT2 1018
#define IDC_EDT_CREST 1018
#define IDC_SELECTED_STORE 1018
#define IDC_EDIT3 1019
#define IDC_EDT_MASTER 1019
#define IDC_OLD_NAME 1019
#define IDC_EDIT4 1020
#define IDC_EDT_REP 1020
#define IDC_EDIT5 1021
#define IDC_EDT_TEND 1021
#define IDC_EDIT6 1022
#define IDC_EDT_POL 1022
#define IDC_EDIT7 1023
#define IDC_EDT_LEV 1023
#define IDC_EDIT9 1025
#define IDC_EDT_BALANCE 1025
#define IDC_BUTTON5 1026
#define IDC_BTN_WITHDRAW 1026
#define IDC_BUTTON6 1027
#define IDC_BTN_DEPOSIT 1027
#define IDC_BUTTON7 1028
#define IDC_BTN_DETAILS 1028
#define IDC_BUTTON8 1029
#define IDC_BTN_RELEASE 1029
#define IDC_EDIT10 1030
#define IDC_EDT_FAME 1030
#define IDC_PASSWORD 1030
#define IDC_UNIFIED_PASSWORD 1030
#define IDC_GUILDMBRSORT_COMBO 1031
#define IDC_LIST2 1032
#define IDC_GUILDMBR_LISTCTRL 1032
#define IDC_UNIFIED_CHAR_LIST 1032
#define IDC_EDIT11 1033
#define IDC_EDT_GOLD 1033
#define IDC_EDIT12 1034
#define IDC_EDT_LOCATION 1034
#define IDC_IPADDRESS1 1035
#define IDC_BTN_REFLUSH 1037
#define IDC_BUTTON10 1038
#define IDC_BTN_CREATE 1038
#define IDC_UNIFIED_STORE_LIST 1039
#define IDC_SELECTED_CHAR 1040
#define ID_CHAR_NAME_CHANGE 32772
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 137
#define _APS_NEXT_COMMAND_VALUE 32773
#define _APS_NEXT_CONTROL_VALUE 1041
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -0,0 +1,7 @@
// stdafx.cpp : 표준 포함 파일을 포함하는 소스 파일입니다.
// DummyClient.pch는 미리 컴파일된 헤더가 됩니다.
// stdafx.obj는 미리 컴파일된 형식 정보를 포함합니다.
#include "stdafx.h"

View File

@@ -0,0 +1,42 @@
// stdafx.h : 잘 변경되지 않고 자주 사용하는
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
// 들어 있는 포함 파일입니다.
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // Windows 헤더에서 거의 사용되지 않는 내용을 제외시킵니다.
#endif
// 아래 지정된 플랫폼보다 우선하는 플랫폼을 대상으로 하는 경우 다음 정의를 수정하십시오.
// 다른 플랫폼에 사용되는 해당 값의 최신 정보는 MSDN을 참조하십시오.
#ifndef WINVER // Windows 95 및 Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define WINVER 0x0400 // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_WINNT // Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINNT 0x0400 // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_WINDOWS // Windows 98 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINDOWS 0x0410 // Windows Me 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_IE // IE 4.0 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_IE 0x0400 // IE 5.0 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소
#include <afxext.h> // MFC 익스텐션
#include <afxdisp.h> // MFC 자동화 클래스
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원
#endif // _AFX_NO_AFXCMN_SUPPORT

View File

@@ -0,0 +1,75 @@
#include "stdafx.h"
#include "CastleBlessMgr.h"
#include <Castle/CastleConstants.h>
#include "GMMemory.h"
using namespace Castle;
CCastleBlessMgr::sCastleBlessInfo CCastleBlessMgr::m_CastleBlessInfo[ MAX_BLESS_INFO_NUM ] =
{
sCastleBlessInfo(0, 0, 5, 320.0f, Castle::TITLE_NEW),
sCastleBlessInfo(1, 1, 10, 320.0f, Castle::TITLE_NEW),
sCastleBlessInfo(2, 1, 20, 400.0f, Castle::TITLE_SETTLED),
sCastleBlessInfo(3, 2, 30, 480.0f, Castle::TITLE_FLOURISHED),
sCastleBlessInfo(4, 2, 40, 560.0f, Castle::TITLE_HONORABLE),
sCastleBlessInfo(5, 3, 50, 640.0f, Castle::TITLE_GLORIOUS)
};
CCastleBlessMgr::CCastleBlessMgr()
{
Initialize();
}
CCastleBlessMgr::~CCastleBlessMgr()
{
Destroy();
}
CCastleBlessMgr& CCastleBlessMgr::GetInstance()
{
static CCastleBlessMgr ms_this;
return ms_this;
}
bool CCastleBlessMgr::Initialize()
{
return true;
}
void CCastleBlessMgr::Destroy()
{
}
unsigned char CCastleBlessMgr::GetTitle(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const
{
int iIndex = FindProperIndex(wGainTaxCount, cUpgradeStep);
return m_CastleBlessInfo[ iIndex ].m_cTitle;
}
unsigned char CCastleBlessMgr::GetBonusPercent(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const
{
int iIndex = FindProperIndex(wGainTaxCount, cUpgradeStep);
return m_CastleBlessInfo[ iIndex ].m_cBonusPercent;
}
float CCastleBlessMgr::GetBlessArea(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const
{
int iIndex = FindProperIndex(wGainTaxCount, cUpgradeStep);
return m_CastleBlessInfo[ iIndex ].m_fArea;
}
int CCastleBlessMgr::FindProperIndex(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const
{
int iIndex = 0;
for (; iIndex<MAX_BLESS_INFO_NUM; ++iIndex)
{
if (m_CastleBlessInfo[ iIndex ].m_wGainTaxCount > wGainTaxCount ||
m_CastleBlessInfo[ iIndex ].m_cUpgradeStep > cUpgradeStep)
{
return (iIndex - 1);
}
}
return (iIndex - 1);
}

View File

@@ -0,0 +1,57 @@
#ifndef _CASTLE_BLESS_MANAGER_H_
#define _CASTLE_BLESS_MANAGER_H_
#pragma once
#define g_CastleBlessMgr Castle::CCastleBlessMgr::GetInstance()
#include <map>
namespace Castle
{
class CCastleBlessMgr
{
private:
enum Const
{
MAX_BLESS_INFO_NUM = 6
};
struct sCastleBlessInfo
{
unsigned short m_wGainTaxCount; // 세금 획득 횟수(임시 -> 누적) = 총 공성 횟수 / Castle::TEMP_TAX_GAIN_COUNT
unsigned char m_cUpgradeStep; // 필요 업그레이드
unsigned char m_cBonusPercent; // 증가 수확량
float m_fArea; // 영역(반경 m 단위)
unsigned char m_cTitle; // 칭호
sCastleBlessInfo(unsigned short wGainTaxCount, unsigned char cUpgradeStep, unsigned char cBonusPercent,
float fArea, unsigned char cTitle)
: m_wGainTaxCount(wGainTaxCount), m_cUpgradeStep(cUpgradeStep), m_cBonusPercent(cBonusPercent),
m_fArea(fArea), m_cTitle(cTitle)
{
}
};
public:
~CCastleBlessMgr();
static CCastleBlessMgr& GetInstance();
unsigned char GetTitle(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const;
unsigned char GetBonusPercent(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const;
float GetBlessArea(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const;
private:
CCastleBlessMgr();
int FindProperIndex(unsigned short wGainTaxCount, unsigned char cUpgradeStep) const;
bool Initialize();
void Destroy();
static sCastleBlessInfo m_CastleBlessInfo[ MAX_BLESS_INFO_NUM ] ;
};
}
#endif // _CASTLE_BLESS_MANAGER_H_

View File

@@ -0,0 +1,100 @@
#ifndef _CASTLE_CONSTANTS_H_
#define _CASTLE_CONSTANTS_H_
namespace Castle
{
enum Type
{
NONE = 0,
CASTLE = 1,
CAMP = 2
};
enum IndentifyBit
{
STATUE_BIT = 0x80000000, // 다크 카나번 석상 (몬스터 비트와 같다.)
CASTLE_BIT = 0x40000000, // 성
CAMP_BIT = 0x20000000, // 길드 요새
TOWN_BIT = 0x10000000, // 마을
SIEGE_BIT = 0x00FF0000, // 공성시간에 공성측 국가가 사용하는 임시 리스폰 포인트 비트
// CASTLE_BIT | SIEGE_BIT 로 사용!!
// ex) 0x40FF1001 : CastleNameID 가 1 이고 임시 리스폰 포인트 2번
CASTLE_NAME_BIT_SHIFT = 12 // 다른 채널에 성이 존재할수 있기 때문에 스크립트에 들어가는 성 ID 대신
// CASTLE_BIT | (CastleNameID << CASTLE_NAME_BIT_SHIFT) 의 값을 사용한다.
// ex) 0x40001000 : CastleNameID 가 1 이다.
};
enum TaxType
{
TRADE_TAX = 0, // 상점 구매/판매
REPAIR_TAX = 1, // 상점 수리
RESMELT_TAX = 2, // 대장장이 재련
CAMP_GOLD_TAX = 3, // 요새 Gold
CAMP_MINERAL_TAX = 4, // 요새 광물
MAX_TAX_TYPE = 5
};
enum TaxChangable
{
TAX_DISABLE = 0, // 세율 변경 불가능
TAX_ENABLE = 1 // 세율 변경 가능
};
enum MineralType
{
ACCUMULATED_MINERAL = 1, // 누적된 광물 아이템
TEMPORARY_MINERAL = 2, // 임시 보관된 광물 아이템
};
enum CastleName
{
TEMP_CASTLE_NAME_0 = 0,
TEMP_CASTLE_NAME_1 = 1,
TEMP_CASTLE_NAME_2 = 2,
TEMP_CASTLE_NAME_3 = 3,
TEMP_CASTLE_NAME_4 = 4,
MAX_CASTLE_NAME_NUM = 5,
MAX_CASTLE_NAME_LEN = 32
};
enum CastleTitle
{
TITLE_NEW = 0, // 칭호 '새로운'
TITLE_SETTLED = 1, // 칭호 '정착한'
TITLE_FLOURISHED = 2, // 칭호 '번창한'
TITLE_HONORABLE = 3, // 칭호 '명예로운'
TITLE_GLORIOUS = 4, // 칭호 '영광의'
MAX_TITLE_NUM = 5
};
enum Const
{
CASTLE_EXP_BONUS_RADIUS = 300, // 공성 경험치 보상 반경
MAX_CASTLE_NUM = 10,
MAX_CASTLE_MINERAL_NUM = 200,
MAX_CASTLE_OBJECT_NUM = 250,
MAX_TEMP_TAX_UPDATE_COUNT = 10,
MAX_TEMP_TAX_AMOUNT = 50000,
EMBLEM_UPGRADE_JEWEL_NUM = 90,
EMBLEM_UPGRADE_JEWEL_NUM_PER_POS = 10,
EMBLEM_UPGRADE_JEWEL_POS_NUM = 9,
FAME_FOR_CAPTURE_CASTLE = 10000, // 공성에서 성을 차지한 길드원들이 얻는 명성치
FAME_FOR_FRIENDLY_GUILD = 5000, // 공성에서 성을 차지한 우호길드의 길드원들이 얻는 명성치
INVINCIBLE_COUNT = 0, // 성주 변경시 주어지는 무적 공성 횟수 (0회)
TEMP_TAX_GAIN_COUNT = 1, // 임시 세금을 누적 세금으로 옮길시 필요한 공성 횟수 (1회)
DAY_END_TIME = 0 // 하루가 끝나는 시간 (밤 12시)
};
}
#endif // _CASTLE_CONSTANTS_H_

View File

@@ -0,0 +1,180 @@
#ifndef _GUILD_CONSTANTS_H_
#define _GUILD_CONSTANTS_H_
namespace Guild
{
enum Const
{
MAX_GUILD_NAME_LEN = 11, // 길드 이름의 최대 길이 (실제 길이)
MAX_GUILD_NAME_FOR_DB = 20, // 길드 이름의 최대 길이 (DB 저장용)
MAX_MEMBER_NAME_LEN = 16, // 길드원 이름의 최대 길이 (일반적인 캐릭터 이름의 최대 길이와 동일)
MAX_MARK_SIZE = 18 * 12 * 2 + 1, // 길드 마크 크기 (18 * 12 크기의 16비트 칼라의 BMP 파일, 첫 1바이트는 마크 존재 여부)
MAX_RIGHT_SIZE = 50, // 길드 권한 구조체 크기
MAX_MEMBER_NUM = 100, // 멤버 수가 가질 수 있는 최대 크기 (가입대기자 때문에 여유분을 더 둔다.)
MAX_RELATION_NUM = 255, // 우호/적대 관계 리스트의 최대 크기 (카운터 적대 신청때문에 여유분을 더 둔다.)
MAX_HOSTILITY_APPLY_NUM = 49, // 대상으로 받을수 있는 최대 적대 관계 수
MAX_HOSTILITY_NUM = 1, // 자신이 적대 선언할 수 있는 최대 수
MAX_ALERT_NUM = 1, // 자신이 경계 적대 선언할 수 있는 최대 수
MAX_LEVEL = 5, // 길드의 최대 레벨
CREATE_LEVEL = 30, // 길드 생성시 요구되는 최소 캐릭터 레벨
CREATE_LEVEL_FOR_CHINA = 15, // (중국용) 길드 생성시 요구되는 최소 캐릭터 레벨
SET_MARK_GOLD = 5000000, // 마크 변경시 필요한 금액
FAME_LEAVE_PENALTY = 1000, // 길드마스터의 승인 없이 탈퇴시 깎이는 명성
MAX_SMALL_NODE_NUM = 500, // 한번에 전송 가능한 길드 간략 정보의 최대 숫자
MEMBER_INFO_UPDATE_COUNT = 10, // 길드원 정보를 다른 서버에 업데이트하는 타이밍
DELETE_GUILD_MEMBER_NUM = 4, // 길드가 유지될 수 있는 최소 인원
MINUTES_PER_HOUR = 60,
// 해외의 요청을 수용하여 탈퇴 대기 시간이 없어졌습니다. (2005-06-13 by 로딘)
LEAVE_WAIT_TIME = 0, // 탈퇴 대기 기간 (단위 : 분)
LEAVE_WAIT_TIME_FOR_CHINA = 10080, // (중국용) 탈퇴 대기 기간 (단위 : 분)
DELETE_GUILD_LOGOUT_TIME = 43200, // 길드원이 로그인하지 않아 길드가 해체될 때까지의 기간 (단위 : 분)
MEMBER_NUM_DELETE_TIME = 1440, // 길드원이 DELETE_GUILD_MEMBER_NUM 미만이 된 후 길드 해체까지의 기간 (단위 : 분)
TRANFER_MASTER_TIME = 20160, // 오랫동안 접속하지 않은 길드마스터의 권한 양도 기간 (단위 : 분)
CHANGE_INCLINATION_TIME = 1440, // 길드 성향 변경 후 다시 변경할 수 있을 때까지의 기간 (단위 : 분)
RELATION_WAIT_TIME = 1440, // 관계 변경 대기 시간 (단위 : 분)
/*
// Test : 길드 테스트를 위한 시간
LEAVE_WAIT_TIME_FOR_CHINA = 10, // (중국용) 탈퇴 대기 기간 (단위 : 분)
DELETE_GUILD_LOGOUT_TIME = 30, // 길드원이 로그인하지 않아 길드가 해체될 때까지의 기간 (단위 : 분)
MEMBER_NUM_DELETE_TIME = 15, // 길드원이 DELETE_GUILD_MEMBER_NUM 미만이 된 후 길드 해체까지의 기간 (단위 : 분)
TRANFER_MASTER_TIME = 20, // 오랫동안 접속하지 않은 길드마스터의 권한 양도 기간 (단위 : 분)
CHANGE_INCLINATION_TIME = 10, // 길드 성향 변경 후 다시 변경할 수 있을 때까지의 기간 (단위 : 분)
RELATION_WAIT_TIME = 1, // 관계 변경 대기 시간 (단위 : 분)
*/
MEMBER_WAIT_BIT = 0x80000000, // 가입 대기자에게 마크를 달지못하게 하는 플래그
TIME_GUILD_POINT = 30, // 길드전 재정비 시간(분단위).
TACTICE_JON_LEVEL = 1, // 용병 가입 레벨.
TACTICS = 1, // 용병.
TACTICS_WAIT = 2, // 용병 가입 대기자.
};
enum Title
{
NONE = 0,
MASTER = 1, // 길드 마스터
MIDDLE_ADMIN = 2, // 중간 관리자
COMMON = 3, // 일반 길드원
LEAVE_WAIT = 4, // 탈퇴 대기자
JOIN_WAIT = 5, // 가입 대기자
MAX_TITLE = 6
};
enum MemberType
{
TYPE_MEMBER = 0, // 멤버
TYPE_TACTICS = 1 // 용병
};
enum GuildSort
{
GUILD_FAME = 0, // 순위(명성)
GUILD_NAME = 1, // 길드명
GUILD_HOSTILITY = 2, // 적대길드
GUILD_NEUTRALITY = 3, // 비적대길드
GUILD_MINE = 4, // 자신의 길드
GUILD_REQUEST = 5 // 길드 리스트 요청 (셀 로긴 등에 의한 무작위 정보 요청)
};
enum MemberSort
{
MEMBER_TITLE = 0, // 직위순
MEMBER_CLASS = 1, // 클래스별 소트
MEMBER_LEVEL = 2, // 레벨별 소트
MEMBER_FAME = 3, // 명성별 소트
MEMBER_NAME = 4, // 이름별 소트
MEMBER_GOLD = 5, // 소지금액별 소트
MEMBER_POSITION = 6, // 위치별 소트
MEMBER_JOIN_WAIT = 7, // 신청중인 플레이어
MEMBER_WAR_ON = 8, // 길드 전쟁 참여중인 멤버 (이름순으로 소트)
MEMBER_WAR_OFF = 9, // 길드 전쟁 불참중인 멤버 (이름순으로 소트)
TACTICS_JOIN_WAIT = 10, // 신청중인 용병 (높은 레벨 순)
TACTICS_ACTIVE = 11 // 활동중인 용병 (높은 레벨 순)
};
enum Relation
{
NEUTRALITY = 0, // 중립 관계
HOSTILITY = 1, // 적대
COUNTER_HOSTILITY = 2, // 카운터 적대
ALERT_HOSTILITY = 3, // 경계 적대
MINE = 4, // 자신의 길드
TARGET_NEUTRALITY = 5, // A->B적대를 하면 DB값이 1로 저장되고 이상태에서 피스를 선언하면
// 해당값이 5로 바뀐다. 5로 바뀐뒤에는 B길드가 적대선언삭제를 해주면
// 이때 DB에서 사라져 완전히 평화관계가 된다.
ALL_HOSTILITY = 6 // 모든 적대 관계
};
enum RelationActor
{
BY_MINE = 0, // 자신이 맺은 길드 관계
BY_TARGET = 1, // 대상으로부터 받은 길드 관계
MAX_RELATION_ACTOR = 2
};
// 중계 서버 전용
enum TimeUpdateType
{
// 수정시엔 CDBObject::UpdateGuildTime 함수를 주의
LAST_LOGOUT = 0, // 길드원이 마지막으로 로그아웃한 시각
MEMBER_NUM_DOWN = 1, // 길드원 수가 3인 이하가 된 시각
MASTER_LOGOUT = 2 // 마스터가 마지막으로 로그아웃한 시각
};
enum ErrType
{
S_SUCCESS = 0,
// CGuild::SetTitle 함수용
E_NOT_MEMBER = 1, // 길드원이 아님
E_DISSOLVE_GUILD = 2, // 길드 해체
E_NOT_CHANGE = 3, // 변경된 바 없음
E_DB_ERROR = 4, // DB 에러
E_NOT_TEMP_MASTER = 5 // 임시 마스터가 될 길드원이 없음
};
enum AddFameType
{
// CGuildDB::AddAllMemberFame, AddFriendGuildMemberFame, AddMemberFame 함수용
TYPE_VALUE = 0, // Fame 값을 그대로 더해준다.
TYPE_HALF = 1, // 명성치를 1/2로 만든다.
TYPE_QUARTER = 2 // 명성치를 1/4로 만든다.
};
// 게임 서버 전용
enum MemberInfoUpdateType
{
// CGuild::UpdateMemberInfo 함수 참조
TYPE_LEVEL = 0,
TYPE_CLASS = 1,
TYPE_FAME = 2,
TYPE_GOLD = 3,
TYPE_WARFLAG = 4
};
const unsigned char ms_aryMaxMemberNum[MAX_LEVEL] = { 10, 20, 30, 40, 50 };
const unsigned long ms_arySetLevelFame[MAX_LEVEL] = { 0, 1000, 3000, 5000, 10000 };
const unsigned long ms_arySetLevelFameForUSA[MAX_LEVEL] = { 0, 400, 2000, 5000, 10000 };
const unsigned long ms_arySetLevelGold[MAX_LEVEL] = { 1000000, 5000000, 10000000, 50000000, 100000000 };
const unsigned long ms_arySetLevelGoldForChina[MAX_LEVEL] = { 100000, 5000000, 10000000, 50000000, 100000000 };
};
#endif

View File

@@ -0,0 +1,78 @@
#ifndef _GUILD_STRUCTURE_H_
#define _GUILD_STRUCTURE_H_
#include <map>
#include <vector>
#include <Community/Guild/GuildConstants.h>
namespace Guild
{
// 전방 참조
class CGuild;
struct MemberListInfo
{
unsigned char m_cRank; // 서열 (한 길드내에선 유니크한 숫자. 길드마스터를 0으로 하여 순차적으로 구성)
unsigned char m_cTitle; // 직위 (Guild::Title의 상수를 참고)
unsigned char m_cLevel; // 레벨
unsigned char m_cClass; // 클래스
unsigned char m_cGuildWarFlag; // 길드전쟁 참여 플래그 (Creature::WarFlag의 상수를 참고)
MemberListInfo()
: m_cRank(0), m_cTitle(0), m_cLevel(0), m_cClass(0), m_cGuildWarFlag(0)
{ }
MemberListInfo(unsigned char cRank, unsigned char cTitle, unsigned char cLevel, unsigned char cClass, unsigned char cGuildWarFlag)
: m_cRank(cRank), m_cTitle(cTitle), m_cLevel(cLevel), m_cClass(cClass), m_cGuildWarFlag(cGuildWarFlag)
{ }
};
struct MemberDetailInfo
{
unsigned long m_dwFame;
unsigned long m_dwGold;
MemberDetailInfo()
: m_dwFame(0), m_dwGold(0)
{ }
MemberDetailInfo(unsigned long dwFame, unsigned long dwGold)
: m_dwFame(dwFame), m_dwGold(dwGold)
{ }
};
struct MemberInfo
{
// 변하지 않는 정보
unsigned long m_dwCID;
char m_strName[MAX_MEMBER_NAME_LEN];
// 따로 처리되는 정보
unsigned long m_dwServerID;
TIME m_LeaveGuildTime;
unsigned char m_cUpdateCount;
unsigned char m_cTactics;
// 가끔 변하는 정보 (변경될 때마다 업데이트)
MemberListInfo m_MemberListInfo;
// 자주 변하는 정보 (일정 횟수 이상 변경되면 업데이트)
MemberDetailInfo m_MemberDetailInfo;
MemberInfo()
: m_dwCID(0), m_dwServerID(0), m_cUpdateCount(0), m_cTactics(0), m_MemberListInfo(), m_MemberDetailInfo()
{
std::fill_n(m_strName, int(MAX_MEMBER_NAME_LEN), 0);
::memset(&m_LeaveGuildTime, 0, sizeof(TIME));
}
};
typedef std::map<unsigned long, CGuild *> GuildMap;
typedef std::map<std::string, CGuild *> GuildNameMap;
typedef std::vector<MemberInfo> MemberList;
typedef std::map<unsigned long, unsigned char> RelationMap; // <GID, cRelation>
};
#endif

View File

@@ -0,0 +1,668 @@
#include "stdafx.h"
#include <Creature/Character/CharacterStructure.h>
#include <Network/Packet/PacketStruct/CharStatusPacketStruct.h>
#include "CharacterClass.h"
#include "GMMemory.h"
// 홀수 레벨일 때 증가량을 기준으로 작성.
CClass ClassTable[CClass::MAX_CLASS] =
{
CClass(),
CClass(CClass::Fighter, CClass::Fighter, CClass::DEFAULT_CLASS, CClass::HUMAN, CClass::STR, 1, CClass::CON, 1, false),
CClass(CClass::Rogue, CClass::Rogue, CClass::DEFAULT_CLASS, CClass::HUMAN, CClass::DEX, 1, CClass::STR, 1, false),
CClass(CClass::Mage, CClass::Mage, CClass::DEFAULT_CLASS, CClass::HUMAN, CClass::INT, 1, CClass::DEX, 1, false),
CClass(CClass::Acolyte, CClass::Acolyte, CClass::DEFAULT_CLASS, CClass::HUMAN, CClass::WIS, 1, CClass::CON, 1, false),
CClass(CClass::Defender, CClass::Fighter, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::STR, 2, CClass::CON, 1, true),
CClass(CClass::Warrior, CClass::Fighter, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::STR, 2, CClass::CON, 1, false),
CClass(CClass::Assassin, CClass::Rogue, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::DEX, 2, CClass::STR, 1, false),
CClass(CClass::Archer, CClass::Rogue, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::DEX, 2, CClass::STR, 1, true),
CClass(CClass::Sorcerer, CClass::Mage, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::INT, 2, CClass::DEX, 1, false),
CClass(CClass::Enchanter, CClass::Mage, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::INT, 2, CClass::DEX, 1, true),
CClass(CClass::Priest, CClass::Acolyte, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::WIS, 2, CClass::CON, 1, true),
CClass(CClass::Cleric, CClass::Acolyte, CClass::JOB_CHANGE_1ST, CClass::HUMAN, CClass::WIS, 2, CClass::CON, 1, false),
CClass(),
CClass(),
CClass(),
CClass(),
CClass(CClass::Combatant, CClass::Combatant, CClass::DEFAULT_CLASS, CClass::AKHAN, CClass::STR, 1, CClass::NONE_STAT, 0, false),
CClass(CClass::Officiator, CClass::Officiator, CClass::DEFAULT_CLASS, CClass::AKHAN, CClass::DEX, 1, CClass::NONE_STAT, 0, false),
CClass(CClass::Templar, CClass::Combatant, CClass::JOB_CHANGE_1ST, CClass::AKHAN, CClass::STR, 2, CClass::CON, 1, true),
CClass(CClass::Attacker, CClass::Combatant, CClass::JOB_CHANGE_1ST, CClass::AKHAN, CClass::STR, 2, CClass::CON, 1, false),
CClass(CClass::Gunner, CClass::Combatant, CClass::JOB_CHANGE_1ST, CClass::AKHAN, CClass::DEX, 2, CClass::STR, 1, true),
CClass(CClass::RuneOff, CClass::Officiator, CClass::JOB_CHANGE_1ST, CClass::AKHAN, CClass::INT, 2, CClass::DEX, 1, false),
CClass(CClass::LifeOff, CClass::Officiator, CClass::JOB_CHANGE_1ST, CClass::AKHAN, CClass::WIS, 2, CClass::DEX, 1, false),
CClass(CClass::ShadowOff, CClass::Officiator, CClass::JOB_CHANGE_1ST, CClass::AKHAN, CClass::DEX, 2, CClass::STR, 1, false)
};
CClass::CClass(const JobType eJobType, const JobType ePrevJobType, const JobLevel eJobLevel, const RaceType eRace,
const CClass::StatusType eType1, const unsigned char cIncrement1,
const CClass::StatusType eType2, const unsigned char cIncrement2,
const bool bLevelSwap)
: m_eJobType(eJobType), m_ePrevJobType(ePrevJobType), m_eJobLevel(eJobLevel),
m_eRace(eRace), m_bLevelSwap(bLevelSwap)
{
m_eIncrementType[0] = eType1; m_eIncrementType[1] = eType2;
m_cIncrementValue[0] = cIncrement1; m_cIncrementValue[1] = cIncrement2;
}
CClass::CClass()
: m_eJobType(NONE_JOB), m_ePrevJobType(NONE_JOB),
m_eJobLevel(DEFAULT_CLASS), m_eRace(MAX_RACE), m_bLevelSwap(false)
{
m_eIncrementType[0] = NONE_STAT; m_eIncrementType[1] = NONE_STAT;
m_cIncrementValue[0] = 0; m_cIncrementValue[1] = 0;
}
void CClass::LevelUp(CHAR_INFOST* InfoSt)
{
unsigned char cIndex1 = m_bLevelSwap ? ((1 == InfoSt->Level % 2) ? 0 : 1) : 0;
unsigned char cIndex2 = m_bLevelSwap ? ((1 == InfoSt->Level % 2) ? 1 : 0) : 1;
IncrementByType(InfoSt, 0, cIndex1);
IncrementByType(InfoSt, 1, cIndex2);
if (AKHAN == GetRace(static_cast<unsigned char>(InfoSt->Class)))
{
if (JobLevel::JOB_CHANGE_1ST == GetJobLevel(static_cast<unsigned char>(InfoSt->Class)))
{
InfoSt->IP += 2;
}
}
else
{
InfoSt->IP += 2;
}
}
unsigned char CClass::GetRequiredIP(unsigned short usClass, unsigned char cType)
{
if (usClass >= MAX_CLASS || cType >= StatusType::MAX_TYPE) { return 0xFF; }
if (ClassTable[usClass].m_eJobLevel == JOB_CHANGE_1ST)
{
return (ClassTable[usClass].m_eIncrementType[0] == cType ||
ClassTable[usClass].m_eIncrementType[1] == cType) ? 2 : 1;
}
for (int nClassIndex = 0; nClassIndex < MAX_CLASS; nClassIndex++)
{
if (ClassTable[nClassIndex].m_eJobType == usClass)
{
if (ClassTable[nClassIndex].m_eIncrementType[0] == cType ||
ClassTable[nClassIndex].m_eIncrementType[1] == cType)
{
return 2;
}
}
}
return 1;
}
bool CClass::JobChange(CharacterDBData* DBData, unsigned char cClassType)
{
if (DBData->m_Info.Level < 10) { return false; }
switch (m_eJobLevel)
{
case DEFAULT_CLASS: return DowngradeClass(DBData, cClassType);
case JOB_CHANGE_1ST: return UpgradeClass(DBData, cClassType);
}
return false;
}
bool CClass::UpgradeClass(CharacterDBData* DBData, unsigned char cClassType)
{
if (DBData->m_Info.Class != ClassTable[cClassType].m_ePrevJobType ||
ClassTable[DBData->m_Info.Class].m_eJobLevel != DEFAULT_CLASS)
{
return false;
}
// 환원되는 IP 계산을 위한 임시 변수들
unsigned short StatusA = 0;
unsigned short StatusB = 0;
unsigned short StatusC = 0;
switch (cClassType)
{
// 인간
case Defender:
DBData->m_Info.STR += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f);
DBData->m_Info.CON += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f + 0.5f);
StatusA = DBData->m_Info.STR - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.CON - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.DEX + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Defender;
break;
case Warrior:
DBData->m_Info.STR += DBData->m_Info.Level - 1;
StatusA = DBData->m_Info.STR - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.CON - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.DEX + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Warrior;
break;
case Assassin:
DBData->m_Info.DEX += DBData->m_Info.Level - 1;
StatusA = DBData->m_Info.DEX - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.STR - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.CON + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Assassin;
break;
case Archer:
DBData->m_Info.DEX += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f);
DBData->m_Info.STR += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f + 0.5f);
StatusA = DBData->m_Info.DEX - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.STR - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.CON + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Archer;
break;
case Sorcerer:
DBData->m_Info.INT += DBData->m_Info.Level - 1;
StatusA = DBData->m_Info.INT - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.DEX - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.STR + DBData->m_Info.CON + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Sorcerer;
break;
case Enchanter:
DBData->m_Info.INT += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f);
DBData->m_Info.DEX += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f + 0.5f);
StatusA = DBData->m_Info.INT - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.DEX - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.STR + DBData->m_Info.CON + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Enchanter;
break;
case Priest:
DBData->m_Info.WIS += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f);
DBData->m_Info.CON += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f + 0.5f);
StatusA = DBData->m_Info.WIS - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.CON - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.STR + DBData->m_Info.DEX + DBData->m_Info.INT - 60;
DBData->m_Info.Class = Priest;
break;
case Cleric:
DBData->m_Info.WIS += DBData->m_Info.Level - 1;
StatusA = DBData->m_Info.WIS - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.CON - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.STR + DBData->m_Info.DEX + DBData->m_Info.INT - 60;
DBData->m_Info.Class = Cleric;
break;
// 아칸
case Templar:
DBData->m_Info.STR += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f + 0.5f);
DBData->m_Info.CON += static_cast<int>((DBData->m_Info.Level - 1) * 1.5f);
DBData->m_Info.IP += (DBData->m_Info.Level - 1) * 2;
StatusA = DBData->m_Info.STR - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.CON - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.DEX + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Templar;
break;
case Attacker:
DBData->m_Info.STR += DBData->m_Info.Level - 1;
DBData->m_Info.CON += DBData->m_Info.Level - 1;
DBData->m_Info.IP += (DBData->m_Info.Level - 1) * 2;
StatusA = DBData->m_Info.STR - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.CON - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.DEX + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Attacker;
break;
case Gunner:
DBData->m_Info.DEX += static_cast<int>((DBData->m_Info.Level - 1) * 1.5f);
DBData->m_Info.STR += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f + 0.5f);
DBData->m_Info.IP += (DBData->m_Info.Level - 1) * 2;
StatusA = DBData->m_Info.DEX - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.STR - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.CON + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = Gunner;
break;
case RuneOff:
DBData->m_Info.INT += (DBData->m_Info.Level - 1) * 2;
DBData->m_Info.IP += (DBData->m_Info.Level - 1) * 2;
StatusA = DBData->m_Info.INT - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.DEX - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.STR + DBData->m_Info.CON + DBData->m_Info.WIS - 60;
DBData->m_Info.Class = RuneOff;
break;
case LifeOff:
DBData->m_Info.WIS += (DBData->m_Info.Level - 1) * 2;
DBData->m_Info.IP += (DBData->m_Info.Level - 1) * 2;
StatusA = DBData->m_Info.WIS - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.DEX - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.STR + DBData->m_Info.CON + DBData->m_Info.INT - 60;
DBData->m_Info.Class = LifeOff;
break;
case ShadowOff:
DBData->m_Info.STR += DBData->m_Info.Level - 1;
DBData->m_Info.DEX += DBData->m_Info.Level - 1;
StatusA = DBData->m_Info.DEX - (20 + (DBData->m_Info.Level - 1) * 2);
StatusB = DBData->m_Info.STR - (20 + DBData->m_Info.Level - 1);
StatusC = DBData->m_Info.CON + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
/*
DBData->m_Info.STR += static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f);
DBData->m_Info.DEX += static_cast<int>((DBData->m_Info.Level - 1) / 2.0f);
DBData->m_Info.IP += (DBData->m_Info.Level - 1) * 2;
StatusA = DBData->m_Info.STR - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f));
StatusB = DBData->m_Info.DEX - (20 + static_cast<int>((DBData->m_Info.Level - 1) * 1.5f + 0.5f));
StatusC = DBData->m_Info.CON + DBData->m_Info.INT + DBData->m_Info.WIS - 60;
*/
DBData->m_Info.Class = ShadowOff;
break;
default:
return false;
}
DBData->m_Info.IP += 10 + (DBData->m_Info.Level - 1) * 2 - ((StatusA + StatusB) * 2 + StatusC) - DBData->m_Info.IP;
return true;
}
bool CClass::DowngradeClass(CharacterDBData* DBData, unsigned char cClassType)
{
// 현재는 거너만 가능하다.
if (Gunner != DBData->m_Info.Class) { return false; }
if (cClassType != ClassTable[DBData->m_Info.Class].m_ePrevJobType ||
ClassTable[DBData->m_Info.Class].m_eJobLevel != JOB_CHANGE_1ST)
{
return false;
}
// 레벨이 10% 감소한다.
DBData->m_Info.Level -= static_cast<char>(DBData->m_Info.Level * 0.1f);
DBData->m_Info.Level = max(DBData->m_Info.Level, 10);
DBData->m_Info.Exp = 0;
// 명성치가 0이 된다.
DBData->m_Info.Fame = 0;
// 스탯이 초기화된다.
switch (cClassType)
{
case Combatant:
DBData->m_Info.STR = 20 + DBData->m_Info.Level - 1;
DBData->m_Info.DEX = 20;
DBData->m_Info.CON = 20;
DBData->m_Info.INT = 20;
DBData->m_Info.WIS = 20;
DBData->m_Info.Class = Combatant;
DBData->m_Info.IP = 10;
break;
default: return false;
}
// 스킬, 퀵슬롯 초기화
DBData->m_Skill = SKILL::SKILL();
DBData->m_Quick = QUICK::QUICK();
return true;
}
bool CClass::InitializeClass(CharacterDBData* DBData, unsigned char cClassType)
{
if (ClassTable[cClassType].m_eJobLevel != DEFAULT_CLASS)
{
return false;
}
// 레벨이 10% 감소한다.
DBData->m_Info.Level = 1;
DBData->m_Info.Exp = 0;
// 명성치가 0이 된다.
DBData->m_Info.Fame = 0;
// 스탯이 초기화된다.
DBData->m_Info.STR = 20;
DBData->m_Info.DEX = 20;
DBData->m_Info.CON = 20;
DBData->m_Info.INT = 20;
DBData->m_Info.WIS = 20;
DBData->m_Info.IP = 10;
DBData->m_Info.Class = cClassType;
// 스킬, 퀵슬롯 초기화
DBData->m_Skill = SKILL::SKILL();
DBData->m_Quick = QUICK::QUICK();
return true;
}
bool CClass::CheckState(ChState& State, unsigned char cLevel)
{
unsigned short wTIP = State.m_wIP;
switch (m_eJobType)
{
case Fighter:
wTIP += (State.m_wSTR - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Rogue:
wTIP += (State.m_wSTR - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wDEX - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Mage:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Acolyte:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20 - (cLevel - 1)) * 2;
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Defender:
wTIP += (State.m_wSTR - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Warrior:
wTIP += (State.m_wSTR - 20 - (cLevel - 1) * 2) * 2;
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Assassin:
wTIP += (State.m_wSTR - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wDEX - 20 - (cLevel - 1) * 2) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Archer:
wTIP += (State.m_wSTR - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wDEX - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Sorcerer:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20 - (cLevel - 1) * 2) * 2;
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Enchanter:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Priest:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Cleric:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20 - (cLevel - 1) * 2) * 2;
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Combatant:
wTIP += (State.m_wSTR - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > 10) { return false; }
break;
case Officiator:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20 - (cLevel - 1)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > 10) { return false; }
break;
case Templar:
wTIP += (State.m_wSTR - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Attacker:
wTIP += (State.m_wSTR - 20 - (cLevel - 1) * 2) * 2;
wTIP += (State.m_wDEX - 20);
wTIP += (State.m_wCON - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case Gunner:
wTIP += (State.m_wSTR - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wDEX - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case RuneOff:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20 - (cLevel - 1) * 2) * 2;
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case LifeOff:
wTIP += (State.m_wSTR - 20);
wTIP += (State.m_wDEX - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20 - (cLevel - 1) * 2) * 2;
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
break;
case ShadowOff:
wTIP += (State.m_wSTR - 20 - (cLevel - 1) * 1) * 2;
wTIP += (State.m_wDEX - 20 - (cLevel - 1) * 2) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
/*
wTIP += (State.m_wSTR - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f + 0.5f)) * 2;
wTIP += (State.m_wDEX - 20 - static_cast<unsigned short>((cLevel - 1) * 1.5f)) * 2;
wTIP += (State.m_wCON - 20);
wTIP += (State.m_wINT - 20);
wTIP += (State.m_wWIS - 20);
if (wTIP > (10 + (cLevel - 1) * 2)) { return false; }
*/
break;
}
return true;
}
bool CClass::CheckMinState(ChState& State, unsigned char cLevel)
{
if (State.m_wSTR < GetMinState(StatusType::STR, cLevel)) { return false; }
if (State.m_wDEX < GetMinState(StatusType::DEX, cLevel)) { return false; }
if (State.m_wCON < GetMinState(StatusType::CON, cLevel)) { return false; }
if (State.m_wINT < GetMinState(StatusType::INT, cLevel)) { return false; }
if (State.m_wWIS < GetMinState(StatusType::WIS, cLevel)) { return false; }
return true;
}
unsigned short CClass::GetMinState(StatusType eType, unsigned char cLevel)
{
// 스탯 기본값
unsigned short wResult = 20;
cLevel = cLevel - 1;
if (eType == m_eIncrementType[0] || eType == m_eIncrementType[1])
{
// 레벨에 관계없이 똑같이 성장하는 경우
if (false == m_bLevelSwap)
{
if (eType == m_eIncrementType[0])
{
wResult += cLevel * m_cIncrementValue[0];
}
if (eType == m_eIncrementType[1])
{
wResult += cLevel * m_cIncrementValue[1];
}
}
// 레벨에 따라 스탯이 번갈아가며 성장하는 경우
else
{
if (eType == m_eIncrementType[0])
{
wResult += static_cast<unsigned short>(cLevel * 1.5f);
}
if (eType == m_eIncrementType[1])
{
wResult += static_cast<unsigned short>(cLevel * 1.5f + 0.5f);
}
}
}
return wResult;
}
CClass::JobLevel CClass::GetJobLevel(unsigned char cClass)
{
if (cClass >= MAX_CLASS) { return DEFAULT_CLASS; }
return ClassTable[cClass].m_eJobLevel;
}
unsigned char CClass::GetPreviousJob(unsigned char cClass)
{
if (cClass >= MAX_CLASS) { return NONE_JOB; }
return ClassTable[cClass].m_ePrevJobType;
}
CClass::RaceType CClass::GetRace(unsigned char cClass)
{
if (cClass >= MAX_CLASS) { return MAX_RACE; }
return ClassTable[cClass].m_eRace;
}

View File

@@ -0,0 +1,120 @@
#ifndef _CHARACTER_CLASS_H_
#define _CHARACTER_CLASS_H_
#include <DB/DBDefine.h>
// 전방 참조
struct CharacterDBData;
struct ChState;
class CClass
{
public:
enum JobType
{
NONE_JOB = 0,
// 인간 기본클래스
Fighter = 1, Rogue = 2,
Mage = 3, Acolyte = 4,
// 인간 1st클래스
Defender = 5, Warrior = 6,
Assassin = 7, Archer = 8,
Sorcerer = 9, Enchanter = 10,
Priest = 11, Cleric = 12,
// 아칸 기본클래스
Combatant = 17, Officiator = 18,
// 아칸 1st클래스
Templar = 19, Attacker = 20,
Gunner = 21, RuneOff = 22,
LifeOff = 23, ShadowOff = 24,
MAX_CLASS = 25
};
enum StatusType
{
NONE_STAT = 0,
STR = 1,
DEX = 2,
CON = 3,
INT = 4,
WIS = 5,
MAX_TYPE = 6
};
enum JobLevel
{
NONE_CLASS = 0,
DEFAULT_CLASS = 1,
JOB_CHANGE_1ST = 2
};
enum RaceType
{
HUMAN = 0,
AKHAN = 1,
MAX_RACE = 2
};
CClass(const JobType eJobType, const JobType ePrevJobType, const JobLevel eJobLevel, const RaceType eRace,
const StatusType eType1, const unsigned char cIncrement1,
const StatusType eType2, const unsigned char cIncrement2,
const bool bLevelSwap);
CClass();
void LevelUp(CHAR_INFOST* InfoSt);
bool JobChange(CharacterDBData* DBData, unsigned char cClassType);
bool UpgradeClass(CharacterDBData* DBData, unsigned char cClassType);
bool DowngradeClass(CharacterDBData* DBData, unsigned char cClassType);
bool InitializeClass(CharacterDBData* DBData, unsigned char cClassType); // 레벨 1의 기본 클래스로 만든다.
bool CheckState(ChState& State, unsigned char cLevel);
bool CheckMinState(ChState& State, unsigned char cLevel);
unsigned short GetMinState(StatusType eType, unsigned char cLevel);
static JobLevel GetJobLevel(unsigned char cClass);
static unsigned char GetPreviousJob(unsigned char cClass);
static unsigned char GetRequiredIP(unsigned short usClass, unsigned char cType);
static RaceType GetRace(unsigned char cClass);
protected:
StatusType m_eIncrementType[2]; // 성장시 추가 능력치 타입
unsigned char m_cIncrementValue[2]; // 성장시 추가 능력치 값
JobType m_eJobType; // 현재 직업
JobType m_ePrevJobType; // 바로 하위 클래스의 직업
JobLevel m_eJobLevel; // 현재 직업의 레벨
RaceType m_eRace; // 소속 종족
bool m_bLevelSwap; // 레벨에 따라 스탯이 번갈아가면서 성장함 (짝수 2/1 성장이면 홀수 1/2 성장)
inline void IncrementByType(CHAR_INFOST* InfoSt,
unsigned char cTypeIndex, unsigned char cIncrementIndex);
};
extern CClass ClassTable[CClass::MAX_CLASS];
inline void CClass::IncrementByType(CHAR_INFOST* InfoSt,
unsigned char cTypeIndex, unsigned char cIncrementIndex)
{
switch(m_eIncrementType[cTypeIndex]) {
case StatusType::STR: InfoSt->STR += m_cIncrementValue[cIncrementIndex]; break;
case StatusType::DEX: InfoSt->DEX += m_cIncrementValue[cIncrementIndex]; break;
case StatusType::CON: InfoSt->CON += m_cIncrementValue[cIncrementIndex]; break;
case StatusType::INT: InfoSt->INT += m_cIncrementValue[cIncrementIndex]; break;
case StatusType::WIS: InfoSt->WIS += m_cIncrementValue[cIncrementIndex]; break;
}
}
#endif

View File

@@ -0,0 +1,11 @@
#include "stdafx.h"
#include "CharacterStructure.h"
#include "GMMemory.h"
CharacterFightInfo::CharacterFightInfo()
: m_pDuelOpponent(NULL)
{
}

View File

@@ -0,0 +1,50 @@
#ifndef _CHARACTER_STRUCTURE_H_
#define _CHARACTER_STRUCTURE_H_
#include <Creature/CreatureStructure.h>
// 전방 참조
class CCharacter;
// -----------------------------------------------------------------------
// DB 에서 처음에 읽어 오는 데이터들. 중간중간 저장해서 DB에 갱신함.
// 되도록이면 게임 처리중에는 건드리지 않는다. ( 레벨업 등등을 제외하고 ... )
struct CharacterDBData
{
CHAR_INFOST m_Info; // 외모, 이름, 능력치, hp,mp 등 기본 정보
CHAR_POS m_Pos; // 종료시 위치 정보, 저장된 위치 정보 ( Respawn 장소 )
SKILL m_Skill;
QUICK m_Quick;
SPELL m_Spell;
unsigned char m_cAdminLevel;
};
typedef CharacterDBData* LPCharacterDBData;
// 유저 접속 정보. 유저의 IP를 넣음.
struct ConnectInfo
{
SOCKADDR_IN m_siAgentHost; // agent UDP address of host
SOCKADDR_IN m_siPrivateHost; // private UDP address of host
SOCKADDR_IN m_siPublicHost; // public UDP address of host
};
typedef ConnectInfo* LPConnectInfo;
// 캐릭터끼리의 전투 정보 (듀얼, 전투)
struct CharacterFightInfo
{
CCharacter* m_pDuelOpponent;
POS m_Pos;
unsigned long m_dwCellID;
__int64 m_nRestoreExp; // 스킬 리저렉션을 통해 부활할 경우 일정량의 경험치가 복구될 수 있다.
CharacterFightInfo();
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,535 @@
#ifndef _CREATURE_STRUCTURE_H_
#define _CREATURE_STRUCTURE_H_
#include <winsock2.h>
#include <windows.h>
#include <cmath>
#include <DB/DBDefine.h>
// 전방 참조
struct CreatureStatus;
struct CharacterStatus;
struct SKILL;
namespace Item
{
class CItem;
class CEquipment;
namespace EquipType
{
enum DoubleSwordType;
}
}
namespace BattleInclination
{
enum Const
{
IS_PEACEMODE = ( 1 << 0 ), // 평화모드인 경우 세팅
IS_SAFETY_ZONE = ( 1 << 1 ), // 세이프티 존 내부에 있는 경우 세팅
HAS_CAMP = ( 1 << 2 ), // 길드 요새를 가진 길드에 속해 있을 경우 세팅
HAS_DEVELOPING_CAMP = ( 1 << 3 ), // 건설중인 길드 요새를 가진 길드에 속해 있을 경우 세팅
IS_CASTLE_OBJECT = ( 1 << 4 ), // 공성 Object이면서 수성병기인 경우만 세팅
IS_CASTLE_NPC = ( 1 << 5 ), // 공성 Object이면서 수성 병기의 병기 관리 NPC 와 뒷문 NPC
IS_GOD_MODE = ( 1 << 6 ), // G모드인 경우 세팅
IS_TEAM_BATTLE = ( 1 << 7 ), // 팀배틀 중인 경우 세팅
};
enum VSType
{
VS_CHARACTER = ( 1 << 0 ), // PvP
VS_PARTY = ( 1 << 1 ), // 파티간 배틀
VS_GUILD = ( 1 << 2 ), // 길드간 배틀
};
// 피아식별시 주체가 되는 캐릭터 정보
// 여기서 데이터 추가하거나 삭제하는 경우,
// 브로드캐스팅 시, 채팅서버로 데이터 전송하는 부분도 수정해야한다.
struct CharData
{
bool IsPeaceMode(void) const { return 0 != (m_cFlags & IS_PEACEMODE); } // 평화모드인 경우
bool IsSafetyZone(void) const { return 0 != (m_cFlags & IS_SAFETY_ZONE); } // 내가 Safety존 내부에 있는지
bool HasCamp(void) const { return 0 != (m_cFlags & HAS_CAMP); } // 속한 길드가 길드 요새를 가지고 있는지...
bool HasDevelopingCamp(void) const { return 0 != (m_cFlags & HAS_DEVELOPING_CAMP); } // 속한 길드가 길드 요새를 건설중인지...
bool IsCastleObject(void) const { return 0 != (m_cFlags & IS_CASTLE_OBJECT); } // 공성병기인 경우, 수성병기인지...
bool IsCastleNPC(void) const { return 0 != (m_cFlags & IS_CASTLE_NPC); } // 수성 NPC 인 경우
bool IsGODMode(void) const { return 0 != (m_cFlags & IS_GOD_MODE); } // G모드인 경우
bool IsTeamBattle(void) const { return 0 != (m_cFlags & IS_TEAM_BATTLE); } // 팀배틀 중인 경우
void SetPeaceMode(bool bPeaceMode) { m_cFlags |= bPeaceMode ? IS_PEACEMODE : 0; }
void SetSafetyZone(bool bInSafetyZone) { m_cFlags |= bInSafetyZone ? IS_SAFETY_ZONE : 0; }
void SetHasCamp(bool bHasCamp) { m_cFlags |= bHasCamp ? HAS_CAMP : 0; }
void SetHasDevelopingCamp(bool bHasDevelopingCamp) { m_cFlags |= bHasDevelopingCamp ? HAS_DEVELOPING_CAMP : 0; }
void SetCastleObject(bool bCastleObject) { m_cFlags |= bCastleObject ? IS_CASTLE_OBJECT : 0; }
void SetCastleNPC(bool bCastleNPC) { m_cFlags |= bCastleNPC ? IS_CASTLE_NPC : 0; }
void SetGODMode(bool bGODMode) { m_cFlags |= bGODMode ? IS_GOD_MODE : 0; }
void SetTeamBattle(bool bTeamBattle) { m_cFlags |= bTeamBattle ? IS_TEAM_BATTLE : 0; }
unsigned long m_dwCID; // 캐릭터 CID
unsigned long m_dwGID; // 캐릭터 GID
unsigned long m_dwCastleID; // 공성 병기인 경우, 속한 성의 ID를 넣는다.
unsigned char m_cSiegeState; // 공성 병기인 경우, 공성 병기 상태를 넣는다.
unsigned char m_cNation; // 캐릭터 국적
unsigned char m_cAdminLevel; // 운영자 레벨
unsigned char m_cFlags; // 기타 정보
unsigned long m_dwPID; // 캐릭터에 파티 정보
unsigned char m_cTacticsFlag; // 캐릭터에 용병 정보
unsigned char m_cRealmWarFlag;
unsigned char m_cGuildWarFlag;
unsigned char m_cCreatureType; // 크리쳐 타입
unsigned short m_wObjectType; // 스트럭쳐 정보
unsigned short m_wKind; // 스트럭쳐 종류
unsigned char m_cRide; // 병기에 탑승 여부.
};
// 피아식별시 쓰이는 캐릭터간의 관계 (일단은 채팅 서버까진 갈 필요 없는 정보로 구성)
struct RelationData
{
unsigned char m_cVSFlag; // PvP, 팀배틀 정보
bool m_bHostileGuild; // 적대 길드인가?
};
};
namespace Creature
{
enum Const
{
PC_MAX_LEVEL = 100, // 캐릭터 최대 레벨
MONSTER_MAX_LEVEL = 150, // 몬스터 최대 레벨
// edith 2008.02.27 길드 가입 제한제외
LEVEL_ABLE_WAR = 1 // 전쟁이 가능한 최소 레벨 (길드 가입/전쟁 모드 제한)
};
enum IdentifyCIDBit
{
MONSTER_KIND_BIT = 0x0000FFFF,
MONSTER_BIT = 0x80000000,
NPC_BIT = 0x40000000,
SIEGE_OBJECT_BIT = 0x10000000,
SUMMON_MONSTER_BIT = 0xA0000000, // MONSTER_BIT (0x80000000) + 0x20000000
NPC_LINK_BIT = 0x50000000, // 소환 완료된 석상의 경우 이 비트가 세트된 NPC와 링크되어 메달상점의 역할을 한다.
// NPC_BIT (0x40000000) + 0x10000000
// 석상 KID (MonsterStructure.h 에도 정의되어 있음)
MIN_STATUE_KID = 4001,
MAX_STATUE_KID = 4070
};
enum CreatureType
{
CT_PC = 0,
CT_NPC = 1,
CT_MONSTER = 2,
CT_SUMMON = 3,
CT_STRUCT = 4,
CT_SIEGE_OBJECT = 5,
CT_NONE_TYPE = 99
};
enum Nation
{
STATELESS = 0, // 무국적 (몬스터, NPC)
KARTERANT = 1, // 카르테란트
MERKADIA = 2, // 메르카디아
ALMIGHTY_PIRATE = 3, // 신의해적단
MAX_NATION = 4
};
enum WarFlag
{
WAR_OFF = 0, // 전쟁 참여 안함
WAR_ON = 1, // 전쟁 참여
WAR_INSTANCE = 2 // 인스턴스 전쟁 참여
};
enum StatusType
{
RIGHT_PASSIVE_TYPE = 0, // 패시브 스킬이 적용된 오른손 장비 스탯 (기본값으로 CreatureStatus에 바로 사용된다.)
LEFT_PASSIVE_TYPE = 1, // 패시브 스킬이 적용된 왼손 장비 스탯 (이도류)
RIGHT_NON_PASSIVE_TYPE = 2, // 패시브 스킬이 적용되지 않은 오른손 장비 스탯 (오른손 무기를 사용하는 스킬)
LEFT_NON_PASSIVE_TYPE = 3, // 패시브 스킬이 적용되지 않은 왼손 장비 스탯 (왼손 무기(스킬암)를 사용하는 스킬)
MAX_STATUS_TYPE = 4
};
// 서버에서 사용하는 Creature 판별 함수들
// 클라이언트에서는 CRYLGameData::GetClientIdentity() 함수 사용!!
static bool IsSummonMonster(unsigned long dwCID)
{
return (Creature::SUMMON_MONSTER_BIT == (dwCID & Creature::SUMMON_MONSTER_BIT));
}
static bool IsStruct(unsigned long dwCID)
{
unsigned short wKID = static_cast<unsigned short>(dwCID & Creature::MONSTER_KIND_BIT);
return (wKID >= MIN_STATUE_KID && wKID <= MAX_STATUE_KID);
}
static bool IsLinkedNPC(unsigned long dwCID)
{
return (Creature::NPC_LINK_BIT == (dwCID & Creature::NPC_LINK_BIT));
}
static CreatureType GetCreatureType(unsigned long dwCID)
{
if (dwCID & Creature::MONSTER_BIT)
{
if (IsSummonMonster(dwCID)) return Creature::CT_SUMMON;
else if (IsStruct(dwCID)) return Creature::CT_STRUCT;
return Creature::CT_MONSTER;
}
else if (dwCID & Creature::NPC_BIT) return Creature::CT_NPC;
else if (dwCID & Creature::SIEGE_OBJECT_BIT) return Creature::CT_SIEGE_OBJECT;
return Creature::CT_PC;
}
inline static const char* GetNationName(unsigned char cNation)
{
switch(cNation)
{
case KARTERANT: return "KARTERANT";
case MERKADIA: return "MERKADIA";
case ALMIGHTY_PIRATE: return "ALMIGHTY_PIRATE";
}
return "STATELESS";
}
inline static const char* GetShortNationName(unsigned char cNation)
{
switch(cNation)
{
case KARTERANT: return "KR";
case MERKADIA: return "ME";
case ALMIGHTY_PIRATE: return "AP";
}
return "ST";
}
};
// 엘리트 보너스 정보
namespace EliteBonus
{
enum Const
{
MAX_BONUS_LEVEL = 10,
MAX_BONUS_DROP_ITEM = 3
};
// 엘리트 보너스에 의한 경험치/드랍률 보너스가 제거되었습니다. (2004-09-17 by 로딘)
static short usBonusExp[MAX_BONUS_LEVEL] = {
100 + 0,
100 + 0,
100 + 0,
100 + 0,
100 + 0,
100 + 0,
100 + 0,
100 + 0,
100 + 0,
100 + 0
};
static unsigned char usBonusItemDropRate[MAX_BONUS_LEVEL][MAX_BONUS_DROP_ITEM] = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
};
struct EliteBonusData
{
char m_cNation;
unsigned char m_cLevel;
EliteBonusData();
EliteBonusData(char cNation, unsigned char cLevel);
};
}
// 맵 이동 정보
struct Position
{
float m_fPointX; // Point X 좌표
float m_fPointY; // Point Y 좌표
float m_fPointZ; // Point Z 좌표
inline Position();
inline Position(const POS& Pos);
inline Position(const Position& Pos);
inline Position(float fPointX, float fPointY, float fPointZ);
inline POS PositionToPOS() const;
inline unsigned long GetDistance(const Position& rhs) const
{
return static_cast<unsigned long>(sqrt(
(m_fPointX - rhs.m_fPointX) * (m_fPointX - rhs.m_fPointX) +
(m_fPointY - rhs.m_fPointY) * (m_fPointY - rhs.m_fPointY) +
(m_fPointZ - rhs.m_fPointZ) * (m_fPointZ - rhs.m_fPointZ)));
}
inline unsigned long GetSquaredDistance(const Position& rhs) const
{
return static_cast<unsigned long>(
(m_fPointX - rhs.m_fPointX) * (m_fPointX - rhs.m_fPointX) +
(m_fPointY - rhs.m_fPointY) * (m_fPointY - rhs.m_fPointY) +
(m_fPointZ - rhs.m_fPointZ) * (m_fPointZ - rhs.m_fPointZ));
}
inline bool operator == (const Position& rhs) const
{
if ( m_fPointX == rhs.m_fPointX && m_fPointY == rhs.m_fPointY && m_fPointZ == rhs.m_fPointZ )
{
return true;
}
return false;
}
inline bool operator != (const Position& rhs) const
{
if ( m_fPointX != rhs.m_fPointX || m_fPointY != rhs.m_fPointY || m_fPointZ != rhs.m_fPointZ )
{
return true;
}
return false;
}
inline void operator () (const Position& rhs)
{
m_fPointX = rhs.m_fPointX;
m_fPointY = rhs.m_fPointY;
m_fPointZ = rhs.m_fPointZ;
}
};
inline Position::Position()
: m_fPointX(0.0f), m_fPointY(0.0f), m_fPointZ(0.0f) { }
inline Position::Position(const POS& Pos)
: m_fPointX(Pos.fPointX), m_fPointY(Pos.fPointY), m_fPointZ(Pos.fPointZ) { }
inline Position::Position(const Position& Pos)
: m_fPointX(Pos.m_fPointX), m_fPointY(Pos.m_fPointY), m_fPointZ(Pos.m_fPointZ) { }
inline Position::Position(float fPointX, float fPointY, float fPointZ)
: m_fPointX(fPointX), m_fPointY(fPointY), m_fPointZ(fPointZ) { }
inline POS Position::PositionToPOS() const
{
POS stPos;
stPos.fPointX = m_fPointX;
stPos.fPointY = m_fPointY;
stPos.fPointZ = m_fPointZ;
return stPos;
}
// 동작 정보
struct MotionInfo
{
float m_fDirection; // 바라보는 방향
float m_fVelocity; // 속도
unsigned short m_wAction; // 취하는 행동
unsigned long m_dwFrame; // 모션 프레임 ( 몬스터, NPC가 사용 )
MotionInfo();
};
// 인챈트 정보
struct EnchantInfo
{
enum
{
ULONG_BIT = 32, // unsigned long (32바이트)
MAX_ARRAY = 4 // 스펠의 종류는 UCHAR_BIT * MAX_ARRAY
};
unsigned long m_dwStatusFlag[MAX_ARRAY]; // 챈트/인챈트 플래그
EnchantInfo();
EnchantInfo( const EnchantInfo& Info ) // 대입을 위한 복사 생성자
{
for( int i = 0 ; i < MAX_ARRAY ; ++i )
{
m_dwStatusFlag[ i ] = Info.m_dwStatusFlag[ i ];
}
}
void SetFlag(unsigned char cSpellKind);
void ResetFlag(unsigned char cSpellKind);
void ClearFlag(void);
bool GetFlag(unsigned char cSpellKind) const;
};
// 데미지 계산시의 추가 효과 정보
struct CalculateDamageInfo
{
bool m_bForceDRC; // '참'이면 기본 DRC를 무시하고 추가 DRC로 대체
float m_fDRC; // 추가 DRC
short m_nOffenceRevision; // 추가 공격보정
short m_nMinDamage; // 추가 최소데미지
short m_nMaxDamage; // 추가 최대데미지
CalculateDamageInfo()
: m_bForceDRC(false), m_fDRC(0.0f), m_nOffenceRevision(0), m_nMinDamage(0), m_nMaxDamage(0)
{ }
CalculateDamageInfo(bool bForceDRC, float fDRC, short nOffenceRevision, short nMinDamage, short nMaxDamage)
: m_bForceDRC(bForceDRC), m_fDRC(fDRC),
m_nOffenceRevision(nOffenceRevision), m_nMinDamage(nMinDamage), m_nMaxDamage(nMaxDamage)
{ }
};
typedef CalculateDamageInfo* LPCalculateDamageInfo;
// 캐릭터에 대한 속성
struct CharacterStatus
{
short m_nSTR; // 캐릭터 STR
short m_nDEX; // 캐릭터 DEX
short m_nCON; // 캐릭터 CON
short m_nINT; // 캐릭터 INT
short m_nWIS; // 캐릭터 WIS
CharacterStatus();
CharacterStatus(CHAR_INFOST& characterDBData);
void Init(CHAR_INFOST& characterDBData);
};
typedef CharacterStatus* LPCharacterStatus;
struct FightStatus
{
// 계산 상태 (중복 계산 방지)
enum CalculateState
{
CS_NONE = 0, // 초기화
CS_BASE_INFO = 1, // 기본 스탯으로 계산을 완료한 상태
CS_EQUIP_INFO = 2, // 장비 효과를 추가 계산한 상태
CS_ENCHANT_INFO = 3 // 인챈트 효과를 받은 상태
};
enum Const
{
MAX_INCHANT_HP = 15000,
MAX_INCHANT_MP = 15000
};
long m_lMinDamage; // 최소데미지
long m_lMaxDamage; // 최대데미지
short m_wArmor; // 방어력
short m_wHitRate; // 명중
short m_wEvade; // 회피
unsigned short m_nMaxHP; // HP 최대값
short m_wHPRegen; // HP 회복
unsigned short m_nMaxMP; // MP 최대값
short m_wMPRegen; // MP 회복
short m_wCritical; // 크리티컬
short m_wBlock; // 블록
short m_wSpeed; // 속도
short m_wCoolDownRevision; // 쿨다운보정
short m_wSkillPoint; // 스킬포인트
short m_wMagicPower; // 마법력
short m_wMagicResist; // 마법저항
int m_wLuck; // 행운값
//--// start..
short m_wFrost; // 냉기/정지 속성
short m_wFire; // 불/독 속성
short m_wElectro; // 전지/충격 속성
short m_wDarkness; // 암흑/빛 속성
//--// end..
float m_fDefenceRate; // 방어%
float m_fCriticalMagnification; // 크리티컬배율
float m_fCriticalRate; // 크리티컬%
float m_fBlockRate; // 블럭률%
float m_fSpeedRate; // 속도%
float m_fCoolDownRevisionRate; // 쿨다운보정%
float m_fMagicResistRate; // 마법저항%
float m_fLuckResistRate; // 럭키찬스%
float m_fLevelExplosion; // 레벨 익스플로젼
unsigned char m_cCriticalType; // 크리티컬 타입
unsigned char m_cComboCount; // 공격 콤보 횟수
unsigned char m_cCalculateState; // 계산 상태
FightStatus();
bool CalculateBaseInfo(const CharacterStatus& characterStatus, const unsigned short wLevel, const unsigned char cClass);
bool CalculateEquipInfo(const Item::CEquipment** ppEquip, const bool bFirstWeaponSlot, const bool bRightHand, const bool bRideFlag,
const SKILL& skill, const unsigned char cLevel, const unsigned short wRiderAbility, const unsigned short wLuckAbility, const unsigned short wLevelAbility,
const CharacterStatus& characterStatus, const unsigned char cClass, FightStatus& resultStatus, int& resultLuck) const;
bool CalculateEnchantInfo(const unsigned short* aryEnchantLevel, FightStatus& resultStatus) const;
void CalculateSubStatus(void);
static bool CheckEquipable(const Item::CEquipment* lpEquip, const CharacterStatus& characterStatus,
const unsigned char cClass, const unsigned char cLevel, const unsigned short wLevelAbility); //--//
};
#pragma pack(8)
//------------------------------------------------------------------------------------
// TODO : memory alignment 주의할 것.
// : 4byte단위로 alignment 가 되도록 할 것.
// : 메모리 부족시에는 크기가 많이 필요 없는 멤버는 short등으로 줄일 것.
// 무기나 도구에 의해서 영향을 받은 능력치를 저장 (게임상에서 모든 계산은 이것으로 함)
struct CreatureStatus
{
__int64 m_nExp; // 사람인 경우는 자신의 경험점, 몬스터인 경우는 나누어 줄 경험점
int m_nLevel; // 레벨
unsigned short m_nNowHP; // 현재 HP
unsigned short m_nNowMP; // 현재 MP (몬스터의 경우는 무조건 최대값으로 초기화)
FightStatus m_StatusInfo; // 대부분의 정보가 이곳에 있음
CreatureStatus();
CreatureStatus(CHAR_INFOST& characterDBData);
void Init(CHAR_INFOST& characterDBData);
};
typedef CreatureStatus* LPCreatureStatus;
#pragma pack()
#endif

Some files were not shown because too many files have changed in this diff Show More