From 44d8b9fb3aa22be068879ca79fc494f534760a3c Mon Sep 17 00:00:00 2001 From: FluffyQuack Date: Wed, 3 Feb 2021 18:05:34 +0100 Subject: [PATCH] Refactored the monster functions DoWalk(), DoWalk2(), and DoWalk3() into one function. --- Source/monster.cpp | 108 ++++++++++++--------------------------------- enums.h | 6 +-- 2 files changed, 31 insertions(+), 83 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index c473cdbe0..5e4f69cba 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2044,55 +2044,41 @@ BOOL M_DoStand(int i) return FALSE; } -BOOL M_DoWalk(int i) +/** + * @brief Continue movement towards new tile + */ +bool M_DoWalk(int i, int variant) { - BOOL rv; + bool returnValue; commitment((DWORD)i < MAXMONSTERS, i); commitment(monster[i].MType != NULL, i); + //Check if we reached new tile if (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) { - dMonster[monster[i]._mx][monster[i]._my] = 0; - monster[i]._mx += monster[i]._mVar1; - monster[i]._my += monster[i]._mVar2; - dMonster[monster[i]._mx][monster[i]._my] = i + 1; - if (monster[i].mlid != NO_LIGHT) - ChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my); - M_StartStand(i, monster[i]._mdir); - rv = TRUE; - } else { - if (monster[i]._mAnimCnt == 0) { - if (monster[i]._mVar8 == 0 && monster[i].MType->mtype == MT_FLESTHNG) - PlayEffect(i, 3); - monster[i]._mVar8++; - monster[i]._mVar6 += monster[i]._mxvel; - monster[i]._mVar7 += monster[i]._myvel; - monster[i]._mxoff = monster[i]._mVar6 >> 4; - monster[i]._myoff = monster[i]._mVar7 >> 4; + switch (variant) { + case MM_WALK: + dMonster[monster[i]._mx][monster[i]._my] = 0; + monster[i]._mx += monster[i]._mVar1; + monster[i]._my += monster[i]._mVar2; + dMonster[monster[i]._mx][monster[i]._my] = i + 1; + break; + case MM_WALK2: + dMonster[monster[i]._mVar1][monster[i]._mVar2] = 0; + break; + case MM_WALK3: + dMonster[monster[i]._mx][monster[i]._my] = 0; + monster[i]._mx = monster[i]._mVar1; + monster[i]._my = monster[i]._mVar2; + dFlags[monster[i]._mVar4][monster[i]._mVar5] &= ~BFLAG_MONSTLR; + dMonster[monster[i]._mx][monster[i]._my] = i + 1; + break; } - rv = FALSE; - } - - if (monster[i].mlid != NO_LIGHT) - M_ChangeLightOffset(i); - - return rv; -} - -BOOL M_DoWalk2(int i) -{ - BOOL rv; - - commitment((DWORD)i < MAXMONSTERS, i); - commitment(monster[i].MType != NULL, i); - - if (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) { - dMonster[monster[i]._mVar1][monster[i]._mVar2] = 0; if (monster[i].mlid != NO_LIGHT) ChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my); M_StartStand(i, monster[i]._mdir); - rv = TRUE; - } else { + returnValue = TRUE; + } else { //We didn't reach new tile so update monster's "sub-tile" position if (monster[i]._mAnimCnt == 0) { if (monster[i]._mVar8 == 0 && monster[i].MType->mtype == MT_FLESTHNG) PlayEffect(i, 3); @@ -2102,47 +2088,13 @@ BOOL M_DoWalk2(int i) monster[i]._mxoff = monster[i]._mVar6 >> 4; monster[i]._myoff = monster[i]._mVar7 >> 4; } - rv = FALSE; + returnValue = FALSE; } - if (monster[i].mlid != NO_LIGHT) - M_ChangeLightOffset(i); - - return rv; -} - -BOOL M_DoWalk3(int i) -{ - BOOL rv; - - commitment((DWORD)i < MAXMONSTERS, i); - commitment(monster[i].MType != NULL, i); - if (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) { - dMonster[monster[i]._mx][monster[i]._my] = 0; - monster[i]._mx = monster[i]._mVar1; - monster[i]._my = monster[i]._mVar2; - dFlags[monster[i]._mVar4][monster[i]._mVar5] &= ~BFLAG_MONSTLR; - dMonster[monster[i]._mx][monster[i]._my] = i + 1; - if (monster[i].mlid != NO_LIGHT) - ChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my); - M_StartStand(i, monster[i]._mdir); - rv = TRUE; - } else { - if (monster[i]._mAnimCnt == 0) { - if (monster[i]._mVar8 == 0 && monster[i].MType->mtype == MT_FLESTHNG) - PlayEffect(i, 3); - monster[i]._mVar8++; - monster[i]._mVar6 += monster[i]._mxvel; - monster[i]._mVar7 += monster[i]._myvel; - monster[i]._mxoff = monster[i]._mVar6 >> 4; - monster[i]._myoff = monster[i]._mVar7 >> 4; - } - rv = FALSE; - } if (monster[i].mlid != NO_LIGHT) // BUGFIX: change uniqtype check to mlid check like it is in all other places (fixed) M_ChangeLightOffset(i); - return rv; + return returnValue; } void M_TryM2MHit(int i, int mid, int hper, int mind, int maxd) @@ -4804,13 +4756,9 @@ void ProcessMonsters() raflag = M_DoStand(mi); break; case MM_WALK: - raflag = M_DoWalk(mi); - break; case MM_WALK2: - raflag = M_DoWalk2(mi); - break; case MM_WALK3: - raflag = M_DoWalk3(mi); + raflag = M_DoWalk(mi, Monst->_mmode); break; case MM_ATTACK: raflag = M_DoAttack(mi); diff --git a/enums.h b/enums.h index 85319295d..aa9eadcf0 100644 --- a/enums.h +++ b/enums.h @@ -2424,9 +2424,9 @@ typedef enum _difficulty { typedef enum MON_MODE { MM_STAND = 0, - MM_WALK = 1, - MM_WALK2 = 2, - MM_WALK3 = 3, + MM_WALK = 1, //Movement towards N, NW, or NE + MM_WALK2 = 2, //Movement towards S, SW, or SE + MM_WALK3 = 3, //Movement towards W or E MM_ATTACK = 4, MM_GOTHIT = 5, MM_DEATH = 6,