| 1397 | } |
| 1398 | |
| 1399 | void collide_generic_and_wall(object *genericobj, float hitspeed, int hitseg, int hitwall, vector *hitpt, |
| 1400 | vector *wall_normal, float hit_dot) { |
| 1401 | bool f_volatile, f_lava; |
| 1402 | bool f_forcefield; |
| 1403 | float volume = MAX_GAME_VOLUME; |
| 1404 | |
| 1405 | // Check for a trigger on this wall |
| 1406 | int tmap; |
| 1407 | if (!ROOMNUM_OUTSIDE(hitseg)) // Make sure we've hit a wall, and not terrain |
| 1408 | { |
| 1409 | CheckTrigger(hitseg, hitwall, genericobj, TT_COLLIDE); |
| 1410 | tmap = Rooms[hitseg].faces[hitwall].tmap; |
| 1411 | } else { |
| 1412 | tmap = Terrain_tex_seg[Terrain_seg[CELLNUM(hitseg)].texseg_index].tex_index; |
| 1413 | } |
| 1414 | f_forcefield = (GameTextures[tmap].flags & TF_FORCEFIELD) != 0; |
| 1415 | f_volatile = (GameTextures[tmap].flags & TF_VOLATILE) != 0; |
| 1416 | f_lava = (GameTextures[tmap].flags & TF_LAVA) != 0; |
| 1417 | |
| 1418 | if (IS_GUIDEBOT(genericobj)) { |
| 1419 | f_forcefield = false; |
| 1420 | f_volatile = false; |
| 1421 | f_lava = false; |
| 1422 | } |
| 1423 | |
| 1424 | if (f_lava) { |
| 1425 | if (!((Game_mode & GM_MULTI) && (Netgame.local_role == LR_CLIENT))) { |
| 1426 | int id = FindWeaponName("NapalmBlob"); |
| 1427 | if (id >= 0) |
| 1428 | SetNapalmDamageEffect(genericobj, nullptr, id); |
| 1429 | else |
| 1430 | Int3(); |
| 1431 | } |
| 1432 | } |
| 1433 | |
| 1434 | // If volatile, make the sound & apply damage |
| 1435 | if (f_volatile && !((Game_mode & GM_MULTI) && (Netgame.local_role == LR_CLIENT))) { |
| 1436 | ApplyDamageToGeneric(genericobj, genericobj, GD_VOLATILE_HISS, VOLATILE_DAMAGE); |
| 1437 | Sound_system.Play3dSound(SOUND_VOLATILE_HISS, SND_PRIORITY_HIGHEST, genericobj, MAX_GAME_VOLUME); |
| 1438 | } |
| 1439 | |
| 1440 | if (f_forcefield && !((Game_mode & GM_MULTI) && (Netgame.local_role == LR_CLIENT))) { |
| 1441 | if (sound_override_force_field == -1) { |
| 1442 | Sound_system.Play3dSound(SOUND_FORCEFIELD_BOUNCE, SND_PRIORITY_LOW, genericobj, MAX_GAME_VOLUME); |
| 1443 | ApplyDamageToGeneric(genericobj, genericobj, GD_ENERGY, FORCEFIELD_DAMAGE); |
| 1444 | } else { |
| 1445 | Sound_system.Play3dSound(sound_override_force_field, SND_PRIORITY_LOW, genericobj, MAX_GAME_VOLUME); |
| 1446 | } |
| 1447 | } |
| 1448 | |
| 1449 | if (genericobj->control_type != CT_AI) { |
| 1450 | if (!f_forcefield && !f_volatile && !f_lava && hitspeed > MIN_WALL_HIT_SOUND_VEL) { |
| 1451 | if (hitspeed < MAX_WALL_HIT_SOUND_VEL) { |
| 1452 | volume = |
| 1453 | MAX_GAME_VOLUME * (hitspeed - MIN_WALL_HIT_SOUND_VEL) / (MAX_WALL_HIT_SOUND_VEL - MIN_WALL_HIT_SOUND_VEL); |
| 1454 | } |
| 1455 | |
| 1456 | if (hitspeed > MIN_WALL_DAMAGE_SPEED) { |
no test coverage detected