diff --git a/Makefile.mak b/Makefile.mak
index 04dd1d92..e96d87e0 100644
--- a/Makefile.mak
+++ b/Makefile.mak
@@ -59,7 +59,7 @@ bin\th01\op.exe: bin\piloadc.obj bin\th01\op.obj th01\op_01.cpp th01\op_02.c th0
$**
|
-bin\th01\reiiden.exe: bin\piloadc.obj bin\th01\reiiden.obj th01\main_01.cpp th01\main_02.c th01\main_03.c th01\main_04.c th01\main_05.c th01\main_06.cpp th01\main_07.cpp th01\main_08.cpp th01\main_12.c th01\main_13.cpp th01\main_13_.cpp th01\main_14.c th01\main_16.c th01\main_19.cpp th01\main_25.cpp th01\main_27.cpp th01\main_38.cpp
+bin\th01\reiiden.exe: bin\piloadc.obj bin\th01\reiiden.obj th01\main_01.cpp th01\main_01_.cpp th01\main_02.c th01\main_03.c th01\main_04.c th01\main_05.c th01\main_06.cpp th01\main_07.cpp th01\main_08.cpp th01\main_12.c th01\main_13.cpp th01\main_13_.cpp th01\main_14.c th01\main_16.c th01\main_19.cpp th01\main_25.cpp th01\main_27.cpp th01\main_38.cpp
$(CC) $(CFLAGS) -ml -3 -DGAME=1 -DBINARY='M' -nbin\th01\ -eREIIDEN.EXE @&&|
$**
|
diff --git a/Research/Borland C++ decompilation.md b/Research/Borland C++ decompilation.md
index da6541cb..b108f4e4 100644
--- a/Research/Borland C++ decompilation.md
+++ b/Research/Borland C++ decompilation.md
@@ -33,7 +33,7 @@ where the scalar-type variable is declared in relation to them.
| `MOV al, var`
`MOV ah, 0`| `var` is *unsigned char* |
| `MOV al, var`
`CBW` | `var` is *char*, `AX` is *int* |
-## Arithmetic
+## Integer arithmetic
| | |
|-|-|
@@ -55,6 +55,39 @@ must be spelled out to silence the `Possibly incorrect assignment` warning.
`SUB` means that `??` is unsigned. Might require suffixing `imm` with `u` in
case it's part of an arithmetic expression that was promoted to `int`.
+## Floating-point arithmetic
+
+* Since the x87 FPU can only load from memory, all temporary results of
+ arithmetic are spilled to one single compiler-generated variable (`fpu_tmp`)
+ on the stack, which is reused across all of the function:
+
+ | | |
+ |-|-|
+ | `MOVÂ AX, myint`
`INCÂ AX`
`MOVÂ fpu_tmp, ax`
`FILD fpu_tmp`
`FSTP ret` | `float ret = (myint + 1)` |
+
+* The same `fpu_tmp` variable is also used as the destination for `FNSTSW`,
+ used in comparisons.
+
+* Performing arithmetic or comparisons between `float` and `double` variables
+ *always* `FLD`s the `float` first, before emitting the corresponding FPU
+ instruction for the `double`, regardless of how the variables are placed in
+ the expression. The instruction order only matches the expression order for
+ literals:
+
+ ```c++
+ char ret;
+ float f;
+ double d;
+
+ ret = (f > d); // FLD f, FCOMP d
+ ret = (d > f); // FLD f, FCOMP d
+
+ ret = (d > 3.14f); // FLD d, FCOMP 3.14f
+ ret = (3.14f > d); // FLD 3.14f, FCOMP d
+ ret = (f > 3.14); // FLD f, FCOMP 3.14 + 4
+ ret = (3.14 > f); // FLD 3.14, FCOMP f + 4
+ ```
+
## `switch` statements
* Sequence of the individual cases is identical in both C and ASM
diff --git a/th01/main/player/orb.cpp b/th01/main/player/orb.cpp
new file mode 100644
index 00000000..57ab7d5c
--- /dev/null
+++ b/th01/main/player/orb.cpp
@@ -0,0 +1,134 @@
+#include "th01/main/playfld.hpp"
+#include "th01/main/player/orb.hpp"
+
+extern const double ORB_VELOCITY_Y_MIN;
+extern const float ORB_VELOCITY_Y_MAX;
+extern const double ORB_COEFFICIENT_OF_RESTITUTION;
+
+inline double gravity_for(const double& force)
+{
+ return ((orb_force_frame / 5) + orb_force);
+}
+/// Temporary data segment workarounds
+/// ----------------------------------
+// Also needs to be spelled out in ASM to avoid the unwanted WAIT instruction
+// afterwards.
+#define GRAVITY_FOR(force) \
+ _AX = orb_force_frame / 5; \
+ asm mov [bp-2], ax; \
+ asm fild word ptr [bp-2]; \
+ asm fadd force;
+
+// Neither WAIT nor FWAIT emit the emulated WAIT we want...
+#define FWAIT db 0xCD, 0x3D;
+/// ----------------------------------
+
+int orb_velocity_y_update(void)
+{
+ /* TODO: Proper decompilation, once data can be emitted here:
+ * ----------------------------------------------------------
+ orb_velocity_y = gravity_for(orb_force);
+ if(orb_velocity_y > ORB_VELOCITY_Y_MAX) {
+ orb_velocity_y = ORB_VELOCITY_Y_MAX;
+ } else if(orb_velocity_y < ORB_VELOCITY_Y_MIN) {
+ orb_velocity_y = ORB_VELOCITY_Y_MIN;
+ }
+ return gravity_for(orb_force);
+ * ----------------------------------------------------------
+ * Performing arithmetic or comparisons between a double (orb_velocity_y)
+ * and a float (ORB_VELOCITY_Y_MAX) variable always FLDs the float first,
+ * before emitting the corresponding FPU instruction with the double,
+ * which is not what we want here.
+ */
+ GRAVITY_FOR(orb_force);
+ asm {
+ fstp orb_velocity_y;
+ fld orb_velocity_y;
+ fcomp ORB_VELOCITY_Y_MAX;
+ fstsw [bp-2];
+ FWAIT;
+ mov ax, [bp-2];
+ sahf;
+ jbe min_velocity_check;
+ fld ORB_VELOCITY_Y_MAX;
+ }
+ goto set_velocity;
+min_velocity_check:
+ if(orb_velocity_y < ORB_VELOCITY_Y_MIN) asm {
+ fld ORB_VELOCITY_Y_MIN;
+set_velocity:
+ fstp orb_velocity_y;
+ FWAIT;
+ }
+ return gravity_for(orb_force);
+}
+
+#define random_velocity_change(val, new_velocity) \
+ if(orb_force_frame < 17) { \
+ if((rand() % 50) == val) { \
+ orb_velocity_x = new_velocity; \
+ } \
+ }
+
+void orb_force_new(double immediate, orb_force_t force)
+{
+ extern const float ORB_FORCE_2_0;
+ extern const double ORB_FORCE_SHOT_BASE;
+
+ if(force == OF_BOUNCE_FROM_GROUND) {
+ orb_force = (-orb_velocity_y * ORB_COEFFICIENT_OF_RESTITUTION);
+ if(orb_velocity_x == OVX_0) {
+ random_velocity_change(0, OVX_4_LEFT);
+ random_velocity_change(1, OVX_4_RIGHT);
+ }
+ }
+ if(force == OF_BOUNCE_FROM_TOP) {
+ orb_force = ((-orb_velocity_y) - (orb_force_frame / 4));
+ }
+ if(force == OF_SHOT) {
+ /* TODO: Proper decompilation, once data can be emitted here:
+ * ----------------------------------------------------------
+ orb_force = ((orb_velocity_y / ORB_FORCE_2_0) + ORB_FORCE_SHOT_BASE);
+ * ----------------------------------------------------------
+ * Performing arithmetic or comparisons between a double
+ * (orb_velocity_y) and a float (ORB_FORCE_2_0) variable always FLDs
+ * the float first, before emitting the corresponding FPU instruction
+ * with the double, which is not what we want here.
+ */
+ asm {
+ fld orb_velocity_y;
+ fdiv ORB_FORCE_2_0;
+ fadd ORB_FORCE_SHOT_BASE;
+ fstp orb_force;
+ FWAIT;
+ }
+ }
+ if(force == OF_IMMEDIATE) {
+ orb_force = immediate;
+ }
+ orb_force_frame = 0;
+}
+
+void orb_move_x(orb_velocity_x_t velocity_x)
+{
+ switch(velocity_x) {
+ case OVX_4_LEFT: orb_cur_left -= 4; break;
+ case OVX_4_RIGHT: orb_cur_left += 4; break;
+ case OVX_8_LEFT: orb_cur_left -= 8; break;
+ case OVX_8_RIGHT: orb_cur_left += 8; break;
+ }
+ if(orb_cur_left <= ORB_LEFT_MIN) {
+ if(orb_velocity_x == OVX_4_LEFT) {
+ orb_velocity_x = OVX_4_RIGHT;
+ } else if(orb_velocity_x == OVX_8_LEFT) {
+ orb_velocity_x = OVX_8_RIGHT;
+ }
+ }
+ if(orb_cur_left >= ORB_LEFT_MAX) {
+ if(orb_velocity_x == OVX_4_RIGHT) {
+ orb_velocity_x = OVX_4_LEFT;
+ } else if(orb_velocity_x == OVX_8_RIGHT) {
+ orb_velocity_x = OVX_8_LEFT;
+ }
+ }
+}
diff --git a/th01/main/player/orb.hpp b/th01/main/player/orb.hpp
index d7186e3e..3882ef6f 100644
--- a/th01/main/player/orb.hpp
+++ b/th01/main/player/orb.hpp
@@ -11,3 +11,45 @@ static const int ORB_TOP_START = ( ORB_TOP_MAX - 88);
extern int orb_cur_left, orb_cur_top;
extern int orb_prev_left, orb_prev_top;
+
+/// Physics
+/// -------
+#pragma option -b
+enum orb_velocity_x_t {
+ OVX_0 = 0,
+ OVX_4_LEFT = 1,
+ OVX_4_RIGHT = 2,
+ OVX_8_LEFT = 3,
+ OVX_8_RIGHT = 4,
+};
+
+enum orb_force_t {
+ OF_BOUNCE_FROM_GROUND = 0,
+ OF_BOUNCE_FROM_TOP = 1,
+ OF_SHOT = 2,
+ OF_IMMEDIATE = 3, // new force passed directly in [immediate]
+};
+#pragma option -b.
+
+// Initial value of the current force acting on the orb
+extern double orb_force;
+
+// Number of frames that [orb_force] has been acting on the orb
+extern int orb_force_frame;
+
+extern orb_velocity_x_t orb_velocity_x;
+extern double orb_velocity_y;
+
+// Applies a new force of the given type onto the orb. Sets [orb_force], and
+// reses [orb_force_frame].
+void orb_force_new(double immediate, orb_force_t force);
+
+// Updates [orb_velocity_y] with the currently active force, and returns the
+// orb's velocity for this frame, in pixels to be added to [orb_cur_top].
+int orb_velocity_y_update(void);
+
+// Updates [orb_cur_left] *and* the global [orb_velocity_x] (!) to bounce the
+// orb off the left or right edge of the playfield, if necessary, depending on
+// the passed [velocity_x].
+void orb_move_x(orb_velocity_x_t velocity_x);
+/// -------
diff --git a/th01/main/player/orb[bss].asm b/th01/main/player/orb[bss].asm
index ed194a36..c8ca5a03 100644
--- a/th01/main/player/orb[bss].asm
+++ b/th01/main/player/orb[bss].asm
@@ -9,6 +9,7 @@ ORB_TOP_MAX = (PLAYFIELD_BOTTOM - ORB_H)
ORB_LEFT_START = (ORB_LEFT_MAX - 8)
ORB_TOP_START = ( ORB_TOP_MAX - 88)
-public _orb_cur_left, _orb_cur_top
+public _orb_cur_left, _orb_cur_top, _orb_force_frame
_orb_cur_left dw ?
_orb_cur_top dw ?
+_orb_force_frame dw ?
diff --git a/th01/main/player/orb[data].asm b/th01/main/player/orb[data].asm
new file mode 100644
index 00000000..2d13f123
--- /dev/null
+++ b/th01/main/player/orb[data].asm
@@ -0,0 +1,14 @@
+OVX_0 = 0
+OVX_4_LEFT = 1
+OVX_4_RIGHT = 2
+OVX_8_LEFT = 3
+OVX_8_RIGHT = 4
+
+OF_BOUNCE_FROM_GROUND = 0
+OF_BOUNCE_FROM_TOP = 1
+OF_SHOT = 2
+OF_IMMEDIATE = 3
+
+public _orb_velocity_y, _orb_force
+_orb_velocity_y dq 0.0
+_orb_force dq 0.0
diff --git a/th01/main_01.cpp b/th01/main_01.cpp
index f4c75181..84b7b1aa 100644
--- a/th01/main_01.cpp
+++ b/th01/main_01.cpp
@@ -1,6 +1,6 @@
/* ReC98
* -----
- * Code segment #1 of TH01's REIIDEN.EXE
+ * 1st part of code segment #1 of TH01's REIIDEN.EXE
*/
extern "C" {
diff --git a/th01/main_01_.cpp b/th01/main_01_.cpp
new file mode 100644
index 00000000..38d90c48
--- /dev/null
+++ b/th01/main_01_.cpp
@@ -0,0 +1,13 @@
+/* ReC98
+ * -----
+ * 2nd part of code segment #1 of TH01's REIIDEN.EXE
+ */
+
+#pragma codeseg main_01__TEXT main_01
+
+extern "C" {
+#include "ReC98.h"
+
+#include "th01/main/player/orb.cpp"
+
+}
diff --git a/th01_reiiden.asm b/th01_reiiden.asm
index 098e9220..868a128a 100644
--- a/th01_reiiden.asm
+++ b/th01_reiiden.asm
@@ -65,7 +65,7 @@ include th01/main/playfld.inc
extern _toupper:proc
extern _vsprintf:proc
-main_01 group main_01_TEXT, main_01__TEXT
+main_01 group main_01_TEXT, main_01__TEXT, main_01___TEXT
main_13 group main_13_TEXT, main_13__TEXT
main_19 group main_19_TEXT, main_19__TEXT
main_25 group main_25_TEXT, main_25__TEXT
@@ -1744,221 +1744,13 @@ loc_C5B1:
pop bp
retf
sub_C466 endp
+main_01__TEXT ends
+main_01___TEXT segment byte public 'CODE' use16
-; =============== S U B R O U T I N E =======================================
-
-; Attributes: bp-based frame
-
-sub_C5B4 proc far
-
-var_2 = word ptr -2
-
- enter 2, 0
- mov ax, word_36C2C
- mov bx, 5
- cwd
- idiv bx
- mov [bp+var_2], ax
- fild [bp+var_2]
- fadd dbl_34A9C
- fstp dbl_34A94
- fld dbl_34A94
- fcomp flt_34B64
- fstsw [bp+var_2]
- fwait
- mov ax, [bp+var_2]
- sahf
- jbe short loc_C5EF
- fld flt_34B64
- jmp short loc_C60A
-; ---------------------------------------------------------------------------
-
-loc_C5EF:
- fld dbl_34A94
- fcomp dbl_34B68
- fstsw [bp+var_2]
- fwait
- mov ax, [bp+var_2]
- sahf
- jnb short loc_C611
- fld dbl_34B68
-
-loc_C60A:
- fstp dbl_34A94
- fwait
-
-loc_C611:
- mov ax, word_36C2C
- mov bx, 5
- cwd
- idiv bx
- mov [bp+var_2], ax
- fild [bp+var_2]
- fadd dbl_34A9C
- call ftol@
- leave
- retf
-sub_C5B4 endp
-
-
-; =============== S U B R O U T I N E =======================================
-
-; Attributes: bp-based frame
-
-; int __cdecl __far sub_C62D(double, int)
-sub_C62D proc far
-
-var_2 = word ptr -2
-arg_0 = qword ptr 6
-arg_8 = word ptr 0Eh
-
- enter 2, 0
- push si
- mov si, [bp+arg_8]
- or si, si
- jnz short loc_C68D
- fld dbl_34A94
- fchs
- fmul dbl_34B70
- fstp dbl_34A9C
- fwait
- cmp word_34A7C, 0
- jnz short loc_C68D
- cmp word_36C2C, 11h
- jge short loc_C670
- call IRand
- mov bx, 32h ; '2'
- cwd
- idiv bx
- or dx, dx
- jnz short loc_C670
- mov word_34A7C, 1
-
-loc_C670:
- cmp word_36C2C, 11h
- jge short loc_C68D
- call IRand
- mov bx, 32h ; '2'
- cwd
- idiv bx
- cmp dx, 1
- jnz short loc_C68D
- mov word_34A7C, 2
-
-loc_C68D:
- cmp si, 1
- jnz short loc_C6B4
- mov ax, word_36C2C
- mov bx, 4
- cwd
- idiv bx
- mov [bp+var_2], ax
- fild [bp+var_2]
- fld dbl_34A94
- fchs
- fsubrp st(1), st
- fstp dbl_34A9C
- fwait
-
-loc_C6B4:
- cmp si, 2
- jnz short loc_C6CF
- fld dbl_34A94
- fdiv flt_34B78
- fadd dbl_34B7C
- fstp dbl_34A9C
- fwait
-
-loc_C6CF:
- cmp si, 3
- jnz short loc_C6DF
- fld [bp+arg_0]
- fstp dbl_34A9C
- fwait
-
-loc_C6DF:
- mov word_36C2C, 0
- pop si
- leave
- retf
-sub_C62D endp
-
-
-; =============== S U B R O U T I N E =======================================
-
-; Attributes: bp-based frame
-
-sub_C6E8 proc far
-
-arg_0 = word ptr 6
-
- push bp
- mov bp, sp
- mov bx, [bp+arg_0]
- dec bx
- cmp bx, 3
- ja short loc_C715
- add bx, bx
- jmp cs:off_C75E[bx]
-
-loc_C6FB:
- sub _orb_cur_left, 4
- jmp short loc_C715
-; ---------------------------------------------------------------------------
-
-loc_C702:
- add _orb_cur_left, 4
- jmp short loc_C715
-; ---------------------------------------------------------------------------
-
-loc_C709:
- sub _orb_cur_left, 8
- jmp short loc_C715
-; ---------------------------------------------------------------------------
-
-loc_C710:
- add _orb_cur_left, 8
-
-loc_C715:
- cmp _orb_cur_left, 0
- jg short loc_C738
- cmp word_34A7C, 1
- jnz short loc_C72B
- mov word_34A7C, 2
- jmp short loc_C738
-; ---------------------------------------------------------------------------
-
-loc_C72B:
- cmp word_34A7C, 3
- jnz short loc_C738
- mov word_34A7C, 4
-
-loc_C738:
- cmp _orb_cur_left, ORB_LEFT_MAX
- jl short loc_C75C
- cmp word_34A7C, 2
- jnz short loc_C74F
- mov word_34A7C, 1
- pop bp
- retf
-; ---------------------------------------------------------------------------
-
-loc_C74F:
- cmp word_34A7C, 4
- jnz short loc_C75C
- mov word_34A7C, 3
-
-loc_C75C:
- pop bp
- retf
-sub_C6E8 endp
-
-; ---------------------------------------------------------------------------
-off_C75E dw offset loc_C6FB
- dw offset loc_C702
- dw offset loc_C709
- dw offset loc_C710
+ extern _orb_velocity_y_update:proc
+ extern _orb_force_new:proc
+ extern _orb_move_x:proc
; =============== S U B R O U T I N E =======================================
@@ -1975,24 +1767,23 @@ arg_0 = word ptr 6
mov si, [bp+arg_0]
cmp word_34A86, 0
jnz loc_C816
- push word_34A7C
- call sub_C6E8
+ call _orb_move_x stdcall, _orb_velocity_x
pop cx
- call sub_C5B4
+ call _orb_velocity_y_update
add _orb_cur_top, ax
inc word_34A92
- cmp word_34A7C, 1
+ cmp _orb_velocity_x, OVX_4_LEFT
jz short loc_C799
- cmp word_34A7C, 3
+ cmp _orb_velocity_x, OVX_8_LEFT
jnz short loc_C79D
loc_C799:
inc word_34A7E
loc_C79D:
- cmp word_34A7C, 2
+ cmp _orb_velocity_x, OVX_4_RIGHT
jz short loc_C7AB
- cmp word_34A7C, 4
+ cmp _orb_velocity_x, OVX_8_RIGHT
jnz short loc_C7AF
loc_C7AB:
@@ -2011,12 +1802,12 @@ loc_C7BC:
loc_C7C9:
cmp _orb_cur_top, ORB_TOP_MAX
jle short loc_C7F4
- push 0 ; int
- fld dbl_34B70
+ push OF_BOUNCE_FROM_GROUND
+ fld _ORB_COEFFICIENT_OF_RESTITUTION
sub sp, 8
fstp [bp+var_C]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
mov _orb_cur_top, ORB_TOP_MAX
mov word_34A84, 0
@@ -2024,12 +1815,12 @@ loc_C7C9:
loc_C7F4:
cmp _orb_cur_top, ORB_TOP_MIN
jge short loc_C816
- push 1 ; int
+ push OF_BOUNCE_FROM_TOP
fldz
sub sp, 8
fstp [bp+var_C]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
mov _orb_cur_top, ORB_TOP_MIN
@@ -4007,10 +3798,10 @@ loc_DB04:
loc_DB0A:
fld dbl_34FF5
- fstp dbl_34A9C
+ fstp _orb_force
fwait
- mov word_36C2C, 0
- mov word_34A7C, 1
+ mov _orb_force_frame, 0
+ mov _orb_velocity_x, OVX_4_LEFT
mov _orb_prev_left, ORB_LEFT_START
mov _orb_prev_top, ORB_TOP_START
mov byte_34A57, 0
@@ -4165,7 +3956,7 @@ loc_DCCA:
call sub_181AC
call sub_1851E
inc dword_36C20
- inc word_36C2C
+ inc _orb_force_frame
inc dword_34A62
inc _bomb_doubletap_frames
test byte ptr _rand, 3
@@ -4735,7 +4526,7 @@ sub_E319 proc far
retf
sub_E319 endp
-main_01__TEXT ends
+main_01___TEXT ends
; ===========================================================================
@@ -18612,14 +18403,14 @@ loc_1AD1A:
mov ax, _player_left
sub ax, _orb_cur_left
jnz short loc_1AD66
- mov word_34A7C, 0
+ mov _orb_velocity_x, OVX_0
call IRand
mov bx, 8
cwd
idiv bx
or dx, dx
jnz short loc_1AD4E
- mov word_34A7C, 1
+ mov _orb_velocity_x, OVX_4_LEFT
loc_1AD4E:
call IRand
@@ -18630,15 +18421,15 @@ loc_1AD4E:
jnz short loc_1AD6C
loc_1AD5E:
- mov word_34A7C, 1
+ mov _orb_velocity_x, OVX_4_LEFT
jmp short loc_1AD6C
; ---------------------------------------------------------------------------
loc_1AD66:
- mov word_34A7C, 2
+ mov _orb_velocity_x, OVX_4_RIGHT
loc_1AD6C:
- push 3
+ push OF_IMMEDIATE
mov ax, si
cwd
sub ax, dx
@@ -18684,38 +18475,38 @@ loc_1ADBB:
jge short loc_1AE0A
cmp si, 65h ; 'e'
jnz short loc_1ADCD
- mov word_34A7C, 1
+ mov _orb_velocity_x, OVX_4_LEFT
jmp short loc_1ADF2
; ---------------------------------------------------------------------------
loc_1ADCD:
cmp si, 66h ; 'f'
jnz short loc_1ADDA
- mov word_34A7C, 2
+ mov _orb_velocity_x, OVX_4_RIGHT
jmp short loc_1ADF2
; ---------------------------------------------------------------------------
loc_1ADDA:
cmp si, 67h ; 'g'
jnz short loc_1ADE7
- mov word_34A7C, 4
+ mov _orb_velocity_x, OVX_8_RIGHT
jmp short loc_1ADF2
; ---------------------------------------------------------------------------
loc_1ADE7:
cmp si, 68h ; 'h'
jnz short loc_1ADF2
- mov word_34A7C, 3
+ mov _orb_velocity_x, OVX_8_LEFT
loc_1ADF2:
- push 3 ; int
+ push OF_IMMEDIATE
fld dbl_35B49
loc_1ADF9:
sub sp, 8
fstp [bp+var_E]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
loc_1AE0A:
@@ -29184,28 +28975,28 @@ loc_20F14:
loc_20F24:
mov _orb_cur_top, ax
- cmp word_34A7C, 2
+ cmp _orb_velocity_x, OVX_4_RIGHT
jnz short loc_20F3C
cmp [bp+var_6], 0
jge short loc_20F3C
- mov word_34A7C, 1
+ mov _orb_velocity_x, OVX_4_LEFT
jmp short loc_20F4F
; ---------------------------------------------------------------------------
loc_20F3C:
- cmp word_34A7C, 1
+ cmp _orb_velocity_x, OVX_4_LEFT
jnz short loc_20F4F
cmp [bp+var_6], 0
jle short loc_20F4F
- mov word_34A7C, 2
+ mov _orb_velocity_x, OVX_4_RIGHT
loc_20F4F:
- push 0 ; int
+ push OF_BOUNCE_FROM_GROUND
fld flt_35C9A
sub sp, 8
fstp [bp+var_1A]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
loc_20F67:
@@ -29348,13 +29139,13 @@ loc_21060:
cmp word ptr es:[bx], 0
jnz short loc_210B1
inc word ptr es:[bx]
- push 3 ; int
- fld dbl_34A94
+ push OF_IMMEDIATE
+ fld _orb_velocity_y
fchs
sub sp, 8
fstp [bp+var_1A]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
loc_210B1:
@@ -29388,13 +29179,13 @@ loc_210C6:
cmp word ptr es:[bx], 0
jnz short loc_21117
inc word ptr es:[bx]
- push 3 ; int
- fld dbl_34A94
+ push OF_IMMEDIATE
+ fld _orb_velocity_y
fchs
sub sp, 8
fstp [bp+var_1A]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
loc_21117:
@@ -29431,42 +29222,42 @@ loc_2112C:
jnz short loc_211CD
inc word ptr es:[bx]
mov byte_39EB2, 1
- cmp word_34A7C, 0
+ cmp _orb_velocity_x, OVX_0
jnz short loc_21198
- push 3 ; int
- fld dbl_34A94
+ push OF_IMMEDIATE
+ fld _orb_velocity_y
fchs
sub sp, 8
fstp [bp+var_1A]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
jmp short loc_211CD
; ---------------------------------------------------------------------------
loc_21198:
- cmp word_34A7C, 1
+ cmp _orb_velocity_x, OVX_4_LEFT
jnz short loc_211A4
mov ax, 2
jmp short loc_211CA
; ---------------------------------------------------------------------------
loc_211A4:
- cmp word_34A7C, 2
+ cmp _orb_velocity_x, OVX_4_RIGHT
jnz short loc_211B0
mov ax, 1
jmp short loc_211CA
; ---------------------------------------------------------------------------
loc_211B0:
- cmp word_34A7C, 3
+ cmp _orb_velocity_x, OVX_8_LEFT
jnz short loc_211BC
mov ax, 4
jmp short loc_211CA
; ---------------------------------------------------------------------------
loc_211BC:
- cmp word_34A7C, 4
+ cmp _orb_velocity_x, OVX_8_RIGHT
jnz short loc_211C8
mov ax, 3
jmp short loc_211CA
@@ -29476,7 +29267,7 @@ loc_211C8:
xor ax, ax
loc_211CA:
- mov word_34A7C, ax
+ mov _orb_velocity_x, ax
loc_211CD:
mov ax, si
@@ -29512,42 +29303,42 @@ loc_211E2:
jnz short loc_21283
inc word ptr es:[bx]
mov byte_39EB2, 1
- cmp word_34A7C, 0
+ cmp _orb_velocity_x, OVX_0
jnz short loc_2124E
- push 3 ; int
- fld dbl_34A94
+ push OF_IMMEDIATE
+ fld _orb_velocity_y
fchs
sub sp, 8
fstp [bp+var_1A]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
jmp short loc_21283
; ---------------------------------------------------------------------------
loc_2124E:
- cmp word_34A7C, 1
+ cmp _orb_velocity_x, OVX_4_LEFT
jnz short loc_2125A
mov ax, 2
jmp short loc_21280
; ---------------------------------------------------------------------------
loc_2125A:
- cmp word_34A7C, 2
+ cmp _orb_velocity_x, OVX_4_RIGHT
jnz short loc_21266
mov ax, 1
jmp short loc_21280
; ---------------------------------------------------------------------------
loc_21266:
- cmp word_34A7C, 3
+ cmp _orb_velocity_x, OVX_8_LEFT
jnz short loc_21272
mov ax, 4
jmp short loc_21280
; ---------------------------------------------------------------------------
loc_21272:
- cmp word_34A7C, 4
+ cmp _orb_velocity_x, OVX_8_RIGHT
jnz short loc_2127E
mov ax, 3
jmp short loc_21280
@@ -29557,7 +29348,7 @@ loc_2127E:
xor ax, ax
loc_21280:
- mov word_34A7C, ax
+ mov _orb_velocity_x, ax
loc_21283:
mov ax, si
@@ -30121,8 +29912,8 @@ loc_21777:
mov bx, 5
cwd
idiv bx
- mov word_34A7C, dx
- push 3 ; int
+ mov _orb_velocity_x, dx
+ push OF_IMMEDIATE
call IRand
mov bx, 13h
cwd
@@ -30133,7 +29924,7 @@ loc_21777:
sub sp, 8
fstp [bp+var_12]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
mov ax, point_39EB9.x
mov _orb_cur_left, ax
@@ -30595,26 +30386,26 @@ loc_21B11:
dec word ptr es:[bx]
les bx, [bp+arg_4]
mov word ptr es:[bx], 1
- cmp word_34A7C, 1
+ cmp _orb_velocity_x, OVX_4_LEFT
jz short loc_21B53
- cmp word_34A7C, 3
+ cmp _orb_velocity_x, OVX_8_LEFT
jz short loc_21B53
- cmp word_34A7C, 2
+ cmp _orb_velocity_x, OVX_4_RIGHT
jz short loc_21B5B
- cmp word_34A7C, 4
+ cmp _orb_velocity_x, OVX_8_RIGHT
jz short loc_21B5B
- cmp word_34A7C, 0
+ cmp _orb_velocity_x, OVX_0
jnz short loc_21B61
cmp _orb_cur_left, (PLAYFIELD_CENTER - (ORB_W / 2))
jge short loc_21B5B
loc_21B53:
- mov word_34A7C, 2
+ mov _orb_velocity_x, OVX_4_RIGHT
jmp short loc_21B61
; ---------------------------------------------------------------------------
loc_21B5B:
- mov word_34A7C, 1
+ mov _orb_velocity_x, OVX_4_LEFT
loc_21B61:
movsx eax, [bp+arg_12]
@@ -49544,10 +49335,10 @@ loc_2C8AE:
mov _orb_cur_top, ORB_TOP_START
mov _player_left, PLAYER_LEFT_START
fld dbl_35FAA
- fstp dbl_34A9C
+ fstp _orb_force
fwait
- mov word_36C2C, 0
- mov word_34A7C, 1
+ mov _orb_force_frame, 0
+ mov _orb_velocity_x, OVX_4_LEFT
mov byte_34A57, 0
mov byte_34A58, 0
push 0
@@ -55170,7 +54961,7 @@ arg_8 = word ptr 0Eh
sub ax, di
cmp ax, 8
jle short loc_2FEB2
- mov word_34A7C, 1
+ mov _orb_velocity_x, OVX_4_LEFT
jmp short loc_2FEE6
; ---------------------------------------------------------------------------
@@ -55183,7 +54974,7 @@ loc_2FEB2:
sub ax, di
cmp ax, 8
jnz short loc_2FECD
- mov word_34A7C, 0
+ mov _orb_velocity_x, OVX_0
jmp short loc_2FEE6
; ---------------------------------------------------------------------------
@@ -55196,23 +54987,22 @@ loc_2FECD:
sub ax, di
cmp ax, 0FFF0h
jle short loc_2FEE6
- mov word_34A7C, 2
+ mov _orb_velocity_x, OVX_4_RIGHT
loc_2FEE6:
- push 2 ; int
+ push OF_SHOT
fldz
sub sp, 8
fstp [bp+var_E]
fwait
- call sub_C62D
+ call _orb_force_new
add sp, 0Ah
les bx, [bp+arg_0]
add bx, si
mov byte ptr es:[bx+30h], 0
- push word_34A7C
- call sub_C6E8
+ call _orb_move_x stdcall, _orb_velocity_x
pop cx
- call sub_C5B4
+ call _orb_velocity_y_update
add _orb_cur_top, ax
mov ax, 1
jmp short loc_2FF20
@@ -57321,7 +57111,8 @@ word_34A74 dw 0
dw 0
word_34A78 dw 0
dw 0
-word_34A7C dw 0
+public _orb_velocity_x
+_orb_velocity_x dw 0
word_34A7E dw 0
_rem_lives dw 4
word_34A82 dw 0
@@ -57334,8 +57125,7 @@ public _orb_prev_left, _orb_prev_top
_orb_prev_left dw ORB_LEFT_START
_orb_prev_top dw ORB_TOP_START
word_34A92 dw 0
-dbl_34A94 dq 0.0
-dbl_34A9C dq 0.0
+include th01/main/player/orb[data].asm
byte_34AA4 db 0
unk_34AA5 db 0Fh
db 0Fh
@@ -57413,11 +57203,13 @@ a0m db 1Bh,'[0m',0
s2 db 'empty.grf',0
aKuzi1_grc db 'kuzi1.grc',0
aKuzi2_grc db 'kuzi2.grc',0
-flt_34B64 dd 16.0
-dbl_34B68 dq -16.0
-dbl_34B70 dq 0.78
-flt_34B78 dd 2.0
-dbl_34B7C dq -10.0
+public _ORB_VELOCITY_Y_MAX, _ORB_VELOCITY_Y_MIN
+public _ORB_COEFFICIENT_OF_RESTITUTION, _ORB_FORCE_2_0, _ORB_FORCE_SHOT_BASE
+_ORB_VELOCITY_Y_MAX dd 16.0
+_ORB_VELOCITY_Y_MIN dq -16.0
+_ORB_COEFFICIENT_OF_RESTITUTION dq 0.78
+_ORB_FORCE_2_0 dd 2.0
+_ORB_FORCE_SHOT_BASE dq -10.0
aVovVtvrvd db '‚o‚`‚t‚r‚d',0
aB@nKjb@b@pic db '@ÄŠJ@@I—¹',0
aBB@b@b@b@b@b@ db 'œ@@@@@@',0
@@ -58437,7 +58229,6 @@ _mode_debug db ?
dword_36C20 dd ?
include th01/main/player/player[bss].asm
include th01/main/player/orb[bss].asm
-word_36C2C dw ?
db 1275 dup(?)
unk_37129 db ? ;
db 645 dup(?)