void Player::logic() { switch (mAction) { case STAND: case SIT: case DEAD: case HURT: break; case WALK: mFrame = (get_elapsed_time(mWalkTime) * 6) / getWalkSpeed(); if (mFrame >= 6) nextStep(); break; case ATTACK: int rotation = 0; std::string particleEffect = ""; int frames = 4; if (mEquippedWeapon && mEquippedWeapon->getAttackType() == ACTION_ATTACK_BOW) { frames = 5; } mFrame = (get_elapsed_time(mWalkTime) * frames) / mAttackSpeed; //attack particle effect if (mEquippedWeapon) particleEffect = mEquippedWeapon->getParticleEffect(); if (!particleEffect.empty() && mParticleEffects && mFrame == 1) { switch (mDirection) { case DOWN: rotation = 0; break; case LEFT: rotation = 90; break; case UP: rotation = 180; break; case RIGHT: rotation = 270; break; default: break; } Particle *p; p = particleEngine->addEffect("graphics/particles/" + particleEffect, 0, 0, rotation); controlParticle(p); } if (mFrame >= frames) nextStep(); break; } Being::logic(); }
void Monster::setAction(Action action, int attackType) { SpriteAction currentAction = ACTION_INVALID; int rotation = 0; std::string particleEffect; switch (action) { case WALK: currentAction = ACTION_WALK; break; case DEAD: currentAction = ACTION_DEAD; sound.playSfx(getInfo().getSound(MONSTER_EVENT_DIE)); break; case ATTACK: currentAction = getInfo().getAttackAction(attackType); for (SpriteIterator it = mSprites.begin(); it != mSprites.end(); it++) (*it)->reset(); //attack particle effect particleEffect = getInfo().getAttackParticleEffect(attackType); if (!particleEffect.empty() && mParticleEffects) { switch (mSpriteDirection) { case DIRECTION_DOWN: rotation = 0; break; case DIRECTION_LEFT: rotation = 90; break; case DIRECTION_UP: rotation = 180; break; case DIRECTION_RIGHT: rotation = 270; break; default: break; } Particle *p; p = particleEngine->addEffect(particleEffect, 0, 0, rotation); controlParticle(p); } break; case STAND: currentAction = ACTION_STAND; break; case HURT: // Not implemented yet break; case SIT: // Also not implemented yet break; } if (currentAction != ACTION_INVALID) { for (SpriteIterator it = mSprites.begin(); it != mSprites.end(); it++) if (*it) (*it)->play(currentAction); mAction = action; } }
Monster::Monster(int id, int job, Map *map): Being(id, job, map) { const MonsterInfo& info = getInfo(); // Setup Monster sprites const std::list<std::string> &sprites = info.getSprites(); for (std::list<std::string>::const_iterator i = sprites.begin(); i != sprites.end(); i++) { std::string file = "graphics/sprites/" + *i; mSprites.push_back(AnimatedSprite::load(file)); } // Ensure that something is shown if (mSprites.size() == 0) { mSprites.push_back(AnimatedSprite::load("graphics/sprites/error.xml")); } if (mParticleEffects) { const std::list<std::string> &particleEffects = info.getParticleEffects(); for (std::list<std::string>::const_iterator i = particleEffects.begin(); i != particleEffects.end(); i++) { controlParticle(particleEngine->addEffect((*i), 0, 0)); } } mNameColor = &guiPalette->getColor(Palette::MONSTER); mTextColor = &guiPalette->getColor(Palette::MONSTER); Being::setName(getInfo().getName()); }
void LocalPlayer::logic() { switch (mAction) { case STAND: break; case SIT: break; case DEAD: break; case HURT: break; case WALK: mFrame = (get_elapsed_time(mWalkTime) * 6) / mWalkSpeed; if (mFrame >= 6) nextStep(); break; case ATTACK: int rotation = 0; std::string particleEffect = ""; int frames = 4; if (mEquippedWeapon && mEquippedWeapon->getAttackType() == ACTION_ATTACK_BOW) frames = 5; mFrame = (get_elapsed_time(mWalkTime) * frames) / mAttackSpeed; //attack particle effect if (mEquippedWeapon) particleEffect = mEquippedWeapon->getParticleEffect(); if (!particleEffect.empty() && mParticleEffects && mFrame == 1) { switch (mDirection) { case DOWN: rotation = 0; break; case LEFT: rotation = 90; break; case UP: rotation = 180; break; case RIGHT: rotation = 270; break; default: break; } Particle *p; p = particleEngine->addEffect("graphics/particles/" + particleEffect, 0, 0, rotation); controlParticle(p); } if (mFrame >= frames) nextStep(); break; } // Actions are allowed once per second if (get_elapsed_time(mLastAction) >= 1000) mLastAction = -1; // Remove target if its been on a being for more than a minute if (get_elapsed_time(mTargetTime) >= 60000) { mTargetTime = -1; setTarget(NULL); } if (mTarget) { // Find whether target is in range const int rangeX = abs(mTarget->mX - mX); const int rangeY = abs(mTarget->mY - mY); const int attackRange = getAttackRange(); const int inRange = rangeX > attackRange || rangeY > attackRange ? 1 : 0; mTarget->setTargetAnimation( mTargetCursor[inRange][mTarget->getTargetCursorSize()]); if (mTarget->mAction == DEAD) stopAttack(); if (mKeepAttacking && mTarget) attack(mTarget, true); } Being::logic(); }