int CRaklionSelupan::GetSelupanTargetIndex() { int iSelupanIndex = this->GetSelupanObjIndex(); LPOBJ lpObj = &gObj[iSelupanIndex]; if ( lpObj->TargetNumber >= 0 && lpObj->TargetNumber < OBJMAX ) { return lpObj->TargetNumber; } return gObjMonsterSearchEnemy(lpObj,lpObj->Type); }
void MonsterHerd::MonsterBaseAct(LPOBJ lpObj) { LPOBJ lpTargetObj = NULL; if ( lpObj->TargetNumber >= 0 ) { lpTargetObj = &gObj[lpObj->TargetNumber]; } else { lpObj->m_ActState.Emotion = 0; } switch ( lpObj->m_ActState.Emotion ) { case 0: { if ( lpObj->m_ActState.Attack != 0 ) { lpObj->m_ActState.Attack = 0; lpObj->TargetNumber = -1; lpObj->NextActionTime = 500; } int actcode1 = rand() % 2; if ( actcode1 == 0 ) { lpObj->m_ActState.Rest = 1; lpObj->NextActionTime = 500; } else if ( lpObj->m_MoveRange > 0 ) { if ( lpObj->m_SkillHarden == 0 ) { this->MonsterMoveAction(lpObj); } } if ( lpObj->m_bIsMonsterAttackFirst != false ) { lpObj->TargetNumber = gObjMonsterSearchEnemy(lpObj, OBJ_USER); if ( lpObj->TargetNumber >= 0 ) { lpObj->m_ActState.EmotionCount = 30; lpObj->m_ActState.Emotion = 1; } } } break; case 1: if ( lpObj->m_ActState.EmotionCount > 0 ) { lpObj->m_ActState.EmotionCount --; } else { lpObj->m_ActState.Emotion = 0; } if ( lpObj->TargetNumber >= 0 && lpObj->PathStartEnd == 0 ) { int dis = gObjCalDistance(lpObj, lpTargetObj); int attackRange; if ( lpObj->m_AttackType >= 100 ) { attackRange = lpObj->m_AttackRange + 2; } else { attackRange = lpObj->m_AttackRange; } if ( dis <= attackRange ) { int tuser = lpObj->TargetNumber; int map = gObj[tuser].MapNumber; if ( MapC[map].CheckWall(lpObj->X, lpObj->Y, gObj[tuser].X, gObj[tuser].Y) == TRUE ) { BYTE attr = MapC[map].GetAttr(gObj[tuser].X, gObj[tuser].Y); if ( (attr&1) != 1 ) { lpObj->m_ActState.Attack = 1; lpObj->m_ActState.EmotionCount = (rand()%30+20); } else { lpObj->TargetNumber = -1; lpObj->m_ActState.EmotionCount = 30; lpObj->m_ActState.Emotion = 1; } lpObj->Dir = GetPathPacketDirPos(lpTargetObj->X-lpObj->X, lpTargetObj->Y-lpObj->Y); lpObj->NextActionTime = lpObj->m_AttackSpeed; } } else { if ( gObjMonsterGetTargetPos(lpObj) == TRUE ) { if ( MapC[lpObj->MapNumber].CheckWall(lpObj->X, lpObj->Y, lpObj->MTX, lpObj->MTY) == TRUE ) { lpObj->m_ActState.Move = 1; lpObj->NextActionTime = 400; lpObj->Dir = GetPathPacketDirPos(lpTargetObj->X - lpObj->X, lpTargetObj->Y-lpObj->Y); } else { this->MonsterMoveAction(lpObj); lpObj->m_ActState.Emotion = 3; lpObj->m_ActState.EmotionCount = 10; } } else { this->MonsterMoveAction(lpObj); lpObj->m_ActState.Emotion = 3; lpObj->m_ActState.EmotionCount = 10; } } } break; case 3: if ( lpObj->m_ActState.EmotionCount > 0 ) { lpObj->m_ActState.EmotionCount--; } else { lpObj->m_ActState.Emotion = 0; } lpObj->m_ActState.Move = 0; lpObj->m_ActState.Attack = 0; lpObj->NextActionTime = 400; break; } }