Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
339
GameTools/GLOBALSCRIPT/Creature/CreatureStructure.cpp
Normal file
339
GameTools/GLOBALSCRIPT/Creature/CreatureStructure.cpp
Normal file
@@ -0,0 +1,339 @@
|
||||
#include "stdafx.h"
|
||||
#include <algorithm>
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
#include "./Character/CharacterClass.h"
|
||||
#endif
|
||||
|
||||
#include "CreatureStructure.h"
|
||||
#include "./Character/CharacterStructure.h"
|
||||
#include "../Item/Item.h"
|
||||
|
||||
|
||||
MotionInfo::MotionInfo()
|
||||
: m_fDirection(0.0f), m_fVelocity(0.0f), m_wAction(0), m_dwFrame(0) { }
|
||||
|
||||
|
||||
StatusInfo::StatusInfo()
|
||||
: m_nCriticalType(0), m_nCriticalPercentage(0),
|
||||
m_nMinDamage(0), m_nMaxDamage(0), m_fDRC(0.0f), m_nOffenceRevision(0),
|
||||
m_nDefence(0), m_nDefenceRevision(0),
|
||||
m_nMagicResistance(0), m_nBlockingPercentage(0),
|
||||
m_nAttackSpeed(0), m_nMoveSpeed(0), m_nAttackRange(0), m_nRangeAttackDistance(0),
|
||||
|
||||
m_nMaxHP(0), m_nMaxMP(0), m_nHPRegenAmount(0), m_nMPRegenAmount(0)
|
||||
{
|
||||
int nMaxAttributeNum = MAX_ATTRIBUTE_NUM;
|
||||
std::fill_n(m_nWeaponAttributeLevel, nMaxAttributeNum, 0);
|
||||
std::fill_n(m_nAttributeResistance, nMaxAttributeNum, 0);
|
||||
}
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
bool StatusInfo::CalculateStatus(const CharacterStatus& characterStatus,
|
||||
const unsigned short nLevel, const unsigned short nClass, unsigned char cUsingWeaponType)
|
||||
{
|
||||
switch (nClass)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::Fighter:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nSTR / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20>α<EFBFBD>
|
||||
case CClass::Rouge:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nDEX / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::Mage:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nINT / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>Ʈ
|
||||
case CClass::Acolyte:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nWIS / 2;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::Defender:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nSTR / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 800;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::Warrior:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nSTR / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 550;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD>ؽ<EFBFBD>
|
||||
case CClass::Assasin:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nDEX / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><>ó
|
||||
case CClass::Archer:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nDEX / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 550;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550;
|
||||
|
||||
} break;
|
||||
|
||||
// <20>Ҽ<EFBFBD><D2BC><EFBFBD>
|
||||
case CClass::Sorcerer:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nINT / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::Enchanter:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nINT / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 550;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
case CClass::Priest:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nWIS / 2;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 800;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD><EFBFBD>
|
||||
case CClass::Cleric:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nWIS / 2;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 550;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 550;
|
||||
|
||||
} break;
|
||||
|
||||
// <20>Ĺ<EFBFBD><C4B9><EFBFBD>Ʈ
|
||||
case CClass::Combatant:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nSTR / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::Officetor:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nDEX / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD>÷<EFBFBD>
|
||||
case CClass::Templar:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nSTR / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 800;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ŀ
|
||||
case CClass::Attacker:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nSTR / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 550;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550;
|
||||
|
||||
} break;
|
||||
|
||||
// <20>ų<EFBFBD>
|
||||
case CClass::Gunner:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nDEX / 2;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::RuneOff:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nINT / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::LifeOff:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nWIS / 2;
|
||||
m_nDefenceRevision = characterStatus.m_nWIS / 2 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 550;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 550;
|
||||
|
||||
} break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
case CClass::ShadowOff:
|
||||
{
|
||||
m_nOffenceRevision = characterStatus.m_nDEX / 4;
|
||||
m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5;
|
||||
|
||||
m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 800;
|
||||
m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300;
|
||||
|
||||
} break;
|
||||
|
||||
default:
|
||||
{
|
||||
#ifdef ERRLOG0
|
||||
ERRLOG0(g_Log, "Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> None<6E><65> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.");
|
||||
#endif
|
||||
return false;
|
||||
|
||||
} break;
|
||||
}
|
||||
|
||||
|
||||
// Ȱ, <20><><EFBFBD><EFBFBD>
|
||||
if (cUsingWeaponType == Item::CItemType::BOW || cUsingWeaponType == Item::CItemType::CROSSBOW)
|
||||
{
|
||||
m_nMinDamage = characterStatus.m_nDEX / 2;
|
||||
m_nMaxDamage = characterStatus.m_nDEX / 2;
|
||||
}
|
||||
// <20><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
else
|
||||
{
|
||||
m_nMinDamage = characterStatus.m_nSTR / 3;
|
||||
m_nMaxDamage = characterStatus.m_nSTR / 3;
|
||||
|
||||
// <20>α<EFBFBD>, <20><><EFBFBD>ؽ<EFBFBD>, <20><>ó, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DEX<45><58> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||
if (CClass::Rouge == CClass::GetPreviousJob(static_cast<unsigned char>(nClass)) ||
|
||||
CClass::ShadowOff == nClass)
|
||||
{
|
||||
m_nMinDamage += characterStatus.m_nDEX / 6;
|
||||
m_nMaxDamage += characterStatus.m_nDEX / 6;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
m_nDefence = 0;
|
||||
m_nBlockingPercentage = 0;
|
||||
|
||||
m_fDRC = 0;
|
||||
|
||||
m_nCriticalPercentage = characterStatus.m_nDEX / 5;
|
||||
m_nCriticalType = 0;
|
||||
|
||||
m_nMagicResistance = characterStatus.m_nWIS / 3;
|
||||
|
||||
m_nAttackSpeed = 0;
|
||||
m_nMoveSpeed = 0;
|
||||
m_nAttackRange = 0;
|
||||
m_nRangeAttackDistance = 0;
|
||||
|
||||
m_nHPRegenAmount = ((characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300) / 50;
|
||||
m_nMPRegenAmount = ((characterStatus.m_nINT + characterStatus.m_nWIS - 40) * nLevel + nLevel * 40 + 300) / 50;
|
||||
|
||||
for (int nAttribute = 0; nAttribute < MAX_ATTRIBUTE_NUM; ++nAttribute)
|
||||
{
|
||||
m_nWeaponAttributeLevel[nAttribute] = 0;
|
||||
m_nAttributeResistance[nAttribute] = 0;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
CreatureStatus::CreatureStatus()
|
||||
: m_nLevel(0), m_nExp(0), m_nNowHP(0), m_nNowMP(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CreatureStatus::CreatureStatus(CHAR_INFOST& characterDBData)
|
||||
: m_nLevel(characterDBData.Level), m_nExp(characterDBData.Exp),
|
||||
m_nNowHP(characterDBData.HP), m_nNowMP(characterDBData.MP)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CreatureStatus::Init(CHAR_INFOST& characterDBData)
|
||||
{
|
||||
m_nLevel = characterDBData.Level;
|
||||
m_nExp = characterDBData.Exp;
|
||||
m_nNowHP = characterDBData.HP;
|
||||
m_nNowMP = characterDBData.MP;
|
||||
}
|
||||
Reference in New Issue
Block a user