Files
Client/GameTools/GLOBALSCRIPT/Creature/CreatureStructure.cpp
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

339 lines
10 KiB
C++

#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)
{
// ÆÄÀÌÅÍ
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;
// ·Î±×
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;
// ¸ÞÀÌÁö
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;
// ¾îÄݶóÀÌÆ®
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;
// µðÆæ´õ
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;
// ¿ö¸®¾î
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;
// ¾î½Ø½Å
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;
// ¾ÆÃ³
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;
// ¼Ò¼­·¯
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;
// ¿£ÂùÅÍ
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;
// ÇÁ¸®½ºÆ®
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;
// Ŭ·¹¸¯
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;
// ÄĹèÅÏÆ®
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;
// ¿ÀÇǼ¼ÀÌÅÍ
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;
// ÅÛÇ÷¯
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;
// ¾îÅÂÄ¿
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;
// °Å³Ê
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;
// ·é¿ÀÇÁ
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;
// ¶óÀÌÇÁ¿ÀÇÁ
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;
// ½¦µµ¿ì¿ÀÇÁ
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, "Ŭ·¡½º°¡ NoneÀΠij¸¯ÅÍÀÔ´Ï´Ù.");
#endif
return false;
} break;
}
// Ȱ, ¼®±Ã
if (cUsingWeaponType == Item::CItemType::BOW || cUsingWeaponType == Item::CItemType::CROSSBOW)
{
m_nMinDamage = characterStatus.m_nDEX / 2;
m_nMaxDamage = characterStatus.m_nDEX / 2;
}
// ±×¿Ü ±ÙÁ¢ ¹«±â
else
{
m_nMinDamage = characterStatus.m_nSTR / 3;
m_nMaxDamage = characterStatus.m_nSTR / 3;
// ·Î±×, ¾î½Ø½Å, ¾ÆÃ³, ½¦µµ¿ì ¿ÀÇÁÀÇ °æ¿ì DEX¿¡ ÀÇÇÑ °¡»êÁ¡ÀÌ...
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;
}
}
// °øÅë»çÇ×µé
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;
}