Files
Leviathan/Client/Game/game/GameSystem/Contents/SHuntaHolicSystem.cpp
T
2026-06-01 12:46:52 +02:00

492 lines
15 KiB
C++

#include "stdafx.h"
#include "SHuntaHolicSystem.h"
//#include "SGameMessageUI.h"
#include "ErrorCode/ErrorCode.h"
#include "SHuntaHolicResourceDB.h"
#include "SWorldLocationDB.h"
#include "TemplateUtil.h"
#include "SStringDB.h" // sonador #2.1.2.11.5
#include "SDebug_Util.h"
namespace hhi = huntaholic_interface;
namespace {
const char* mask_red = "<#ed1c24>";
const char* mask_green = "<#cfff0e>";
const char* mask_blue = "<#0072bc>";
const char* mask_white = "<#fffffff>";
}
SHuntaHolicSystem::SHuntaHolicSystem( const char* name, SContentsManager& contentsMgr )
: SContents( name, contentsMgr )
, mTimeLimit( 0 )
, mGuiLobby( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_LOBBY )
, mGuiInstance( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_INSTANCE )
, mGuiScoreBoard( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_SCOREBOARD )
, mGuiResult( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_RESULT )
, mGuiCreateInstance( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CREATE_INSTANCE )
, mGuiConfirmPassword( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CONFIRM_PASSWORD )
, mGuiPartyCommand( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_PARTY )
, mInstanceStartTime( 0 )
, mIsInHuntaHolic( false )
{
defMsgProc( MSG_HUNTAHOLIC_INSTANCE_LIST, &SHuntaHolicSystem::onInstanceList );
defMsgProc( MSG_HUNTAHOLIC_INSTANCE_INFO, &SHuntaHolicSystem::onInstanceInfo );
defMsgProc( MSG_HUNTAHOLIC_HUNTING_SCORE, &SHuntaHolicSystem::onHuntingScore );
defMsgProc( MSG_HUNTAHOLIC_UPDATE_SCORE, &SHuntaHolicSystem::onUpdateScore );
defMsgProc( MSG_HUNTAHOLIC_BEGIN_HUNTING, &SHuntaHolicSystem::onBeginHunting );
defMsgProc( MSG_CHANGE_LOCATION, &SHuntaHolicSystem::onChangeLocation );
defMsgProc( MSG_RESULT, &SHuntaHolicSystem::onMsgResult );
defMsgProc( MSG_HUNTAHOLIC_MAX_POINT_ACHIEVED, &SHuntaHolicSystem::onMaxPointAchieved ); // sonador #2.1.2.11.5
mMyInstance.init();
}
void SHuntaHolicSystem::process( DWORD time )
{
if( !isHunting() )
return;
AR_TIME currArTime = GetArTime();
AR_TIME huntingPeriod = GetHuntaHolicResourceDB().Find( mLobby.huntaholic_id ).hunting_period * 100;
if( currArTime < mInstanceStartTime )
{
mTimeLimit = huntingPeriod;
}
else
{
mTimeLimit = huntingPeriod - ( currArTime - mInstanceStartTime );
}
if( mGuiScoreBoard )
{
if( mTimeLimit <= 30000 )
mGuiScoreBoard->Perform( hhi::id_updateTimeLimit, hhi::updateTimeLimit( mask_red ) );
else
mGuiScoreBoard->Perform( hhi::id_updateTimeLimit, hhi::updateTimeLimit( mask_green ) );
}
}
void SHuntaHolicSystem::reset()
{
mLobby.init();
mInstanceList.clear();
mMyInstance.init();
mMyScore.init();
mInstanceStartTime = 0;
}
void SHuntaHolicSystem::reqInstanceList( int page ) const
{
TS_CS_HUNTAHOLIC_INSTANCE_LIST reqMsg;
reqMsg.page = page;
mContentsMgr.sendMsg( reqMsg );
}
void SHuntaHolicSystem::reqCreateInstance()
{
mGuiCreateInstance->Perform( hhi::id_setCallBack, hhi::setCallBack( this ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CREATE_INSTANCE, true, true ) );
}
void SHuntaHolicSystem::reqJoinInstance( int index )
{
if( index < 0 || index >= (int)mInstanceList.size() )
return;
mMyInstance = mInstanceList[ index ];
if( mMyInstance.require_password )
{
mGuiConfirmPassword->Perform( hhi::id_setCallBack, hhi::setCallBack( this ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CONFIRM_PASSWORD, true, true ) );
return;
}
TS_CS_HUNTAHOLIC_JOIN_INSTANCE joinMsg;
joinMsg.instance_no = mMyInstance.instance_no;
::memset( joinMsg.password, 0, sizeof( joinMsg.password ) );
mContentsMgr.sendMsg( joinMsg );
}
void SHuntaHolicSystem::reqLeaveInstance() const
{
mContentsMgr.sendMsg( TS_CS_HUNTAHOLIC_LEAVE_INSTANCE() );
}
void SHuntaHolicSystem::reqLeaveHuntaHolic()
{
mContentsMgr.sendMsg( TS_CS_HUNTAHOLIC_LEAVE_LOBBY() );
}
void SHuntaHolicSystem::reqBeginHuntaHolic()
{
mContentsMgr.sendMsg( TS_CS_HUNTAHOLIC_BEGIN_HUNTING() );
}
unsigned int SHuntaHolicSystem::getArTimeLimitByMinutes() const
{
return (unsigned int)( getArTimeLimit() / 6000 );
}
void SHuntaHolicSystem::onCreateInstance( const TS_CS_HUNTAHOLIC_CREATE_INSTANCE& createArg ) const
{
mContentsMgr.sendMsg( createArg );
}
void SHuntaHolicSystem::onConfirmPassword( const char* password ) const
{
TS_CS_HUNTAHOLIC_JOIN_INSTANCE joinMsg;
joinMsg.instance_no = mMyInstance.instance_no;
::strcpy_s( joinMsg.password, password );
mContentsMgr.sendMsg( joinMsg );
}
void* SHuntaHolicSystem::Perform( KID id, KArg& msg )
{
if( id == hhi::id_onCreateInstance )
{
hhi::onCreateInstance* realMsg = static_cast< hhi::onCreateInstance* >( &msg );
onCreateInstance( realMsg->createArg );
}
else if( id == hhi::id_onConfirmPassword )
{
hhi::onConfirmPassword* realMsg = static_cast< hhi::onConfirmPassword* >( &msg );
onConfirmPassword( realMsg->password );
}
return (void*)1;
}
bool SHuntaHolicSystem::isObjCompleted() const
{
return mMyScore.score >= GetHuntaHolicResourceDB().Find( mLobby.huntaholic_id ).objective_point ? true : false;
}
void SHuntaHolicSystem::onInstanceList( SGameMessage* msg )
{
SMSG_HUNTAHOLIC_INSTANCE_LIST* instanceList = static_cast< SMSG_HUNTAHOLIC_INSTANCE_LIST* >( msg );
mLobby.huntaholic_id = instanceList->huntaholic_id;
mLobby.page = ::min( instanceList->page, instanceList->total_page );
mLobby.count = instanceList->count;
mLobby.total_page = instanceList->total_page;
HuntaHolicInstance* instanceInfo = instanceList->instance_info;
mGuiLobby->Perform( hhi::id_refreshLobby );
mInstanceList.clear();
for( int i = 0; i < mLobby.count; ++i )
{
mInstanceList.push_back( *( instanceInfo++ ) );
mGuiLobby->Perform( hhi::id_refreshInstance, hhi::refreshInstance( i ) );
}
if( isInInstance() )
{
mGuiLobby->Perform( hhi::id_disableUserCommand );
}
else
{
mGuiLobby->Perform( hhi::id_enableUserCommand );
}
}
void SHuntaHolicSystem::onInstanceInfo( SGameMessage* msg )
{
SMSG_HUNTAHOLIC_INSTANCE_INFO* instanceInfo = static_cast< SMSG_HUNTAHOLIC_INSTANCE_INFO* >( msg );
mMyInstance = instanceInfo->info;
mGuiInstance->Perform( hhi::id_updateMyInstance );
}
void SHuntaHolicSystem::onHuntingScore( SGameMessage* msg )
{
SMSG_HUNTAHOLIC_HUNTING_SCORE* score = static_cast< SMSG_HUNTAHOLIC_HUNTING_SCORE* >( msg );
mMyScore.huntaholic_id = score->huntaholic_id;
mMyScore.personal_kill_count = score->personal_kill_count;
mMyScore.personal_score = score->personal_score;
mMyScore.kill_count = score->kill_count;
mMyScore.score = score->score;
mMyScore.point_advantage = score->point_advantage;
mMyScore.point_rate = score->point_rate;
mMyScore.gain_point = score->gain_point;
mMyScore.is_retired = score->is_retired;
endHunting();
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_SCOREBOARD, false, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_RESULT, true, false ) );
mMyInstance.init();
mGuiResult->Perform( hhi::id_showResult );
mGuiLobby->Perform( hhi::id_enableUserCommand );
}
void SHuntaHolicSystem::onUpdateScore( SGameMessage* msg )
{
SMSG_HUNTAHOLIC_UPDATE_SCORE* updateScore = static_cast< SMSG_HUNTAHOLIC_UPDATE_SCORE* >( msg );
int scoreDiff = 0;
if( updateScore->score )
scoreDiff = updateScore->score - mMyScore.score;
mMyScore.kill_count = updateScore->kill_count;
mMyScore.score = updateScore->score;
int objectivePoint = GetHuntaHolicResourceDB().Find( mLobby.huntaholic_id ).objective_point;
if( mMyScore.score < objectivePoint )
{
mGuiScoreBoard->Perform( hhi::id_setScoreBoardNormalMode );
mGuiScoreBoard->Perform( hhi::id_updateScore, hhi::updateScore( mask_white ) );
}
else
{
mGuiScoreBoard->Perform( hhi::id_setScoreBoardCompleteMode );
mGuiScoreBoard->Perform( hhi::id_updateScore, hhi::updateScore( mask_blue ) );
}
if( scoreDiff > 2 )
{
mGuiScoreBoard->Perform( hhi::id_updateKillCountByExplosionFx );
}
else if( scoreDiff > 0 )
{
mGuiScoreBoard->Perform( hhi::id_updateKillCountByWaterFallFx );
}
else
{
mGuiScoreBoard->Perform( hhi::id_updateKillCount );
}
}
void SHuntaHolicSystem::onBeginHunting( SGameMessage* msg )
{
SMSG_HUNTAHOLIC_BEGIN_HUNTING* real = static_cast< SMSG_HUNTAHOLIC_BEGIN_HUNTING* >( msg );
beginHunting( real->begin_time );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_LOBBY, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_INSTANCE, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_SCOREBOARD, true ) );
mMyScore.init();
mGuiScoreBoard->Perform( hhi::id_updateTimeLimit, hhi::updateTimeLimit( mask_green ) );
mGuiScoreBoard->Perform( hhi::id_updateScore, hhi::updateScore( mask_white ) );
mGuiScoreBoard->Perform( hhi::id_setScoreBoardNormalMode ); // sonador #2.3.1.42
mGuiScoreBoard->Perform( hhi::id_updateKillCount );
}
// sonador #2.1.2.11.5
void SHuntaHolicSystem::onMaxPointAchieved( SGameMessage* msg )
{
mContentsMgr.sendInterfaceMsg(
SIMSG_REQ_OPEN_MSGBOX(
SIMSG_REQ_OPEN_MSGBOX::MSGBOX_HUNTAHOLIC_MAXPOINT,
S( 999 ),
"huntaholic_have_aquired_max_points" ) );
}
void SHuntaHolicSystem::onChangeLocation( SGameMessage* msg )
{
SMSG_CHANGE_LOCATION* loc = static_cast< SMSG_CHANGE_LOCATION* >( msg );
const WorldLocationBase* locInfo = GetWorldLocationDB().GetWLData( loc->cur_location_id, 0, 0 );
if( !locInfo )
return;
if( locInfo->location_type == WorldLocationBase::LOCTYPE_HUNTAHOLIC_LOBBY ||
locInfo->location_type == WorldLocationBase::LOCTYPE_HUNTAHOLIC_DUNGEON )
enterHuntaHolic();
else
leaveHuntaHolic();
}
void SHuntaHolicSystem::onMsgResult( SGameMessage* msg )
{
SMSG_RESULT* result = static_cast< SMSG_RESULT* >( msg );
switch( result->request_msg_id )
{
case TM_CS_HUNTAHOLIC_CREATE_INSTANCE:
case TM_CS_HUNTAHOLIC_JOIN_INSTANCE:
{
if( result->result == RESULT_SUCCESS )
{
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_LOBBY, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_INSTANCE, true ) );
mGuiInstance->Perform( hhi::id_updateMyInstance );
mGuiLobby->Perform( hhi::id_disableUserCommand );
}
}
break;
case TM_CS_HUNTAHOLIC_LEAVE_INSTANCE:
{
if( result->result == RESULT_SUCCESS )
{
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_INSTANCE, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CREATE_INSTANCE, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CONFIRM_PASSWORD, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_SCOREBOARD, false ) );
mMyInstance.init();
mGuiInstance->Perform( hhi::id_updateMyInstance );
mGuiLobby->Perform( hhi::id_enableUserCommand );
reqInstanceList( mLobby.page );
}
}
break;
case TM_CS_HUNTAHOLIC_LEAVE_LOBBY:
{
// 캐릭터가 헌터홀릭 로비 내에 존재하지 않습니다.(로비 외의 지역에 있습니다)
if( result->result == RESULT_ACCESS_DENIED )
{
}
// 캐릭터가 특정 헌터홀릭 인스턴스 내에 소속되어 있습니다. 소속되어 있는
// 헌터홀릭 인스턴스에서 나간 후에 재시도하여야 합니다.
else if( result->result == RESULT_NOT_ACTABLE )
{
}
// 로비에서 성공적으로 나가는 처리가 이루어져서 곧 워프될 예정입니다.
else if( result->result == RESULT_SUCCESS )
{
leaveHuntaHolic();
}
}
break;
}
}
void SHuntaHolicSystem::enterHuntaHolic()
{
if( !mIsInHuntaHolic )
{
mGuiPartyCommand->Perform( hhi::id_disablePartyCommand );
mIsInHuntaHolic = true;
}
}
void SHuntaHolicSystem::leaveHuntaHolic()
{
if( mIsInHuntaHolic )
{
//
// close all windows
//
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_LOBBY, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_INSTANCE, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_SCOREBOARD, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_RESULT, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CREATE_INSTANCE, false ) );
mContentsMgr.sendInterfaceMsg( SIMSG_SHOW_UIWINDOW( SIMSG_TOGGLE_UIWINDOW::UIWINDOW_HUNTAHOLIC_CONFIRM_PASSWORD, false ) );
mGuiPartyCommand->Perform( hhi::id_enablePartyCommand );
mIsInHuntaHolic = false;
}
}
#if defined( __TEST_HUNTAHOLICSYSTEM )
void testInputInfo( HuntaHolicInstance& info, int no, const char* name, int memberCount, int maxMemberCount, bool reqPW )
{
info.instance_no = no;
::strcpy_s( info.name, name );
info.current_member_count = memberCount;
info.max_member_count = maxMemberCount;
info.require_password = reqPW;
}
void SHuntaHolicSystem::testInstanceList()
{
SMSG_HUNTAHOLIC_INSTANCE_LIST* instanceList = new SMSG_HUNTAHOLIC_INSTANCE_LIST();
mLobby.huntaholic_id = 1000;
mLobby.page = 1;
mLobby.count = 18;
mLobby.total_page = 1;
mGuiLobby->Perform( hhi::id_refreshLobby );
{
HuntaHolicInstance sample;
testInputInfo( sample, 0, "1", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 1, "2", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 2, "3", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 3, "4", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 4, "5", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 5, "6", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 6, "7", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 7, "8", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 8, "9", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample, 9, "10", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,10, "11", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,11, "12", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,12, "13", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,13, "14", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,14, "15", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,15, "16", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,16, "17", 1, 4, true );
mInstanceList.push_back( sample );
testInputInfo( sample,17, "18", 1, 4, true );
mInstanceList.push_back( sample );
}
for( int i = 0; i < 18; ++i )
mGuiLobby->Perform( hhi::id_refreshInstance, hhi::refreshInstance( i ) );
}
#endif