Browse Source

Add enum to represent monster sound effects

pull/5159/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
9309f2fe4f
  1. 6
      Source/missiles.cpp
  2. 34
      Source/monster.cpp
  3. 9
      Source/monster.h

6
Source/missiles.cpp

@ -247,7 +247,7 @@ bool MonsterMHit(int pnum, int monsterId, int mindam, int maxdam, int dist, miss
if (monster.hitPoints >> 6 <= 0) { if (monster.hitPoints >> 6 <= 0) {
M_StartKill(monster, player); M_StartKill(monster, player);
} else if (resist) { } else if (resist) {
PlayEffect(monster, 1); PlayEffect(monster, MonsterSound::Hit);
} else { } else {
if (monster.mode != MonsterMode::Petrified && MissilesData[t].mType == 0 && HasAnyOf(player._pIFlags, ItemSpecialEffect::Knockback)) if (monster.mode != MonsterMode::Petrified && MissilesData[t].mType == 0 && HasAnyOf(player._pIFlags, ItemSpecialEffect::Knockback))
M_GetKnockback(monster); M_GetKnockback(monster);
@ -885,9 +885,9 @@ bool MonsterTrapHit(int monsterId, int mindam, int maxdam, int dist, missile_id
if (monster.hitPoints >> 6 <= 0) { if (monster.hitPoints >> 6 <= 0) {
MonsterDeath(monster, monster.direction, true); MonsterDeath(monster, monster.direction, true);
} else if (resist) { } else if (resist) {
PlayEffect(monster, 1); PlayEffect(monster, MonsterSound::Hit);
} else if (monster.type().type != MT_GOLEM) { } else if (monster.type().type != MT_GOLEM) {
PlayEffect(monster, 1); PlayEffect(monster, MonsterSound::Hit);
M_StartHit(monster, dam); M_StartHit(monster, dam);
} }
return true; return true;

34
Source/monster.cpp

@ -1151,7 +1151,7 @@ bool MonsterWalk(Monster &monster, MonsterMode variant)
} else { // We didn't reach new tile so update monster's "sub-tile" position } else { // We didn't reach new tile so update monster's "sub-tile" position
if (monster.animInfo.tickCounterOfCurrentFrame == 0) { if (monster.animInfo.tickCounterOfCurrentFrame == 0) {
if (monster.animInfo.currentFrame == 0 && monster.type().type == MT_FLESTHNG) if (monster.animInfo.currentFrame == 0 && monster.type().type == MT_FLESTHNG)
PlayEffect(monster, 3); PlayEffect(monster, MonsterSound::Special);
monster.position.offset2 += monster.position.velocity; monster.position.offset2 += monster.position.velocity;
monster.position.offset.deltaX = monster.position.offset2.deltaX >> 4; monster.position.offset.deltaX = monster.position.offset2.deltaX >> 4;
monster.position.offset.deltaY = monster.position.offset2.deltaY >> 4; monster.position.offset.deltaY = monster.position.offset2.deltaY >> 4;
@ -1176,7 +1176,7 @@ void ApplyMonsterDamage(Monster &monster, int damage)
delta_monster_hp(monster, *MyPlayer); delta_monster_hp(monster, *MyPlayer);
NetSendCmdMonDmg(false, monster.getId(), damage); NetSendCmdMonDmg(false, monster.getId(), damage);
PlayEffect(monster, 1); PlayEffect(monster, MonsterSound::Hit);
} }
void MonsterAttackMonster(Monster &attacker, Monster &target, int hper, int mind, int maxd) void MonsterAttackMonster(Monster &attacker, Monster &target, int hper, int mind, int maxd)
@ -1342,20 +1342,20 @@ bool MonsterAttack(Monster &monster)
if (monster.animInfo.currentFrame == monster.data().animFrameNum - 1) { if (monster.animInfo.currentFrame == monster.data().animFrameNum - 1) {
MonsterAttackEnemy(monster, monster.toHit, monster.minDamage, monster.maxDamage); MonsterAttackEnemy(monster, monster.toHit, monster.minDamage, monster.maxDamage);
if (monster.ai != AI_SNAKE) if (monster.ai != AI_SNAKE)
PlayEffect(monster, 0); PlayEffect(monster, MonsterSound::Attack);
} }
if (IsAnyOf(monster.type().type, MT_NMAGMA, MT_YMAGMA, MT_BMAGMA, MT_WMAGMA) && monster.animInfo.currentFrame == 8) { if (IsAnyOf(monster.type().type, MT_NMAGMA, MT_YMAGMA, MT_BMAGMA, MT_WMAGMA) && monster.animInfo.currentFrame == 8) {
MonsterAttackEnemy(monster, monster.toHit + 10, monster.minDamage - 2, monster.maxDamage - 2); MonsterAttackEnemy(monster, monster.toHit + 10, monster.minDamage - 2, monster.maxDamage - 2);
PlayEffect(monster, 0); PlayEffect(monster, MonsterSound::Attack);
} }
if (IsAnyOf(monster.type().type, MT_STORM, MT_RSTORM, MT_STORML, MT_MAEL) && monster.animInfo.currentFrame == 12) { if (IsAnyOf(monster.type().type, MT_STORM, MT_RSTORM, MT_STORML, MT_MAEL) && monster.animInfo.currentFrame == 12) {
MonsterAttackEnemy(monster, monster.toHit - 20, monster.minDamage + 4, monster.maxDamage + 4); MonsterAttackEnemy(monster, monster.toHit - 20, monster.minDamage + 4, monster.maxDamage + 4);
PlayEffect(monster, 0); PlayEffect(monster, MonsterSound::Attack);
} }
if (monster.ai == AI_SNAKE && monster.animInfo.currentFrame == 0) if (monster.ai == AI_SNAKE && monster.animInfo.currentFrame == 0)
PlayEffect(monster, 0); PlayEffect(monster, MonsterSound::Attack);
if (monster.animInfo.currentFrame == monster.animInfo.numberOfFrames - 1) { if (monster.animInfo.currentFrame == monster.animInfo.numberOfFrames - 1) {
M_StartStand(monster, monster.direction); M_StartStand(monster, monster.direction);
return true; return true;
@ -1384,7 +1384,7 @@ bool MonsterRangedAttack(Monster &monster)
0); 0);
} }
} }
PlayEffect(monster, 0); PlayEffect(monster, MonsterSound::Attack);
} }
if (monster.animInfo.currentFrame == monster.animInfo.numberOfFrames - 1) { if (monster.animInfo.currentFrame == monster.animInfo.numberOfFrames - 1) {
@ -1408,7 +1408,7 @@ bool MonsterRangedSpecialAttack(Monster &monster)
monster.var3, monster.var3,
0) 0)
!= nullptr) { != nullptr) {
PlayEffect(monster, 3); PlayEffect(monster, MonsterSound::Special);
} }
} }
@ -1622,7 +1622,7 @@ void MonsterDeath(Monster &monster)
bool MonsterSpecialStand(Monster &monster) bool MonsterSpecialStand(Monster &monster)
{ {
if (monster.animInfo.currentFrame == monster.data().animFrameNumSpecial - 1) if (monster.animInfo.currentFrame == monster.data().animFrameNumSpecial - 1)
PlayEffect(monster, 3); PlayEffect(monster, MonsterSound::Special);
if (monster.animInfo.currentFrame == monster.animInfo.numberOfFrames - 1) { if (monster.animInfo.currentFrame == monster.animInfo.numberOfFrames - 1) {
M_StartStand(monster, monster.direction); M_StartStand(monster, monster.direction);
@ -2311,7 +2311,7 @@ void RhinoAi(Monster &monster)
size_t monsterId = monster.getId(); size_t monsterId = monster.getId();
if (AddMissile(monster.position.tile, monster.enemyPosition, md, MIS_RHINO, TARGET_PLAYERS, monsterId, 0, 0) != nullptr) { if (AddMissile(monster.position.tile, monster.enemyPosition, md, MIS_RHINO, TARGET_PLAYERS, monsterId, 0, 0) != nullptr) {
if (monster.data().hasSpecialSound) if (monster.data().hasSpecialSound)
PlayEffect(monster, 3); PlayEffect(monster, MonsterSound::Special);
dMonster[monster.position.tile.x][monster.position.tile.y] = -(monsterId + 1); dMonster[monster.position.tile.x][monster.position.tile.y] = -(monsterId + 1);
monster.mode = MonsterMode::Charge; monster.mode = MonsterMode::Charge;
} }
@ -2695,7 +2695,7 @@ void SnakeAi(Monster &monster)
if (distanceToEnemy < 3 && LineClear([&monster](Point position) { return IsTileAvailable(monster, position); }, monster.position.tile, monster.enemyPosition) && static_cast<MonsterMode>(monster.var1) != MonsterMode::Charge) { if (distanceToEnemy < 3 && LineClear([&monster](Point position) { return IsTileAvailable(monster, position); }, monster.position.tile, monster.enemyPosition) && static_cast<MonsterMode>(monster.var1) != MonsterMode::Charge) {
size_t monsterId = monster.getId(); size_t monsterId = monster.getId();
if (AddMissile(monster.position.tile, monster.enemyPosition, md, MIS_RHINO, TARGET_PLAYERS, monsterId, 0, 0) != nullptr) { if (AddMissile(monster.position.tile, monster.enemyPosition, md, MIS_RHINO, TARGET_PLAYERS, monsterId, 0, 0) != nullptr) {
PlayEffect(monster, 0); PlayEffect(monster, MonsterSound::Attack);
dMonster[monster.position.tile.x][monster.position.tile.y] = -(monsterId + 1); dMonster[monster.position.tile.x][monster.position.tile.y] = -(monsterId + 1);
monster.mode = MonsterMode::Charge; monster.mode = MonsterMode::Charge;
} }
@ -3555,7 +3555,7 @@ void WeakenNaKrul()
return; return;
auto &monster = Monsters[UberDiabloMonsterIndex]; auto &monster = Monsters[UberDiabloMonsterIndex];
PlayEffect(monster, 2); PlayEffect(monster, MonsterSound::Death);
Quests[Q_NAKRUL]._qlog = false; Quests[Q_NAKRUL]._qlog = false;
monster.armorClass -= 50; monster.armorClass -= 50;
int hp = monster.maxHitPoints / 2; int hp = monster.maxHitPoints / 2;
@ -3768,7 +3768,7 @@ void M_StartHit(Monster &monster, const Player &player, int dam)
monster.direction = GetMonsterDirection(monster); monster.direction = GetMonsterDirection(monster);
} }
PlayEffect(monster, 1); PlayEffect(monster, MonsterSound::Hit);
M_StartHit(monster, dam); M_StartHit(monster, dam);
} }
@ -3786,7 +3786,7 @@ void MonsterDeath(Monster &monster, Direction md, bool sendmsg)
if (monster.type().type == MT_DIABLO) if (monster.type().type == MT_DIABLO)
DiabloDeath(monster, true); DiabloDeath(monster, true);
else else
PlayEffect(monster, 2); PlayEffect(monster, MonsterSound::Death);
if (monster.mode != MonsterMode::Petrified) { if (monster.mode != MonsterMode::Petrified) {
if (monster.type().type == MT_GOLEM) if (monster.type().type == MT_GOLEM)
@ -4405,7 +4405,7 @@ void PrintUniqueHistory()
} }
} }
void PlayEffect(Monster &monster, int mode) void PlayEffect(Monster &monster, MonsterSound mode)
{ {
if (MyPlayer->pLvlLoad != 0) { if (MyPlayer->pLvlLoad != 0) {
return; return;
@ -4416,7 +4416,7 @@ void PlayEffect(Monster &monster, int mode)
return; return;
} }
TSnd *snd = monster.type().sounds[mode][sndIdx].get(); TSnd *snd = monster.type().sounds[static_cast<size_t>(mode)][sndIdx].get();
if (snd == nullptr || snd->isPlaying()) { if (snd == nullptr || snd->isPlaying()) {
return; return;
} }
@ -4442,7 +4442,7 @@ void MissToMonst(Missile &missile, Point position)
monster.position.tile = position; monster.position.tile = position;
M_StartStand(monster, monster.direction); M_StartStand(monster, monster.direction);
if ((monster.flags & MFLAG_TARGETS_MONSTER) == 0) if ((monster.flags & MFLAG_TARGETS_MONSTER) == 0)
PlayEffect(monster, 1); PlayEffect(monster, MonsterSound::Hit);
else else
ApplyMonsterDamage(monster, 0); ApplyMonsterDamage(monster, 0);
M_StartHit(monster, 0); M_StartHit(monster, 0);

9
Source/monster.h

@ -150,6 +150,13 @@ struct AnimStruct {
int8_t rate; int8_t rate;
}; };
enum class MonsterSound {
Attack,
Hit,
Death,
Special
};
struct CMonster { struct CMonster {
std::unique_ptr<byte[]> animData; std::unique_ptr<byte[]> animData;
AnimStruct anims[6]; AnimStruct anims[6];
@ -399,7 +406,7 @@ void SyncMonsterAnim(Monster &monster);
void M_FallenFear(Point position); void M_FallenFear(Point position);
void PrintMonstHistory(int mt); void PrintMonstHistory(int mt);
void PrintUniqueHistory(); void PrintUniqueHistory();
void PlayEffect(Monster &monster, int mode); void PlayEffect(Monster &monster, MonsterSound mode);
void MissToMonst(Missile &missile, Point position); void MissToMonst(Missile &missile, Point position);
Monster *MonsterAtPosition(Point position); Monster *MonsterAtPosition(Point position);

Loading…
Cancel
Save