[Client] MONSTER_OBJECT class

10/26/2022 13:26 lnwnuyhodd#1
Code:
MONSTER_OBJECT *__thiscall MONSTER_OBJECT::MONSTER_OBJECT(MONSTER_OBJECT *this)
{
    this->mCheckValidState = 0;
    return this;
}

void __thiscall MONSTER_OBJECT::Init(MONSTER_OBJECT *this)
{
    this->mCheckValidState = 0;
}

void __thiscall MONSTER_OBJECT::Free(MONSTER_OBJECT *this)
{
    this->mCheckValidState = 0;
}

void __thiscall MONSTER_OBJECT::PlayActionSound(MONSTER_OBJECT *This, int tObjIndex)
{
    GSOUND *v2; // eax

    if ( This->mCheckValidState )
    {
        v2 = GDATA::ReturnMonsterSound(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
        GSOUND::Play3(v2, This->mDATA.mAction.aLocation, mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation);
    }
}

void __thiscall MONSTER_OBJECT::Draw(MONSTER_OBJECT *This, int tDrawSort, int tObjIndex, float dTime)
{
    float tHeightForCulling; // [esp+Ch] [ebp-38h]
    float tHeightForCullingb; // [esp+Ch] [ebp-38h]
    float tHeightForCullinga; // [esp+Ch] [ebp-38h]
    float tHeightForCullingc; // [esp+Ch] [ebp-38h]
    float tLength; // [esp+14h] [ebp-30h]
    int v10; // [esp+20h] [ebp-24h]
    int v11; // [esp+24h] [ebp-20h]
    int v12; // [esp+28h] [ebp-1Ch]
    float tAngle; // [esp+2Ch] [ebp-18h] BYREF
    float v14; // [esp+30h] [ebp-14h]
    float v15; // [esp+34h] [ebp-10h]
    int v16; // [esp+38h] [ebp-Ch]
    int v17; // [esp+3Ch] [ebp-8h]
    GMOTION *tMOTION; // [esp+40h] [ebp-4h]

    if ( !This->mCheckValidState )
        return;
    if ( tDrawSort < 1 )
        return;
    if ( tDrawSort > 2 )
        return;
    tLength = This->mMONSTER_INFO->mSize[1];
    if ( !UTIL::CheckPossibleDrawMeWithCamera(This->mDATA.mAction.aLocation, tLength) )
        return;
    tAngle = 0.0;
    v14 = This->mDATA.mAction.aFront;
    v15 = 0.0;
    if ( This->mMONSTER_INFO->mIndex >= 589 && This->mMONSTER_INFO->mIndex <= 600 )
    {
        v12 = CHUGSOUNG_WAR_UI::ZoneIndex(mMYINFO[0].mPresentZoneNumber);
        if ( v12 != -1 )
        {
            v10 = mCHUGSOUNG_WAR_UI[0].c[v12] % 100;
            v11 = mCHUGSOUNG_WAR_UI[0].c[v12] / 100;
            if ( v11 == 1 || v11 == 3 || v11 == 5 || v11 == 7 )
            {
                v17 = UTIL::ReturnChugSoungWarObject(v10, v11);
                if ( v17 != -1 )
                {
                    GMOBJECT::DisplayMObject(&mGDATA[0].mMOB_004[v17], tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, &tAngle, 1);
                    if ( This->mDATA.mAction.aFrame >= 41.0 )
                        This->mDATA.mAction.aFrame = 0.0;
                }
                return;
            }
            if ( v10 == 3 )
                GMOBJECT::DisplayMObject(&mGDATA[0].mMOB_005[v11 / 2 + 235], tDrawSort, 0.0, This->mDATA.mAction.aLocation, &tAngle, 1);
        }
    }
    tMOTION = GDATA::ReturnMonsterMotion(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    tHeightForCulling = This->mMONSTER_INFO->mSize[1];
    if ( This->c26 )
        GSOBJECT::DisplaySObject(mGDATA[0].mNPC[This->mMONSTER_INFO->mDataSortNumber + 65], tDrawSort, 0.0, This->c33, This->cFront, tHeightForCulling, tMOTION, 1);
    else
        GSOBJECT::DisplaySObject(mGDATA[0].mNPC[This->mMONSTER_INFO->mDataSortNumber + 65], tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCulling, tMOTION, 1);
    if ( This->mMONSTER_INFO->mType != 2 )
    {
        if ( This->mMONSTER_INFO->mIndex == 1141 || This->mMONSTER_INFO->mIndex == 1142 || This->mMONSTER_INFO->mIndex == 1143 || This->mMONSTER_INFO->mIndex == 1144 )
        {
            tHeightForCullinga = This->mMONSTER_INFO->mSize[1];
            if ( This->mDATA.mLifeValue > 0 )
                GSOBJECT::DisplaySObject(mGDATA[0].mMONSTER_HEAD[4 * This->mMONSTER_INFO->mDataSortNumber + 296], tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullinga, tMOTION, 1);
            else
                GSOBJECT::DisplaySObject((576 * (This->mMONSTER_INFO->mDataSortNumber - 1) + 15907192), tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullinga, tMOTION, 1);
            goto LABEL_34;
        }
        goto LABEL_33;
    }
    if ( mGAMEOPTION[0].mMetureMode != 1 )
    {
LABEL_33:
        tHeightForCullingc = This->mMONSTER_INFO->mSize[1];
        GSOBJECT::DisplaySObject(mGDATA[0].mMONSTER_HEAD[4 * This->mMONSTER_INFO->mDataSortNumber + 296], tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullingc, tMOTION, 1);
        goto LABEL_34;
    }
    v16 = 3 - (This->mDATA.mLifeValue * 100.0 / This->mMONSTER_INFO->mLife) / 30;
    tHeightForCullingb = This->mMONSTER_INFO->mSize[1];
    GSOBJECT::DisplaySObject(&mGDATA[0].mMONSTER_HEAD[4 * This->mMONSTER_INFO->mDataSortNumber + 296][v16], tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullingb, tMOTION, 1);
LABEL_34:
    tAngle = 0.0;
    v14 = This->mDATA.mAction.aFront;
    v15 = 0.0;
    switch ( This->mDATA.mAction.aSort )
    {
        case 0:
            v17 = UTIL::ReturnMonsterCreateObject(This->mMONSTER_INFO->mDataSortNumber);
            if ( v17 != -1 )
                goto LABEL_42;
            break;
        case 5:
            v17 = UTIL::ReturnMonsterAttackObject(This->mMONSTER_INFO->mDataSortNumber);
            if ( v17 != -1 )
                goto LABEL_42;
            break;
        case 7:
            v17 = UTIL::ReturnMonsterSkillObject(This->mMONSTER_INFO->mDataSortNumber);
            if ( v17 != -1 )
                goto LABEL_42;
            break;
        case 12:
            v17 = UTIL::ReturnMonsterDeathObject(This->mMONSTER_INFO->mDataSortNumber);
            if ( v17 != -1 )
LABEL_42:
                GMOBJECT::DisplayMObject(&mGDATA[0].mMOB_004[v17], tDrawSort, This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, &tAngle, 0);
            break;
        default:
            break;
    }
    if ( This->c36 )
        GMOBJECT::DisplayMObject(&mGDATA[0].mMOB_005[67], tDrawSort, This->c37, This->mDATA.mAction.aLocation, &tAngle, 0);
    if ( This->c38 )
        GMOBJECT::DisplayMObject(&mGDATA[0].mMOB_005[68], tDrawSort, This->c39, This->mDATA.mAction.aLocation, &tAngle, 0);
    if ( This->c40 )
        GMOBJECT::DisplayMObject(&mGDATA[0].mMOB_004[138], tDrawSort, This->c41, This->mDATA.mAction.aLocation, &tAngle, 0);
}

void __thiscall MONSTER_OBJECT::DrawLowShadow(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    float tHeightForCulling; // [esp+Ch] [ebp-1Ch]
    float tHeightForCullinga; // [esp+Ch] [ebp-1Ch]
    float tHeightForCullingb; // [esp+Ch] [ebp-1Ch]
    float tLength; // [esp+18h] [ebp-10h]
    GMOTION *tMOTION; // [esp+24h] [ebp-4h]

    if ( This->mCheckValidState )
    {
        if ( UTIL::ReturnLengthXYZ(This->mDATA.mAction.aLocation, mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation) <= 300.0 )
        {
            tLength = This->mMONSTER_INFO->mSize[1];
            if ( UTIL::CheckPossibleDrawMeWithCamera(This->mDATA.mAction.aLocation, tLength) )
            {
                tMOTION = GDATA::ReturnMonsterMotion(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
                tHeightForCulling = This->mMONSTER_INFO->mSize[1];
                if ( This->c26 )
                    GSOBJECT::DisplaySObjectLowShadow(mGDATA[0].mNPC[This->mMONSTER_INFO->mDataSortNumber + 65], 0.0, This->c33, This->cFront, tHeightForCulling, &mGDATA[0].mZONE, tMOTION, 1);
                else
                    GSOBJECT::DisplaySObjectLowShadow(mGDATA[0].mNPC[This->mMONSTER_INFO->mDataSortNumber + 65], This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCulling, &mGDATA[0].mZONE, tMOTION, 1);
                if ( This->mMONSTER_INFO->mType == 2 )
                {
                    tHeightForCullinga = This->mMONSTER_INFO->mSize[1];
                    if ( mGAMEOPTION[0].mMetureMode == 1 )
                    {
                        GSOBJECT::DisplaySObjectLowShadow(&mGDATA[0].mMONSTER_HEAD[4 * This->mMONSTER_INFO->mDataSortNumber + 296][3 - (This->mDATA.mLifeValue * 100.0 / This->mMONSTER_INFO->mLife) / 30], This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullinga, &mGDATA[0].mZONE, tMOTION, 1);
                        return;
                    }
                    goto LABEL_10;
                }
                if ( This->mMONSTER_INFO->mIndex == 1141 || This->mMONSTER_INFO->mIndex == 1142 || This->mMONSTER_INFO->mIndex == 1143 || This->mMONSTER_INFO->mIndex == 1144 )
                {
                    tHeightForCullinga = This->mMONSTER_INFO->mSize[1];
                    if ( This->mDATA.mLifeValue > 0 )
                    {
LABEL_10:
                        GSOBJECT::DisplaySObjectLowShadow(mGDATA[0].mMONSTER_HEAD[4 * This->mMONSTER_INFO->mDataSortNumber + 296], This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullinga, &mGDATA[0].mZONE, tMOTION, 1);
                        return;
                    }
                    GSOBJECT::DisplaySObjectLowShadow((576 * (This->mMONSTER_INFO->mDataSortNumber - 1) + 15907192), This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullinga, &mGDATA[0].mZONE, tMOTION, 1);
                }
                else
                {
                    tHeightForCullingb = This->mMONSTER_INFO->mSize[1];
                    GSOBJECT::DisplaySObjectLowShadow(mGDATA[0].mMONSTER_HEAD[4 * This->mMONSTER_INFO->mDataSortNumber + 296], This->mDATA.mAction.aFrame, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, tHeightForCullingb, &mGDATA[0].mZONE, tMOTION, 1);
                }
            }
        }
    }
}

void __thiscall MONSTER_OBJECT::DrawInfo(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v3; // eax
    float tLength; // [esp+0h] [ebp-18h]
    float tCoord[3]; // [esp+Ch] [ebp-Ch] BYREF

    if ( This->mCheckValidState )
    {
        tLength = This->mMONSTER_INFO->mSize[1];
        if ( UTIL::CheckPossibleDrawMeWithCamera(This->mDATA.mAction.aLocation, tLength) )
        {
            tCoord[0] = This->mDATA.mAction.aLocation[0];
            tCoord[1] = (This->mMONSTER_INFO->mSize[1] + This->mMONSTER_INFO->mSize[3] + 1) + This->mDATA.mAction.aLocation[1];
            tCoord[2] = This->mDATA.mAction.aLocation[2];
            v3 = UTIL::ReturnMonsterNameColor(This);
            UTIL::DrawFont3D(This->mMONSTER_INFO->mName, tCoord, v3);
        }
    }
}

void __thiscall MONSTER_OBJECT::InitForCreate(MONSTER_OBJECT *This, int tObjIndex)
{
    int v2; // [esp+0h] [ebp-14h]
    int v3; // [esp+4h] [ebp-10h]
    int i; // [esp+10h] [ebp-4h]
    int j; // [esp+10h] [ebp-4h]

    if ( This->mCheckValidState )
    {
        This->c02 = 0;
        This->c26 = 0;
        This->c36 = 0;
        This->c38 = 0;
        This->c40 = 0;
        switch ( This->mMONSTER_INFO->mDataSortNumber )
        {
            case 42:
            case 44:
            case 46:
            case 59:
            case 61:
            case 64:
            case 65:
            case 67:
            case 74:
            case 75:
            case 76:
            case 85:
            case 89:
                v3 = This->mMONSTER_INFO->mSpecialType;
                if ( v3 >= 2 && v3 <= 6 )
                {
                    for ( i = 0; i < mPLAY[0].MAX_EFFECT_OBJECT && mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState; ++i )
                        ;
                    if ( i < mPLAY[0].MAX_EFFECT_OBJECT )
                        EFFECT_OBJECT::SetZone175TypeMonsterEffect(&mPLAY[0].mEFFECT_OBJECT[i], 1, This);
                }
                break;
            case 48:
            case 53:
            case 62:
            case 66:
            case 72:
            case 81:
                v2 = This->mMONSTER_INFO->mSpecialType;
                if ( v2 >= 2 && v2 <= 6 )
                {
                    for ( j = 0; j < mPLAY[0].MAX_EFFECT_OBJECT && mPLAY[0].mEFFECT_OBJECT[j].mCheckValidState; ++j )
                        ;
                    if ( j < mPLAY[0].MAX_EFFECT_OBJECT )
                        EFFECT_OBJECT::SetZone175TypeMonsterEffect(&mPLAY[0].mEFFECT_OBJECT[j], 2, This);
                }
                break;
            default:
                return;
        }
    }
}

void __thiscall MONSTER_OBJECT::InitForAction(MONSTER_OBJECT *This, int tObjIndex)
{
    double v2; // st7
    GMOTION *v3; // eax
    int v4; // [esp+1Ch] [ebp-60h]
    int v5; // [esp+20h] [ebp-5Ch]
    float v6; // [esp+2Ch] [ebp-50h]
    float v7; // [esp+30h] [ebp-4Ch]
    float v8; // [esp+34h] [ebp-48h]
    float v9; // [esp+38h] [ebp-44h]
    float v11; // [esp+54h] [ebp-28h]
    float v12; // [esp+58h] [ebp-24h]
    float v13; // [esp+5Ch] [ebp-20h]
    float v14; // [esp+5Ch] [ebp-20h]
    float v15; // [esp+64h] [ebp-18h]
    float v16; // [esp+64h] [ebp-18h]
    float tCoord[3]; // [esp+68h] [ebp-14h] BYREF
    int i; // [esp+74h] [ebp-8h]
    float v19; // [esp+78h] [ebp-4h]

    if ( This->mCheckValidState )
    {
        MONSTER_OBJECT::PlayActionSound(This, tObjIndex);
        This->c02 = 0;
        This->c23 = 0;
        switch ( This->mDATA.mAction.aSort )
        {
            case 0:
                if ( This->mMONSTER_INFO->mType == 4 )
                {
                    if ( (mMYINFO[0].mUseAvatar.aQuestInfo[2] == 1 || mMYINFO[0].mUseAvatar.aQuestInfo[2] == 5) && mMYINFO[0].mUseAvatar.aQuestInfo[3] == This->mMONSTER_INFO->mIndex )
                    {
                        if ( strcmp(This->mMONSTER_INFO->mChatInfo, aEmptyChar) )
                        {
                            This->c36 = 1;
                            This->c37 = 0.0;
                            BOARDUI::Set(mBOARDUI, 6, 1, This->mMONSTER_INFO->mChatInfo, aEmptyChar);
                        }
                    }
                }
                else
                {
                    if ( strcmp(This->mMONSTER_INFO->mChatInfo, aEmptyChar) )
                        BOARDUI::Set(mBOARDUI, 8, 1, This->mMONSTER_INFO->mChatInfo, aEmptyChar);
                    if ( This->mMONSTER_INFO->mIndex >= 589 && This->mMONSTER_INFO->mIndex <= 600 )
                        GSOUND::Play3(&mGDATA[0].mSOUND_05[398], This->mDATA.mAction.aLocation, mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation);
                }
                return;
            case 5:
                switch ( This->mMONSTER_INFO->mAttackType )
                {
                    case 1:
                    case 2:
                        This->c02 = 1;
                        This->c03 = 1;
                        This->c04 = 1;
                        This->c05 = 0;
                        break;
                    case 3:
                    case 4:
                        if ( UTIL::ReturnMonsterBulletObject(This->mMONSTER_INFO->mDataSortNumber) == -1 )
                        {
                            This->c02 = 1;
                            This->c03 = 1;
                        }
                        else
                        {
                            This->c02 = 1;
                            This->c03 = 2;
                        }
                        This->c04 = 1;
                        This->c05 = 0;
                        break;
                    case 5:
                    case 6:
                        This->c02 = 1;
                        This->c03 = 1;
                        This->c04 = 2;
                        This->c05 = 0;
                        break;
                    default:
                        return;
                }
                return;
            case 7:
                This->c02 = 1;
                This->c03 = 0;
                This->c04 = 0;
                This->c05 = 0;
                return;
            case 12:
                This->c23 = 1;
                if ( This->c19 )
                    v2 = (2 * This->mMONSTER_INFO->mDeathSpeed);
                else
                    v2 = This->mMONSTER_INFO->mDeathSpeed;
                This->mDeathSpeedFrame = v2;
                if ( This->mDATA.mAction.aSkillNumber == 1 )
                {
                    if ( mGAMEOPTION[0].mMetureMode == 1 )
                    {
                        This->c26 = 1;
                        v12 = This->mDATA.mAction.aFront * 0.01745329238474369;
                        v9 = sin(v12);
                        v13 = v9;
                        v11 = This->mDATA.mAction.aFront * 0.01745329238474369;
                        v8 = cos(v11);
                        v15 = v8;
                        v7 = v8 * v8 + 0.0 * 0.0 + v13 * v13;
                        v6 = sqrt(v7);
                        v19 = v6;
                        if ( v6 > 0.0 )
                        {
                            v13 = v9 / v19;
                            v15 = v8 / v19;
                        }
                        v14 = v13 * 50.0;
                        v16 = v15 * 50.0;
                        This->c27[0] = v14;
                        This->c27[1] = (rand() % 51 + 50);
                        This->c27[2] = v16;
                        This->c30 = rand() % 6 + 5;
                        This->c31 = 0;
                        v3 = GDATA::ReturnMonsterMotion(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
                        GSOBJECT::GetSObjectCoord(&mGDATA[0].mMONSTER_BODY[299][This->mMONSTER_INFO->mDataSortNumber + 3], 1, tCoord, 0.0, This->mDATA.mAction.aLocation, This->mDATA.mAction.aFront, v3, 1);
                        This->c32 = tCoord[1] - This->mDATA.mAction.aLocation[1];
                        CopyMemory(This->c33, This->mDATA.mAction.aLocation, 12);
                        This->cFront = This->mDATA.mAction.aFront;
                    }
                }
                else if ( This->mMONSTER_INFO->mIndex < 589 || This->mMONSTER_INFO->mIndex > 600 )
                {
                    GSOUND::Play3(&mGDATA[0].mSOUND_05[289], This->mDATA.mAction.aLocation, mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation);
                }
                else
                {
                    GSOUND::Play3(&mGDATA[0].mSOUND_05[399], This->mDATA.mAction.aLocation, mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation);
                }
                if ( This->mMONSTER_INFO->mDamageType != 2 )
                    goto LABEL_58;
                for ( i = 0; i < mPLAY[0].MAX_EFFECT_OBJECT && mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState; ++i )
                    ;
                if ( i == mPLAY[0].MAX_EFFECT_OBJECT )
                    goto LABEL_58;
                if ( This->mDATA.mAction.aSkillNumber == 1 )
                {
                    EFFECT_OBJECT::SetBloodForMonster(&mPLAY[0].mEFFECT_OBJECT[i], This, 7);
                }
                else
                {
                    v5 = This->c14;
                    if ( v5 != 1 )
                    {
                        if ( v5 != 2 )
                            goto LABEL_58;
LABEL_56:
                        EFFECT_OBJECT::SetBloodForMonster(&mPLAY[0].mEFFECT_OBJECT[i], This, 5);
                        goto LABEL_58;
                    }
                    v4 = This->c15;
                    switch ( v4 )
                    {
                        case 1:
                            EFFECT_OBJECT::SetBloodForMonster(&mPLAY[0].mEFFECT_OBJECT[i], This, 4);
                            break;
                        case 2:
                            goto LABEL_56;
                        case 3:
                            EFFECT_OBJECT::SetBloodForMonster(&mPLAY[0].mEFFECT_OBJECT[i], This, 6);
                            break;
                    }
                }
LABEL_58:
                if ( This->mMONSTER_INFO->mType == 4 )
                {
                    if ( (mMYINFO[0].mUseAvatar.aQuestInfo[2] == 1 || mMYINFO[0].mUseAvatar.aQuestInfo[2] == 5) && mMYINFO[0].mUseAvatar.aQuestInfo[3] == This->mMONSTER_INFO->mIndex && strcmp(This->mMONSTER_INFO->mChatInfo[1], aEmptyChar) )
                    {
                        This->c38 = 1;
                        This->c39 = 0.0;
                        BOARDUI::Set(mBOARDUI, 7, 1, This->mMONSTER_INFO->mChatInfo[1], aEmptyChar);
                    }
                }
                else if ( strcmp(This->mMONSTER_INFO->mChatInfo[1], aEmptyChar) )
                {
                    BOARDUI::Set(mBOARDUI, 9, 1, This->mMONSTER_INFO->mChatInfo[1], aEmptyChar);
                }
                break;
            default:
                return;
        }
    }
}

void __thiscall MONSTER_OBJECT::Update(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    float tPostYCoord; // [esp+20h] [ebp-48h]
    int v4; // [esp+28h] [ebp-40h]
    int v5; // [esp+2Ch] [ebp-3Ch]
    int v6; // [esp+34h] [ebp-34h]
    char v8[4]; // [esp+48h] [ebp-20h] BYREF
    float v9; // [esp+4Ch] [ebp-1Ch]
    int i; // [esp+54h] [ebp-14h]
    int v11; // [esp+58h] [ebp-10h]
    float x; // [esp+5Ch] [ebp-Ch] BYREF
    float y[2]; // [esp+60h] [ebp-8h] BYREF

    if ( This->mCheckValidState )
    {
        if ( This->c36 )
        {
            This->c37 = dTime * 30.0 + This->c37;
            if ( This->c37 >= GMOBJECT::GetTotalFrameNum(&mGDATA[0].mMOB_005[67], 0) )
                This->c36 = 0;
        }
        if ( This->c38 )
        {
            This->c39 = dTime * 30.0 + This->c39;
            if ( This->c39 >= GMOBJECT::GetTotalFrameNum(&mGDATA[0].mMOB_005[68], 0) )
                This->c38 = 0;
        }
        if ( This->c40 )
        {
            This->c41 = dTime * 30.0 + This->c41;
            if ( This->c41 >= GMOBJECT::GetTotalFrameNum(&mGDATA[0].mMOB_004[138], 0) )
                This->c40 = 0;
        }
        v6 = This->mDATA.mAction.aSort;
        if ( v6 == 5 )
        {
            if ( This->c02 == 1 )
            {
                v11 = 0;
                if ( This->c05 )
                {
                    if ( !PLAY::CheckMAttackFrame(This->mMONSTER_INFO, This->mDATA.mAction.aFrame) )
                        This->c05 = 0;
                }
                else if ( PLAY::CheckMAttackFrame(This->mMONSTER_INFO, This->mDATA.mAction.aFrame) )
                {
                    This->c05 = 1;
                    v11 = 1;
                }
                if ( v11 == 1 )
                {
                    if ( This->mMONSTER_INFO->mDataSortNumber == 113 || This->mMONSTER_INFO->mSpecialType == 18 )
                        goto LABEL_32;
                    for ( i = 0; i < mPLAY[0].MAX_AVATAR_OBJECT && (!mPLAY[0].mAVATAR_OBJECT[i].mCheckValidState || mPLAY[0].mAVATAR_OBJECT[i].mServerIndex != This->mDATA.mAction.aTargetObjectIndex || mPLAY[0].mAVATAR_OBJECT[i].mUniqueNumber != This->mDATA.mAction.aTargetObjectUniqueNumber); ++i )
                        ;
                    if ( i != mPLAY[0].MAX_AVATAR_OBJECT )
                    {
LABEL_32:
                        v5 = This->c03;
                        if ( v5 == 1 )
                        {
                            v4 = This->c04;
                            if ( v4 == 1 )
                            {
                                MONSTER_OBJECT::ProcessGAttackPacket(This);
                            }
                            else if ( v4 == 2 )
                            {
                                MONSTER_OBJECT::ProcessRAttackPacket(This);
                            }
                        }
                        else if ( v5 == 2 )
                        {
                            MONSTER_OBJECT::ProcessBAttackPacket(This);
                        }
                    }
                }
            }
        }
        else if ( v6 == 7 && This->c02 == 1 )
        {
            v11 = 0;
            if ( This->c05 )
            {
                if ( !PLAY::CheckMSkillFrame(This->mMONSTER_INFO, This->mDATA.mAction.aFrame) )
                    This->c05 = 0;
            }
            else if ( PLAY::CheckMSkillFrame(This->mMONSTER_INFO, This->mDATA.mAction.aFrame) )
            {
                This->c05 = 1;
                v11 = 1;
            }
            if ( v11 == 1 )
                MONSTER_OBJECT::ProcessSAttackPacket(This);
        }
        if ( This->c26 )
        {
            if ( This->c31 < This->c30 )
            {
                CopyMemory(v8, This->c33, 12);
                This->c27[1] = dTime * -300.0 + This->c27[1];
                This->c33[0] = This->c27[0] * dTime + This->c33[0];
                This->c33[1] = This->c27[1] * dTime + This->c33[1];
                This->c33[2] = This->c27[2] * dTime + This->c33[2];
                CopyMemory(&x, This->c33, 12);
                tPostYCoord = v9 + 20.0;
                if ( WORLD_FOR_GXD::GetYCoord(&mGDATA[0].mZONE.mWORLD, x, y[1], y, 1, tPostYCoord, 0, 0) )
                {
                    if ( This->c33[1] < y[0] - This->c32 )
                    {
                        ++This->c31;
                        This->c33[1] = y[0] - This->c32;
                        if ( This->c31 == 1 )
                            GSOUND::Play3(&mGDATA[0].mSOUND_05[26], This->c33, mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation);
                    }
                }
            }
        }
        switch ( This->mDATA.mAction.aSort )
        {
            case 0:
                MONSTER_OBJECT::A001(This, tObjIndex, dTime);
                break;
            case 1:
                MONSTER_OBJECT::A002(This, tObjIndex, dTime);
                break;
            case 3:
                MONSTER_OBJECT::A004(This, tObjIndex, dTime);
                break;
            case 4:
                MONSTER_OBJECT::A005(This, tObjIndex, dTime);
                break;
            case 5:
                MONSTER_OBJECT::A006(This, tObjIndex, dTime);
                break;
            case 7:
                MONSTER_OBJECT::A008(This, tObjIndex, dTime);
                break;
            case 8:
                MONSTER_OBJECT::A009(This, tObjIndex, dTime);
                break;
            case 12:
                MONSTER_OBJECT::A013(This, tObjIndex, dTime);
                break;
            case 19:
                MONSTER_OBJECT::A020(This, tObjIndex, dTime);
                break;
            default:
                return;
        }
    }
}

void __thiscall MONSTER_OBJECT::ProcessGAttackPacket(MONSTER_OBJECT *This)
{
    ATTACK_FOR_PROTOCOL tAttackInfo; // [esp+4h] [ebp-48h] BYREF

    if ( mPLAY[0].mAVATAR_OBJECT[0].mServerIndex == This->mDATA.mAction.aTargetObjectIndex && mPLAY[0].mAVATAR_OBJECT[0].mUniqueNumber == This->mDATA.mAction.aTargetObjectUniqueNumber )
    {
        tAttackInfo.mCase = 4;
        tAttackInfo.mServerIndex1 = This->mIndex;
        tAttackInfo.mUniqueNumber1 = This->mUniqueNumber;
        tAttackInfo.mServerIndex2 = mPLAY[0].mAVATAR_OBJECT[0].mServerIndex;
        tAttackInfo.mUniqueNumber2 = mPLAY[0].mAVATAR_OBJECT[0].mUniqueNumber;
        tAttackInfo.mSenderLocation[0] = mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[0];
        tAttackInfo.mSenderLocation[1] = mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[1];
        tAttackInfo.mSenderLocation[2] = mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[2];
        tAttackInfo.mAttackActionValue1 = 1;
        tAttackInfo.mAttackActionValue2 = 0;
        tAttackInfo.mAttackActionValue3 = 0;
        tAttackInfo.mAttackActionValue4 = 0;
        TRANSFER::T_PROCESS_ATTACK_SEND(&tAttackInfo);
    }
}

void __thiscall MONSTER_OBJECT::ProcessRAttackPacket(MONSTER_OBJECT *This)
{
    ATTACK_FOR_PROTOCOL tAttackInfo; // [esp+4h] [ebp-48h] BYREF

    if ( This->mMONSTER_INFO->mRadiusInfo[0] >= UTIL::ReturnLengthXYZ(mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation, This->mDATA.mAction.aLocation) )
    {
        tAttackInfo.mCase = 4;
        tAttackInfo.mServerIndex1 = This->mIndex;
        tAttackInfo.mUniqueNumber1 = This->mUniqueNumber;
        tAttackInfo.mServerIndex2 = mPLAY[0].mAVATAR_OBJECT[0].mServerIndex;
        tAttackInfo.mUniqueNumber2 = mPLAY[0].mAVATAR_OBJECT[0].mUniqueNumber;
        tAttackInfo.mSenderLocation[0] = mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[0];
        tAttackInfo.mSenderLocation[1] = mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[1];
        tAttackInfo.mSenderLocation[2] = mPLAY[0].mAVATAR_OBJECT[0].mDATA.aAction.aLocation[2];
        tAttackInfo.mAttackActionValue1 = 1;
        tAttackInfo.mAttackActionValue2 = 0;
        tAttackInfo.mAttackActionValue3 = 0;
        tAttackInfo.mAttackActionValue4 = 0;
        TRANSFER::T_PROCESS_ATTACK_SEND(&tAttackInfo);
    }
}

void __thiscall MONSTER_OBJECT::ProcessBAttackPacket(MONSTER_OBJECT *This)
{
    int i; // [esp+Ch] [ebp-4h]

    for ( i = 0; i < mPLAY[0].MAX_EFFECT_OBJECT && mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState; ++i )
        ;
    if ( i != mPLAY[0].MAX_EFFECT_OBJECT )
    {
        mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState = 1;
        mPLAY[0].mEFFECT_OBJECT[i].mObjType = 3;
        mPLAY[0].mEFFECT_OBJECT[i].mObjSort = 2;
        mPLAY[0].mEFFECT_OBJECT[i].mServerIndex = This->mIndex;
        mPLAY[0].mEFFECT_OBJECT[i].mUniqueNumber = This->mUniqueNumber;
        mPLAY[0].mEFFECT_OBJECT[i].mDataSortNumber = This->mMONSTER_INFO->mDataSortNumber;
        mPLAY[0].mEFFECT_OBJECT[i].bb05 = 1;
        mPLAY[0].mEFFECT_OBJECT[i].mTargetObjectIndex = This->mDATA.mAction.aTargetObjectIndex;
        mPLAY[0].mEFFECT_OBJECT[i].mTargetObjectUniqueNumber = This->mDATA.mAction.aTargetObjectUniqueNumber;
        mPLAY[0].mEFFECT_OBJECT[i].bb08 = 0;
        mPLAY[0].mEFFECT_OBJECT[i].bb11 = 0;
        if ( This->mMONSTER_INFO->mDataSortNumber == 113 )
        {
            mPLAY[0].mEFFECT_OBJECT[i].bb08 = 1;
            switch ( This->mMONSTER_INFO->mSpecialType )
            {
                case 18:
                    mPLAY[0].mEFFECT_OBJECT[i].bb09 = 0;
                    break;
                case 35:
                    mPLAY[0].mEFFECT_OBJECT[i].bb09 = !mMYINFO[0].mUseAvatar.aTribe || mMYINFO[0].mUseAvatar.aTribe == PLAY::ReturnAllianceTribe(0);
                    break;
                case 36:
                    mPLAY[0].mEFFECT_OBJECT[i].bb09 = mMYINFO[0].mUseAvatar.aTribe == 1 || mMYINFO[0].mUseAvatar.aTribe == PLAY::ReturnAllianceTribe(1);
                    break;
                case 37:
                    mPLAY[0].mEFFECT_OBJECT[i].bb09 = mMYINFO[0].mUseAvatar.aTribe == 2 || mMYINFO[0].mUseAvatar.aTribe == PLAY::ReturnAllianceTribe(2);
                    break;
                case 38:
                    mPLAY[0].mEFFECT_OBJECT[i].bb09 = mMYINFO[0].mUseAvatar.aTribe == 3 || mMYINFO[0].mUseAvatar.aTribe == PLAY::ReturnAllianceTribe(3);
                    break;
                default:
                    break;
            }
            mPLAY[0].mEFFECT_OBJECT[i].bb10 = 0.0;
        }
        mPLAY[0].mEFFECT_OBJECT[i].mMObjectIdx = UTIL::ReturnMonsterBulletObject(This->mMONSTER_INFO->mDataSortNumber);
        if ( mPLAY[0].mEFFECT_OBJECT[i].mMObjectIdx == -1 )
        {
            mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState = 0;
        }
        else
        {
            mPLAY[0].mEFFECT_OBJECT[i].mFrame = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[0] = This->mDATA.mAction.aLocation[0];
            mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[1] = This->mMONSTER_INFO->mBulletInfo[0] + This->mDATA.mAction.aLocation[1];
            mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[2] = This->mDATA.mAction.aLocation[2];
            mPLAY[0].mEFFECT_OBJECT[i].mAngle[0] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAngle[1] = This->mDATA.mAction.aFront;
            mPLAY[0].mEFFECT_OBJECT[i].mAngle[2] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mLocation[0] = mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[0];
            mPLAY[0].mEFFECT_OBJECT[i].mLocation[1] = mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[1];
            mPLAY[0].mEFFECT_OBJECT[i].mLocation[2] = mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[2];
            mPLAY[0].mEFFECT_OBJECT[i].mTargetLocation[0] = This->mDATA.mAction.aTargetLocation[0];
            mPLAY[0].mEFFECT_OBJECT[i].mTargetLocation[1] = This->mDATA.mAction.aTargetLocation[1];
            mPLAY[0].mEFFECT_OBJECT[i].mTargetLocation[2] = This->mDATA.mAction.aTargetLocation[2];
            mPLAY[0].mEFFECT_OBJECT[i].cc01 = This->mMONSTER_INFO->mBulletInfo[1];
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mCase = 4;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mServerIndex1 = This->mIndex;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mUniqueNumber1 = This->mUniqueNumber;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mServerIndex2 = This->mDATA.mAction.aTargetObjectIndex;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mUniqueNumber2 = This->mDATA.mAction.aTargetObjectUniqueNumber;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mSenderLocation[0] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mSenderLocation[1] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mSenderLocation[2] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue1 = 1;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue2 = 0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue3 = 0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue4 = 0;
        }
    }
}

void __thiscall MONSTER_OBJECT::ProcessSAttackPacket(MONSTER_OBJECT *This)
{
    int i; // [esp+4h] [ebp-4h]

    for ( i = 0; i < mPLAY[0].MAX_EFFECT_OBJECT && mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState; ++i )
        ;
    if ( i != mPLAY[0].MAX_EFFECT_OBJECT )
    {
        mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState = 1;
        mPLAY[0].mEFFECT_OBJECT[i].mObjType = 3;
        mPLAY[0].mEFFECT_OBJECT[i].mObjSort = 2;
        mPLAY[0].mEFFECT_OBJECT[i].mServerIndex = This->mIndex;
        mPLAY[0].mEFFECT_OBJECT[i].mUniqueNumber = This->mUniqueNumber;
        mPLAY[0].mEFFECT_OBJECT[i].mDataSortNumber = This->mMONSTER_INFO->mDataSortNumber;
        mPLAY[0].mEFFECT_OBJECT[i].bb05 = 1;
        mPLAY[0].mEFFECT_OBJECT[i].mTargetObjectIndex = This->mDATA.mAction.aTargetObjectIndex;
        mPLAY[0].mEFFECT_OBJECT[i].mTargetObjectUniqueNumber = This->mDATA.mAction.aTargetObjectUniqueNumber;
        mPLAY[0].mEFFECT_OBJECT[i].bb08 = 0;
        mPLAY[0].mEFFECT_OBJECT[i].bb11 = 1;
        mPLAY[0].mEFFECT_OBJECT[i].mMObjectIdx = UTIL::ReturnMonsterBulletObject(This->mMONSTER_INFO->mDataSortNumber);
        if ( mPLAY[0].mEFFECT_OBJECT[i].mMObjectIdx == -1 )
        {
            mPLAY[0].mEFFECT_OBJECT[i].mCheckValidState = 0;
        }
        else
        {
            mPLAY[0].mEFFECT_OBJECT[i].mFrame = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[0] = This->mDATA.mAction.aLocation[0];
            mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[1] = This->mMONSTER_INFO->mBulletInfo[0] + This->mDATA.mAction.aLocation[1];
            mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[2] = This->mDATA.mAction.aLocation[2];
            mPLAY[0].mEFFECT_OBJECT[i].mAngle[0] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAngle[1] = This->mDATA.mAction.aFront;
            mPLAY[0].mEFFECT_OBJECT[i].mAngle[2] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mLocation[0] = mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[0];
            mPLAY[0].mEFFECT_OBJECT[i].mLocation[1] = mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[1];
            mPLAY[0].mEFFECT_OBJECT[i].mLocation[2] = mPLAY[0].mEFFECT_OBJECT[i].mDstLocation[2];
            mPLAY[0].mEFFECT_OBJECT[i].mTargetLocation[0] = This->mDATA.mAction.aTargetLocation[0];
            mPLAY[0].mEFFECT_OBJECT[i].mTargetLocation[1] = This->mDATA.mAction.aTargetLocation[1];
            mPLAY[0].mEFFECT_OBJECT[i].mTargetLocation[2] = This->mDATA.mAction.aTargetLocation[2];
            mPLAY[0].mEFFECT_OBJECT[i].cc01 = This->mMONSTER_INFO->mBulletInfo[1];
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mCase = 4;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mServerIndex1 = This->mIndex;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mUniqueNumber1 = This->mUniqueNumber;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mServerIndex2 = This->mDATA.mAction.aTargetObjectIndex;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mUniqueNumber2 = This->mDATA.mAction.aTargetObjectUniqueNumber;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mSenderLocation[0] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mSenderLocation[1] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mSenderLocation[2] = 0.0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue1 = 1;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue2 = 0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue3 = 0;
            mPLAY[0].mEFFECT_OBJECT[i].mAttackInfo.mAttackActionValue4 = 1;
        }
    }
}

void __thiscall MONSTER_OBJECT::A001(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v4; // [esp+4h] [ebp-4h]

    v4 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v4 )
    {
        This->mDATA.mAction.aSort = 1;
        This->mDATA.mAction.aFrame = 0.0;
    }
}

void __thiscall MONSTER_OBJECT::A002(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v4; // [esp+4h] [ebp-4h]

    v4 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v4 )
        This->mDATA.mAction.aFrame = This->mDATA.mAction.aFrame - v4;
}

void __thiscall MONSTER_OBJECT::A004(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    float tSpeed; // [esp+0h] [ebp-18h]
    BOOL tCheckArrival; // [esp+10h] [ebp-8h] BYREF
    int v6; // [esp+14h] [ebp-4h]

    v6 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v6 )
        This->mDATA.mAction.aFrame = This->mDATA.mAction.aFrame - v6;
    tSpeed = This->mMONSTER_INFO->mWalkSpeed;
    if ( WORLD_FOR_GXD::Move(&mGDATA[0].mZONE.mRANGE1, This->mDATA.mAction.aLocation, This->mDATA.mAction.aTargetLocation, tSpeed, dTime, &tCheckArrival) )
    {
        if ( tCheckArrival )
        {
            This->mDATA.mAction.aSort = 1;
            This->mDATA.mAction.aFrame = 0.0;
        }
    }
    else
    {
        This->mDATA.mAction.aSort = 1;
        This->mDATA.mAction.aFrame = 0.0;
    }
}

void __thiscall MONSTER_OBJECT::A005(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    float tSpeed; // [esp+0h] [ebp-18h]
    BOOL tCheckArrival; // [esp+10h] [ebp-8h] BYREF
    int v6; // [esp+14h] [ebp-4h]

    v6 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v6 )
        This->mDATA.mAction.aFrame = This->mDATA.mAction.aFrame - v6;
    tSpeed = This->mMONSTER_INFO->mRunSpeed;
    if ( WORLD_FOR_GXD::Move(&mGDATA[0].mZONE.mRANGE1, This->mDATA.mAction.aLocation, This->mDATA.mAction.aTargetLocation, tSpeed, dTime, &tCheckArrival) )
    {
        if ( tCheckArrival )
        {
            This->mDATA.mAction.aSort = 1;
            This->mDATA.mAction.aFrame = 0.0;
        }
    }
    else
    {
        This->mDATA.mAction.aSort = 1;
        This->mDATA.mAction.aFrame = 0.0;
    }
}

