diff --git a/rwengine/include/objects/InstanceObject.hpp b/rwengine/include/objects/InstanceObject.hpp index 34df7509..e485d534 100644 --- a/rwengine/include/objects/InstanceObject.hpp +++ b/rwengine/include/objects/InstanceObject.hpp @@ -12,6 +12,7 @@ class CollisionInstance; */ class InstanceObject : public GameObject { + float health; public: glm::vec3 scale; CollisionInstance* body; @@ -36,6 +37,8 @@ public: virtual void setRotation(const glm::quat& r); virtual bool takeDamage(const DamageInfo& damage); + + float getHealth() const { return health; } }; diff --git a/rwengine/src/engine/GameWorld.cpp b/rwengine/src/engine/GameWorld.cpp index b30d5391..fd217f58 100644 --- a/rwengine/src/engine/GameWorld.cpp +++ b/rwengine/src/engine/GameWorld.cpp @@ -525,7 +525,12 @@ void GameWorld::destroyObject(GameObject* object) auto& pool = getTypeObjectPool(object); pool.remove(object); - allObjects.erase(std::find(allObjects.begin(), allObjects.end(), object)); + auto it = std::find(allObjects.begin(), allObjects.end(), object); + RW_CHECK(it != allObjects.end(), "destroying object not in allObjects"); + if (it != allObjects.end()) { + allObjects.erase(it); + } + delete object; } @@ -602,6 +607,8 @@ void GameWorld::destroyEffect(VisualFX* effect) void GameWorld::doWeaponScan(const WeaponScan &scan) { + RW_CHECK(scan.type != WeaponScan::RADIUS, "Radius scans not implemented yet"); + if( scan.type == WeaponScan::RADIUS ) { // TODO // Requires custom ConvexResultCallback @@ -661,8 +668,12 @@ float GameWorld::getGameTime() const return state->gameTime; } -InventoryItem*GameWorld::getInventoryItem(uint16_t weaponId) const +InventoryItem* GameWorld::getInventoryItem(uint16_t weaponId) const { + RW_CHECK(weaponId < inventoryItems.size(), "InventoryItem ID out of range"); + if (weaponId >= inventoryItems.size()) { + return nullptr; + } return inventoryItems[weaponId]; } diff --git a/rwengine/src/objects/InstanceObject.cpp b/rwengine/src/objects/InstanceObject.cpp index 3898dd73..7934a9b9 100644 --- a/rwengine/src/objects/InstanceObject.cpp +++ b/rwengine/src/objects/InstanceObject.cpp @@ -13,8 +13,14 @@ InstanceObject::InstanceObject(GameWorld* engine, std::shared_ptr obj, InstanceObject* lod, std::shared_ptr dyn) -: GameObject(engine, pos, rot, model), scale(scale), body(nullptr), object(obj), - LODinstance(lod), dynamics(dyn), _enablePhysics(false) + : GameObject(engine, pos, rot, model) + , health(100.f) + , scale(scale) + , body(nullptr) + , object(obj) + , LODinstance(lod) + , dynamics(dyn) + , _enablePhysics(false) { if( obj ) { changeModel(obj); @@ -162,7 +168,6 @@ void InstanceObject::setRotation(const glm::quat &r) bool InstanceObject::takeDamage(const GameObject::DamageInfo& dmg) { - RW_CHECK(dmg.hitpoints == 0, "Instance damange not implemented yet"); bool explodeOnHit = (object->flags&ObjectData::EXPLODEONHIT) == ObjectData::EXPLODEONHIT; bool smash = (object->flags&ObjectData::SMASHABLE) == ObjectData::SMASHABLE; if( dynamics ) { @@ -176,10 +181,10 @@ bool InstanceObject::takeDamage(const GameObject::DamageInfo& dmg) { if(explodeOnHit) { // explode - //mHealth = -1.f; + health = -1.f; } else { - //mHealth -= dmg.hitpoints; + health -= dmg.hitpoints; } return true; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 75572ff9..670feb60 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,9 +1,43 @@ -FILE(GLOB TEST_SOURCES - "*.cpp" - "${CMAKE_SOURCE_DIR}/rwengine/tests/*.cpp") -ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) +set(TEST_SOURCES + "main.cpp" + "test_animation.cpp" + "test_archive.cpp" + "test_buoyancy.cpp" + "test_character.cpp" + "test_chase.cpp" + "test_cutscene.cpp" + "test_data.cpp" + "test_FileIndex.cpp" + "test_GameData.cpp" + "test_GameWorld.cpp" + "test_globals.hpp" + "test_items.cpp" + "test_lifetime.cpp" + "test_loaderdff.cpp" + "test_Logger.cpp" + "test_menu.cpp" + "test_object.cpp" + "test_object_data.cpp" + "test_pickup.cpp" + "test_renderer.cpp" + "test_Resource.cpp" + "test_rwbstream.cpp" + "test_SaveGame.cpp" + "test_scriptmachine.cpp" + "test_skeleton.cpp" + "test_state.cpp" + "test_text.cpp" + "test_trafficdirector.cpp" + "test_vehicle.cpp" + "test_VisualFX.cpp" + "test_weapon.cpp" + "test_worker.cpp" + "test_world.cpp" + ) -add_executable(run_tests ${TEST_SOURCES}) +ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) + +add_executable(run_tests ${TEST_SOURCES}) include_directories(include) include_directories("${CMAKE_SOURCE_DIR}/tests") diff --git a/rwengine/tests/test_FileIndex.cpp b/tests/test_FileIndex.cpp similarity index 95% rename from rwengine/tests/test_FileIndex.cpp rename to tests/test_FileIndex.cpp index 4596aeea..a61f84cd 100644 --- a/rwengine/tests/test_FileIndex.cpp +++ b/tests/test_FileIndex.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include BOOST_AUTO_TEST_SUITE(FileIndexTests) @@ -50,4 +50,4 @@ BOOST_AUTO_TEST_CASE(test_file_archive) BOOST_CHECK( handle != nullptr ); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/rwengine/tests/test_GameData.cpp b/tests/test_GameData.cpp similarity index 100% rename from rwengine/tests/test_GameData.cpp rename to tests/test_GameData.cpp diff --git a/rwengine/tests/test_GameWorld.cpp b/tests/test_GameWorld.cpp similarity index 100% rename from rwengine/tests/test_GameWorld.cpp rename to tests/test_GameWorld.cpp diff --git a/rwengine/tests/test_Logger.cpp b/tests/test_Logger.cpp similarity index 100% rename from rwengine/tests/test_Logger.cpp rename to tests/test_Logger.cpp diff --git a/rwengine/tests/test_Resource.cpp b/tests/test_Resource.cpp similarity index 100% rename from rwengine/tests/test_Resource.cpp rename to tests/test_Resource.cpp diff --git a/rwengine/tests/test_SaveGame.cpp b/tests/test_SaveGame.cpp similarity index 95% rename from rwengine/tests/test_SaveGame.cpp rename to tests/test_SaveGame.cpp index 7474f166..7151801b 100644 --- a/rwengine/tests/test_SaveGame.cpp +++ b/tests/test_SaveGame.cpp @@ -4,6 +4,7 @@ #include