33 aiMobState_LavaJumper::aiMobState_LavaJumper(
void)
37 aiMobState_LavaJumper::~aiMobState_LavaJumper(
void)
48 fp->readDouble(&dWait);
49 _ttWait.parameters(dWait,dWait);
53 fp->readBool(&_bAlwaysDoSameJump);
54 fp->readBool(&_bLavaJumper);
55 fp->readBool(&_bFollowCurve);
60 _ttTurn.parameters(_tJumpAvg, _tJumpAvg);
65 void aiMobState_LavaJumper::perceive_active( std::string strID_Old )
70 pMonster->agressive(M_TRUE);
71 pMonster->enableBattleGUI(M_FALSE);
73 pMonster->getPivot()-> bSimulateGravitation = M_TRUE;
76 _ptOriginalPos = pMonster->getPosition();
88 pMonster->setExplicitFacing(1);
92 void aiMobState_LavaJumper::perceive_inactive( std::string strID_New )
122 void aiMobState_LavaJumper::perceive(
unsigned state, M_BOOL global,
unsigned id, aiPerceptData data)
127 if(_bFollowCurve) _follow_curve();
128 if(_bLavaJumper) _update_trail();
130 int direction = pMonster->getMoveDirection();
131 pMonster->move( this->_update_direction( direction ) );
133 _ttWait.animate( *(::laSystemIntegrator::getEnvironment()->getTimer()) );
134 _ttTurn.animate( *(::laSystemIntegrator::getEnvironment()->getTimer()) );
136 aiMobState::perceive(state, global,
id, data);
139 void aiMobState_LavaJumper::_follow_curve()
142 laPivot *pMobPivot = pMonster->getPivot();
145 if( pMobPivot->bOnGround )
147 if( _ttTurn.isEnabled())
152 _tJumpAvg = ( _tJumpAvg * _nJumpSamples + _tJump.delta() ) / ( (
double)_nJumpSamples + 1.0 );
156 _ttTurn.parameters(_tJumpAvg, _tJumpAvg);
160 _ttTurn.enable(M_FALSE);
163 else if ( !_ttTurn.isEnabled() )
172 ang = (1 - _ttTurn.reminder()) * 180;
173 if( _ptTargetPos.x() <= pMobPivot->x() ) ang *= -1;
175 if(_ttTurn.isEnabled())
176 pMobPivot->ptGeometryOffset.y( -0.5*(1 - _ttTurn.reminder())*
M_UNIT );
178 pMobPivot->ptGeometryOffset.y(0);
180 pMobPivot->angleZ = ang;
183 int aiMobState_LavaJumper::_update_direction(
int direction)
186 laPivot *pMobPivot = pMonster->getPivot();
190 if( pMobPivot->bOnGround )
192 if( _ttWait.isEnabled() )
194 if( _ttWait.isElapsed() )
196 _ptTargetPos = _find_target();
212 _ttWait.enable(M_FALSE);
214 if( pMobPivot->x()> _ptTargetPos.x() +
M_UNIT*0.1 )
return -1;
216 if( pMobPivot->x()< _ptTargetPos.x() -
M_UNIT*0.1 )
return +1;
222 laPoint3 aiMobState_LavaJumper::_find_target()
225 double dDL = pMonster->getLeftRange();
226 double dDR = pMonster->getRightRange();
232 x -= (dDL * (rand()%100) / 100.0 );
235 if(_bLavaJumper)
while( !_trap_below(x) && ( x < dDR) )
240 x += (dDR * (rand()%100) / 100.0);
242 if(_bLavaJumper)
while( !_trap_below(x) && ( x > -1*dDL ) )
247 if( ( x > dDR) || (x < -1*dDL) )
251 else if(_bLavaJumper)
256 if( !_trap_below(0) )
258 _ptOriginalPos[0] += x;
262 return laPoint3(_ptOriginalPos.x() + x, _ptOriginalPos.y());
265 void aiMobState_LavaJumper::_update_trail()
268 laPivot *pMobPivot = pMonster->getPivot();
271 if( _trap_below(_ptTargetPos.x() - _ptOriginalPos.x(), &ptrap) )
273 pMonster->_fxTrail.copyStyle( ptrap->pTSE->getFx(
"fx") );
279 pMonster->_fxTrail.enable();
283 M_BOOL aiMobState_LavaJumper::_trap_below(
double dx,
rpgTrap** ppt)
286 laPivot *pMobPivot = pMonster->getPivot();
288 laPoint3 vTentacle(0, +4*
M_UNIT, 0);
291 vPivot[0] = _ptOriginalPos.x() + dx;
292 vPivot[1] = vPivot.y() - 2.0 *
M_UNIT;
294 M_BOOL bTrap1 = M_FALSE;
295 vPivot[0] -= vPivot.size.x() * 0.5;
296 vPivot.projectVector(vTentacle, &bTrap1, ppt);
298 M_BOOL bTrap2 = M_FALSE;
299 vPivot[0] += vPivot.size.x() * 1.0;
300 vPivot.projectVector(vTentacle, &bTrap2, ppt);
302 return bTrap1 && bTrap2;
#define M_UNIT
Unit of 1 meter.
Adds capabilities and percepts specific to monster creatures.