void Player::calculateHP(int dmg){ if(php<=dmg) { setHP(0); pAlive = false; }else { setHP(php - dmg); pAlive = true; } }
Player::Player(std::string _name, osg::Vec3f _pos, float _colRad, int _hp, osg::ref_ptr<osg::MatrixTransform> _scene, int _bridgeModel) { initTransform(); rigidBodyRadius = _colRad; pos = _pos; setName(_name); setHP(_hp); setMaxHP(_hp); _scene->addChild(playerTransform); playerTransform->postMult(osg::Matrix::translate(pos)); healthbarTransform->postMult(osg::Matrix::rotate(-PI / 8, 1.0f, 0.0f, 0.0f)); bridgeTransform->postMult(osg::Matrix::rotate(PI + PI / 4.0, 1.0, 0.0, 0.0)); //bridgeTransform->postMult(osg::Matrix::scale(0.1f, 0.1f, 0.1f)); if (_bridgeModel == 1) { bridge = GameObject((std::string)("Kommandobryggan"), osg::Vec3f(0, 0, 0), 0, 100000, (std::string)("models/kurvbrygga_lasselagom.ive"), bridgeTransform, 100000); bridgeTransform->postMult(osg::Matrix::translate(0.0f, 3.5f, 0.0f)); } if (_bridgeModel == 2) { bridge = GameObject((std::string)("Kommandobryggan"), osg::Vec3f(0, 0, 0), 0, 100000, (std::string)("models/kurvbrygga_lasselagom.ive"), bridgeTransform, 100000); bridgeTransform->postMult(osg::Matrix::translate(0.0f, 2.5f, 0.0f)); } if (_bridgeModel == 3) { bridge = GameObject((std::string)("Kommandobryggan"), osg::Vec3f(0, 0, 0), 0, 100000, (std::string)("models/kurvbrygga_lassesmal.ive"), bridgeTransform, 100000); bridgeTransform->postMult(osg::Matrix::translate(0.0f, 3.5f, 0.0f)); } if (_bridgeModel == 4) { bridge = GameObject((std::string)("Kommandobryggan"), osg::Vec3f(0, 0, 0), 0, 100000, (std::string)("models/kurvbrygga_lassesmal.ive"), bridgeTransform, 100000); bridgeTransform->postMult(osg::Matrix::translate(0.0f, 2.5f, 0.0f)); } }
void GameObj::damage(int amount, SoundManager &sm) { // Process incoming damage if(getArmor() > amount) return; // armor negates all damage else amount -= getArmor(); setHP(getHP() - amount); // SFX t_damaged.Calculate_Ellapsed_Time(); if(t_damaged.TotalTime() >= TIMER_SOUND_DAMAGED) { SoundManager::Sounds soundID; switch(goSettings.getTypeID()) { case Settings::OBJ_ID_ARCHER: soundID = sm.SND_ARCHER_DAMAGED; break; case Settings::OBJ_ID_STONEWALL: soundID = sm.SND_STONEWALL_DAMAGED; break; // case settings.OBJ_T_DOG: soundID = sm.SND_DOG_MELEE; break; // case settings.OBJ_T_SPEARMAN: soundID = sm.SND_SPEARMAN_MELEE; break; // case settings.OBJ_ID_ARCHER: soundID = sm.SND_ARCHER_MELEE; break; default: soundID = sm.SND_ARCHER_DAMAGED; break; } sm.playSound(soundSourceID, soundID, body->GetPosition()); t_damaged.Reset(0.0); } // Special Behavior (defined in derived classes) damageSpecial(amount, sm); // Death sequence if(getHP() < 0) { death(sm); } }
Spawn::Spawn(Spawn* s, uint16_t id) : Item(tSpawn, id) { setName(s->name()); setLastName(s->lastName()); Item::setPoint(s->x(), s->y(), s->z()); setPetOwnerID(s->petOwnerID()); setLight(s->light()); setGender(s->gender()); setDeity(s->deity()); setRace(s->race()); setClassVal(s->classVal()); setHP(s->HP()); setMaxHP(s->maxHP()); setGuildID(s->guildID()); setLevel(s->level()); for (int i = 0; i <= tLastCoreWearSlot; i++) setEquipment(i, s->equipment(i)); setEquipment(tUnknown1, SlotEmpty); setTypeflag(s->typeflag()); setGM(s->gm()); setNPC(s->NPC()); setAnimation(s->animation()); setDeltas(s->deltaX(), s->deltaY(), s->deltaZ()); setHeading(s->heading(), s->deltaHeading()); setConsidered(s->considered()); // the new copy will own the spawn track list m_spawnTrackList.setAutoDelete(false); m_spawnTrackList = s->m_spawnTrackList; s->m_spawnTrackList.setAutoDelete(false); m_spawnTrackList.setAutoDelete(true); }
void Player::onInit() { const ItemManager& items = ItemManager::getInstance(); // Reset score m_score = 0; m_panel.setScore(0); // Equip Shield item items.getItem(Item::SHIELD, UserSettings::getItemLevel(Item::SHIELD)).equip(*this); setShield(m_shield); // Keep previous shield value // Equip Hull item and repair spaceship items.getItem(Item::HULL, UserSettings::getItemLevel(Item::HULL)).equip(*this); setHP(m_max_hp); m_panel.setHP(m_max_hp); // Equip Engine item items.getItem(Item::ENGINE, UserSettings::getItemLevel(Item::ENGINE)).equip(*this); // Equip Heatsink item and for cooldown items.getItem(Item::HEATSINK, UserSettings::getItemLevel(Item::HEATSINK)).equip(*this); m_heat = 0; m_panel.setHeat(m_heat); m_overheat = false; m_panel.setOverheat(false); // Equip Weapon item items.getItem(Item::WEAPON, UserSettings::getItemLevel(Item::WEAPON)).equip(*this); }
int PlayerSAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { // It's best that attachments cannot be punched if (isAttached()) return 0; if (!toolcap) return 0; // No effect if PvP disabled if (g_settings->getBool("enable_pvp") == false) { if (puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) { std::string str = gob_cmd_punched(0, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); return 0; } } HitParams hitparams = getHitParams(m_armor_groups, toolcap, time_from_last_punch); std::string punchername = "nil"; if (puncher != 0) punchername = puncher->getDescription(); PlayerSAO *playersao = m_player->getPlayerSAO(); bool damage_handled = m_env->getScriptIface()->on_punchplayer(playersao, puncher, time_from_last_punch, toolcap, dir, hitparams.hp); if (!damage_handled) { setHP(getHP() - hitparams.hp); } else { // override client prediction if (puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) { std::string str = gob_cmd_punched(0, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); } } actionstream << "Player " << m_player->getName() << " punched by " << punchername; if (!damage_handled) { actionstream << ", damage " << hitparams.hp << " HP"; } else { actionstream << ", damage handled by lua"; } actionstream << std::endl; return hitparams.wear; }
//---------------------------------------------------------------------- // Spawn Spawn::Spawn() : Item(tSpawn, 0) { m_name = "fake"; setNPC(SPAWN_NPC_UNKNOWN); Item::setPos(0, 0, 0); setDeltas(0, 0, 0); setHeading(0, 0); setAnimation(0); setPetOwnerID(0); setLight(0); setGender(0); setDeity(0); setRace(0); setClassVal(0); setHP(0); setMaxHP(0); setGuildID(0xffff); setGuildTag(NULL); setLevel(0); setTypeflag(0); for (int i = 0; i < tNumWearSlots; i++) setEquipment(i, 0); // just clear the considred flag since data would be outdated setConsidered(false); // finally, note when this update occurred. updateLast(); }
void Player::applyKonamiCode() { m_konami_code_activated = true; // Set max hp setMaxHP(10); setHP(m_max_hp); m_panel.setHP(m_max_hp); // Set max shield setMaxShield(10); setShield(m_max_shield); m_icecubes = 42; m_panel.setIcecubes(42); m_missiles = 42; m_panel.setMissiles(42); m_weapon.setMultiply(3); m_missile_launcher.setMultiply(3); MessageSystem::write("KONAMI CODE ON", getPosition()); m_powerup_emitter.setPosition(getCenter()); m_powerup_emitter.createParticles(50); }
void Server::handleCommand_Damage(NetworkPacket* pkt) { //const auto peer_id = pkt->getPeerId(); auto & packet = *(pkt->packet); auto player = m_env->getPlayer(pkt->getPeerId()); if (!player) { m_con.DisconnectPeer(pkt->getPeerId()); return; } auto playersao = player->getPlayerSAO(); if (!playersao) { m_con.DisconnectPeer(pkt->getPeerId()); return; } u8 damage = packet[TOSERVER_DAMAGE_VALUE].as<u8>(); if(g_settings->getBool("enable_damage")) { actionstream << player->getName() << " damaged by " << (int)damage << " hp at " << PP(player->getPosition() / BS) << std::endl; playersao->setHP(playersao->getHP() - damage); SendPlayerHPOrDie(playersao); stat.add("damage", player->getName(), damage); } }
bool Hero::init() { if (!Entity::init()) { return false; } setState(NORMAL); //初始化状态 setHP(100); setSP(100); TP = 0; //初始化三大数据 m_mode = SHIELD; //初始化模式状态 velocityY = 0; //初始化水平和竖直方向的速度 faceto = false; inTheAir_flag = true; initSprite(); //初始化动画 initBlock(); //初始化碰撞框 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/Cloak.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/Clock.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/e.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/ea.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/en.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/haaaaa.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/heng.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/kale.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/maxArmor.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/seiya.ogg"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("Audio/souyuken.ogg"); return true; }
Spawn::Spawn(uint16_t id, int16_t x, int16_t y, int16_t z, int16_t deltaX, int16_t deltaY, int16_t deltaZ, int8_t heading, int8_t deltaHeading, uint8_t animation) : Item(tSpawn, id) { // apply the unknown mob values m_name = "unknown"; setNPC(SPAWN_NPC_UNKNOWN); // set what is known setPos(x, y, z); setDeltas(deltaX, deltaY, deltaZ); setHeading(heading, deltaHeading); setAnimation(animation); // initialize what isn't to 0 setPetOwnerID(0); setLight(0); setGender(0); setDeity(0); setRace(0); setClassVal(0); setHP(0); setMaxHP(0); setLevel(0); for (int i = 0; i < tNumWearSlots; i++) setEquipment(i, 0); setTypeflag(0); setConsidered(false); // turn on auto delete for the track list m_spawnTrackList.setAutoDelete(true); }
Spawn::Spawn(Spawn& s, uint16_t id) : Item(tSpawn, id) { setName(s.name()); setLastName(s.lastName()); Item::setPoint(s.x(), s.y(), s.z()); setPetOwnerID(s.petOwnerID()); setLight(s.light()); setGender(s.gender()); setDeity(s.deity()); setRace(s.race()); setClassVal(s.classVal()); setHP(s.HP()); setMaxHP(s.maxHP()); setGuildID(s.GuildID()); setLevel(s.level()); for (int i = 0; i <= tLastCoreWearSlot; i++) setEquipment(i, s.equipment(i)); setEquipment(tUnknown1, 0); setTypeflag(s.typeflag()); setNPC(s.NPC()); setAnimation(s.animation()); setDeltas(s.deltaX(), s.deltaY(), s.deltaZ()); setHeading(s.heading(), s.deltaHeading()); setConsidered(s.considered()); // the new copy will own the spawn track list m_spawnTrackList.setAutoDelete(false); m_spawnTrackList = s.m_spawnTrackList; s.m_spawnTrackList.setAutoDelete(false); m_spawnTrackList.setAutoDelete(true); }
MultiPartEntity::Part::Part(int id, int hp): m_id(id), m_destructible(true), m_parent(NULL) { setHP(hp); }
int LuaEntitySAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { if(!m_registered){ // Delete unknown LuaEntities when punched m_removed = true; return 0; } // It's best that attachments cannot be punched if(isAttached()) return 0; ItemStack *punchitem = NULL; ItemStack punchitem_static; if(puncher){ punchitem_static = puncher->getWieldedItem(); punchitem = &punchitem_static; } PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, punchitem, time_from_last_punch); if(result.did_punch) { setHP(getHP() - result.damage); std::string punchername = "nil"; if ( puncher != 0 ) punchername = puncher->getDescription(); actionstream<<getDescription()<<" punched by " <<punchername<<", damage "<<result.damage <<" hp, health now "<<getHP()<<" hp"<<std::endl; { std::string str = gob_cmd_punched(result.damage, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); } if(getHP() == 0) m_removed = true; } ENV_TO_SA(m_env)->luaentity_Punch(m_id, puncher, time_from_last_punch, toolcap, dir); return result.wear; }
int LuaEntitySAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { if (!m_registered) { // Delete unknown LuaEntities when punched m_pending_removal = true; return 0; } ItemStack *punchitem = NULL; ItemStack punchitem_static; if (puncher) { punchitem_static = puncher->getWieldedItem(); punchitem = &punchitem_static; } PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, punchitem, time_from_last_punch); bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher, time_from_last_punch, toolcap, dir, result.did_punch ? result.damage : 0); if (!damage_handled) { if (result.did_punch) { setHP(getHP() - result.damage, PlayerHPChangeReason(PlayerHPChangeReason::SET_HP)); if (result.damage > 0) { std::string punchername = puncher ? puncher->getDescription() : "nil"; actionstream << getDescription() << " punched by " << punchername << ", damage " << result.damage << " hp, health now " << getHP() << " hp" << std::endl; } std::string str = gob_cmd_punched(result.damage, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); } } if (getHP() == 0 && !isGone()) { m_pending_removal = true; clearParentAttachment(); clearChildAttachments(); m_env->getScriptIface()->luaentity_on_death(m_id, puncher); } return result.wear; }
//============HumanoidCombatComponent======= HumanoidCombatComponent::HumanoidCombatComponent(int HP, int maxHP, float damage, float attackRange, float attackSpeed) { setMaxHP(maxHP); setHP(maxHP); setDamage(damage); setAttackRange(attackRange); setAttackSpeed(attackSpeed); setMarkedForRemoval(false); }
void EffectArmageddon::decreaseHP(Damage_t damage ) throw() { //cout << "EffectArmageddon Damaged : " << (int)damage << endl; HP_t RemainHP = max(0, m_HP - damage); setHP(RemainHP); // 남은 HP가 0일 경우 다음 EffectManager::heartbeat() 에서 이펙트를 날려준다. if(RemainHP == 0 ) setDeadline(0); }
void Pokemon::SetStatsForLevel() { setHP(round(ceil(2 * getBaseHP() + 31) * getLevel() / 100 + getLevel() + 10)); setAtt(round(ceil(2 * getBaseAtt() + 31) * getLevel() / 100 + 5)); setDef(round(ceil(2 * getBaseDef() + 31) * getLevel() / 100 + 5)); setSpeed(round(ceil(2 * getBaseSpeed() + 31) * getLevel() / 100 + 5)); setCurrentHP(getHP()); setCurrentAtt(getAtt()); setCurrentDef(getDef()); setCurrentSpeed(getSpeed()); }
HumanoidCombatComponent::HumanoidCombatComponent(objectCombat settings) { setMaxHP(settings.maxHP); setHP(settings.maxHP); setDamage(settings.damage); setAttackRange(settings.attackRange); setAttackSpeed(settings.attackSpeed); setAlive(true); setMarkedForRemoval(false); }
void SkillNormalBombStep::update(float dt) { if (!_start || !_stepData || _targetRoles.size()==0) return; if (_step == 0) { for(int i=0; i<_targetRoles.size(); i++) { auto role = _targetRoles.at(i); auto player = AnimiPlayer::create(_frames, _stepData->frameDt); player->setTag(1000+i); player->start(1); player->setUserObject(role); player->setStopEvent([&](AnimiPlayer* player) { auto effect = DamageEffect::create(_stepData->_hurtHP); effect->setPosition(Point(CCRANDOM_MINUS1_1()*10, CCRANDOM_MINUS1_1()*10+60)); auto role = static_cast<BattleRole*>(player->getUserObject()); role->getNode()->addChild(effect, 10); int hp = role->getHP() + _stepData->_hurtHP; role->setHP(hp); player->removeFromParent(); }); player->setPosition(GRID_CONVER_TO_PIXEL(role->getGridIndex().x, role->getGridIndex().y)); BattleController::getInstance()->addChild(player, ZORDER_BATTLE_EFFECT); } _step ++; } else if (_step == 1) { bool over = true; for(int i=0; i<_targetRoles.size(); i++) { auto node = BattleController::getInstance()->getChildByTag(1000+i); if (node) { over = false; } } if (over) { setOver(over); _step++; } } }
GameObject::GameObject(std::string _name, osg::Vec3f _pos, float _colRad, int _hp, std::string _model, osg::ref_ptr<osg::MatrixTransform> _scene, int _id) { initTransform(); setVel(0.0); setDir(osg::Vec3f(0.0f, 0.0f, 1.0f)); setOrientation(osg::Quat(0.0f, 0.0f, 0.0f, 1.0f)); rigidBodyRadius = _colRad; translate(_pos); setName(_name); setHP(_hp); setDescr((std::string)("hej")); _scene->addChild(getTrans()); setID(_id); setModel(_model); }
Asteroid::Asteroid(Size size, float angle): m_size(size), m_rotation_speed(math::rand(ROTATION_SPEED_MIN, ROTATION_SPEED_MAX)) { setHP(size * 2 + 1); setTexture(Resources::getTexture("entities/asteroids.png")); setRandomImage(); // Compute speed vector from angle and velocity angle = math::to_radians(angle); m_speed.x = std::cos(angle) * BASE_SPEED; m_speed.y = -std::sin(angle) * BASE_SPEED; // Origin must be located at sprite center to enable centered rotation setOrigin(getWidth() / 2, getHeight() / 2); }
int PlayerSAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { // It's best that attachments cannot be punched if(isAttached()) return 0; if(!toolcap) return 0; // No effect if PvP disabled if(g_settings->getBool("enable_pvp") == false){ if(puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER){ std::string str = gob_cmd_punched(0, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); return 0; } } HitParams hitparams = getHitParams(m_armor_groups, toolcap, time_from_last_punch); std::string punchername = "nil"; if ( puncher != 0 ) punchername = puncher->getDescription(); actionstream<<"Player "<<m_player->getName()<<" punched by " <<punchername<<", damage "<<hitparams.hp <<" HP"<<std::endl; setHP(getHP() - hitparams.hp); if(hitparams.hp != 0) { std::string str = gob_cmd_punched(hitparams.hp, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); } return hitparams.wear; }
FlyingSaucerBoss::FlyingSaucerBoss(): m_target(NULL), m_timer(0), m_angle(0) { setHP(400); setTexture(Resources::getTexture("entities/flying-saucer-boss.png")); setY(CIRCLE_CENTER_Y); m_left_tube.init("laser-pink"); m_left_tube.setOwner(this); m_left_tube.setPosition(34, 122); m_right_tube.init("laser-pink"); m_right_tube.setOwner(this); m_right_tube.setPosition(157, 122); setTeam(Entity::BAD); }
bool Hero::init() { if (!Role::initWithSpriteFrameName("stand.png")) return false; if (!initAnimation()) return false; global->hero = this; setHalfBodyWidth(getContentSize().width / 4); setHP(100); setAP(5); setRunSpeed(10); setWalkSpeed(5); return true; }
TentaculatBoss::TentaculatBoss(): m_state(INIT), m_timer(0.f), m_speed(-100.f, 0.f), m_target(NULL) { setTeam(Entity::BAD); setHP(300); // init weapon m_weapon.init("laser-pink"); m_weapon.setOwner(this); m_weapon.setPosition(74, 42); m_weapon.setMultiply(3); m_animator.setAnimation(*this, EntityManager::getInstance().getAnimation("boss-tentacles")); }
EnemyShip::EnemyShip(std::string _name, osg::Vec3f _pos, float _colRad, std::string _model, osg::ref_ptr<osg::MatrixTransform> _scene, int _hp, int _id) { initTransform(); setVel(0.0); setDir(osg::Vec3f(0.0f, 0.0f, 1.0f)); //Not used setOrientation(osg::Quat(0.0f, 0.0f, 1.0f, 0.0f)); setColRad(_colRad); setHP(_hp); translate(_pos); setName(_name); setDescr((std::string)("hej")); _scene->addChild(getTrans()); setID(_id); setModel(_model); attackCooldown = 10; homingMissileAttackCooldown = 40; }
void Character::adjustHP( int delta ) { std::string pointsAsText = "N/A"; int x = getX(), y = getY(); unsigned int color; if(delta < 0) { pointsAsText = toString(-delta); color = makecol(255, 20, 20); } else if( delta > 0) { pointsAsText = toString(delta); color = makecol(20, 255, 20); } myBattle->addEntity(new BouncyTextEntity(pointsAsText, x, y, color, this->getZOrder())); setHP(getHP() + delta); }
bool AirPlane::init() { if (!GoodNPC::init() || !initWithSpriteFrameName("pet2_0.png")) { return false; } setRotation(90); setWalkSpeed(1); setRunSpeed(2); setAttackRate(2); setHalfBodyWidth(getContentSize().width / 2); setHP(50.0f); setAP(5.0f); setAttackRect(Rect(0, 0, 150, getContentSize().height)); initAnimation(); return true; }
void Spawn::update(const spawnStruct* s) { if (m_name.find(Spawn_Corpse_Designator) == -1) { setName(s->name); setLastName(s->lastName); } setPos(s->x >> 3, s->y >> 3, s->z >> 3); setPetOwnerID(s->petOwnerId); setLight(s->light); setGender(s->gender); setDeity(s->deity); setRace(s->race); setClassVal(s->class_); setHP(s->curHp); //setMaxHP(s->maxHp); setMaxHP(s->curHp); //maxHp is no longer part of the struct setGuildID(s->guildID); setLevel(s->level); for (int i = 0; i <= tLastCoreWearSlot; i++) setEquipment(i, s->equipment[i]); setEquipment(tUnknown1, 0); setTypeflag(s->bodytype); setGM(s->gm); // If it is a corpse with Unknown (NPC) religion. if ((s->NPC == SPAWN_PC_CORPSE) && (s->deity == DEITY_UNKNOWN)) setNPC(SPAWN_NPC_CORPSE); // it's a dead monster else setNPC(s->NPC); // otherwise it is what it is setAnimation(s->animation); // only non corpses and things with animation != 66 move if (!isCorpse() && (s->animation != 66)) { setDeltas(s->deltaX >> 2, s->deltaY >> 2, s->deltaZ >> 2); setHeading(s->heading, s->deltaHeading); }