summaryrefslogtreecommitdiff
path: root/src/d/d_player_mdl.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-05-22 10:55:33 +0200
committerrobojumper <robojumper@gmail.com>2025-05-22 10:55:33 +0200
commitefd3d68b0446e62c45a07c042bec13eb3bbbe449 (patch)
treea3b969492d9f91d3f87d341f99f8920d064dcc84 /src/d/d_player_mdl.cpp
parenta2397c773b65e0adfc9f2caf27a370d3bbdd44a2 (diff)
Shameful goto
Diffstat (limited to 'src/d/d_player_mdl.cpp')
-rw-r--r--src/d/d_player_mdl.cpp67
1 files changed, 42 insertions, 25 deletions
diff --git a/src/d/d_player_mdl.cpp b/src/d/d_player_mdl.cpp
index cd33f24d..face7de4 100644
--- a/src/d/d_player_mdl.cpp
+++ b/src/d/d_player_mdl.cpp
@@ -1907,35 +1907,52 @@ void daPlayerModelBase_c::setPosCopy3() {
checkCurrentAction(/* HANG_ON_ZIP */ 0x85)) {
poscopy3 = position;
poscopy3.y -= 100.0f;
- } else if (checkActionFlags(FLG0_HANGING_LEDGE) || (getCurrentAction() >= 0x82 && getCurrentAction() <= 0x84)) {
- // TODO this control flow is weird
- const nw4r::math::MTX34 *c = mHeadMdl.getLocalMtx();
- poscopy3.x = c->_03;
- poscopy3.y = c->_13;
- poscopy3.z = c->_23;
- } else if (checkCurrentAction(/* SLIDING */ 0x09)) {
- poscopy3 = position + mVec3_c(posCopy3v2);
} else {
- mMtx_c mtx;
- mMainMdl.getLocalMtx(mtx);
+ // TODO maybe fakematch, is there a way to avoid this goto?
+ if (checkActionFlags(FLG0_HANGING_LEDGE)) {
+ goto label;
+ }
- f32 f;
- const Vec *v;
- if (checkActionFlags(FLG0_IN_WATER) || checkCurrentAction(/* SWIM_DASH_INFO_AIR */ 0x57)) {
- v = &posCopy3v3;
- f = position.y;
- } else {
- if (checkCurrentAction(/* VOID_SAND */ 0x4C)) {
- v = &posCopy3v3;
- } else {
- v = checkActionFlags(FLG0_CRAWLING) ? &posCopy3v1 : &posCopy3v0;
+ switch (getCurrentAction()) {
+ case 0x82:
+ case 0x83:
+ case 0x84: {
+ label:
+ const nw4r::math::MTX34 *c = mHeadMdl.getLocalMtx();
+ poscopy3.x = c->_03;
+ poscopy3.y = c->_13;
+ poscopy3.z = c->_23;
+ break;
+ }
+ case 0x09: {
+ // SLIDING
+ poscopy3 = position + mVec3_c(posCopy3v2);
+ break;
+ }
+ default: {
+ mMtx_c mtx;
+ mMainMdl.getLocalMtx(mtx);
+
+ f32 f;
+ const Vec *v;
+ if (checkActionFlags(FLG0_IN_WATER) || checkCurrentAction(/* SWIM_DASH_INFO_AIR */ 0x57)) {
+ v = &posCopy3v3;
+ f = position.y;
+ } else {
+ if (checkCurrentAction(/* VOID_SAND */ 0x4C)) {
+ v = &posCopy3v3;
+ } else {
+ v = checkActionFlags(FLG0_CRAWLING) ? &posCopy3v1 : &posCopy3v0;
+ }
+ f = mtx.m[1][3];
+ }
+ poscopy3.copyFrom(v);
+ poscopy3.x += position.x;
+ poscopy3.y += f;
+ poscopy3.z += position.z;
+ break;
}
- f = mtx.m[1][3];
}
- poscopy3.copyFrom(v);
- poscopy3.x += position.x;
- poscopy3.y += f;
- poscopy3.z += position.z;
}
}