diff --git a/src/camera.h b/src/camera.h index 450fd9c..d24b58b 100644 --- a/src/camera.h +++ b/src/camera.h @@ -327,16 +327,18 @@ struct Camera : ICamera { timer += Core::deltaTime * 30.0f; float t = timer - int(timer); - int indexA = min(int(timer), level->cameraFramesCount - 1); - int indexB = min((indexA + 1), level->cameraFramesCount - 1); + int indexA = min(int(timer), level->cameraFramesCount - 3); + int indexB = min((indexA + 1), level->cameraFramesCount - 3); if (indexA == level->cameraFramesCount - 3) { if (level->isCutsceneLevel()) game->loadNextLevel(); else { Character *lara = (Character*)owner; - if (lara->health > 0.0f) + if (lara->health > 0.0f) { mode = MODE_FOLLOW; + return; + } } } diff --git a/src/enemy.h b/src/enemy.h index b525b21..de6d3eb 100644 --- a/src/enemy.h +++ b/src/enemy.h @@ -307,7 +307,8 @@ struct Enemy : Character { void bite(int joint, const vec3 &offset, float damage) { ASSERT(target); target->hit(damage, this); - game->addEntity(TR::Entity::BLOOD, target->getRoomIndex(), getJoint(joint) * offset); + if (joint >= 0) + game->addEntity(TR::Entity::BLOOD, target->getRoomIndex(), getJoint(joint) * offset); } Mood getMoodFixed() { @@ -2574,7 +2575,8 @@ struct Human : Enemy { game->addMuzzleFlash(this, jointGun, muzzleOffset, -1); if (targetDist < HUMAN_DIST_SHOT && randf() < ((HUMAN_DIST_SHOT - targetDist) / HUMAN_DIST_SHOT - 0.25f)) { - bite(rand() % target->getModel()->mCount, vec3(0.0f), damage); + bite(-1, vec3(0.0f), damage); + game->addEntity(TR::Entity::BLOOD, target->getRoomIndex(), target->getJoint(rand() % target->getModel()->mCount).pos); game->playSound(target->stand == STAND_UNDERWATER ? TR::SND_HIT_UNDERWATER : TR::SND_HIT, target->pos, Sound::PAN); return true; } diff --git a/src/inventory.h b/src/inventory.h index 0950793..cd9e581 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -246,6 +246,7 @@ struct Inventory { case TR::Entity::INV_MAP : desc = Desc( STR_MAP, PAGE_INVENTORY, level->extra.inv.map ); break; case TR::Entity::INV_COMPASS : desc = Desc( STR_COMPASS, PAGE_INVENTORY, level->extra.inv.compass ); break; case TR::Entity::INV_STOPWATCH : desc = Desc( STR_STOPWATCH, PAGE_INVENTORY, level->extra.inv.stopwatch ); break; + case TR::Entity::INV_EXPLOSIVE : desc = Desc( STR_EXPLOSIVE, PAGE_INVENTORY, level->extra.inv.explosive ); break; case TR::Entity::INV_HOME : desc = Desc( STR_HOME, PAGE_OPTION, level->extra.inv.home ); break; case TR::Entity::INV_DETAIL : desc = Desc( STR_DETAIL, PAGE_OPTION, level->extra.inv.detail ); break; case TR::Entity::INV_SOUND : desc = Desc( STR_SOUND, PAGE_OPTION, level->extra.inv.sound ); break; @@ -627,6 +628,7 @@ struct Inventory { add(TR::Entity::INV_PUZZLE_3, 3); add(TR::Entity::INV_PUZZLE_4, 3); + add(TR::Entity::INV_EXPLOSIVE); add(TR::Entity::INV_LEADBAR, 3); #endif } diff --git a/src/trigger.h b/src/trigger.h index 407d3dd..88ed888 100644 --- a/src/trigger.h +++ b/src/trigger.h @@ -274,7 +274,7 @@ struct MuzzleFlash : Controller { lum = alpha; game->setShader(Core::pass, Shader::FLASH, false, true); - Core::active.shader->setParam(uMaterial, vec4(lum, 0.0f, 0.0f, alpha)); + Core::active.shader->setParam(uMaterial, vec4(lum * alpha, 0.0f, 0.0f, alpha)); Core::setBasis(&b, 1); mesh->renderModel(level->extra.muzzleFlash); diff --git a/src/ui.h b/src/ui.h index 3bcc790..f8d7d8f 100644 --- a/src/ui.h +++ b/src/ui.h @@ -89,6 +89,7 @@ enum StringID { , STR_JOY_LAST = STR_JOY_FIRST + jkMAX - 1 // inventory items , STR_UNKNOWN + , STR_EXPLOSIVE , STR_PISTOLS , STR_SHOTGUN , STR_MAGNUMS @@ -216,6 +217,7 @@ const char *STR[STR_MAX] = { , "NONE", "A", "B", "X", "Y", "L BUMPER", "R BUMPER", "SELECT", "START", "L STICK", "R STICK", "L TRIGGER", "R TRIGGER", "D-LEFT", "D-RIGHT", "D-UP", "D-DOWN" // inventory items , "Unknown" + , "Explosive" , "Pistols" , "Shotgun" , "Magnums"