From 098542de69aa400364605a53520f4c005d929819 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Tue, 11 Oct 2022 12:16:59 +1100 Subject: [PATCH] - Duke: Call `movetransports()` before processing any player movement. * This simply works much better. In addition to being able to revert commits like `- Duke: Maintain x/y/z velocity when falling through a portal, such as E1L1's air duct.`, transitioning from above water to underwater and vice-versa is interpolated, smooth and seamless, something that I was unable to hack in without this change. --- source/games/duke/src/actors_d.cpp | 1 - source/games/duke/src/actors_r.cpp | 1 - source/games/duke/src/dispatch.cpp | 4 ++++ source/games/duke/src/duke3d.h | 1 + source/games/duke/src/gameloop.cpp | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index 10eb8dd8e..47fbd7013 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -3274,7 +3274,6 @@ void think_d(void) movefta(); //ST 2 moveweapons_d(); //ST 4 - movetransports_d(); //ST 9 moveplayers(); //ST 10 movefallers_d(); //ST 12 moveexplosions_d(); //ST 5 diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp index 5d173e66b..59fa93006 100644 --- a/source/games/duke/src/actors_r.cpp +++ b/source/games/duke/src/actors_r.cpp @@ -3741,7 +3741,6 @@ void think_r(void) movefta(); //ST 2 moveweapons_r(); //ST 4 - movetransports_r(); //ST 9 moveplayers(); //ST 10 movefallers_r(); //ST 12 moveexplosions_r(); //ST 5 diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index dc26dd2e9..12a1095e5 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -98,6 +98,8 @@ void displaymasks_d(int snum, int p, double interpfrac); void displaymasks_r(int snum, int p, double interpfrac); void think_d(); void think_r(); +void movetransports_d(); +void movetransports_r(); void animatesprites_d(tspriteArray& tsprites, const DVector2& viewVec, DAngle viewang, double interpfrac); void animatesprites_r(tspriteArray& tsprites, const DVector2& viewVec, DAngle viewang, double interpfrac); @@ -109,6 +111,7 @@ void SetDispatcher() { fi = { think_d, + movetransports_d, initactorflags_d, isadoorwall_d, animatewalls_d, @@ -151,6 +154,7 @@ void SetDispatcher() { fi = { think_r, + movetransports_r, initactorflags_r, isadoorwall_r, animatewalls_r, diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index 7acced1f5..5b7841789 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -70,6 +70,7 @@ struct Dispatcher { // sectors_?.cpp void (*think)(); + void (*movetransports)(); void (*initactorflags)(); bool (*isadoorwall)(int dapic); void (*animatewalls)(); diff --git a/source/games/duke/src/gameloop.cpp b/source/games/duke/src/gameloop.cpp index 267170544..a60b01ebe 100644 --- a/source/games/duke/src/gameloop.cpp +++ b/source/games/duke/src/gameloop.cpp @@ -70,6 +70,7 @@ void GameInterface::Ticker() everyothertime++; global_random = krand(); + fi.movetransports();//ST 9 movedummyplayers();//ST 13 for (int i = connecthead; i >= 0; i = connectpoint2[i])