// process a destroy feature msg. bool recvDestroyFeature(NETQUEUE queue) { FEATURE *pF; uint32_t id; NETbeginDecode(queue, GAME_DEBUG_REMOVE_FEATURE); NETuint32_t(&id); NETend(); if (!getDebugMappingStatus() && bMultiPlayer) { debug(LOG_WARNING, "Failed to remove feature for player %u.", NetPlay.players[queue.index].position); return false; } pF = IdToFeature(id,ANYPLAYER); if (pF == NULL) { debug(LOG_FEATURE, "feature id %d not found (probably already destroyed)", id); return false; } debug(LOG_FEATURE, "p%d feature id %d destroyed (%s)", pF->player, pF->id, pF->psStats->pName); // Remove the feature locally turnOffMultiMsg(true); destroyFeature(pF, gameTime - deltaGameTime + 1); // deltaGameTime is actually 0 here, since we're between updates. However, the value of gameTime - deltaGameTime + 1 will not change when we start the next tick. turnOffMultiMsg(false); return true; }
/* Update routine for features */ void featureUpdate(FEATURE *psFeat) { // if(getRevealStatus()) // { // update the visibility for the feature processVisibilityLevel((BASE_OBJECT *)psFeat); // } switch (psFeat->psStats->subType) { case FEAT_DROID: case FEAT_BUILD_WRECK: // //kill off wrecked droids and structures after 'so' long // if ((gameTime - psFeat->born) > WRECK_LIFETIME) // { destroyFeature(psFeat); // get rid of the now!!! // } break; default: break; } }
/** Deals with damage to a feature * \param psFeature feature to deal damage to * \param damage amount of damage to deal * \param weaponClass,weaponSubClass the class and subclass of the weapon that deals the damage * \param impactSide the side/directon on which the feature is hit * \return < 0 never, >= 0 always */ int32_t featureDamage(FEATURE *psFeature, UDWORD damage, WEAPON_CLASS weaponClass, WEAPON_SUBCLASS weaponSubClass, HIT_SIDE impactSide) { int32_t relativeDamage; ASSERT_OR_RETURN(0, psFeature != NULL, "Invalid feature pointer"); debug(LOG_ATTACK, "feature (id %d): body %d armour %d damage: %d", psFeature->id, psFeature->body, psFeature->armour[impactSide][weaponClass], damage); relativeDamage = objDamage((BASE_OBJECT *)psFeature, damage, psFeature->psStats->body, weaponClass, weaponSubClass, impactSide); // If the shell did sufficient damage to destroy the feature if (relativeDamage < 0) { debug(LOG_ATTACK, "feature (id %d) DESTROYED", psFeature->id); destroyFeature(psFeature); return relativeDamage * -1; } else { return relativeDamage; } }
/** Deals with damage to a feature * \param psFeature feature to deal damage to * \param damage amount of damage to deal * \param weaponClass,weaponSubClass the class and subclass of the weapon that deals the damage * \return < 0 never, >= 0 always */ int32_t featureDamage(FEATURE *psFeature, unsigned damage, WEAPON_CLASS weaponClass, WEAPON_SUBCLASS weaponSubClass, unsigned impactTime, bool isDamagePerSecond, int minDamage) { int32_t relativeDamage; ASSERT_OR_RETURN(0, psFeature != NULL, "Invalid feature pointer"); debug(LOG_ATTACK, "feature (id %d): body %d armour %d damage: %d", psFeature->id, psFeature->body, psFeature->psStats->armourValue, damage); relativeDamage = objDamage(psFeature, damage, psFeature->psStats->body, weaponClass, weaponSubClass, isDamagePerSecond, minDamage); // If the shell did sufficient damage to destroy the feature if (relativeDamage < 0) { debug(LOG_ATTACK, "feature (id %d) DESTROYED", psFeature->id); destroyFeature(psFeature, impactTime); return relativeDamage * -1; } else { return relativeDamage; } }