ref: fcc1e3cc23f050ca5b01d18fef6adcea8e93352f
parent: 041bd0e5f948d4b501f1a5589e0f98b4b67110cc
author: Gabriel Ravier <gabravier@gmail.com>
date: Sun Sep 15 06:48:18 EDT 2019
Added some common macro utilities used by most NPCs I'm pretty sure Pixel didn't actually use macros for this but I don't think just having this kind of stuff copied around everywhere is really great either Forgot to commit and push this yesterday Signed-off-by: Gabriel Ravier <gabravier@gmail.com>
--- a/src/BossFrog.cpp
+++ b/src/BossFrog.cpp
@@ -573,17 +573,9 @@
break;
}
- boss->ym += 0x40;
- if (boss->ym > 0x5FF)
- boss->ym = 0x5FF;
-
- boss->x += boss->xm;
- boss->y += boss->ym;
-
- if (boss->direct == DIR_LEFT)
- boss->rect = rcLeft[boss->ani_no];
- else
- boss->rect = rcRight[boss->ani_no];
+ NPC_DO_GRAVITY(boss, 0x40, 0x5FF);
+ NPC_UPDATE_POSITIONS_WITH_VELOCITIES(boss);
+ NPC_SET_RECT_FROM_LEFT_RIGHT(boss, rcLeft, rcRight);
ActBossChar02_01();
ActBossChar02_02();
--- a/src/NpChar.h
+++ b/src/NpChar.h
@@ -1,10 +1,29 @@
#pragma once
+#include "CommonDefines.h"
#include "WindowsWrapper.h"
#include "Draw.h"
#define NPC_MAX 0x200
+
+#define NPC_CAP_Y_VELOCITY(npc, maxYVel) \
+ if (npc->ym > (maxYVel)) \
+ npc->ym = (maxYVel)
+
+#define NPC_DO_GRAVITY(npc, ymAdd, maxYVel) \
+ npc->ym += ymAdd; \
+ NPC_CAP_Y_VELOCITY(npc, maxYVel)
+
+#define NPC_UPDATE_POSITIONS_WITH_VELOCITIES(npc) \
+ npc->x += npc->xm; \
+ npc->y = npc->ym;
+
+#define NPC_SET_RECT_FROM_LEFT_RIGHT(npc, rcLeft, rcRight) \
+ if (npc->direct == DIR_LEFT) \
+ npc->rect = rcLeft[npc->ani_no]; \
+ else \
+ npc->rect = rcRight[npc->ani_no];
// Be careful when changing these: they're baked into the 'npc.tbl' file
enum NPCFlags