[Decompilation] [th04/th05] Handle subpixels at the C++ type level

I've had the idea to hide this implementation detail and improve code
readability for some time now, but it obviously must still all inline,
to be indistinguishable from a direct assignment of the correct value…

… which, amazingly, it does! Even the static_cast from float to int.
The latter allows us to exclusively implement this for float, since we
do have to express the occasional value smaller than 16.

Who needs macros anyway. Yay, C++ in TH04 and TH05 after all!

Part of P0030, funded by zorg.
This commit is contained in:
nmlgc 2019-09-15 19:36:17 +02:00
parent 0abf84f450
commit 9d121c7cce
5 changed files with 60 additions and 17 deletions

View File

@ -73,7 +73,7 @@ bin\th04\op.exe: bin\th04\op.obj th04\op_02.c
$**
|
bin\th05\main.exe: bin\th05\main.obj th05\main_01.c
bin\th05\main.exe: bin\th05\main.obj th05\main_01.cpp
$(CC) $(CFLAGS) -ml -3 -DGAME=5 -nbin\th05\ -eMAIN.EXE @&&|
$**
|

View File

@ -1,14 +0,0 @@
/* ReC98
* -----
* Types shared between TH04 and TH05
*/
/// Score
/// -----
extern unsigned long score_delta;
void pascal near score_update_and_render(void);
// Adds the entire score delta at once to the current score.
void pascal score_delta_commit(void);
/// -----

53
th04/shared.hpp Normal file
View File

@ -0,0 +1,53 @@
/* ReC98
* -----
* Types shared between TH04 and TH05
*/
/// Math
/// ----
class Subpixel {
private:
int v;
public:
Subpixel() {}
Subpixel(float screen_v) { *this = screen_v; }
Subpixel& operator =(float screen_v) {
v = static_cast<int>(screen_v * 16.0f);
return *this;
}
};
struct SPPoint {
Subpixel x, y;
void set(float screen_x, float screen_y) {
x = screen_x;
y = screen_y;
}
};
typedef struct {
SPPoint cur;
SPPoint prev;
SPPoint velocity;
void init(float screen_x, float screen_y) {
cur.x = screen_x;
prev.x = screen_x;
cur.y = screen_y;
prev.y = screen_y;
}
} motion_t;
/// ----
/// Score
/// -----
extern unsigned long score_delta;
void pascal near score_update_and_render(void);
// Adds the entire score delta at once to the current score.
void pascal score_delta_commit(void);
/// -----

View File

@ -3,7 +3,8 @@
* Code segment #1 of TH05's MAIN.EXE
*/
#include "th05/th05.h"
extern "C" {
#include "th05/th05.hpp"
// Adds the entire score delta at once to the current score.
void pascal score_delta_commit(void)
@ -12,3 +13,5 @@ void pascal score_delta_commit(void)
score_update_and_render();
}
}
}

View File

@ -4,4 +4,5 @@
*/
#include "ReC98.h"
#include "th04/shared.h"
#include "th04/shared.hpp"
/// ------