void __thiscall MONSTER_OBJECT::A006(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v4; // [esp+4h] [ebp-4h]

    v4 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v4 )
    {
        This->mDATA.mAction.aSort = 1;
        This->mDATA.mAction.aFrame = 0.0;
        This->c02 = 0;
    }
}

void __thiscall MONSTER_OBJECT::A008(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v4; // [esp+4h] [ebp-4h]

    v4 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v4 )
    {
        This->mDATA.mAction.aSort = 1;
        This->mDATA.mAction.aFrame = 0.0;
        This->c02 = 0;
    }
}

void __thiscall MONSTER_OBJECT::A009(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v4; // [esp+4h] [ebp-4h]

    v4 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v4 )
    {
        This->mDATA.mAction.aSort = 1;
        This->mDATA.mAction.aFrame = 0.0;
    }
}

void __thiscall MONSTER_OBJECT::A013(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    float tPostYCoord; // [esp+20h] [ebp-18h]
    float x; // [esp+28h] [ebp-10h]
    float y; // [esp+2Ch] [ebp-Ch] BYREF
    float z; // [esp+30h] [ebp-8h]
    int v8; // [esp+34h] [ebp-4h]

    v8 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aSkillNumber != 1 && This->c23 == 1 )
    {
        This->mDeathSpeedFrame = This->mDeathSpeedFrame - dTime * 100.0;
        if ( This->mDeathSpeedFrame < 0.0 )
            This->mDeathSpeedFrame = 0.0;
        x = This->mDATA.mAction.aTargetLocation[0] * This->mDeathSpeedFrame * dTime + This->mDATA.mAction.aLocation[0];
        y = This->mDATA.mAction.aLocation[1];
        z = This->mDATA.mAction.aTargetLocation[2] * This->mDeathSpeedFrame * dTime + This->mDATA.mAction.aLocation[2];
        tPostYCoord = This->mDATA.mAction.aLocation[1] + 20.0;
        if ( WORLD_FOR_GXD::GetYCoord(&mGDATA[0].mZONE.mRANGE1, x, z, &y, 1, tPostYCoord, 0, 1) )
        {
            This->mDATA.mAction.aLocation[0] = x;
            This->mDATA.mAction.aLocation[1] = y;
            This->mDATA.mAction.aLocation[2] = z;
        }
    }
    if ( This->mDATA.mAction.aFrame >= v8 )
    {
        This->mDATA.mAction.aFrame = (v8 - 1);
        if ( This->c23 == 1 )
        {
            This->c23 = 0;
            This->mLastDeathUpdate = mApp[0].hPresentElapsedSeconds;
        }
        else if ( mApp[0].hPresentElapsedSeconds - This->mLastDeathUpdate > 3.0 )
        {
            MONSTER_OBJECT::Free(This);
        }
    }
}

void __thiscall MONSTER_OBJECT::A020(MONSTER_OBJECT *This, int tObjIndex, float dTime)
{
    int v4; // [esp+8h] [ebp-4h]

    v4 = GDATA::ReturnMonsterMotionFrameNum(This->mMONSTER_INFO->mDataSortNumber - 1, This->mDATA.mAction.aSort);
    This->mDATA.mAction.aFrame = dTime * 30.0 + This->mDATA.mAction.aFrame;
    if ( This->mDATA.mAction.aFrame >= v4 )
        This->mDATA.mAction.aFrame = (v4 - 1);
}
10/26/2022 13:40 java558#2
how to use it?

how to use it?

how to use it?
10/27/2022 03:08 RHNbaskan#3
man i talk to a lot of people
also applies to myself
there is still no capacity to understand this.

To understand, you have to constantly look at the source code.

dude i read the codes a little
Can we get character positioning out of here?

but there is more than one in the source codes
I got control
There is no such table.