Files
Client/Server/RylServerProject/RylGameLibrary/Creature/Siege/SiegeObject.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

946 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "SiegeObject.h"
#include <Utility/Math/Math.h>
#include <Utility/Setup/ServerSetup.h>
#include <Item/ItemFactory.h>
#include <Network/ClientSocket/ClientConstants.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Dispatch/GameClient/SendCharCastle.h>
#include <Network/Dispatch/GameClient/SendCharAttack.h>
#include <Network/Dispatch/DBAgent/DBAgentDispatch.h>
#include <Network/Dispatch/DBAgent/DBAgentRequest.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Community/Guild/Guild.h>
#include <Community/Guild/GuildMgr.h>
#include <Creature/Siege/SiegeObjectMgr.h>
#include <Creature/Monster/MonsterMgr.h>
#include <Creature/EnemyCheck.h>
#include <Castle/Castle.h>
#include <Castle/CastleMgr.h>
#include <Map/FieldMap/CellManager.h>
#include <Map/DuelMap/DuelCellManager.h>
#include <Skill/SkillTable.h>
#include <Skill/SkillMgr.h>
#include <GameTime/GameTimeConstants.h>
#include <GameTime/GameTimeMgr.h>
CSiegeObject::CSiegeObject(MonsterCreateInfo& MonsterCreate, const CastleObjectInfo& CastleObject)
: CSkillMonster(MonsterCreate), m_dwCampOrCastleID(CastleObject.m_dwCastleID), m_dwOwnerID(CastleObject.m_dwOwnerID),
m_cNation(CastleObject.m_cNation), m_dwGID(0), m_wObjectType(CastleObject.m_wObjectType), m_cState(CastleObject.m_cState),
m_cSubState(CastleObject.m_cSubState), m_cUpgradeStep(CastleObject.m_cUpgradeStep), m_cUpgradeType(CastleObject.m_cUpgradeType),
m_cMaterial(0), m_cSiegeCount(0), m_fDefaultDir(CastleObject.m_fDefaultDir), m_dwRiderCID(0), m_cHPUpdateCount(0),
m_dwBroadCastSize(0), m_dwDeltaSize(0)
{
InitMonster(MonsterCreate.m_Pos);
m_MotionInfo.m_fDirection = m_fDefaultDir;
m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(CastleObject.m_dwHP);
switch (m_wObjectType)
{
case Siege::GUARD: m_wDefaultSearchRange = 32; break;
case Siege::EMBLEM: m_wDefaultSearchRange = 32; break;
}
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD>
m_SerializeSiegeObjectData.PrepareData( *this );
m_SerializeSiegeObjectData.ClearDeltaData();
}
CSiegeObject::CSiegeObject(MonsterCreateInfo& MonsterCreate, unsigned long dwCampID, unsigned long dwGID,
unsigned long dwHP, unsigned short wObjectType, unsigned char cState,
unsigned char cSubState, unsigned char cUpgradeStep, unsigned char cMaterial,
unsigned char cSiegeCount, bool bFullHP)
: CSkillMonster(MonsterCreate), m_dwCampOrCastleID(dwCampID), m_dwOwnerID(0), m_wObjectType(wObjectType),
m_dwGID(dwGID), m_cNation(0), m_cState(cState), m_cSubState(cSubState), m_cUpgradeStep(cUpgradeStep),
m_cUpgradeType(0), m_cMaterial(cMaterial), m_cSiegeCount(cSiegeCount), m_fDefaultDir(0), m_dwRiderCID(0),
m_cHPUpdateCount(0), m_dwBroadCastSize(0),m_dwDeltaSize(0)
{
InitMonster(MonsterCreate.m_Pos);
if (bFullHP) m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
else m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(dwHP);
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD>
m_SerializeSiegeObjectData.PrepareData( *this );
m_SerializeSiegeObjectData.ClearDeltaData();
}
CSiegeObject::CSiegeObject(MonsterCreateInfo& MonsterCreate, unsigned long dwOwnerID, unsigned char cNation,
unsigned long dwHP, unsigned short wObjectType, unsigned char cState, unsigned char cUpgradeStep)
: CSkillMonster(MonsterCreate), m_dwCampOrCastleID(0), m_dwOwnerID(dwOwnerID), m_wObjectType(wObjectType), m_cNation(cNation),
m_dwGID(0), m_cState(cState), m_cSubState(0), m_cUpgradeStep(cUpgradeStep), m_cUpgradeType(0), m_cMaterial(0),
m_cSiegeCount(0), m_fDefaultDir(0), m_dwRiderCID(0), m_cHPUpdateCount(0), m_dwBroadCastSize(0),m_dwDeltaSize(0)
{
InitMonster(MonsterCreate.m_Pos);
if (0 == dwHP) m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
else m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(dwHP);
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD>
m_SerializeSiegeObjectData.PrepareData( *this );
m_SerializeSiegeObjectData.ClearDeltaData();
}
CSiegeObject::~CSiegeObject()
{
}
EnemyCheck::EnemyType CSiegeObject::IsEnemy(CCreature* lpTarget, unsigned char* cResult)
{
if (NULL == lpTarget)
{
ERRLOG1(g_Log, "CID:0x%08x <20>Ǿƽĺ<C6BD><C4BA><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_dwCID);
return EnemyCheck::EC_NEUTRAL;
}
BattleInclination::CharData ownerInfo;
BattleInclination::CharData targetInfo;
BattleInclination::SetCharData(*this, ownerInfo);
BattleInclination::SetCharData(*lpTarget, targetInfo);
BattleInclination::RelationData relationInfo;
BattleInclination::SetRelationData(*this, *lpTarget, relationInfo);
unsigned char cResultFromStruct = 0;
unsigned long dwResult = EnemyCheck::CCheckTable::GetInstance().IsEnemyFromStruct(
ownerInfo, targetInfo, relationInfo, cResultFromStruct);
return static_cast<EnemyCheck::EnemyType>(dwResult);
}
unsigned char CSiegeObject::IsRider(unsigned long dwCID) const
{
if (m_dwRiderCID == dwCID)
{
return Siege::RIDER_FOR_OWNER;
}
return Siege::NOT_RIDER;
}
bool CSiegeObject::SkillAttack()
{
unsigned char cSkillLockCount = m_cUpgradeStep + 1;
unsigned char cSkillLevel = CSkillMonster::USE_SKILL_LEVEL;
if (cSkillLockCount >= CSkillMgr::MAX_SKILL_LOCKCOUNT - 1)
{
cSkillLockCount = CSkillMgr::MAX_SKILL_LOCKCOUNT - 2;
}
enum { FIRST_PATTERN=0, SECOND_PATTERN=1, MAX_PATTERN = 2 };
int nSelectPattern = FIRST_PATTERN;
CAggresiveCreature* ppAggresiveCreature[AtNode::MAX_DEFENDER_NUM] = {0, };
AtType attackType;
attackType.m_cSkillLockCount = cSkillLockCount;
attackType.m_cSkillLevel = cSkillLevel;
char nSkillPattern = 0;
while (nSelectPattern < MAX_PATTERN)
{
switch (nSelectPattern)
{
case FIRST_PATTERN:
{
// <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ൿ
// A B A : <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MP <20>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
// : <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// : A <20><>ų <20><><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (0 == m_MonsterInfo.m_wSkillID[A_SKILL])
{
++nSelectPattern;
continue;
}
nSkillPattern = A_SKILL;
attackType.m_wType = m_MonsterInfo.m_wSkillID[A_SKILL];
ppAggresiveCreature[0] = m_lpTarget;
}
break;
case SECOND_PATTERN:
{
// <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ൿ
// A B D : <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MP <20>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
// : <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// : D <20><>ų <20><><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (0 == m_MonsterInfo.m_wSkillID[D_SKILL])
{
++nSelectPattern;
continue;
}
nSkillPattern = D_SKILL;
attackType.m_wType = m_MonsterInfo.m_wSkillID[D_SKILL];
ppAggresiveCreature[0] = m_lpTarget;
}
break;
default:
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<EFBFBD><D1BE>Խ<EFBFBD><D4BD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
}
// <20><>ų <20><><EFBFBD><EFBFBD><><C4B3><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ϰ<EFBFBD> <20>ȴ<EFBFBD>.)
if (true == UseSkill(attackType, ppAggresiveCreature, nSkillPattern))
{
return true;
}
else
{
++nSelectPattern;
}
}
return false;
}
void CSiegeObject::UpdateObjectInfo(unsigned char cHPType, unsigned short wRepairHP)
{
unsigned short wPrevMaxHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
unsigned short wNowHP = m_CreatureStatus.m_nNowHP;
int nKID = Siege::GetKID(m_wObjectType, m_cState, m_cUpgradeType, m_cUpgradeStep);
const CMonsterMgr::MonsterProtoType* lpProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoType)
{
m_CreatureStatus = lpProtoType->m_CreatureStatus;
m_MonsterInfo = lpProtoType->m_MonsterInfo;
m_CreatureStatus.m_StatusInfo.CalculateSubStatus();
}
unsigned long dwTempHp;
switch (cHPType)
{
case Siege::NOW_HP:
m_CreatureStatus.m_nNowHP = wNowHP;
SendHPUpdateToDBAgent();
break;
case Siege::UPGRADE_HP:
dwTempHp = wNowHP + m_CreatureStatus.m_StatusInfo.m_nMaxHP - wPrevMaxHP;
m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(
std::min(dwTempHp, static_cast<unsigned long>(m_CreatureStatus.m_StatusInfo.m_nMaxHP)));
SendHPUpdateToDBAgent(true);
break;
case Siege::REPAIR_HP:
dwTempHp = wNowHP + wRepairHP;
m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(
std::min(dwTempHp, static_cast<unsigned long>(m_CreatureStatus.m_StatusInfo.m_nMaxHP)));
SendHPUpdateToDBAgent(true);
break;
case Siege::FULL_HP:
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
SendHPUpdateToDBAgent(true);
break;
}
}
void CSiegeObject::UpgradeByEmblem(unsigned char cUpgradeType, unsigned char cUpgradeStep)
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
if (!IsCastleObject())
{
return;
}
int nKID = Siege::GetKID(Siege::EMBLEM, Siege::COMPLETE, cUpgradeType, cUpgradeStep);
const CMonsterMgr::MonsterProtoType* lpProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoType)
{
// <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_cUpgradeSpeed -= static_cast<unsigned char>(m_MonsterInfo.m_cUpgradeSpeed
* lpProtoType->m_MonsterInfo.m_fUpgradeSpeedUp);
// <20><><EFBFBD><EFBFBD> <20>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_cDevelopSpeed -= static_cast<unsigned char>(m_MonsterInfo.m_cDevelopSpeed
* lpProtoType->m_MonsterInfo.m_fDevelopSpeedUp);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_CreatureStatus.m_StatusInfo.m_wArmor += static_cast<short>(m_CreatureStatus.m_StatusInfo.m_wArmor
* lpProtoType->m_MonsterInfo.m_fDefenseUp);
m_CreatureStatus.m_StatusInfo.m_wMagicResist += static_cast<short>(m_CreatureStatus.m_StatusInfo.m_wMagicResist
* lpProtoType->m_MonsterInfo.m_fDefenseUp);
// HP <20><><EFBFBD><EFBFBD>
unsigned short wAddHP = static_cast<unsigned short>(m_CreatureStatus.m_StatusInfo.m_nMaxHP
* lpProtoType->m_MonsterInfo.m_fHPUp);
m_CreatureStatus.m_StatusInfo.m_nMaxHP += wAddHP;
m_CreatureStatus.m_nNowHP += wAddHP;
// <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_CreatureStatus.m_StatusInfo.m_lMinDamage += static_cast<long>(m_CreatureStatus.m_StatusInfo.m_lMinDamage
* lpProtoType->m_MonsterInfo.m_fOffenseUp);
m_CreatureStatus.m_StatusInfo.m_lMaxDamage += static_cast<long>(m_CreatureStatus.m_StatusInfo.m_lMaxDamage
* lpProtoType->m_MonsterInfo.m_fOffenseUp);
m_CreatureStatus.m_StatusInfo.m_wMagicPower += static_cast<short>(m_CreatureStatus.m_StatusInfo.m_wMagicPower
* lpProtoType->m_MonsterInfo.m_fOffenseUp);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_dwDevelopGold -= static_cast<unsigned long>(m_MonsterInfo.m_dwDevelopGold
* lpProtoType->m_MonsterInfo.m_fDevelopGoldDown);
// <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_dwUpgradeGold -= static_cast<unsigned long>(m_MonsterInfo.m_dwUpgradeGold
* lpProtoType->m_MonsterInfo.m_fUpgradeGoldDown);
}
}
void CSiegeObject::DegradeByEmblem(unsigned char cUpgradeType, unsigned char cUpgradeStep)
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
if (!IsCastleObject())
{
return;
}
int nKID = Siege::GetKID(Siege::EMBLEM, Siege::COMPLETE, cUpgradeType, cUpgradeStep);
const CMonsterMgr::MonsterProtoType* lpProtoTypeEmblem = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
nKID = GetKID();
const CMonsterMgr::MonsterProtoType* lpProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoType && lpProtoTypeEmblem)
{
unsigned short wNowHP = m_CreatureStatus.m_nNowHP -
static_cast<unsigned short>(m_CreatureStatus.m_nNowHP * lpProtoTypeEmblem->m_MonsterInfo.m_fHPUp);
m_CreatureStatus = lpProtoType->m_CreatureStatus;
m_MonsterInfo = lpProtoType->m_MonsterInfo;
m_CreatureStatus.m_nNowHP = wNowHP;
}
}
unsigned short CSiegeObject::GetDefaultNowHP()
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
if (IsCastleObject())
{
Castle::CCastle* lpCastle = Castle::CCastleMgr::GetInstance().GetCastle( GetCastleID() );
CSiegeObject* lpEmblem = lpCastle->GetCastleEmblem();
if (lpCastle && lpEmblem)
{
int nKID = lpEmblem->GetKID();
const CMonsterMgr::MonsterProtoType* lpProtoTypeEmblem = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoTypeEmblem)
{
return m_CreatureStatus.m_nNowHP - static_cast<unsigned short>(m_CreatureStatus.m_nNowHP * lpProtoTypeEmblem->m_MonsterInfo.m_fHPUp);
}
}
}
return m_CreatureStatus.m_nNowHP;
}
void CSiegeObject::MoveTo(const Position& NewPosition)
{
CAggresiveCreature::MoveTo(NewPosition, false);
}
unsigned long CSiegeObject::GetRepairHP()
{
return m_CreatureStatus.m_StatusInfo.m_nMaxHP - m_CreatureStatus.m_nNowHP;
}
int CSiegeObject::GetKID() const
{
return Siege::GetKID(m_wObjectType, m_cState, m_cUpgradeType, m_cUpgradeStep);
}
void CSiegeObject::GetRiders( unsigned long* pRiders ) const
{
pRiders[0] = m_dwRiderCID;
}
unsigned char CSiegeObject::GetRiderNum() const
{
return (0 == m_dwRiderCID) ? 0 : 1;
}
unsigned long CSiegeObject::GetDevelopGold(unsigned short wDefaultObjectType) const
{
wDefaultObjectType = (wDefaultObjectType == Siege::DEFAULT_TYPE) ? m_wObjectType : wDefaultObjectType;
int nKID = Siege::GetKID(wDefaultObjectType, Siege::DEVELOPING, m_cUpgradeType, m_cUpgradeStep);
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_dwDevelopGold;
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return 0;
}
unsigned char CSiegeObject::GetDevelopSpeed(unsigned short wDefaultObjectType) const
{
wDefaultObjectType = (wDefaultObjectType == Siege::DEFAULT_TYPE) ? m_wObjectType : wDefaultObjectType;
int nKID = Siege::GetKID(wDefaultObjectType, Siege::DEVELOPING, m_cUpgradeType, m_cUpgradeStep);
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_cDevelopSpeed;
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return Siege::DEFAULT_TIME_VALUE;
}
unsigned long CSiegeObject::GetUpgradeGold() const
{
int nKID = Siege::GetKID(m_wObjectType, Siege::UPGRADING, m_cUpgradeType, m_cUpgradeStep);
if ( m_cUpgradeStep < Siege::MAX_UPGRADE_NUM )
{
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_dwUpgradeGold;
}
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return 0;
}
unsigned char CSiegeObject::GetUpgradeSpeed(unsigned char cDefaultUpgradeType) const
{
cDefaultUpgradeType = (cDefaultUpgradeType == Siege::NO_JEWEL) ? m_cUpgradeType : cDefaultUpgradeType;
int nKID = Siege::GetKID(m_wObjectType, Siege::UPGRADING, cDefaultUpgradeType, m_cUpgradeStep);
if ( m_cUpgradeStep < Siege::MAX_UPGRADE_NUM )
{
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_cUpgradeSpeed;
}
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><EFBFBD>̵<EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return Siege::DEFAULT_TIME_VALUE;
}
float CSiegeObject::GetBonusRate() const
{
return m_MonsterInfo.m_fBonusRate;
}
unsigned long CSiegeObject::GetGID() const
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetGID() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->GetGID();
}
}
return m_dwGID;
}
unsigned char CSiegeObject::GetNation() const
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetNation() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->GetNation();
}
}
if ( IsCastleObject() || IsSiegeArms() )
{
return m_cNation;
}
else
{
// <20>ش<EFBFBD> Guild <20><> GetNation() ȣ<><C8A3>
CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(m_dwGID);
if (NULL != lpGuild)
{
return lpGuild->GetNation();
}
}
// <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
return Creature::STATELESS;
}
bool CSiegeObject::IsPeaceMode()
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetNation() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->IsPeaceMode();
}
}
if ( IsCastleObject() || IsSiegeArms() )
{
return false;
}
else
{
// <20>ش<EFBFBD> Guild <20><> GetNation() ȣ<><C8A3>
CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(m_dwGID);
if (NULL != lpGuild)
{
return lpGuild->IsPeaceMode();
}
}
// <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return false;
}
CAggresiveCreature* CSiegeObject::GetDuelOpponent(void) const
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetNation() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->GetDuelOpponent();
}
}
return NULL;
}
bool CSiegeObject::IsWorldWeapon() const
{
if (Siege::KARTERANT_WEAPON == m_wObjectType || Siege::MERKADIA_WEAPON == m_wObjectType)
{
return true;
}
return false;
}
/*
bool CSiegeObject::SerializeOut(char* szBuffer_In, unsigned short& wDataLen)
{
PktSiegeBroadCast* lpBroadCast = reinterpret_cast<PktSiegeBroadCast*>(szBuffer_In);
lpBroadCast->m_dwCID = m_dwCID;
lpBroadCast->m_dwOwnerID = m_dwOwnerID; // <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> ID
lpBroadCast->m_dwGID = m_dwGID; // <20><><EFBFBD><EFBFBD> ID
if (IsEmblem() && m_dwEnemyGID)
{
lpBroadCast->m_dwGID = m_dwEnemyGID; // <20><><EFBFBD><EFBFBD> ID
}
lpBroadCast->m_wObjectType = m_wObjectType;
lpBroadCast->m_dwNowHP = m_CreatureStatus.m_nNowHP;
lpBroadCast->m_dwMaxHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
lpBroadCast->m_cState = m_cState;
lpBroadCast->m_cSubState = m_cSubState;
lpBroadCast->m_cUpgradeStep = m_cUpgradeStep;
lpBroadCast->m_cUpgradeType = m_cUpgradeType;
lpBroadCast->m_fDefaultDir = m_fDefaultDir;
std::fill_n(&lpBroadCast->m_dwRiderID[0], int(Siege::AIRSHIP_RIDER_NUM), 0);
GetRiders( lpBroadCast->m_dwRiderID );
float fY = GetCurrentPos().m_fPointY;
const MotionInfo& motionInfo = GetMotionInfo();
if (IsSiegeArms())
{
if (Siege::AIRSHIP != m_wObjectType)
{
fY = 0.0f;
}
}
lpBroadCast->m_NetworkPos.Initialize(GetCurrentPos().m_fPointX, fY, GetCurrentPos().m_fPointZ, motionInfo.m_fDirection,
(0 == motionInfo.m_dwFrame) ? 0.0f : motionInfo.m_fVelocity / motionInfo.m_dwFrame);
wDataLen = sizeof(PktSiegeBroadCast);
return true;
}
*/
/*
void CSiegeObject::SendToRadiusCell(const char* szPacket, unsigned long dwPacketSize, unsigned char cCMD_In)
{
// <20>ݰ<EFBFBD> 5<><35><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
CCell* lpCenterCell = GetCellPos().m_lpCell;
if (lpCenterCell)
{
int nCellWidth = Siege::BROADCAST_CELL_SIZE * 2 - 1;
int nCellHeight = Siege::BROADCAST_CELL_SIZE * 2 - 1;
int i, j;
CCell* lpStartCell = NULL;
for (i=1; i<Siege::BROADCAST_CELL_SIZE; ++i)
{
lpStartCell = lpCenterCell->GetConnectCell(CCell::LEFT);
if (NULL == lpStartCell)
{
nCellWidth = nCellWidth - (Siege::BROADCAST_CELL_SIZE - i);
break;
}
lpCenterCell = lpStartCell;
}
for (i=1; i<Siege::BROADCAST_CELL_SIZE; ++i)
{
lpStartCell = lpCenterCell->GetConnectCell(CCell::UP);
if (NULL == lpStartCell)
{
nCellHeight = nCellHeight - (Siege::BROADCAST_CELL_SIZE - i);
break;
}
lpCenterCell = lpStartCell;
}
lpStartCell = lpCenterCell;
for (i=0; i<nCellHeight; ++i)
{
CCell* lpTempCell = lpStartCell;
for (j=0; j<nCellWidth; ++j)
{
if (lpTempCell)
{
lpTempCell->SendAllCharacter(szPacket, dwPacketSize, cCMD_In);
lpTempCell = lpTempCell->GetConnectCell(CCell::RIGHT);
}
else break;
}
lpStartCell = lpStartCell->GetConnectCell(CCell::DOWN);
if (NULL == lpStartCell) break;
}
}
}
*/
void CSiegeObject::RangeTest()
{
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ <20>ݰ<EFBFBD><DDB0><EFBFBD> <20><><EFBFBD> ij<><C4B3><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>.)
PktNewSiegeBroadCast pktNSBC;
ZeroMemory(&pktNSBC, sizeof(PktNewSiegeBroadCast));
pktNSBC.m_dwCID = GetCID();
pktNSBC.m_cType = BroadCastSiege::BROADCAST_DELETE_DATA;
bool bDeletePacketCrypt = true;
char* szPacket = reinterpret_cast<char *>(&pktNSBC);
if (!PacketWrap::WrapCrypt(szPacket, sizeof(PktNewSiegeBroadCast), CmdNewSiegeBroadCast, 0, 0))
{
ERRLOG0(g_Log, "Siege Broadcast delete data packet crypt fail..");
bDeletePacketCrypt = false;
}
BroadCastSet::iterator itr = m_BroadCastSet.begin();
while (itr != m_BroadCastSet.end())
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter( (*itr) );
if (lpCharacter)
{
if (lpCharacter->GetCurrentPos().GetSquaredDistance( GetCurrentPos() ) > Siege::BROADCAST_SQUARED_RADIUS)
{
itr = m_BroadCastSet.erase(itr);
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch && bDeletePacketCrypt)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, sizeof(PktNewSiegeBroadCast), CmdNewSiegeBroadCast);
}
}
else
{
++itr;
}
}
else
{
itr = m_BroadCastSet.erase(itr);
}
}
// BroadCast Data <20><> Delta Data <20><> <20><><EFBFBD><EFBFBD><EFBFBD>صд<D8B5>.
char szSrcBuffer[ BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE ] ;
char szDeltaSrcBuffer[ BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE ] ;
m_dwBroadCastSize = BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE;
m_dwDeltaSize = 0;
PktNewSiegeBroadCast* lpPktNewSiegeBC = reinterpret_cast<PktNewSiegeBroadCast*>( szSrcBuffer );
char* lpDataPos = reinterpret_cast<char*>( lpPktNewSiegeBC + 1 );
lpPktNewSiegeBC->m_dwCID = GetCID();
lpPktNewSiegeBC->m_cType = BroadCastSiege::BROADCAST_ALL_DATA;
memcpy( lpDataPos, m_SerializeSiegeObjectData.GetBroadCastData(), m_SerializeSiegeObjectData.GetBroadCastDataLen() );
PacketWrap::WrapCompress( m_szBroadCastBuffer, m_dwBroadCastSize, szSrcBuffer,
static_cast<unsigned short>( sizeof(PktNewSiegeBroadCast) + m_SerializeSiegeObjectData.GetBroadCastDataLen() ),
CmdNewSiegeBroadCast, 0, 0 );
if ( m_SerializeSiegeObjectData.GetDeltaDataLen() > 0 )
{
m_dwDeltaSize = BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE;
lpPktNewSiegeBC = reinterpret_cast<PktNewSiegeBroadCast*>( szDeltaSrcBuffer ) ;
lpDataPos = reinterpret_cast<char*>( lpPktNewSiegeBC + 1 );
lpPktNewSiegeBC->m_dwCID = GetCID();
lpPktNewSiegeBC->m_cType = BroadCastSiege::BROADCAST_DELTA_DATA;
memcpy( lpDataPos, m_SerializeSiegeObjectData.GetDeltaData(), m_SerializeSiegeObjectData.GetDeltaDataLen() );
PacketWrap::WrapCompress( m_szDeltaBuffer, m_dwDeltaSize, szDeltaSrcBuffer,
static_cast<unsigned short>( sizeof(PktNewSiegeBroadCast) + m_SerializeSiegeObjectData.GetDeltaDataLen() ),
CmdNewSiegeBroadCast, 0, 0 );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
CCharSphereTree::GetInstance().RangeTest( GetCurrentPos(), Siege::BROADCAST_RADIUS, this );
}
void CSiegeObject::RangeTestCallBack( const Position& centerPos, float fDistance, CCharSphereNode* pNode )
{
if ( pNode )
{
BroadCastSet::iterator itr = m_BroadCastSet.find(pNode->GetCID());
if (itr != m_BroadCastSet.end())
{
CCharacter* lpCharacter = pNode->GetCharacter();
if (NULL != lpCharacter)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. Delta <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if (m_SerializeSiegeObjectData.GetDeltaDataLen() > 0)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(m_szDeltaBuffer, m_dwDeltaSize, CmdNewSiegeBroadCast);
}
}
}
}
else
{
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. BroadCast <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CCharacter* lpCharacter = pNode->GetCharacter();
if (NULL != lpCharacter)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(m_szBroadCastBuffer, m_dwBroadCastSize, CmdNewSiegeBroadCast);
}
m_BroadCastSet.insert( pNode->GetCID() );
}
}
}
}
void CSiegeObject::SendToRange( float fRadius, const char* szPacket, unsigned long dwPacketSize, unsigned char cCMD_In )
{
CCharSphereTree::GetInstance().SendToRange( GetCurrentPos(), fRadius, szPacket, dwPacketSize, cCMD_In );
}
void CSiegeObject::SendHPUpdateToDBAgent(bool bForce)
{
++m_cHPUpdateCount;
// <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if (lpDBAgentDispatch)
{
switch (m_wObjectType)
{
case Siege::CAMP: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::CAMP_SHOP: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::MINING_CAMP: // ä<><C3A4><EFBFBD><EFBFBD>
case Siege::KARTERANT_WEAPON: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::MERKADIA_WEAPON: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (bForce || m_cHPUpdateCount >= MAX_HP_UPDATE_COUNT)
{
GameClientSendPacket::SendCharCampCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), 0, GetCampID(),
m_CreatureStatus.m_nNowHP, 0, PktCampCmd::CAMP_UPDATE_HP,
PktBase::NO_SERVER_ERR);
m_cHPUpdateCount = 0;
}
}
break;
case Siege::EMBLEM: // <20><> <20><>¡<EFBFBD><C2A1>
case Siege::GATE: // <20><><EFBFBD><EFBFBD>
case Siege::GUARD: // <20><><EFBFBD><EFBFBD>
case Siege::SHORT_RANGE_CASTLE_ARMS: // <20>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::LONG_RANGE_CASTLE_ARMS: // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (bForce || m_cHPUpdateCount >= MAX_HP_UPDATE_COUNT)
{
GameClientSendPacket::SendCharCastleCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), 0, GetCastleID(), m_dwCID,
GetDefaultNowHP(), 0, PktCastleCmd::CASTLE_UPDATE_HP,
PktBase::NO_SERVER_ERR);
m_cHPUpdateCount = 0;
}
}
break;
case Siege::SHORT_RANGE_SIEGE_ARMS: // <20>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::LONG_RANGE_SIEGE_ARMS: // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::AIRSHIP: // <20><><EFBFBD>ۼ<EFBFBD>
{
if (bForce || m_cHPUpdateCount >= MAX_HP_UPDATE_COUNT)
{
GameClientSendPacket::SendCharSiegeArmsCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), m_dwOwnerID, m_dwCID,
m_CreatureStatus.m_nNowHP, PktSiegeArmsCmd::SIEGE_UPDATE_HP,
PktBase::NO_SERVER_ERR);
m_cHPUpdateCount = 0;
}
}
}
}
}
bool CSiegeObject::IsCamp() const
{
switch ( m_wObjectType )
{
case Siege::CAMP:
case Siege::CAMP_SHOP:
case Siege::MINING_CAMP:
case Siege::KARTERANT_WEAPON:
case Siege::MERKADIA_WEAPON:
return true;
}
return false;
}
bool CSiegeObject::IsCastleObject() const
{
switch ( m_wObjectType )
{
case Siege::EMBLEM :
case Siege::GATE :
case Siege::BACKDOOR :
case Siege::CASTLE_ARMS_NPC :
case Siege::GUARD :
case Siege::SHORT_RANGE_CASTLE_ARMS :
case Siege::LONG_RANGE_CASTLE_ARMS :
{
return true;
}
}
return false;
}
bool CSiegeObject::IsCastleArms() const
{
switch ( m_wObjectType )
{
case Siege::GUARD :
case Siege::SHORT_RANGE_CASTLE_ARMS :
case Siege::LONG_RANGE_CASTLE_ARMS :
case Siege::CASTLE_ARMS_NPC :
{
return true;
}
}
return false;
}
bool CSiegeObject::IsSiegeArms() const
{
switch ( m_wObjectType )
{
case Siege::SHORT_RANGE_SIEGE_ARMS :
case Siege::LONG_RANGE_SIEGE_ARMS :
case Siege::AIRSHIP :
{
return true;
}
}
return false;
}
bool CSiegeObject::IsRidable() const
{
switch ( m_wObjectType )
{
case Siege::SHORT_RANGE_CASTLE_ARMS :
case Siege::LONG_RANGE_CASTLE_ARMS :
case Siege::SHORT_RANGE_SIEGE_ARMS :
case Siege::LONG_RANGE_SIEGE_ARMS :
case Siege::AIRSHIP :
{
return true;
}
}
return false;
}
void CSiegeObject::SetMaterialNum(unsigned char cMaterial)
{
m_cMaterial = cMaterial;
}
void CSiegeObject::SetNation(unsigned char cNation)
{
m_cNation = cNation;
if (IsEmblem() && Creature::STATELESS == cNation)
{
m_cState = Siege::COMPLETE;
m_cSubState = Siege::NONE;
}
}