mirror of https://github.com/nmlgc/ReC98.git
59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
#pragma option -zCBULLET_A_TEXT -zPmain_03 -k-
|
||
|
||
#include "platform.h"
|
||
#include "pc98.h"
|
||
#include "th01/math/overlap.hpp"
|
||
#include "th01/math/subpixel.hpp"
|
||
#include "th04/math/motion.hpp"
|
||
#include "th04/main/playfld.hpp"
|
||
extern "C" {
|
||
#include "th04/main/player/player.hpp"
|
||
#include "th04/main/bullet/bullet.hpp"
|
||
#include "th04/main/bullet/clearzap.hpp"
|
||
#include "th05/main/playperf.hpp"
|
||
|
||
bool near bullet_template_clip(void)
|
||
{
|
||
extern bool group_fixedspeed;
|
||
|
||
if(
|
||
(bullet_clear_time != 0) &&
|
||
// If a newly spawned bullet wouldn't fully decay during the remaining
|
||
// time, let's simply not spawn it at all? This way, they don't award
|
||
// score points either.
|
||
(bullet_clear_time < (BMS_DECAY_FRAMES + 1)) // differs from TH04!
|
||
) {
|
||
clipped:
|
||
return true;
|
||
}
|
||
|
||
// Also applies to 8×8 pellets, because why wouldn't you combine both
|
||
// cases. #goodcode
|
||
_AX = bullet_template.origin.x;
|
||
_DX = bullet_template.origin.y;
|
||
if(!playfield_encloses(_AX, _DX, BULLET16_W, BULLET16_H)) {
|
||
goto clipped;
|
||
}
|
||
_AX -= player_pos.cur.x;
|
||
if(overlap_1d_inplace_fast(_AX, BULLET_KILLBOX_W)) {
|
||
_DX -= player_pos.cur.y;
|
||
if(overlap_1d_inplace_fast(_DX, BULLET_KILLBOX_H)) {
|
||
player_is_hit = true;
|
||
// Yes, no `return true` - TH05 does in fact *not* clip bullets
|
||
// that are spawned on top of the player.
|
||
// This might sound like it has a different effect on gameplay.
|
||
// Until you realize that the player got hit in this case and will
|
||
// either lose a life or deathbomb, both of which will cause all
|
||
// on-screen bullets to get cleared anyway.
|
||
// So it's at most a visual glitch.
|
||
}
|
||
}
|
||
|
||
if(!group_fixedspeed) {
|
||
bullet_template.speed.v = playperf_speedtune(bullet_template.speed.v);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
}
|